PSA/server/migrations/20250916000002_add_country_flags.cjs
Hermes 284313f908
Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Initial import of AlgaPSA codebase from PSA server
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz

Source: /opt/alga-psa on psa.joliet.tech
2026-06-22 16:12:17 -05:00

338 lines
11 KiB
JavaScript

/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
exports.up = async function(knex) {
// Add flag_emoji column to countries table
await knex.schema.alterTable('countries', function(table) {
table.string('flag_emoji', 10);
});
// Add flag emojis for all countries
const flagUpdates = [
// A
['AD', '🇦🇩'], // Andorra
['AE', '🇦🇪'], // United Arab Emirates
['AF', '🇦🇫'], // Afghanistan
['AG', '🇦🇬'], // Antigua and Barbuda
['AI', '🇦🇮'], // Anguilla
['AL', '🇦🇱'], // Albania
['AM', '🇦🇲'], // Armenia
['AO', '🇦🇴'], // Angola
['AQ', '🇦🇶'], // Antarctica
['AR', '🇦🇷'], // Argentina
['AS', '🇦🇸'], // American Samoa
['AT', '🇦🇹'], // Austria
['AU', '🇦🇺'], // Australia
['AW', '🇦🇼'], // Aruba
['AX', '🇦🇽'], // Åland Islands
['AZ', '🇦🇿'], // Azerbaijan
// B
['BA', '🇧🇦'], // Bosnia and Herzegovina
['BB', '🇧🇧'], // Barbados
['BD', '🇧🇩'], // Bangladesh
['BE', '🇧🇪'], // Belgium
['BF', '🇧🇫'], // Burkina Faso
['BG', '🇧🇬'], // Bulgaria
['BH', '🇧🇭'], // Bahrain
['BI', '🇧🇮'], // Burundi
['BJ', '🇧🇯'], // Benin
['BL', '🇧🇱'], // Saint Barthélemy
['BM', '🇧🇲'], // Bermuda
['BN', '🇧🇳'], // Brunei Darussalam
['BO', '🇧🇴'], // Bolivia
['BQ', '🇧🇶'], // Bonaire, Sint Eustatius and Saba
['BR', '🇧🇷'], // Brazil
['BS', '🇧🇸'], // Bahamas
['BT', '🇧🇹'], // Bhutan
['BV', '🇧🇻'], // Bouvet Island
['BW', '🇧🇼'], // Botswana
['BY', '🇧🇾'], // Belarus
['BZ', '🇧🇿'], // Belize
// C
['CA', '🇨🇦'], // Canada
['CC', '🇨🇨'], // Cocos (Keeling) Islands
['CD', '🇨🇩'], // Congo, Democratic Republic of the
['CF', '🇨🇫'], // Central African Republic
['CG', '🇨🇬'], // Congo
['CH', '🇨🇭'], // Switzerland
['CI', '🇨🇮'], // Côte d'Ivoire
['CK', '🇨🇰'], // Cook Islands
['CL', '🇨🇱'], // Chile
['CM', '🇨🇲'], // Cameroon
['CN', '🇨🇳'], // China
['CO', '🇨🇴'], // Colombia
['CR', '🇨🇷'], // Costa Rica
['CU', '🇨🇺'], // Cuba
['CV', '🇨🇻'], // Cabo Verde
['CW', '🇨🇼'], // Curaçao
['CX', '🇨🇽'], // Christmas Island
['CY', '🇨🇾'], // Cyprus
['CZ', '🇨🇿'], // Czech Republic
// D
['DE', '🇩🇪'], // Germany
['DJ', '🇩🇯'], // Djibouti
['DK', '🇩🇰'], // Denmark
['DM', '🇩🇲'], // Dominica
['DO', '🇩🇴'], // Dominican Republic
['DZ', '🇩🇿'], // Algeria
// E
['EC', '🇪🇨'], // Ecuador
['EE', '🇪🇪'], // Estonia
['EG', '🇪🇬'], // Egypt
['EH', '🇪🇭'], // Western Sahara
['ER', '🇪🇷'], // Eritrea
['ES', '🇪🇸'], // Spain
['ET', '🇪🇹'], // Ethiopia
// F
['FI', '🇫🇮'], // Finland
['FJ', '🇫🇯'], // Fiji
['FK', '🇫🇰'], // Falkland Islands (Malvinas)
['FM', '🇫🇲'], // Micronesia, Federated States of
['FO', '🇫🇴'], // Faroe Islands
['FR', '🇫🇷'], // France
// G
['GA', '🇬🇦'], // Gabon
['GB', '🇬🇧'], // United Kingdom
['GD', '🇬🇩'], // Grenada
['GE', '🇬🇪'], // Georgia
['GF', '🇬🇫'], // French Guiana
['GG', '🇬🇬'], // Guernsey
['GH', '🇬🇭'], // Ghana
['GI', '🇬🇮'], // Gibraltar
['GL', '🇬🇱'], // Greenland
['GM', '🇬🇲'], // Gambia
['GN', '🇬🇳'], // Guinea
['GP', '🇬🇵'], // Guadeloupe
['GQ', '🇬🇶'], // Equatorial Guinea
['GR', '🇬🇷'], // Greece
['GS', '🇬🇸'], // South Georgia and the South Sandwich Islands
['GT', '🇬🇹'], // Guatemala
['GU', '🇬🇺'], // Guam
['GW', '🇬🇼'], // Guinea-Bissau
['GY', '🇬🇾'], // Guyana
// H
['HK', '🇭🇰'], // Hong Kong
['HM', '🇭🇲'], // Heard Island and McDonald Islands
['HN', '🇭🇳'], // Honduras
['HR', '🇭🇷'], // Croatia
['HT', '🇭🇹'], // Haiti
['HU', '🇭🇺'], // Hungary
// I
['ID', '🇮🇩'], // Indonesia
['IE', '🇮🇪'], // Ireland
['IL', '🇮🇱'], // Israel
['IM', '🇮🇲'], // Isle of Man
['IN', '🇮🇳'], // India
['IO', '🇮🇴'], // British Indian Ocean Territory
['IQ', '🇮🇶'], // Iraq
['IR', '🇮🇷'], // Iran
['IS', '🇮🇸'], // Iceland
['IT', '🇮🇹'], // Italy
// J
['JE', '🇯🇪'], // Jersey
['JM', '🇯🇲'], // Jamaica
['JO', '🇯🇴'], // Jordan
['JP', '🇯🇵'], // Japan
// K
['KE', '🇰🇪'], // Kenya
['KG', '🇰🇬'], // Kyrgyzstan
['KH', '🇰🇭'], // Cambodia
['KI', '🇰🇮'], // Kiribati
['KM', '🇰🇲'], // Comoros
['KN', '🇰🇳'], // Saint Kitts and Nevis
['KP', '🇰🇵'], // Korea, Democratic People's Republic of
['KR', '🇰🇷'], // Korea, Republic of
['KW', '🇰🇼'], // Kuwait
['KY', '🇰🇾'], // Cayman Islands
['KZ', '🇰🇿'], // Kazakhstan
// L
['LA', '🇱🇦'], // Lao People's Democratic Republic
['LB', '🇱🇧'], // Lebanon
['LC', '🇱🇨'], // Saint Lucia
['LI', '🇱🇮'], // Liechtenstein
['LK', '🇱🇰'], // Sri Lanka
['LR', '🇱🇷'], // Liberia
['LS', '🇱🇸'], // Lesotho
['LT', '🇱🇹'], // Lithuania
['LU', '🇱🇺'], // Luxembourg
['LV', '🇱🇻'], // Latvia
['LY', '🇱🇾'], // Libya
// M
['MA', '🇲🇦'], // Morocco
['MC', '🇲🇨'], // Monaco
['MD', '🇲🇩'], // Moldova, Republic of
['ME', '🇲🇪'], // Montenegro
['MF', '🇲🇫'], // Saint Martin (French part)
['MG', '🇲🇬'], // Madagascar
['MH', '🇲🇭'], // Marshall Islands
['MK', '🇲🇰'], // North Macedonia
['ML', '🇲🇱'], // Mali
['MM', '🇲🇲'], // Myanmar
['MN', '🇲🇳'], // Mongolia
['MO', '🇲🇴'], // Macao
['MP', '🇲🇵'], // Northern Mariana Islands
['MQ', '🇲🇶'], // Martinique
['MR', '🇲🇷'], // Mauritania
['MS', '🇲🇸'], // Montserrat
['MT', '🇲🇹'], // Malta
['MU', '🇲🇺'], // Mauritius
['MV', '🇲🇻'], // Maldives
['MW', '🇲🇼'], // Malawi
['MX', '🇲🇽'], // Mexico
['MY', '🇲🇾'], // Malaysia
['MZ', '🇲🇿'], // Mozambique
// N
['NA', '🇳🇦'], // Namibia
['NC', '🇳🇨'], // New Caledonia
['NE', '🇳🇪'], // Niger
['NF', '🇳🇫'], // Norfolk Island
['NG', '🇳🇬'], // Nigeria
['NI', '🇳🇮'], // Nicaragua
['NL', '🇳🇱'], // Netherlands
['NO', '🇳🇴'], // Norway
['NP', '🇳🇵'], // Nepal
['NR', '🇳🇷'], // Nauru
['NU', '🇳🇺'], // Niue
['NZ', '🇳🇿'], // New Zealand
// O
['OM', '🇴🇲'], // Oman
// P
['PA', '🇵🇦'], // Panama
['PE', '🇵🇪'], // Peru
['PF', '🇵🇫'], // French Polynesia
['PG', '🇵🇬'], // Papua New Guinea
['PH', '🇵🇭'], // Philippines
['PK', '🇵🇰'], // Pakistan
['PL', '🇵🇱'], // Poland
['PM', '🇵🇲'], // Saint Pierre and Miquelon
['PN', '🇵🇳'], // Pitcairn
['PR', '🇵🇷'], // Puerto Rico
['PS', '🇵🇸'], // Palestine, State of
['PT', '🇵🇹'], // Portugal
['PW', '🇵🇼'], // Palau
['PY', '🇵🇾'], // Paraguay
// Q
['QA', '🇶🇦'], // Qatar
// R
['RE', '🇷🇪'], // Réunion
['RO', '🇷🇴'], // Romania
['RS', '🇷🇸'], // Serbia
['RU', '🇷🇺'], // Russian Federation
['RW', '🇷🇼'], // Rwanda
// S
['SA', '🇸🇦'], // Saudi Arabia
['SB', '🇸🇧'], // Solomon Islands
['SC', '🇸🇨'], // Seychelles
['SD', '🇸🇩'], // Sudan
['SE', '🇸🇪'], // Sweden
['SG', '🇸🇬'], // Singapore
['SH', '🇸🇭'], // Saint Helena, Ascension and Tristan da Cunha
['SI', '🇸🇮'], // Slovenia
['SJ', '🇸🇯'], // Svalbard and Jan Mayen
['SK', '🇸🇰'], // Slovakia
['SL', '🇸🇱'], // Sierra Leone
['SM', '🇸🇲'], // San Marino
['SN', '🇸🇳'], // Senegal
['SO', '🇸🇴'], // Somalia
['SR', '🇸🇷'], // Suriname
['SS', '🇸🇸'], // South Sudan
['ST', '🇸🇹'], // Sao Tome and Principe
['SV', '🇸🇻'], // El Salvador
['SX', '🇸🇽'], // Sint Maarten (Dutch part)
['SY', '🇸🇾'], // Syrian Arab Republic
['SZ', '🇸🇿'], // Eswatini
// T
['TC', '🇹🇨'], // Turks and Caicos Islands
['TD', '🇹🇩'], // Chad
['TF', '🇹🇫'], // French Southern Territories
['TG', '🇹🇬'], // Togo
['TH', '🇹🇭'], // Thailand
['TJ', '🇹🇯'], // Tajikistan
['TK', '🇹🇰'], // Tokelau
['TL', '🇹🇱'], // Timor-Leste
['TM', '🇹🇲'], // Turkmenistan
['TN', '🇹🇳'], // Tunisia
['TO', '🇹🇴'], // Tonga
['TR', '🇹🇷'], // Turkey
['TT', '🇹🇹'], // Trinidad and Tobago
['TV', '🇹🇻'], // Tuvalu
['TW', '🇹🇼'], // Taiwan, Province of China
['TZ', '🇹🇿'], // Tanzania, United Republic of
// U
['UA', '🇺🇦'], // Ukraine
['UG', '🇺🇬'], // Uganda
['UM', '🇺🇲'], // United States Minor Outlying Islands
['US', '🇺🇸'], // United States
['UY', '🇺🇾'], // Uruguay
['UZ', '🇺🇿'], // Uzbekistan
// V
['VA', '🇻🇦'], // Holy See (Vatican City State)
['VC', '🇻🇨'], // Saint Vincent and the Grenadines
['VE', '🇻🇪'], // Venezuela
['VG', '🇻🇬'], // Virgin Islands, British
['VI', '🇻🇮'], // Virgin Islands, U.S.
['VN', '🇻🇳'], // Viet Nam
['VU', '🇻🇺'], // Vanuatu
// W
['WF', '🇼🇫'], // Wallis and Futuna
['WS', '🇼🇸'], // Samoa
// Y
['YE', '🇾🇪'], // Yemen
['YT', '🇾🇹'], // Mayotte
// Z
['ZA', '🇿🇦'], // South Africa
['ZM', '🇿🇲'], // Zambia
['ZW', '🇿🇼'], // Zimbabwe
];
// Update countries with flag emojis using bulk UPDATE with CASE WHEN
// Note: countries is a reference table (shared across all tenants), so no tenant filter needed
if (flagUpdates.length > 0) {
const codes = flagUpdates.map(([code]) => code);
const caseWhen = flagUpdates
.map(([code, emoji]) => `WHEN '${code}' THEN '${emoji}'`)
.join(' ');
await knex.raw(`
UPDATE countries
SET flag_emoji = CASE code ${caseWhen} END
WHERE code IN (${codes.map(code => `'${code}'`).join(', ')})
`);
}
};
/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
exports.down = async function(knex) {
// Remove flag_emoji column
await knex.schema.alterTable('countries', function(table) {
table.dropColumn('flag_emoji');
});
};