+++ /dev/null
-/**
- * @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<UserAddress>} [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<UserAddress>} 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<UserAddress|null>} 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
--- /dev/null
+/**
+ * @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<UserAddress>} [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<UserAddress>} 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<UserAddress|null>} 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<UserAddress|null>} 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<UserAddress[]>} 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