diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d06269c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +compose/repositories diff --git a/docker compose/deploy.sh b/compose/deploy.sh old mode 100755 new mode 100644 similarity index 97% rename from docker compose/deploy.sh rename to compose/deploy.sh index 900df7c..ced1dd7 --- a/docker compose/deploy.sh +++ b/compose/deploy.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # List of repository URLs REPOS=( diff --git a/docker compose/docker-compose.yaml b/compose/docker-compose.yaml similarity index 85% rename from docker compose/docker-compose.yaml rename to compose/docker-compose.yaml index 521e602..6b13ad1 100644 --- a/docker compose/docker-compose.yaml +++ b/compose/docker-compose.yaml @@ -42,7 +42,7 @@ services: timeout: 10s retries: 5 db: - image: postgres:17 + image: postgres:16.4 ports: - "5431:5432" environment: @@ -53,6 +53,8 @@ services: interval: 30s timeout: 10s retries: 5 + # volumes: + # - ./init.sql:/docker-entrypoint-initdb.d/init.sql worker: build: ./repositories/worker depends_on: @@ -71,6 +73,11 @@ services: - "3000:3000" depends_on: - backend + - file-storage + environment: + - DATABASE_URL=postgres://postgres:password@db:5432/maxit/ + - FILESTORAGE_URL=http://file-storage:8888 + - BACKEND_URL=http://backend:8000 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000"] interval: 30s diff --git a/compose/init.sql b/compose/init.sql new file mode 100644 index 0000000..c486239 --- /dev/null +++ b/compose/init.sql @@ -0,0 +1,194 @@ +CREATE TYPE "public"."language_type" AS ENUM('CPP', 'C', 'Python');--> statement-breakpoint +CREATE TYPE "public"."user_solution_result_status" AS ENUM('succes', 'failed', 'InternalError');--> statement-breakpoint +CREATE TYPE "public"."user_solution_status" AS ENUM('submitted', 'queued', 'executed');--> statement-breakpoint +CREATE TYPE "public"."user_role" AS ENUM('student', 'teacher', 'admin');--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "groups" ( + "id" serial PRIMARY KEY NOT NULL, + "name" varchar(255) NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "input_output" ( + "id" serial PRIMARY KEY NOT NULL, + "task_id" integer, + "order" integer NOT NULL, + "time_limit" real NOT NULL, + "memory_limit" real NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "language_config" ( + "id" serial PRIMARY KEY NOT NULL, + "type" varchar(50) NOT NULL, + "version" varchar(50) NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "queue_messages" ( + "id" text PRIMARY KEY NOT NULL, + "user_solution_id" integer, + "queued_at" timestamp with time zone DEFAULT now() +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "session" ( + "id" text PRIMARY KEY NOT NULL, + "user_id" integer NOT NULL, + "expires_at" timestamp with time zone NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "submission_results" ( + "id" serial PRIMARY KEY NOT NULL, + "user_solution_id" integer, + "status_code" "user_solution_result_status" NOT NULL, + "message" varchar(255), + "created_at" timestamp with time zone DEFAULT now() +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "submissions" ( + "id" serial PRIMARY KEY NOT NULL, + "task_id" integer, + "user_id" integer, + "order" integer NOT NULL, + "language_id" integer, + "status" "user_solution_status" NOT NULL, + "submitted_at" timestamp with time zone DEFAULT now(), + "checked_at" timestamp with time zone +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "task_group" ( + "task_id" integer, + "group_id" integer, + CONSTRAINT "task_group_task_id_group_id_pk" PRIMARY KEY("task_id","group_id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "task_user" ( + "task_id" integer, + "user_id" integer, + CONSTRAINT "task_user_task_id_user_id_pk" PRIMARY KEY("task_id","user_id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "tasks" ( + "id" serial PRIMARY KEY NOT NULL, + "name" text NOT NULL, + "created_at" timestamp with time zone DEFAULT now() NOT NULL, + "updated_at" timestamp with time zone DEFAULT now() NOT NULL, + "created_by_id" integer NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "test_results" ( + "id" serial PRIMARY KEY NOT NULL, + "user_solution_result_id" integer, + "input_output_id" integer, + "passed" boolean NOT NULL, + "error_message" varchar +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "user_group" ( + "user_id" integer, + "group_id" integer, + CONSTRAINT "user_group_user_id_group_id_pk" PRIMARY KEY("user_id","group_id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "users" ( + "id" serial PRIMARY KEY NOT NULL, + "name" text NOT NULL, + "surname" text NOT NULL, + "email" text NOT NULL, + "username" text NOT NULL, + "password_hash" text NOT NULL, + CONSTRAINT "users_email_unique" UNIQUE("email"), + CONSTRAINT "users_username_unique" UNIQUE("username") +); +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "input_output" ADD CONSTRAINT "input_output_task_id_tasks_id_fk" FOREIGN KEY ("task_id") REFERENCES "public"."tasks"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "queue_messages" ADD CONSTRAINT "queue_messages_user_solution_id_submissions_id_fk" FOREIGN KEY ("user_solution_id") REFERENCES "public"."submissions"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "session" ADD CONSTRAINT "session_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "submission_results" ADD CONSTRAINT "submission_results_user_solution_id_submissions_id_fk" FOREIGN KEY ("user_solution_id") REFERENCES "public"."submissions"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "submissions" ADD CONSTRAINT "submissions_task_id_tasks_id_fk" FOREIGN KEY ("task_id") REFERENCES "public"."tasks"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "submissions" ADD CONSTRAINT "submissions_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "submissions" ADD CONSTRAINT "submissions_language_id_language_config_id_fk" FOREIGN KEY ("language_id") REFERENCES "public"."language_config"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "task_group" ADD CONSTRAINT "task_group_task_id_tasks_id_fk" FOREIGN KEY ("task_id") REFERENCES "public"."tasks"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "task_group" ADD CONSTRAINT "task_group_group_id_groups_id_fk" FOREIGN KEY ("group_id") REFERENCES "public"."groups"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "task_user" ADD CONSTRAINT "task_user_task_id_tasks_id_fk" FOREIGN KEY ("task_id") REFERENCES "public"."tasks"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "task_user" ADD CONSTRAINT "task_user_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "tasks" ADD CONSTRAINT "tasks_created_by_id_users_id_fk" FOREIGN KEY ("created_by_id") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "test_results" ADD CONSTRAINT "test_results_user_solution_result_id_submission_results_id_fk" FOREIGN KEY ("user_solution_result_id") REFERENCES "public"."submission_results"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "test_results" ADD CONSTRAINT "test_results_input_output_id_input_output_id_fk" FOREIGN KEY ("input_output_id") REFERENCES "public"."input_output"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "user_group" ADD CONSTRAINT "user_group_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "user_group" ADD CONSTRAINT "user_group_group_id_groups_id_fk" FOREIGN KEY ("group_id") REFERENCES "public"."groups"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$;