* @file Address model for phase.addresses table
*/
-const { Model, ValidationError } = require('./model');
+const { Model, NotFoundError, ValidationError, FailedToCreateError } = require( './model' );
/**
* @typedef {Object} Address
* Create an Address instance
* @param {Partial<Address>} [props] - Address properties
*/
- constructor(props) {
- super(props);
+ constructor( props ) {
+ super( props );
this.table = 'phase.addresses';
this.prepend = 'a';
this.default_columns = [
];
this.update_exclude_columns = ['id', 'created_at', 'is_deleted', 'deleted_at', 'deleted_by_id'];
this.base_query = `
- SELECT a.id, a.street_1, a.street_2, a.city, a.state, a.zip_code,
- a.created_by_id, a.created_at, a.is_deleted, a.deleted_by_id, a.deleted_at
+ SELECT a.id,
+ a.street_1,
+ a.street_2,
+ a.city,
+ a.state,
+ a.zip_code,
+ a.created_by_id,
+ a.created_at,
+ a.is_deleted,
+ a.deleted_by_id,
+ a.deleted_at
FROM phase.addresses a
WHERE a.is_deleted = false
`;
this.base_list_query = `
- SELECT a.id, a.street_1, a.street_2, a.city, a.state, a.zip_code,
- a.created_by_id, a.created_at
- FROM phase.addresses a
- WHERE a.is_deleted = false
+ SELECT a.id,
+ a.street_1,
+ a.street_2,
+ a.city,
+ a.state,
+ a.zip_code,
+ a.created_by_id,
+ a.created_at
+ FROM phase.addresses a
+ WHERE a.is_deleted = false
`;
this.default_order_by = 'ORDER BY a.zip_code ASC';
- this.instance = _props => new Address(_props);
+ this.instance = _props => new Address( _props );
}
/**
* @param {Omit<Address, 'id'|'created_at'|'is_deleted'|'deleted_by_id'|'deleted_at'>} address_data - Address data
* @returns {Promise<Address>} Created address instance
* @throws {ValidationError} If required fields are missing
+ * @throws {FailedToCreateError} If creation fails
*/
- static async create(address_data) {
+ static async create( address_data ) {
const { street_1, street_2 = null, city, state, zip_code, created_by_id = null } = address_data;
if (!street_1 || !city || !state || !zip_code) {
- throw new ValidationError('Missing required fields: street_1, city, state, zip_code');
+ throw new ValidationError( 'Missing required fields: street_1, city, state, zip_code' );
}
const query_str = `
- INSERT INTO phase.addresses (street_1, street_2, city, state, zip_code, created_by_id)
- VALUES ($1, $2, $3, $4, $5, $6) RETURNING *;
+ INSERT INTO phase.addresses (street_1, street_2, city, state, zip_code, created_by_id)
+ VALUES ($1, $2, $3, $4, $5, $6)
+ RETURNING *;
`;
const values = [street_1, street_2, city, state, zip_code, created_by_id];
- const result = await phsdb.query(query_str, values, { plain: true });
- if (!result) throw new ValidationError('Failed to create address');
- return new Address(result);
+ const result = await phsdb.query( query_str, values, { plain:true } );
+ if (!result) throw new FailedToCreateError( 'Failed to create address' );
+ return new Address( result );
}
/**
* @param user_id
* @returns {Promise<{user_id: number, address_id: number}>}
*/
- static async add_user(user_id) {
+ static async add_user( user_id ) {
const done = await require( 'user_address.model' ).add_relation( user_id, this.id );
- if (!done) throw new ValidationError('Failed to add phone number');
+ if (!done) throw new ValidationError( 'Failed to add phone number' );
return done;
};
* @param {string[]} [excludes] - Fields to exclude from result
* @returns {Promise<Address|null>[]} Address instance or null
*/
- static async find_by_zip_code(zip_code, excludes = []) {
+ static async find_by_zip_code( zip_code, excludes = [] ) {
return await new Address().find_many( { zip_code }, excludes );
- }
+ };
/**
* Soft delete address
* @param {number|string} deleted_by_id - ID of user performing deletion
* @returns {Promise<Address>} Updated address instance
* @throws {ValidationError} If deleted_by_id is invalid
+ * @throws {NotFoundError} If record not found
*/
- async soft_delete(deleted_by_id) {
- const deleted_by_id_int = parseInt(deleted_by_id, 10);
- if (isNaN(deleted_by_id_int)) {
- throw new ValidationError('deleted_by_id must be a valid integer');
+ async soft_delete( deleted_by_id ) {
+ const deleted_by_id_int = parseInt( deleted_by_id, 10 );
+ if (isNaN( deleted_by_id_int )) {
+ throw new ValidationError( 'deleted_by_id must be a valid integer' );
}
- return await this.update({
- is_deleted: true,
- deleted_at: new Date().toISOString(),
- deleted_by_id: deleted_by_id_int
- });
- }
-
- /**
- * Get the user who created this address
- * @returns {Promise<User|null>} Creator user instance or null
- */
- async get_created_by() {
- if (!this.created_by_id) return null;
- const User = require('./user.model');
- return await new User().find_one({ id: this.created_by_id }, []);
- }
+ return await this.update( {
+ is_deleted:true,
+ deleted_at:new Date().toISOString(),
+ deleted_by_id:deleted_by_id_int
+ } );
+ };
}
module.exports = Address;
\ No newline at end of file