From 0b6aa938ee4320d672cd98a9bc15c49e56363563 Mon Sep 17 00:00:00 2001 From: charleswrayjr Date: Thu, 11 Sep 2025 21:16:27 -0500 Subject: [PATCH] Cleaning up the user_addresses.model.js file. --- src/models/address.model.js | 2 +- src/models/user_address.model.js | 87 --------------------- src/models/user_addresses.model.js | 118 +++++++++++++++++++++++++++++ 3 files changed, 119 insertions(+), 88 deletions(-) delete mode 100644 src/models/user_address.model.js create mode 100644 src/models/user_addresses.model.js diff --git a/src/models/address.model.js b/src/models/address.model.js index 0ea8662..dd1b93f 100644 --- a/src/models/address.model.js +++ b/src/models/address.model.js @@ -97,7 +97,7 @@ class Address extends Model { * @returns {Promise<{user_id: number, address_id: number}>} */ static async add_user( user_id ) { - const done = await require( 'user_address.model' ).add_relation( user_id, this.id ); + const done = await require( 'src/models/user_addresses.model' ).add_relation( user_id, this.id ); if (!done) throw new ValidationError( 'Failed to add phone number' ); return done; }; diff --git a/src/models/user_address.model.js b/src/models/user_address.model.js deleted file mode 100644 index 8312340..0000000 --- a/src/models/user_address.model.js +++ /dev/null @@ -1,87 +0,0 @@ -/** - * @file User addresses model for phase.user_addresses table - */ - -const { Model, ValidationError } = require( './model' ); - -/** - * @typedef {Object} UserAddress - * @property {number} user_id - User ID (foreign key) - * @property {number} address_id - Address ID (foreign key) - */ - -/** - * User address model class - * @extends Model - */ -class UserAddress extends Model { - /** - * Create a UserAddress instance - * @param {Partial} [props] - User address properties - */ - constructor( props ) { - super( props ); - this.table = 'phase.user_addresses'; - this.prepend = 'ua'; - this.default_columns = ['user_id', 'address_id']; - this.update_exclude_columns = ['user_id', 'address_id']; - this.base_query = ` - SELECT ua.user_id, ua.address_id - FROM phase.user_addresses ua - `; - this.base_list_query = this.base_query; - this.default_order_by = 'ORDER BY ua.user_id ASC'; - this.instance = _props => new UserAddress( _props ); - }; - - /** - * Add a user-address relation - * @param {number|string} user_id - User ID - * @param {number|string} address_id - Address ID - * @returns {Promise} Created relation instance - * @throws {ValidationError} If IDs are invalid - */ - static async add_relation( user_id, address_id ) { - const user_id_int = parseInt( user_id, 10 ); - const address_id_int = parseInt( address_id, 10 ); - if (isNaN( user_id_int ) || isNaN( address_id_int )) { - throw new ValidationError( 'user_id and address_id must be valid integers' ); - } - const query_str = ` - INSERT INTO phase.user_addresses (user_id, address_id) - VALUES ($1, $2) - RETURNING *; - `; - const values = [user_id_int, address_id_int]; - const result = await phsdb.query( query_str, values, { plain:true } ); - if (!result) throw new ValidationError( 'Failed to add user-address relation' ); - return new UserAddress( result ); - }; - - /** - * Remove a user-address relation - * @param {number|string} address_id - Address ID - * @param {number|string|undefined} [user_id = undefined] - User ID - * @returns {Promise} Deleted relation instance or null - * @throws {ValidationError} If IDs are invalid - */ - static async remove_relation( address_id, user_id = undefined ) { - const user_id_int = parseInt( user_id, 10 ); - const address_id_int = parseInt( address_id, 10 ); - if (isNaN( address_id_int )) { - throw new ValidationError( 'user_id and address_id must be valid integers' ); - } - const query_str = ` - DELETE - FROM phase.user_addresses - WHERE address_id = $1 ${ user_id_int ? 'AND user_id = $2' : '' } - RETURNING *; - `; - const values = [address_id_int]; - if (!isNaN( user_id_int )) values.push( user_id_int ); - const result = await phsdb.query( query_str, values, { plain:!isNaN( user_id_int ) } ); - return result ? new UserAddress( result ) : null; - }; -} - -module.exports = UserAddress; \ No newline at end of file diff --git a/src/models/user_addresses.model.js b/src/models/user_addresses.model.js new file mode 100644 index 0000000..2bfaed7 --- /dev/null +++ b/src/models/user_addresses.model.js @@ -0,0 +1,118 @@ +/** + * @file User addresses model for phase.user_addresses table + */ + +const { Model, ValidationError, FailedToCreateError } = require('./model'); + +/** + * @typedef {Object} UserAddress + * @property {number} user_id - User ID (foreign key) + * @property {number} address_id - Address ID (foreign key) + */ + +/** + * User address model class + * @extends Model + */ +class UserAddress extends Model { + /** + * Create a UserAddress instance + * @param {Partial} [props] - User address properties + */ + constructor(props) { + super(props); + this.table = 'phase.user_addresses'; + this.prepend = 'ua'; + this.default_columns = ['user_id', 'address_id']; + this.update_exclude_columns = ['user_id', 'address_id']; + this.base_query = ` + SELECT ua.user_id, ua.address_id + FROM phase.user_addresses ua + `; + this.base_list_query = this.base_query; + this.default_order_by = 'ORDER BY ua.user_id ASC'; + this.instance = _props => new UserAddress(_props); + }; + + /** + * Add a user-address relation + * @param {number|string} user_id - User ID + * @param {number|string} address_id - Address ID + * @returns {Promise} Created relation instance + * @throws {ValidationError} If IDs are invalid + * @throws {FailedToCreateError} If creation fails + */ + static async add_relation(user_id, address_id) { + const user_id_int = parseInt(user_id, 10); + const address_id_int = parseInt(address_id, 10); + if (isNaN(user_id_int) || isNaN(address_id_int)) { + throw new ValidationError('user_id and address_id must be valid integers'); + } + const query_str = ` + INSERT INTO phase.user_addresses (user_id, address_id) + VALUES ($1, $2) RETURNING *; + `; + const values = [user_id_int, address_id_int]; + const result = await phsdb.query(query_str, values, { plain: true }); + if (!result) throw new FailedToCreateError('Failed to add user-address relation'); + return new UserAddress(result); + }; + + /** + * Remove a user-address relation + * @param {number|string} address_id - Address ID + * @param {number|string|undefined} [user_id=undefined] - User ID + * @returns {Promise} Deleted relation instance or null + * @throws {ValidationError} If IDs are invalid + */ + static async remove_relation(address_id, user_id = undefined) { + const user_id_int = parseInt(user_id, 10); + const address_id_int = parseInt(address_id, 10); + if (isNaN(address_id_int)) { + throw new ValidationError('address_id must be a valid integer'); + } + let query_str = ` + DELETE FROM phase.user_addresses + WHERE address_id = $1 ${user_id_int ? 'AND user_id = $2' : ''} RETURNING *; + `; + const values = [address_id_int]; + if (!isNaN(user_id_int)) values.push(user_id_int); + const result = await phsdb.query(query_str, values, { plain: !isNaN(user_id_int) }); + return result ? new UserAddress(result) : null; + }; + + /** + * Find user-address relation by IDs + * @param {number|string} user_id - User ID + * @param {number|string} address_id - Address ID + * @param {string[]} [excludes] - Fields to exclude from result + * @returns {Promise} Relation instance or null + */ + static async find_by_ids(user_id, address_id, excludes = []) { + return await new UserAddress().find_one( + { user_id, address_id }, + excludes + ); + }; + + /** + * Find user-address relations by user ID + * @param {number|string} user_id - User ID + * @param {string[]} [excludes] - Fields to exclude from result + * @param {{name: string, direction?: 'asc'|'desc'}||null} [order_by] - Order by configuration + * @param {number} [limit=100] - Maximum number of records + * @param {number} [offset=0] - Number of records to skip + * @returns {Promise} Array of relations + */ + static async find_by_user_id(user_id, excludes = [], order_by = null, limit = 100, offset = 0) { + return await new UserAddress().find_many( + { user_id }, + excludes, + order_by, + limit, + offset + ); + }; +} + +module.exports = UserAddress; \ No newline at end of file -- 2.43.0