feat: Enhance condo and family data models
Adds new fields for detailed address information and notes to the Condo and Family types. Updates database schema and server API endpoints to support these new fields, improving data richness for location and specific family/condo details.
This commit is contained in:
65
server/db.js
65
server/db.js
@@ -76,12 +76,39 @@ const initDb = async () => {
|
||||
id VARCHAR(36) PRIMARY KEY,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
address VARCHAR(255),
|
||||
street_number VARCHAR(20),
|
||||
city VARCHAR(100),
|
||||
province VARCHAR(100),
|
||||
zip_code VARCHAR(20),
|
||||
notes TEXT,
|
||||
iban VARCHAR(50),
|
||||
default_monthly_quota DECIMAL(10, 2) DEFAULT 100.00,
|
||||
image VARCHAR(255),
|
||||
created_at ${TIMESTAMP_TYPE} DEFAULT CURRENT_TIMESTAMP
|
||||
)
|
||||
`);
|
||||
|
||||
// Migration for condos: Add new address fields
|
||||
try {
|
||||
let hasCity = false;
|
||||
if (DB_CLIENT === 'postgres') {
|
||||
const [cols] = await connection.query("SELECT column_name FROM information_schema.columns WHERE table_name='condos'");
|
||||
hasCity = cols.some(c => c.column_name === 'city');
|
||||
} else {
|
||||
const [cols] = await connection.query("SHOW COLUMNS FROM condos");
|
||||
hasCity = cols.some(c => c.Field === 'city');
|
||||
}
|
||||
|
||||
if (!hasCity) {
|
||||
console.log('Migrating: Adding address fields to condos...');
|
||||
await connection.query("ALTER TABLE condos ADD COLUMN street_number VARCHAR(20)");
|
||||
await connection.query("ALTER TABLE condos ADD COLUMN city VARCHAR(100)");
|
||||
await connection.query("ALTER TABLE condos ADD COLUMN province VARCHAR(100)");
|
||||
await connection.query("ALTER TABLE condos ADD COLUMN zip_code VARCHAR(20)");
|
||||
await connection.query("ALTER TABLE condos ADD COLUMN notes TEXT");
|
||||
}
|
||||
} catch(e) { console.warn("Condos migration warning:", e.message); }
|
||||
|
||||
|
||||
// 2. Families Table
|
||||
await connection.query(`
|
||||
@@ -90,6 +117,9 @@ const initDb = async () => {
|
||||
condo_id VARCHAR(36),
|
||||
name VARCHAR(255) NOT NULL,
|
||||
unit_number VARCHAR(50),
|
||||
stair VARCHAR(50),
|
||||
floor VARCHAR(50),
|
||||
notes TEXT,
|
||||
contact_email VARCHAR(255),
|
||||
custom_monthly_quota DECIMAL(10, 2) NULL,
|
||||
created_at ${TIMESTAMP_TYPE} DEFAULT CURRENT_TIMESTAMP,
|
||||
@@ -97,18 +127,22 @@ const initDb = async () => {
|
||||
)
|
||||
`);
|
||||
|
||||
// Migration for families: Add condo_id and custom_monthly_quota if missing
|
||||
// Migration for families: Add condo_id, custom_monthly_quota, stair, floor, notes
|
||||
try {
|
||||
let hasCondoId = false;
|
||||
let hasQuota = false;
|
||||
let hasStair = false;
|
||||
|
||||
if (DB_CLIENT === 'postgres') {
|
||||
const [cols] = await connection.query("SELECT column_name FROM information_schema.columns WHERE table_name='families'");
|
||||
hasCondoId = cols.some(c => c.column_name === 'condo_id');
|
||||
hasQuota = cols.some(c => c.column_name === 'custom_monthly_quota');
|
||||
hasStair = cols.some(c => c.column_name === 'stair');
|
||||
} else {
|
||||
const [cols] = await connection.query("SHOW COLUMNS FROM families");
|
||||
hasCondoId = cols.some(c => c.Field === 'condo_id');
|
||||
hasQuota = cols.some(c => c.Field === 'custom_monthly_quota');
|
||||
hasStair = cols.some(c => c.Field === 'stair');
|
||||
}
|
||||
|
||||
if (!hasCondoId) {
|
||||
@@ -119,6 +153,13 @@ const initDb = async () => {
|
||||
console.log('Migrating: Adding custom_monthly_quota to families...');
|
||||
await connection.query("ALTER TABLE families ADD COLUMN custom_monthly_quota DECIMAL(10, 2) NULL");
|
||||
}
|
||||
if (!hasStair) {
|
||||
console.log('Migrating: Adding extended fields to families...');
|
||||
await connection.query("ALTER TABLE families ADD COLUMN stair VARCHAR(50)");
|
||||
await connection.query("ALTER TABLE families ADD COLUMN floor VARCHAR(50)");
|
||||
await connection.query("ALTER TABLE families ADD COLUMN notes TEXT");
|
||||
}
|
||||
|
||||
} catch(e) { console.warn("Families migration warning:", e.message); }
|
||||
|
||||
// 3. Payments Table
|
||||
@@ -156,6 +197,7 @@ const initDb = async () => {
|
||||
await connection.query(`
|
||||
CREATE TABLE IF NOT EXISTS alerts (
|
||||
id VARCHAR(36) PRIMARY KEY,
|
||||
condo_id VARCHAR(36) NULL,
|
||||
subject VARCHAR(255) NOT NULL,
|
||||
body TEXT,
|
||||
days_offset INT DEFAULT 1,
|
||||
@@ -163,10 +205,29 @@ const initDb = async () => {
|
||||
send_hour INT DEFAULT 9,
|
||||
active BOOLEAN DEFAULT TRUE,
|
||||
last_sent ${TIMESTAMP_TYPE} NULL,
|
||||
created_at ${TIMESTAMP_TYPE} DEFAULT CURRENT_TIMESTAMP
|
||||
created_at ${TIMESTAMP_TYPE} DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (condo_id) REFERENCES condos(id) ON DELETE CASCADE
|
||||
)
|
||||
`);
|
||||
|
||||
// Migration for alerts: Add condo_id if missing
|
||||
try {
|
||||
let hasCondoId = false;
|
||||
if (DB_CLIENT === 'postgres') {
|
||||
const [cols] = await connection.query("SELECT column_name FROM information_schema.columns WHERE table_name='alerts'");
|
||||
hasCondoId = cols.some(c => c.column_name === 'condo_id');
|
||||
} else {
|
||||
const [cols] = await connection.query("SHOW COLUMNS FROM alerts");
|
||||
hasCondoId = cols.some(c => c.Field === 'condo_id');
|
||||
}
|
||||
|
||||
if (!hasCondoId) {
|
||||
console.log('Migrating: Adding condo_id to alerts...');
|
||||
await connection.query("ALTER TABLE alerts ADD COLUMN condo_id VARCHAR(36)");
|
||||
await connection.query("ALTER TABLE alerts ADD CONSTRAINT fk_alerts_condo FOREIGN KEY (condo_id) REFERENCES condos(id) ON DELETE CASCADE");
|
||||
}
|
||||
} catch(e) { console.warn("Alerts migration warning:", e.message); }
|
||||
|
||||
// 6. Notices Table
|
||||
await connection.query(`
|
||||
CREATE TABLE IF NOT EXISTS notices (
|
||||
|
||||
Reference in New Issue
Block a user