]> PHS Git Server - phs-api.git/commitdiff
Cleaning up the user_addresses.model.js file.
authorcharleswrayjr <charleswrayjr@gmail.com>
Fri, 12 Sep 2025 02:16:27 +0000 (21:16 -0500)
committercharleswrayjr <charleswrayjr@gmail.com>
Fri, 12 Sep 2025 02:16:27 +0000 (21:16 -0500)
src/models/address.model.js
src/models/user_address.model.js [deleted file]
src/models/user_addresses.model.js [new file with mode: 0644]

index 0ea8662ebc7807aaeb555d25f5be1632cee2d341..dd1b93fcb258027f50f578fdb3467270fefcf50d 100644 (file)
@@ -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 (file)
index 8312340..0000000
+++ /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<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
diff --git a/src/models/user_addresses.model.js b/src/models/user_addresses.model.js
new file mode 100644 (file)
index 0000000..2bfaed7
--- /dev/null
@@ -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<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