Update Whatsapp credentials
This commit is contained in:
parent
6718b50efb
commit
de9710c23d
@ -58,6 +58,16 @@ spec:
|
|||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: {{ include "invy.fullname" . }}-secrets
|
name: {{ include "invy.fullname" . }}-secrets
|
||||||
key: google-client-secret
|
key: google-client-secret
|
||||||
|
- name: WHATSAPP_ACCESS_TOKEN
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ include "invy.fullname" . }}-secrets
|
||||||
|
key: whatsapp-access-token
|
||||||
|
- name: WHATSAPP_PHONE_NUMBER_ID
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ include "invy.fullname" . }}-secrets
|
||||||
|
key: whatsapp-phone-number-id
|
||||||
{{- range $key, $value := .Values.backend.env }}
|
{{- range $key, $value := .Values.backend.env }}
|
||||||
- name: {{ $key }}
|
- name: {{ $key }}
|
||||||
value: {{ $value | quote }}
|
value: {{ $value | quote }}
|
||||||
|
|||||||
@ -7,39 +7,120 @@ metadata:
|
|||||||
app.kubernetes.io/component: database
|
app.kubernetes.io/component: database
|
||||||
data:
|
data:
|
||||||
init.sql: |
|
init.sql: |
|
||||||
-- Wedding Guest List Database Schema
|
-- Invy — Full Database Init Schema
|
||||||
|
-- Runs only on a FRESH (empty) data directory.
|
||||||
|
-- For existing production DBs run migrate_production.sql manually.
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS guests (
|
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
||||||
id SERIAL PRIMARY KEY,
|
|
||||||
first_name VARCHAR(100) NOT NULL,
|
-- ── Users ──────────────────────────────────────────────────────────────
|
||||||
last_name VARCHAR(100) NOT NULL,
|
CREATE TABLE IF NOT EXISTS users (
|
||||||
email VARCHAR(255) UNIQUE,
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||||
phone_number VARCHAR(50),
|
email TEXT NOT NULL UNIQUE,
|
||||||
rsvp_status VARCHAR(20) DEFAULT 'pending' CHECK (rsvp_status IN ('pending', 'accepted', 'declined')),
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
||||||
meal_preference VARCHAR(50),
|
|
||||||
has_plus_one BOOLEAN DEFAULT FALSE,
|
|
||||||
plus_one_name VARCHAR(200),
|
|
||||||
owner VARCHAR(50),
|
|
||||||
notes TEXT,
|
|
||||||
table_number INTEGER,
|
|
||||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
||||||
updated_at TIMESTAMP WITH TIME ZONE
|
|
||||||
);
|
);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);
|
||||||
|
|
||||||
-- Create indexes for better query performance
|
-- ── Events ─────────────────────────────────────────────────────────────
|
||||||
CREATE INDEX IF NOT EXISTS idx_guests_email ON guests(email);
|
CREATE TABLE IF NOT EXISTS events (
|
||||||
CREATE INDEX IF NOT EXISTS idx_guests_rsvp_status ON guests(rsvp_status);
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||||
CREATE INDEX IF NOT EXISTS idx_guests_last_name ON guests(last_name);
|
name TEXT NOT NULL,
|
||||||
CREATE INDEX IF NOT EXISTS idx_guests_owner ON guests(owner);
|
date TIMESTAMP WITH TIME ZONE,
|
||||||
|
location TEXT,
|
||||||
|
partner1_name TEXT,
|
||||||
|
partner2_name TEXT,
|
||||||
|
venue TEXT,
|
||||||
|
event_time TEXT,
|
||||||
|
guest_link TEXT,
|
||||||
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
||||||
|
);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_events_created_at ON events(created_at);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_events_guest_link ON events(guest_link);
|
||||||
|
|
||||||
-- Create trigger to update updated_at timestamp
|
-- ── Event members (authorization) ──────────────────────────────────────
|
||||||
CREATE OR REPLACE FUNCTION update_updated_at_column()
|
CREATE TABLE IF NOT EXISTS event_members (
|
||||||
RETURNS TRIGGER AS $$
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||||
|
event_id UUID NOT NULL REFERENCES events(id) ON DELETE CASCADE,
|
||||||
|
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||||
|
role TEXT NOT NULL DEFAULT 'admin'
|
||||||
|
CHECK (role IN ('admin', 'editor', 'viewer')),
|
||||||
|
display_name TEXT,
|
||||||
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
UNIQUE(event_id, user_id)
|
||||||
|
);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_event_members_event_id ON event_members(event_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_event_members_user_id ON event_members(user_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_event_members_event_user ON event_members(event_id, user_id);
|
||||||
|
|
||||||
|
-- ── Guests v2 ──────────────────────────────────────────────────────────
|
||||||
|
CREATE TABLE IF NOT EXISTS guests_v2 (
|
||||||
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||||
|
event_id UUID NOT NULL REFERENCES events(id) ON DELETE CASCADE,
|
||||||
|
added_by_user_id UUID NOT NULL REFERENCES users(id),
|
||||||
|
|
||||||
|
first_name TEXT NOT NULL,
|
||||||
|
last_name TEXT NOT NULL DEFAULT '',
|
||||||
|
email TEXT,
|
||||||
|
phone TEXT,
|
||||||
|
phone_number TEXT,
|
||||||
|
|
||||||
|
rsvp_status TEXT NOT NULL DEFAULT 'invited'
|
||||||
|
CHECK (rsvp_status IN ('invited', 'confirmed', 'declined')),
|
||||||
|
meal_preference TEXT,
|
||||||
|
|
||||||
|
has_plus_one BOOLEAN DEFAULT FALSE,
|
||||||
|
plus_one_name TEXT,
|
||||||
|
|
||||||
|
table_number TEXT,
|
||||||
|
side TEXT,
|
||||||
|
|
||||||
|
owner_email TEXT,
|
||||||
|
source TEXT NOT NULL DEFAULT 'manual'
|
||||||
|
CHECK (source IN ('google', 'manual', 'self-service')),
|
||||||
|
|
||||||
|
notes TEXT,
|
||||||
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
||||||
|
);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_guests_v2_event_id ON guests_v2(event_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_guests_v2_added_by ON guests_v2(added_by_user_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_guests_v2_phone_number ON guests_v2(phone_number);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_guests_v2_event_phone ON guests_v2(event_id, phone_number);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_guests_v2_event_status ON guests_v2(event_id, rsvp_status);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_guests_v2_owner_email ON guests_v2(event_id, owner_email);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_guests_v2_source ON guests_v2(event_id, source);
|
||||||
|
|
||||||
|
-- ── RSVP tokens ────────────────────────────────────────────────────────
|
||||||
|
CREATE TABLE IF NOT EXISTS rsvp_tokens (
|
||||||
|
token TEXT PRIMARY KEY,
|
||||||
|
event_id UUID NOT NULL REFERENCES events(id) ON DELETE CASCADE,
|
||||||
|
guest_id UUID REFERENCES guests_v2(id) ON DELETE SET NULL,
|
||||||
|
phone TEXT,
|
||||||
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
expires_at TIMESTAMP WITH TIME ZONE,
|
||||||
|
used_at TIMESTAMP WITH TIME ZONE
|
||||||
|
);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_rsvp_tokens_event_id ON rsvp_tokens(event_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_rsvp_tokens_guest_id ON rsvp_tokens(guest_id);
|
||||||
|
|
||||||
|
-- ── updated_at trigger ─────────────────────────────────────────────────
|
||||||
|
CREATE OR REPLACE FUNCTION _update_updated_at()
|
||||||
|
RETURNS TRIGGER LANGUAGE plpgsql AS $$
|
||||||
BEGIN
|
BEGIN
|
||||||
NEW.updated_at = CURRENT_TIMESTAMP;
|
NEW.updated_at = CURRENT_TIMESTAMP;
|
||||||
RETURN NEW;
|
RETURN NEW;
|
||||||
END;
|
END;
|
||||||
$$ language 'plpgsql';
|
$$;
|
||||||
|
|
||||||
CREATE TRIGGER update_guests_updated_at BEFORE UPDATE ON guests
|
DO $$ BEGIN
|
||||||
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
CREATE TRIGGER trg_guests_v2_updated_at
|
||||||
|
BEFORE UPDATE ON guests_v2
|
||||||
|
FOR EACH ROW EXECUTE FUNCTION _update_updated_at();
|
||||||
|
EXCEPTION WHEN duplicate_object THEN NULL; END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
CREATE TRIGGER trg_events_updated_at
|
||||||
|
BEFORE UPDATE ON events
|
||||||
|
FOR EACH ROW EXECUTE FUNCTION _update_updated_at();
|
||||||
|
EXCEPTION WHEN duplicate_object THEN NULL; END $$;
|
||||||
|
|||||||
@ -12,3 +12,5 @@ stringData:
|
|||||||
database-url: "postgresql://{{ .Values.postgres.user }}:{{ .Values.postgres.password }}@{{ include "invy.fullname" . }}-db:{{ .Values.postgres.port }}/{{ .Values.postgres.database }}"
|
database-url: "postgresql://{{ .Values.postgres.user }}:{{ .Values.postgres.password }}@{{ include "invy.fullname" . }}-db:{{ .Values.postgres.port }}/{{ .Values.postgres.database }}"
|
||||||
google-client-id: {{ .Values.backend.googleClientId | quote }}
|
google-client-id: {{ .Values.backend.googleClientId | quote }}
|
||||||
google-client-secret: {{ .Values.backend.googleClientSecret | quote }}
|
google-client-secret: {{ .Values.backend.googleClientSecret | quote }}
|
||||||
|
whatsapp-access-token: {{ .Values.backend.whatsappAccessToken | quote }}
|
||||||
|
whatsapp-phone-number-id: {{ .Values.backend.whatsappPhoneNumberId | quote }}
|
||||||
|
|||||||
@ -33,6 +33,10 @@ backend:
|
|||||||
googleClientId: "YOUR_GOOGLE_CLIENT_ID"
|
googleClientId: "YOUR_GOOGLE_CLIENT_ID"
|
||||||
googleClientSecret: "YOUR_GOOGLE_CLIENT_SECRET"
|
googleClientSecret: "YOUR_GOOGLE_CLIENT_SECRET"
|
||||||
|
|
||||||
|
# WhatsApp Cloud API credentials (set these values!)
|
||||||
|
whatsappAccessToken: "YOUR_WHATSAPP_ACCESS_TOKEN"
|
||||||
|
whatsappPhoneNumberId: "YOUR_WHATSAPP_PHONE_NUMBER_ID"
|
||||||
|
|
||||||
ingress:
|
ingress:
|
||||||
enabled: true
|
enabled: true
|
||||||
className: "traefik"
|
className: "traefik"
|
||||||
|
|||||||
@ -27,6 +27,9 @@ backend:
|
|||||||
# Google OAuth credentials
|
# Google OAuth credentials
|
||||||
googleClientId: "97702229450-ivi5rvj0drai08k5svm7sekqdijj6953.apps.googleusercontent.com"
|
googleClientId: "97702229450-ivi5rvj0drai08k5svm7sekqdijj6953.apps.googleusercontent.com"
|
||||||
googleClientSecret: "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"
|
googleClientSecret: "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"
|
||||||
|
# WhatsApp Cloud API credentials
|
||||||
|
whatsappAccessToken: "EAAMdmYX7DJUBQxcw1WmKVW8jKQalkPiCb7VZAQgh1mN69b6hNkPxAZAM7XRcZB0rKC6H77VxQ8q2pfEMaGvGpVEXALs4rq3lxLQJfAjfxyIJJFc2pIvJ4PEBTHpJQM3TxS6Oaz835rIGMk3exzvZA0ZCJp5YaLtdvZCeHmnn0QVluoZAfcNGlz9lUbcl7oHWOZB123rJDEaL6UL6uoRim4pCpKAl1J5ZAZB4kgEJAFhLOMsIZBZBQazkxbUvHKqtjxwtJJ5KmecxNGNDkCQXcALs4jElLkQKtQZDZD"
|
||||||
|
whatsappPhoneNumberId: "1028674740318926"
|
||||||
ingress:
|
ingress:
|
||||||
enabled: true
|
enabled: true
|
||||||
className: "traefik"
|
className: "traefik"
|
||||||
@ -50,7 +53,7 @@ frontend:
|
|||||||
image:
|
image:
|
||||||
repository: harbor.dvirlabs.com/my-apps/invy-frontend
|
repository: harbor.dvirlabs.com/my-apps/invy-frontend
|
||||||
pullPolicy: IfNotPresent
|
pullPolicy: IfNotPresent
|
||||||
tag: "master-e0169b8"
|
tag: "master-d4270ea"
|
||||||
service:
|
service:
|
||||||
type: ClusterIP
|
type: ClusterIP
|
||||||
port: 80
|
port: 80
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user