--- /dev/null
+/**
+ * @file Address controller for handling address-related API requests
+ */
+
+const db = require( '../models' );
+const createError = require( 'http-errors' );
+
+/**
+ * Address controller
+ * @type {Object}
+ */
+module.exports = {
+ /**
+ * Create a new address
+ * @param {Object} req - Express request object
+ * @param {Object} res - Express response object
+ * @param {Function} next - Express next middleware function
+ * @returns {Promise<void>}
+ */
+ async create( req, res, next ) {
+ try {
+ const address_data = req.body;
+ const address = await db.address.create( address_data );
+ res.json( address );
+ } catch (error) {
+ logger.error( `Create address error: ${ error.message }` );
+ next( createError( error.status || 400, error.message ) );
+ }
+ },
+
+ /**
+ * Find address by zip code
+ * @param {Object} req - Express request object
+ * @param {Object} res - Express response object
+ * @param {Function} next - Express next middleware function
+ * @returns {Promise<void>}
+ */
+ async find_by_zip_code( req, res, next ) {
+ try {
+ const { zip_code } = req.params;
+ const address = await db.address.find_by_zip_code( zip_code );
+ if (!address) return next( createError( 404, 'Address not found' ) );
+ res.json( address );
+ } catch (error) {
+ logger.error( `Find address by zip code error: ${ error.message }` );
+ next( createError( error.status || 500, error.message ) );
+ }
+ },
+
+ /**
+ * Find one address by ID
+ * @param {Object} req - Express request object
+ * @param {Object} res - Express response object
+ * @param {Function} next - Express next middleware function
+ * @returns {Promise<void>}
+ */
+ async find_one( req, res, next ) {
+ try {
+ const { id } = req.params;
+ const address = await db.address.find_one( { id:parseInt( id ) } );
+ if (!address) return next( createError( 404, 'Address not found' ) );
+ res.json( address );
+ } catch (error) {
+ logger.error( `Find address error: ${ error.message }` );
+ next( createError( error.status || 500, error.message ) );
+ }
+ },
+
+ /**
+ * Find many addresses
+ * @param {Object} req - Express request object
+ * @param {Object} res - Express response object
+ * @param {Function} next - Express next middleware function
+ * @returns {Promise<void>}
+ */
+ async find_many( req, res, next ) {
+ try {
+ const { limit = '100', offset = '0', ...where } = req.query;
+ const addresses = await db.address.find_many( where, [], null, parseInt( limit ), parseInt( offset ) );
+ res.json( addresses );
+ } catch (error) {
+ logger.error( `Find many addresses error: ${ error.message }` );
+ next( createError( error.status || 500, error.message ) );
+ }
+ },
+
+ /**
+ * Update an address
+ * @param {Object} req - Express request object
+ * @param {Object} res - Express response object
+ * @param {Function} next - Express next middleware function
+ * @returns {Promise<void>}
+ */
+ async update( req, res, next ) {
+ try {
+ const { id } = req.params;
+ const address_data = req.body;
+ const address = await db.address.instance().find_one( { id:parseInt( id ) } );
+ if (!address) return next( createError( 404, 'Address not found' ) );
+ const updated_address = await address.update( address_data );
+ res.json( updated_address );
+ } catch (error) {
+ logger.error( `Update address error: ${ error.message }` );
+ next( createError( error.status || 400, error.message ) );
+ }
+ },
+
+ /**
+ * Soft delete an address
+ * @param {Object} req - Express request object
+ * @param {Object} res - Express response object
+ * @param {Function} next - Express next middleware function
+ * @returns {Promise<void>}
+ */
+ async soft_delete( req, res, next ) {
+ try {
+ const { id } = req.params;
+ const { deleted_by_id } = req.body;
+ const address = await db.address.instance().find_one( { id:parseInt( id ) } );
+ if (!address) return next( createError( 404, 'Address not found' ) );
+ const deleted_address = await address.soft_delete( deleted_by_id );
+ res.json( deleted_address );
+ } catch (error) {
+ logger.error( `Soft delete address error: ${ error.message }` );
+ next( createError( error.status || 400, error.message ) );
+ }
+ }
+};
\ No newline at end of file
--- /dev/null
+/**
+ * @file User addresses controller for handling user-address-related API requests
+ */
+
+const db = require( '../models' );
+const createError = require( 'http-errors' );
+
+/**
+ * User addresses controller
+ * @type {Object}
+ */
+module.exports = {
+ /**
+ * Add a user-address relation
+ * @param {Object} req - Express request object
+ * @param {Object} res - Express response object
+ * @param {Function} next - Express next middleware function
+ * @returns {Promise<void>}
+ */
+ async add_relation( req, res, next ) {
+ try {
+ const { user_id, address_id } = req.body;
+ const relation = await db.user_addresses.add_relation( user_id, address_id );
+ res.json( relation );
+ } catch (error) {
+ logger.error( `Add user-address relation error: ${ error.message }` );
+ next( createError( error.status || 400, error.message ) );
+ }
+ },
+
+ /**
+ * Remove a user-address relation
+ * @param {Object} req - Express request object
+ * @param {Object} res - Express response object
+ * @param {Function} next - Express next middleware function
+ * @returns {Promise<void>}
+ */
+ async remove_relation( req, res, next ) {
+ try {
+ const { address_id, user_id } = req.body;
+ const relation = await db.user_addresses.remove_relation( address_id, user_id );
+ if (!relation) return next( createError( 404, 'Relation not found' ) );
+ res.json( relation );
+ } catch (error) {
+ logger.error( `Remove user-address relation error: ${ error.message }` );
+ next( createError( error.status || 400, error.message ) );
+ }
+ },
+
+ /**
+ * Find user-address relation by IDs
+ * @param {Object} req - Express request object
+ * @param {Object} res - Express response object
+ * @param {Function} next - Express next middleware function
+ * @returns {Promise<void>}
+ */
+ async find_by_ids( req, res, next ) {
+ try {
+ const { user_id, address_id } = req.params;
+ const relation = await db.user_addresses.find_by_ids( parseInt( user_id ), parseInt( address_id ) );
+ if (!relation) return next( createError( 404, 'Relation not found' ) );
+ res.json( relation );
+ } catch (error) {
+ logger.error( `Find user-address by IDs error: ${ error.message }` );
+ next( createError( error.status || 500, error.message ) );
+ }
+ },
+
+ /**
+ * Find user-address relations by user ID
+ * @param {Object} req - Express request object
+ * @param {Object} res - Express response object
+ * @param {Function} next - Express next middleware function
+ * @returns {Promise<void>}
+ */
+ async find_by_user_id( req, res, next ) {
+ try {
+ const { user_id } = req.params;
+ const { limit = '100', offset = '0' } = req.query;
+ const relations = await db.user_addresses.find_by_user_id( parseInt( user_id ), [], null, parseInt( limit ), parseInt( offset ) );
+ res.json( relations );
+ } catch (error) {
+ logger.error( `Find user-addresses by user ID error: ${ error.message }` );
+ next( createError( error.status || 500, error.message ) );
+ }
+ }
+};
\ No newline at end of file
--- /dev/null
+/**
+ * @file Address routes configuration
+ */
+
+const express = require('express');
+const router = express.Router();
+const { validate_auth } = require('../middleware/routeHelpers');
+const address_controller = require('../controllers/address.controller');
+
+/**
+ * Configure address routes
+ * @param {Object} passport - Passport instance for authentication
+ * @returns {Object} Express router with address routes
+ */
+module.exports = (passport) => {
+ router.post('/create', validate_auth(passport), address_controller.create);
+ router.get('/zip/:zip_code', validate_auth(passport), address_controller.find_by_zip_code);
+ router.get('/:id', validate_auth(passport), address_controller.find_one);
+ router.get('/', validate_auth(passport), address_controller.find_many);
+ router.put('/:id', validate_auth(passport), address_controller.update);
+ router.put('/:id/soft_delete', validate_auth(passport), address_controller.soft_delete);
+ return router;
+};
\ No newline at end of file
--- /dev/null
+/**
+ * @file User addresses routes configuration
+ */
+
+const express = require( 'express' );
+const router = express.Router();
+const { validate_auth } = require( '../middleware/routeHelpers' );
+const user_addresses_controller = require( '../controllers/user_addresses.controller' );
+
+/**
+ * Configure user addresses routes
+ * @param {Object} passport - Passport instance for authentication
+ * @returns {Object} Express router with user addresses routes
+ */
+module.exports = ( passport ) => {
+ router.post( '/add', validate_auth( passport ), user_addresses_controller.add_relation );
+ router.delete( '/remove', validate_auth( passport ), user_addresses_controller.remove_relation );
+ router.get( '/ids/:user_id/:address_id', validate_auth( passport ), user_addresses_controller.find_by_ids );
+ router.get( '/user/:user_id', validate_auth( passport ), user_addresses_controller.find_by_user_id );
+ return router;
+};
\ No newline at end of file