Update deployment: fixed backend entities loading and nginx proxy

This commit is contained in:
Donat Magda
2025-11-26 00:17:58 +01:00
parent 1c1792e7e1
commit d53fe4bb3e
4 changed files with 181 additions and 237 deletions
+1 -1
View File
@@ -22,7 +22,7 @@ server {
# API proxy to backend # API proxy to backend
location /api/ { location /api/ {
proxy_pass http://backend:3000/; proxy_pass http://backend:3000;
proxy_http_version 1.1; proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade'; proxy_set_header Connection 'upgrade';
Binary file not shown.
Binary file not shown.
+180 -236
View File
@@ -1,236 +1,180 @@
-- SerpentRace Database Schema -- This script was generated by the ERD tool in pgAdmin 4.
-- Generated from TypeORM Entity Aggregates -- Please log an issue at https://github.com/pgadmin-org/pgadmin4/issues/new/choose if you find any bugs, including reproduction steps.
-- This file creates the complete database schema without initial data BEGIN;
-- Enable UUID extension -- ===================================================================
CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- STEP 1: Enable Required Extensions
-- ===================================================================
-- Create Users table CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE "Users" (
"id" UUID PRIMARY KEY DEFAULT uuid_generate_v4(), -- ===================================================================
"orgid" UUID NULL, -- STEP 2: Create Tables
"username" VARCHAR(100) UNIQUE NOT NULL, -- ===================================================================
"password" VARCHAR(255) NOT NULL,
"email" VARCHAR(255) UNIQUE NOT NULL, CREATE TABLE IF NOT EXISTS public."ChatArchives"
"fname" VARCHAR(100) NOT NULL, (
"lname" VARCHAR(100) NOT NULL, id uuid NOT NULL DEFAULT uuid_generate_v4(),
"token" VARCHAR(255) NULL, "chatId" uuid NOT NULL,
"TokenExpires" TIMESTAMP NULL, "archivedMessages" json NOT NULL,
"phone" VARCHAR(20) NULL, "archivedAt" timestamp without time zone NOT NULL,
"state" INTEGER NOT NULL DEFAULT 0, "createDate" timestamp without time zone NOT NULL DEFAULT now(),
"regdate" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, "chatType" character varying(50) COLLATE pg_catalog."default" NOT NULL,
"updatedate" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, "chatName" character varying(255) COLLATE pg_catalog."default",
"Orglogindate" TIMESTAMP NULL "gameId" uuid,
); participants uuid[] NOT NULL,
CONSTRAINT "PK_fe62979fc2061d7afe278d3f14e" PRIMARY KEY (id)
-- Create Organizations table );
CREATE TABLE "Organizations" (
"id" UUID PRIMARY KEY DEFAULT uuid_generate_v4(), CREATE TABLE IF NOT EXISTS public."Chats"
"name" VARCHAR(255) NOT NULL, (
"contactfname" VARCHAR(100) NOT NULL, id uuid NOT NULL DEFAULT uuid_generate_v4(),
"contactlname" VARCHAR(100) NOT NULL, type character varying(50) COLLATE pg_catalog."default" NOT NULL DEFAULT 'direct'::character varying,
"contactphone" VARCHAR(20) NOT NULL, name character varying(255) COLLATE pg_catalog."default",
"contactemail" VARCHAR(255) NOT NULL, "gameId" uuid,
"state" INTEGER NOT NULL DEFAULT 0, "createdBy" uuid,
"regdate" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, users uuid[] NOT NULL,
"updatedate" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, messages json NOT NULL DEFAULT '[]'::json,
"url" VARCHAR(500) NULL, "lastActivity" timestamp without time zone,
"userinorg" INTEGER NOT NULL DEFAULT 0, "createDate" timestamp without time zone NOT NULL DEFAULT now(),
"maxOrganizationalDecks" INTEGER NULL "updateDate" timestamp without time zone NOT NULL DEFAULT now(),
); state integer NOT NULL DEFAULT 0,
"archiveDate" timestamp without time zone,
-- Create Decks table CONSTRAINT "PK_64c36c2b8d86a0d5de4cf64de8d" PRIMARY KEY (id)
CREATE TABLE "Decks" ( );
"id" UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
"name" VARCHAR(255) NOT NULL, CREATE TABLE IF NOT EXISTS public."Contacts"
"type" INTEGER NOT NULL, (
"user_id" UUID NOT NULL, id uuid NOT NULL DEFAULT uuid_generate_v4(),
"creation_date" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, name character varying(255) COLLATE pg_catalog."default" NOT NULL,
"cards" JSONB NOT NULL DEFAULT '[]', email character varying(255) COLLATE pg_catalog."default" NOT NULL,
"played_number" INTEGER NOT NULL DEFAULT 0, userid uuid,
"ctype" INTEGER NOT NULL DEFAULT 0, type integer NOT NULL,
"update_date" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, txt text COLLATE pg_catalog."default" NOT NULL,
"state" INTEGER NOT NULL DEFAULT 0, state integer NOT NULL DEFAULT 0,
"organization_id" UUID NULL "createDate" timestamp without time zone NOT NULL DEFAULT now(),
); "updateDate" timestamp without time zone NOT NULL DEFAULT now(),
"adminResponse" text COLLATE pg_catalog."default",
-- Create Chats table "responseDate" timestamp without time zone,
CREATE TABLE "Chats" ( "respondedBy" uuid,
"id" UUID PRIMARY KEY DEFAULT uuid_generate_v4(), CONSTRAINT "PK_68782cec65c8eef577c62958273" PRIMARY KEY (id)
"type" VARCHAR(50) NOT NULL DEFAULT 'direct', );
"name" VARCHAR(255) NULL,
"gameId" UUID NULL, CREATE TABLE IF NOT EXISTS public."Decks"
"createdBy" UUID NULL, (
"users" UUID[] NOT NULL, id uuid NOT NULL DEFAULT uuid_generate_v4(),
"messages" JSONB NOT NULL DEFAULT '[]', name character varying(255) COLLATE pg_catalog."default" NOT NULL,
"lastActivity" TIMESTAMP NULL, type integer NOT NULL,
"createDate" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, user_id uuid NOT NULL,
"updateDate" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, creation_date timestamp without time zone NOT NULL DEFAULT now(),
"state" INTEGER NOT NULL DEFAULT 0, cards json NOT NULL,
"archiveDate" TIMESTAMP NULL played_number integer NOT NULL DEFAULT 0,
); ctype integer NOT NULL DEFAULT 0,
"updateDate" timestamp without time zone NOT NULL DEFAULT now(),
-- Create Contacts table state integer NOT NULL DEFAULT 0,
CREATE TABLE "Contacts" ( organization_id uuid,
"id" UUID PRIMARY KEY DEFAULT uuid_generate_v4(), CONSTRAINT "PK_001f26cb3ec39c1f25269943473" PRIMARY KEY (id)
"name" VARCHAR(255) NOT NULL, );
"email" VARCHAR(255) NOT NULL,
"userid" UUID NULL, CREATE TABLE IF NOT EXISTS public."Games"
"type" INTEGER NOT NULL, (
"txt" TEXT NOT NULL, id uuid NOT NULL DEFAULT uuid_generate_v4(),
"state" INTEGER NOT NULL DEFAULT 0, gamecode character varying(10) COLLATE pg_catalog."default" NOT NULL,
"createDate" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, maxplayers integer NOT NULL,
"updateDate" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, logintype integer NOT NULL DEFAULT 0,
"adminResponse" TEXT NULL, boardsize integer NOT NULL DEFAULT 50,
"responseDate" TIMESTAMP NULL, "createdBy" uuid NOT NULL,
"respondedBy" UUID NULL organizationid uuid,
); decks jsonb NOT NULL DEFAULT '[]'::jsonb,
playerids uuid[] NOT NULL DEFAULT '{}'::uuid[],
-- Create Games table "winnerId" uuid,
CREATE TABLE "Games" ( state integer NOT NULL DEFAULT 0,
"id" UUID PRIMARY KEY DEFAULT uuid_generate_v4(), "createDate" timestamp without time zone NOT NULL DEFAULT now(),
"gamecode" VARCHAR(10) UNIQUE NOT NULL, start_date timestamp without time zone,
"maxplayers" INTEGER NOT NULL, "finishDate" timestamp without time zone,
"logintype" INTEGER NOT NULL DEFAULT 0, "updateDate" timestamp without time zone NOT NULL DEFAULT now(),
"state" INTEGER NOT NULL DEFAULT 0, "organizationId" uuid,
"playerids" UUID[] NOT NULL DEFAULT '{}', CONSTRAINT "PK_1950492f583d31609c5e9fbbe12" PRIMARY KEY (id),
"decks" JSONB NOT NULL DEFAULT '[]', CONSTRAINT "UQ_9d52c646079cbe6f242a85c5c41" UNIQUE (gamecode)
"boardsize" INTEGER NOT NULL DEFAULT 50, );
"createDate" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updateDate" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, CREATE TABLE IF NOT EXISTS public."Organizations"
"finishDate" TIMESTAMP NULL, (
"winnerid" UUID NULL, id uuid NOT NULL DEFAULT uuid_generate_v4(),
"createdBy" UUID NOT NULL, name character varying(255) COLLATE pg_catalog."default" NOT NULL,
"organizationid" UUID NULL contactfname character varying(100) COLLATE pg_catalog."default" NOT NULL,
); contactlname character varying(100) COLLATE pg_catalog."default" NOT NULL,
contactphone character varying(20) COLLATE pg_catalog."default" NOT NULL,
-- Add Foreign Key Constraints contactemail character varying(255) COLLATE pg_catalog."default" NOT NULL,
ALTER TABLE "Users" state integer NOT NULL DEFAULT 0,
ADD CONSTRAINT "FK_Users_Organizations" regdate timestamp without time zone NOT NULL DEFAULT now(),
FOREIGN KEY ("orgid") REFERENCES "Organizations"("id") ON DELETE SET NULL; "updateDate" timestamp without time zone NOT NULL DEFAULT now(),
url character varying(500) COLLATE pg_catalog."default",
ALTER TABLE "Decks" userinorg integer NOT NULL DEFAULT 0,
ADD CONSTRAINT "FK_Decks_Users" "maxOrganizationalDecks" integer,
FOREIGN KEY ("user_id") REFERENCES "Users"("id") ON DELETE CASCADE; CONSTRAINT "PK_e0690a31419f6666194423526f2" PRIMARY KEY (id)
);
ALTER TABLE "Decks"
ADD CONSTRAINT "FK_Decks_Organizations" CREATE TABLE IF NOT EXISTS public."Users"
FOREIGN KEY ("organization_id") REFERENCES "Organizations"("id") ON DELETE SET NULL; (
id uuid NOT NULL DEFAULT uuid_generate_v4(),
ALTER TABLE "Contacts" orgid uuid,
ADD CONSTRAINT "FK_Contacts_Users" username character varying(100) COLLATE pg_catalog."default" NOT NULL,
FOREIGN KEY ("userid") REFERENCES "Users"("id") ON DELETE SET NULL; password character varying(255) COLLATE pg_catalog."default" NOT NULL,
email character varying(255) COLLATE pg_catalog."default" NOT NULL,
ALTER TABLE "Contacts" fname character varying(100) COLLATE pg_catalog."default" NOT NULL,
ADD CONSTRAINT "FK_Contacts_RespondedBy" lname character varying(100) COLLATE pg_catalog."default" NOT NULL,
FOREIGN KEY ("respondedBy") REFERENCES "Users"("id") ON DELETE SET NULL; token character varying(255) COLLATE pg_catalog."default",
"TokenExpires" timestamp without time zone,
ALTER TABLE "Chats" phone character varying(20) COLLATE pg_catalog."default",
ADD CONSTRAINT "FK_Chats_CreatedBy" state integer NOT NULL DEFAULT 0,
FOREIGN KEY ("createdBy") REFERENCES "Users"("id") ON DELETE SET NULL; regdate timestamp without time zone NOT NULL DEFAULT now(),
"updateDate" timestamp without time zone NOT NULL DEFAULT now(),
ALTER TABLE "Chats" "Orglogindate" timestamp without time zone,
ADD CONSTRAINT "FK_Chats_Games" CONSTRAINT "PK_16d4f7d636df336db11d87413e3" PRIMARY KEY (id),
FOREIGN KEY ("gameId") REFERENCES "Games"("id") ON DELETE SET NULL; CONSTRAINT "UQ_3c3ab3f49a87e6ddb607f3c4945" UNIQUE (email),
CONSTRAINT "UQ_ffc81a3b97dcbf8e320d5106c0d" UNIQUE (username)
ALTER TABLE "Games" );
ADD CONSTRAINT "FK_Games_CreatedBy"
FOREIGN KEY ("createdBy") REFERENCES "Users"("id") ON DELETE CASCADE; CREATE TABLE IF NOT EXISTS public.migrations
(
ALTER TABLE "Games" id serial NOT NULL,
ADD CONSTRAINT "FK_Games_Organizations" "timestamp" bigint NOT NULL,
FOREIGN KEY ("organizationid") REFERENCES "Organizations"("id") ON DELETE SET NULL; name character varying COLLATE pg_catalog."default" NOT NULL,
CONSTRAINT "PK_8c82d7f526340ab734260ea46be" PRIMARY KEY (id)
ALTER TABLE "Games" );
ADD CONSTRAINT "FK_Games_Winner"
FOREIGN KEY ("winnerid") REFERENCES "Users"("id") ON DELETE SET NULL; ALTER TABLE IF EXISTS public."Decks"
ADD CONSTRAINT "FK_06ee28f90d68543a03b14aebe13" FOREIGN KEY (organization_id)
-- Create Indexes for Performance REFERENCES public."Organizations" (id) MATCH SIMPLE
CREATE INDEX "IDX_Users_Username" ON "Users" ("username"); ON UPDATE NO ACTION
CREATE INDEX "IDX_Users_Email" ON "Users" ("email"); ON DELETE NO ACTION;
CREATE INDEX "IDX_Users_OrgId" ON "Users" ("orgid");
CREATE INDEX "IDX_Users_State" ON "Users" ("state");
ALTER TABLE IF EXISTS public."Decks"
CREATE INDEX "IDX_Organizations_Name" ON "Organizations" ("name"); ADD CONSTRAINT "FK_a39059433e29882e1309d3a5e70" FOREIGN KEY (user_id)
CREATE INDEX "IDX_Organizations_State" ON "Organizations" ("state"); REFERENCES public."Users" (id) MATCH SIMPLE
ON UPDATE NO ACTION
CREATE INDEX "IDX_Decks_UserId" ON "Decks" ("user_id"); ON DELETE NO ACTION;
CREATE INDEX "IDX_Decks_Type" ON "Decks" ("type");
CREATE INDEX "IDX_Decks_CType" ON "Decks" ("ctype");
CREATE INDEX "IDX_Decks_State" ON "Decks" ("state"); ALTER TABLE IF EXISTS public."Games"
CREATE INDEX "IDX_Decks_OrganizationId" ON "Decks" ("organization_id"); ADD CONSTRAINT "FK_330362bff8b25bb573f31fb4023" FOREIGN KEY ("winnerId")
REFERENCES public."Users" (id) MATCH SIMPLE
CREATE INDEX "IDX_Chats_Type" ON "Chats" ("type"); ON UPDATE NO ACTION
CREATE INDEX "IDX_Chats_State" ON "Chats" ("state"); ON DELETE NO ACTION;
CREATE INDEX "IDX_Chats_GameId" ON "Chats" ("gameId");
CREATE INDEX "IDX_Chats_CreatedBy" ON "Chats" ("createdBy");
ALTER TABLE IF EXISTS public."Games"
CREATE INDEX "IDX_Contacts_Type" ON "Contacts" ("type"); ADD CONSTRAINT "FK_e3c4e8898fa026a5551aefc4f62" FOREIGN KEY ("organizationId")
CREATE INDEX "IDX_Contacts_State" ON "Contacts" ("state"); REFERENCES public."Organizations" (id) MATCH SIMPLE
CREATE INDEX "IDX_Contacts_UserId" ON "Contacts" ("userid"); ON UPDATE NO ACTION
ON DELETE NO ACTION;
CREATE INDEX "IDX_Games_GameCode" ON "Games" ("gamecode");
CREATE INDEX "IDX_Games_State" ON "Games" ("state");
CREATE INDEX "IDX_Games_CreatedBy" ON "Games" ("createdBy"); ALTER TABLE IF EXISTS public."Games"
CREATE INDEX "IDX_Games_OrganizationId" ON "Games" ("organizationid"); ADD CONSTRAINT "FK_f32db60863a8a393b30aa222cd5" FOREIGN KEY ("createdBy")
REFERENCES public."Users" (id) MATCH SIMPLE
-- Create update trigger for updatedate columns ON UPDATE NO ACTION
CREATE OR REPLACE FUNCTION update_updatedate_column() ON DELETE NO ACTION;
RETURNS TRIGGER AS $$
BEGIN END;
NEW.updatedate = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ language 'plpgsql';
-- Apply update triggers
CREATE TRIGGER update_users_updatedate
BEFORE UPDATE ON "Users"
FOR EACH ROW EXECUTE FUNCTION update_updatedate_column();
CREATE TRIGGER update_organizations_updatedate
BEFORE UPDATE ON "Organizations"
FOR EACH ROW EXECUTE FUNCTION update_updatedate_column();
CREATE TRIGGER update_decks_updatedate
BEFORE UPDATE ON "Decks"
FOR EACH ROW EXECUTE FUNCTION update_updatedate_column();
CREATE TRIGGER update_chats_updatedate
BEFORE UPDATE ON "Chats"
FOR EACH ROW EXECUTE FUNCTION update_updatedate_column();
CREATE TRIGGER update_contacts_updatedate
BEFORE UPDATE ON "Contacts"
FOR EACH ROW EXECUTE FUNCTION update_updatedate_column();
CREATE TRIGGER update_games_updatedate
BEFORE UPDATE ON "Games"
FOR EACH ROW EXECUTE FUNCTION update_updatedate_column();
-- Comments for documentation
COMMENT ON TABLE "Users" IS 'User accounts with authentication and profile information';
COMMENT ON TABLE "Organizations" IS 'Organizations that can have multiple users and premium features';
COMMENT ON TABLE "Decks" IS 'Card decks for the game, can be public, private, or organizational';
COMMENT ON TABLE "Chats" IS 'Chat system supporting direct messages, groups, and game chats';
COMMENT ON TABLE "Contacts" IS 'Contact form submissions and support tickets';
COMMENT ON TABLE "Games" IS 'Game sessions with players, decks, and game state';
-- Enum value comments
COMMENT ON COLUMN "Users"."state" IS '0=REGISTERED_NOT_VERIFIED, 1=VERIFIED_REGULAR, 2=VERIFIED_PREMIUM, 3=SOFT_DELETE, 4=DEACTIVATED, 5=ADMIN';
COMMENT ON COLUMN "Organizations"."state" IS '0=REGISTERED, 1=ACTIVE, 2=SOFT_DELETE';
COMMENT ON COLUMN "Decks"."type" IS '0=LUCK, 1=JOKER, 2=QUESTION';
COMMENT ON COLUMN "Decks"."ctype" IS '0=PUBLIC, 1=PRIVATE, 2=ORGANIZATION';
COMMENT ON COLUMN "Decks"."state" IS '0=ACTIVE, 1=SOFT_DELETE';
COMMENT ON COLUMN "Chats"."type" IS 'direct, group, game';
COMMENT ON COLUMN "Chats"."state" IS '0=ACTIVE, 1=ARCHIVE, 2=SOFT_DELETE';
COMMENT ON COLUMN "Contacts"."type" IS '0=BUG, 1=PROBLEM, 2=QUESTION, 3=SALES, 4=OTHER';
COMMENT ON COLUMN "Contacts"."state" IS '0=ACTIVE, 1=RESOLVED, 2=SOFT_DELETE';
COMMENT ON COLUMN "Games"."state" IS '0=WAITING, 1=ACTIVE, 2=FINISHED, 3=CANCELLED';
COMMENT ON COLUMN "Games"."logintype" IS '0=PUBLIC, 1=PRIVATE, 2=ORGANIZATION';
-- Grant permissions for application user
-- Note: Replace 'serpentrace_app' with your actual application database user
-- GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO serpentrace_app;
-- GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO serpentrace_app;
-- GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO serpentrace_app;