fix(kubernetes): support localized template schema
Update migration, runtime grants, sandbox seed, and live upgrade guidance for the normalized email template schema. Ref: IT-1601
This commit is contained in:
@@ -18,7 +18,8 @@ import time
|
||||
|
||||
NAMESPACE = "shared-notification"
|
||||
MANAGED = "hrynco-shared-notification"
|
||||
MIGRATIONS = ["20260501214629_InitialCreate", "20260502154249_PendingChanges"]
|
||||
MIGRATIONS = ["20260501214629_InitialCreate", "20260502154249_PendingChanges",
|
||||
"20261017072410_EmailTemplateLocalizations"]
|
||||
IMAGE = re.compile(r"registry\.hrynco\.com/[a-z0-9._/-]+@sha256:[a-f0-9]{64}$")
|
||||
SHA = re.compile(r"[a-f0-9]{64}$")
|
||||
PRODUCTION_RESULT_QUEUE = "invemory.production.notification-results"
|
||||
@@ -53,7 +54,8 @@ REVOKE ALL ON DATABASE notification_service FROM PUBLIC;
|
||||
GRANT CONNECT ON DATABASE notification_service TO notification_runtime;
|
||||
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
|
||||
GRANT USAGE ON SCHEMA public TO notification_runtime;
|
||||
GRANT SELECT, INSERT, UPDATE, DELETE ON email_channels, email_templates, email_channel_usage TO notification_runtime;
|
||||
GRANT SELECT, INSERT, UPDATE, DELETE ON email_channels, email_templates, email_channel_usage,
|
||||
services, service_languages, email_template_definitions TO notification_runtime;
|
||||
'''
|
||||
|
||||
SANDBOX = r'''
|
||||
@@ -62,11 +64,24 @@ INSERT INTO email_channels (id, service_name, priority, provider_type, settings,
|
||||
SELECT gen_random_uuid(), 'Invemory.Staging.Sandbox', 1, 1,
|
||||
'{"EmailChannelType":1,"Host":"mailpit","Port":1025,"Username":"","Password":"","UseSsl":false,"FromEmail":"no-reply@local.hrynco.test","FromName":"Invemory Sandbox"}'::jsonb, 90, true, now()
|
||||
WHERE NOT EXISTS (SELECT 1 FROM email_channels WHERE service_name = 'Invemory.Staging.Sandbox');
|
||||
INSERT INTO email_templates (id, service_name, key, language_code, subject, html_body, text_body, variables, created)
|
||||
VALUES (gen_random_uuid(), 'Invemory.Staging.Sandbox', 'TestEmail', 'en', 'Test notification',
|
||||
'<p>Hello {{RecipientName}},</p><p>{{Message}}</p>', 'Hello {{RecipientName}}, {{Message}}',
|
||||
'[{"name":"RecipientName","required":true},{"name":"Message","required":true}]'::jsonb, now())
|
||||
ON CONFLICT (service_name, key, language_code) DO NOTHING;
|
||||
INSERT INTO services (id, name, revision, created)
|
||||
VALUES (gen_random_uuid(), 'Invemory.Staging.Sandbox', gen_random_uuid(), now())
|
||||
ON CONFLICT (name) DO NOTHING;
|
||||
INSERT INTO service_languages (id, service_id, code, created)
|
||||
SELECT gen_random_uuid(), s.id, 'en', now() FROM services s WHERE s.name = 'Invemory.Staging.Sandbox'
|
||||
ON CONFLICT (service_id, code) DO NOTHING;
|
||||
INSERT INTO email_template_definitions (id, service_id, key, revision, variables, created)
|
||||
SELECT gen_random_uuid(), s.id, 'TestEmail', gen_random_uuid(),
|
||||
'[{"name":"RecipientName","required":true},{"name":"Message","required":true}]'::jsonb, now()
|
||||
FROM services s WHERE s.name = 'Invemory.Staging.Sandbox'
|
||||
ON CONFLICT (service_id, key) DO NOTHING;
|
||||
INSERT INTO email_templates (id, definition_id, service_id, service_language_id, subject, html_body, text_body, created)
|
||||
SELECT gen_random_uuid(), d.id, s.id, l.id, 'Test notification',
|
||||
'<p>Hello {{RecipientName}},</p><p>{{Message}}</p>', 'Hello {{RecipientName}}, {{Message}}', now()
|
||||
FROM services s JOIN service_languages l ON l.service_id = s.id AND l.code = 'en'
|
||||
JOIN email_template_definitions d ON d.service_id = s.id AND d.key = 'TestEmail'
|
||||
WHERE s.name = 'Invemory.Staging.Sandbox'
|
||||
ON CONFLICT (definition_id, service_language_id) DO NOTHING;
|
||||
COMMIT;
|
||||
'''
|
||||
|
||||
@@ -75,9 +90,12 @@ SANDBOX_CHECK = """SELECT
|
||||
settings->>'Host' = 'mailpit' AND settings->>'Port' = '1025' AND
|
||||
settings->>'UseSsl' = 'false' AND settings->>'Username' = '' AND settings->>'Password' = '')
|
||||
FROM email_channels WHERE service_name = 'Invemory.Staging.Sandbox') AND
|
||||
EXISTS (SELECT 1 FROM email_templates WHERE service_name = 'Invemory.Staging.Sandbox'
|
||||
AND key = 'TestEmail' AND language_code = 'en'
|
||||
AND variables @> '[{"name":"RecipientName","required":true},{"name":"Message","required":true}]'::jsonb)"""
|
||||
EXISTS (SELECT 1 FROM email_templates t
|
||||
JOIN email_template_definitions d ON d.id = t.definition_id AND d.service_id = t.service_id
|
||||
JOIN service_languages l ON l.id = t.service_language_id AND l.service_id = t.service_id
|
||||
JOIN services s ON s.id = t.service_id
|
||||
WHERE s.name = 'Invemory.Staging.Sandbox' AND d.key = 'TestEmail' AND l.code = 'en'
|
||||
AND d.variables @> '[{"name":"RecipientName","required":true},{"name":"Message","required":true}]'::jsonb)"""
|
||||
|
||||
|
||||
def read_json(path):
|
||||
@@ -640,7 +658,7 @@ def deploy(cluster, config, artifacts, args):
|
||||
except Exception:
|
||||
cluster.scale("worker", 0)
|
||||
raise
|
||||
print("deployment complete; SMTP is sandbox-only, Invemory publisher cutover is separate")
|
||||
print("deployment complete; verify configured SMTP channels and publisher routes separately")
|
||||
|
||||
|
||||
def main(argv=None):
|
||||
|
||||
Reference in New Issue
Block a user