From eddeb60a0e60d0921355550ea1b50f4b9671a11a Mon Sep 17 00:00:00 2001 From: Maria Sauer <mcs22@inf.ufpr.br> Date: Mon, 5 May 2025 10:26:21 -0300 Subject: [PATCH] Issue #271: connection with new backend --- bun.lockb | Bin 0 -> 175722 bytes package.json | 2 +- src/db/migrations/0000_daffy_sentinel.sql | 672 ++++ src/db/migrations/0001_bouncy_valkyrie.sql | 1 - .../0002_melodic_baron_strucker.sql | 4 - .../0002_thankful_captain_midlands.sql | 49 - .../migrations/0003_mysterious_the_fallen.sql | 1 - src/db/migrations/meta/0000_snapshot.json | 14 +- src/db/migrations/meta/0002_snapshot.json | 2714 ----------------- src/db/migrations/meta/0003_snapshot.json | 2714 ----------------- src/db/migrations/meta/_journal.json | 12 +- .../repo/resource-educational-stages.repo.ts | 2 + src/db/repo/resource.repo.ts | 13 +- src/db/repo/search.repo.ts | 16 +- src/db/schema/search.schema.ts | 5 +- src/db/seeds/object-type.seed.ts | 45 - src/db/seeds/subjects.seed.ts | 192 +- src/env.ts | 2 +- src/routes/homologation.route.ts | 1 + src/routes/resource.route.ts | 21 +- src/routes/search.route.ts | 33 +- src/routes/subjects.route.ts | 2 +- src/services/auth.service.ts | 8 +- src/services/contact.service.ts | 2 +- .../resource-educational-stages.service.ts | 4 +- src/services/resource.service.ts | 4 + src/services/search.service.ts | 68 +- 27 files changed, 812 insertions(+), 5789 deletions(-) create mode 100755 bun.lockb create mode 100644 src/db/migrations/0000_daffy_sentinel.sql delete mode 100644 src/db/migrations/0001_bouncy_valkyrie.sql delete mode 100644 src/db/migrations/0002_melodic_baron_strucker.sql delete mode 100644 src/db/migrations/0002_thankful_captain_midlands.sql delete mode 100644 src/db/migrations/0003_mysterious_the_fallen.sql delete mode 100644 src/db/migrations/meta/0002_snapshot.json delete mode 100644 src/db/migrations/meta/0003_snapshot.json diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..c6fab67ceda4fd6f25551f4c2a416322ac7ac6ae GIT binary patch literal 175722 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 E08A)a8vp<R literal 0 HcmV?d00001 diff --git a/package.json b/package.json index fe9262e..dc6c791 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "hono-backend", "scripts": { - "dev": "bun run --port '4000' --hot --watch src/index.ts", + "dev": "bun run --port '3000' --hot --watch src/index.ts", "db:generate": "drizzle-kit generate", "db:migrate": "cross-env DB_MIGRATING=true bun run src/db/migrate.ts", "db:seed": "cross-env DB_SEEDING=true bun run src/db/seed.ts", diff --git a/src/db/migrations/0000_daffy_sentinel.sql b/src/db/migrations/0000_daffy_sentinel.sql new file mode 100644 index 0000000..f19b960 --- /dev/null +++ b/src/db/migrations/0000_daffy_sentinel.sql @@ -0,0 +1,672 @@ +DO $$ BEGIN + CREATE TYPE "public"."complaints_state" AS ENUM('complained', 'rejected', 'accepted'); +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + CREATE TYPE "public"."resource_state" AS ENUM('draft', 'submitted', 'accepted', 'reported', 'deleted'); +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + CREATE TYPE "public"."review_state" AS ENUM('active', 'inactive', 'under_review'); +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "achievements" ( + "id" serial PRIMARY KEY NOT NULL, + "name" varchar(255) NOT NULL, + "description" text, + "reward_experience" numeric, + "reward_points" numeric, + "review_state" "review_state" DEFAULT 'under_review' NOT NULL, + "repeatable" integer NOT NULL, + "is_resettable" boolean NOT NULL, + "created_at" timestamp DEFAULT now() NOT NULL, + "updated_at" timestamp DEFAULT now() NOT NULL, + CONSTRAINT "achievements_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "actions" ( + "id" serial PRIMARY KEY NOT NULL, + "name" varchar(255) NOT NULL, + "created_at" timestamp DEFAULT now() NOT NULL, + "updated_at" timestamp DEFAULT now() NOT NULL, + CONSTRAINT "actions_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "collection_likes" ( + "id" serial PRIMARY KEY NOT NULL, + "user_id" integer NOT NULL, + "collection_id" integer NOT NULL, + CONSTRAINT "collection_likes_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "collection_resources" ( + "id" serial PRIMARY KEY NOT NULL, + "collection_id" integer NOT NULL, + "resource_id" integer NOT NULL, + CONSTRAINT "collection_resources_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "collection_stats" ( + "id" serial PRIMARY KEY NOT NULL, + "views" integer DEFAULT 0 NOT NULL, + "downloads" integer DEFAULT 0 NOT NULL, + "likes" integer DEFAULT 0 NOT NULL, + "shares" integer DEFAULT 0 NOT NULL, + "score" numeric DEFAULT '0.0' NOT NULL, + "follows" integer DEFAULT 0 NOT NULL, + CONSTRAINT "collection_stats_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "collections" ( + "id" serial PRIMARY KEY NOT NULL, + "name" varchar(255) NOT NULL, + "description" text, + "is_private" boolean DEFAULT false, + "is_active" boolean, + "created_at" timestamp DEFAULT now() NOT NULL, + "updated_at" timestamp DEFAULT now() NOT NULL, + "deleted_at" timestamp, + "thumbnail" varchar(255), + "user_id" integer NOT NULL, + "collection_stats_id" integer NOT NULL, + CONSTRAINT "collections_id_unique" UNIQUE("id"), + CONSTRAINT "collections_collection_stats_id_unique" UNIQUE("collection_stats_id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "commentReply" ( + "id" serial PRIMARY KEY NOT NULL, + "user_id" integer NOT NULL, + "comment_id" integer NOT NULL, + "text" text NOT NULL, + "created_at" timestamp DEFAULT now() NOT NULL, + "deleted_at" timestamp, + "update_at" timestamp DEFAULT now() NOT NULL, + CONSTRAINT "commentReply_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "comments" ( + "id" serial PRIMARY KEY NOT NULL, + "user_id" integer NOT NULL, + "resource_id" integer NOT NULL, + "text" text NOT NULL, + "created_at" timestamp DEFAULT now() NOT NULL, + "deleted_at" timestamp, + "updated_at" timestamp DEFAULT now() NOT NULL, + CONSTRAINT "comments_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "complaints" ( + "id" serial PRIMARY KEY NOT NULL, + "state" "complaints_state" DEFAULT 'complained' NOT NULL, + "description" text NOT NULL, + "denouncer_id" integer NOT NULL, + "resource_id" integer NOT NULL, + "collection_id" integer, + "user_id" integer, + "evaluated_at" timestamp, + "created_at" timestamp DEFAULT now() NOT NULL, + "q1" boolean, + "q2" boolean, + "q3" boolean, + "q4" boolean, + "q5" boolean, + "q6" boolean, + "q7" boolean, + CONSTRAINT "complaints_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "educational_stages" ( + "id" serial PRIMARY KEY NOT NULL, + "name" varchar(255) NOT NULL, + CONSTRAINT "educational_stages_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "followers" ( + "id" serial PRIMARY KEY NOT NULL, + "user_id" integer NOT NULL, + "follower_id" integer NOT NULL, + CONSTRAINT "followers_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "institutions" ( + "id" serial PRIMARY KEY NOT NULL, + "name" varchar(255) NOT NULL, + "uf" varchar(2), + "city" varchar(255), + "cep" varchar(10), + "created_at" timestamp DEFAULT now() NOT NULL, + "updated_at" timestamp DEFAULT now() NOT NULL, + CONSTRAINT "institutions_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "item_achievements" ( + "item_id" integer NOT NULL, + "achievement_id" integer NOT NULL, + CONSTRAINT "item_achievements_item_id_achievement_id_pk" PRIMARY KEY("item_id","achievement_id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "items" ( + "id" serial PRIMARY KEY NOT NULL, + "name" varchar(255) NOT NULL, + "price" numeric, + "discount" numeric, + "description" text, + "is_active" boolean DEFAULT false, + "created_at" timestamp DEFAULT now() NOT NULL, + "updated_at" timestamp DEFAULT now() NOT NULL, + CONSTRAINT "items_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "languages" ( + "id" serial PRIMARY KEY NOT NULL, + "name" varchar(255) NOT NULL, + "code" varchar(10) NOT NULL, + CONSTRAINT "languages_id_unique" UNIQUE("id"), + CONSTRAINT "languages_code_unique" UNIQUE("code") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "licenses" ( + "id" serial PRIMARY KEY NOT NULL, + "name" varchar(255) NOT NULL, + "description" text NOT NULL, + "url" varchar(255) NOT NULL, + CONSTRAINT "licenses_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "notifications" ( + "id" serial PRIMARY KEY NOT NULL, + "owner_id" integer NOT NULL, + "action_id" integer NOT NULL, + "actor_user_id" integer NOT NULL, + "target_user_id" integer, + "target_resource_id" integer, + "target_collection_id" integer, + "viewed" boolean DEFAULT false, + "created_at" timestamp DEFAULT now() NOT NULL, + "updated_at" timestamp DEFAULT now() NOT NULL, + CONSTRAINT "notifications_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "object_types" ( + "id" serial PRIMARY KEY NOT NULL, + "name" varchar(255) NOT NULL, + CONSTRAINT "object_types_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "resource_educational_stages" ( + "id" serial PRIMARY KEY NOT NULL, + "resource_id" integer NOT NULL, + "educational_stage_id" integer NOT NULL, + CONSTRAINT "resource_educational_stages_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "resource_languages" ( + "id" serial PRIMARY KEY NOT NULL, + "resource_id" integer NOT NULL, + "language_id" integer NOT NULL, + CONSTRAINT "resource_languages_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "resource_likes" ( + "id" serial PRIMARY KEY NOT NULL, + "user_id" integer NOT NULL, + "resource_id" integer NOT NULL, + CONSTRAINT "resource_likes_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "resource_stats" ( + "id" serial PRIMARY KEY NOT NULL, + "views" integer DEFAULT 0 NOT NULL, + "downloads" integer DEFAULT 0 NOT NULL, + "likes" integer DEFAULT 0 NOT NULL, + "shares" integer DEFAULT 0 NOT NULL, + "score" numeric DEFAULT '0.0' NOT NULL, + "follows" integer DEFAULT 0 NOT NULL, + "comments" integer DEFAULT 0 NOT NULL, + CONSTRAINT "resource_stats_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "resource_subjects" ( + "id" serial PRIMARY KEY NOT NULL, + "resource_id" integer NOT NULL, + "subject_id" integer NOT NULL, + CONSTRAINT "resource_subjects_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "resources" ( + "id" serial PRIMARY KEY NOT NULL, + "state" "resource_state" DEFAULT 'draft' NOT NULL, + "name" varchar(255) NOT NULL, + "author" varchar(255) NOT NULL, + "link" varchar(255), + "thumbnail" varchar(255), + "description" text, + "created_at" timestamp DEFAULT now() NOT NULL, + "updated_at" timestamp DEFAULT now() NOT NULL, + "published_at" timestamp, + "submitted_at" timestamp, + "deleted_at" timestamp, + "user_id" integer NOT NULL, + "resource_stats_id" integer NOT NULL, + "object_type_id" integer NOT NULL, + "license_id" integer NOT NULL, + CONSTRAINT "resources_id_unique" UNIQUE("id"), + CONSTRAINT "resources_resource_stats_id_unique" UNIQUE("resource_stats_id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "roles" ( + "id" serial PRIMARY KEY NOT NULL, + "name" varchar(255) NOT NULL, + "description" text, + "created_at" timestamp DEFAULT now() NOT NULL, + "updated_at" timestamp DEFAULT now() NOT NULL, + CONSTRAINT "roles_id_unique" UNIQUE("id"), + CONSTRAINT "roles_name_unique" UNIQUE("name") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "subjects" ( + "id" serial PRIMARY KEY NOT NULL, + "name" varchar(255) NOT NULL, + CONSTRAINT "subjects_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "submissions" ( + "id" serial PRIMARY KEY NOT NULL, + "is_accepted" boolean DEFAULT false NOT NULL, + "justification" text, + "resource_id" integer NOT NULL, + "submitter_id" integer NOT NULL, + "curator_id" integer, + "created_at" timestamp DEFAULT now() NOT NULL, + "updated_at" timestamp DEFAULT now() NOT NULL, + "answered_at" timestamp, + "q1" boolean, + "q2" boolean, + "q3" boolean, + "q4" boolean, + CONSTRAINT "submissions_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "user_achievements" ( + "id" serial PRIMARY KEY NOT NULL, + "user_id" integer NOT NULL, + "achievement_id" integer NOT NULL, + CONSTRAINT "user_achievements_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "user_collections" ( + "id" serial PRIMARY KEY NOT NULL, + "user_id" integer NOT NULL, + "collection_id" integer NOT NULL, + CONSTRAINT "user_collections_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "user_institutions" ( + "id" serial PRIMARY KEY NOT NULL, + "user_id" integer NOT NULL, + "institution_id" integer NOT NULL, + CONSTRAINT "user_institutions_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "user_items" ( + "id" serial PRIMARY KEY NOT NULL, + "user_id" integer NOT NULL, + "item_id" integer NOT NULL, + CONSTRAINT "user_items_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "user_roles" ( + "id" serial PRIMARY KEY NOT NULL, + "user_id" integer NOT NULL, + "role_id" integer NOT NULL, + CONSTRAINT "user_roles_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "user_stats" ( + "id" serial PRIMARY KEY NOT NULL, + "score" numeric DEFAULT '0.0' NOT NULL, + "likes" integer DEFAULT 0 NOT NULL, + "likes_received" integer DEFAULT 0 NOT NULL, + "follows" integer DEFAULT 0 NOT NULL, + "followers" integer DEFAULT 0 NOT NULL, + "collections" integer DEFAULT 0 NOT NULL, + "submitted_resources" integer DEFAULT 0 NOT NULL, + "approved_resources" integer DEFAULT 0 NOT NULL, + "reviewed_resources" integer DEFAULT 0 NOT NULL, + "comments" integer DEFAULT 0 NOT NULL, + CONSTRAINT "user_stats_id_unique" UNIQUE("id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "users" ( + "id" serial PRIMARY KEY NOT NULL, + "name" varchar(255) NOT NULL, + "username" varchar(255), + "password" varchar(255), + "email" varchar(255) NOT NULL, + "description" text DEFAULT 'sem descrição', + "birthday" timestamp, + "cpf" varchar(11) NOT NULL, + "created_at" timestamp DEFAULT now() NOT NULL, + "updated_at" timestamp DEFAULT now() NOT NULL, + "confirmed_at" timestamp, + "confirmation_sent_at" timestamp, + "deleted_at" timestamp, + "reactivated_at" timestamp, + "is_active" boolean DEFAULT true, + "user_stats_id" integer NOT NULL, + "level" integer DEFAULT 1, + "experience" integer DEFAULT 0, + "points" integer DEFAULT 0, + "level_xp" integer DEFAULT 0, + CONSTRAINT "users_id_unique" UNIQUE("id"), + CONSTRAINT "users_username_unique" UNIQUE("username"), + CONSTRAINT "users_email_unique" UNIQUE("email"), + CONSTRAINT "users_cpf_unique" UNIQUE("cpf"), + CONSTRAINT "users_user_stats_id_unique" UNIQUE("user_stats_id") +); +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "collection_likes" ADD CONSTRAINT "collection_likes_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "collection_likes" ADD CONSTRAINT "collection_likes_collection_id_collections_id_fk" FOREIGN KEY ("collection_id") REFERENCES "public"."collections"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "collection_resources" ADD CONSTRAINT "collection_resources_collection_id_collections_id_fk" FOREIGN KEY ("collection_id") REFERENCES "public"."collections"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "collection_resources" ADD CONSTRAINT "collection_resources_resource_id_resources_id_fk" FOREIGN KEY ("resource_id") REFERENCES "public"."resources"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "collections" ADD CONSTRAINT "collections_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "collections" ADD CONSTRAINT "collections_collection_stats_id_collection_stats_id_fk" FOREIGN KEY ("collection_stats_id") REFERENCES "public"."collection_stats"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "commentReply" ADD CONSTRAINT "commentReply_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "commentReply" ADD CONSTRAINT "commentReply_comment_id_comments_id_fk" FOREIGN KEY ("comment_id") REFERENCES "public"."comments"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "comments" ADD CONSTRAINT "comments_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "comments" ADD CONSTRAINT "comments_resource_id_resources_id_fk" FOREIGN KEY ("resource_id") REFERENCES "public"."resources"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "complaints" ADD CONSTRAINT "complaints_denouncer_id_users_id_fk" FOREIGN KEY ("denouncer_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "complaints" ADD CONSTRAINT "complaints_resource_id_resources_id_fk" FOREIGN KEY ("resource_id") REFERENCES "public"."resources"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "complaints" ADD CONSTRAINT "complaints_collection_id_collections_id_fk" FOREIGN KEY ("collection_id") REFERENCES "public"."collections"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "complaints" ADD CONSTRAINT "complaints_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "followers" ADD CONSTRAINT "followers_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "followers" ADD CONSTRAINT "followers_follower_id_users_id_fk" FOREIGN KEY ("follower_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "item_achievements" ADD CONSTRAINT "item_achievements_item_id_items_id_fk" FOREIGN KEY ("item_id") REFERENCES "public"."items"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "item_achievements" ADD CONSTRAINT "item_achievements_achievement_id_achievements_id_fk" FOREIGN KEY ("achievement_id") REFERENCES "public"."achievements"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "notifications" ADD CONSTRAINT "notifications_owner_id_users_id_fk" FOREIGN KEY ("owner_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "notifications" ADD CONSTRAINT "notifications_action_id_actions_id_fk" FOREIGN KEY ("action_id") REFERENCES "public"."actions"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "notifications" ADD CONSTRAINT "notifications_actor_user_id_users_id_fk" FOREIGN KEY ("actor_user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "notifications" ADD CONSTRAINT "notifications_target_user_id_users_id_fk" FOREIGN KEY ("target_user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "notifications" ADD CONSTRAINT "notifications_target_resource_id_resources_id_fk" FOREIGN KEY ("target_resource_id") REFERENCES "public"."resources"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "notifications" ADD CONSTRAINT "notifications_target_collection_id_collections_id_fk" FOREIGN KEY ("target_collection_id") REFERENCES "public"."collections"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "resource_educational_stages" ADD CONSTRAINT "resource_educational_stages_resource_id_resources_id_fk" FOREIGN KEY ("resource_id") REFERENCES "public"."resources"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "resource_educational_stages" ADD CONSTRAINT "resource_educational_stages_educational_stage_id_educational_stages_id_fk" FOREIGN KEY ("educational_stage_id") REFERENCES "public"."educational_stages"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "resource_languages" ADD CONSTRAINT "resource_languages_resource_id_resources_id_fk" FOREIGN KEY ("resource_id") REFERENCES "public"."resources"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "resource_languages" ADD CONSTRAINT "resource_languages_language_id_languages_id_fk" FOREIGN KEY ("language_id") REFERENCES "public"."languages"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "resource_likes" ADD CONSTRAINT "resource_likes_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "resource_likes" ADD CONSTRAINT "resource_likes_resource_id_resources_id_fk" FOREIGN KEY ("resource_id") REFERENCES "public"."resources"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "resource_subjects" ADD CONSTRAINT "resource_subjects_resource_id_resources_id_fk" FOREIGN KEY ("resource_id") REFERENCES "public"."resources"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "resource_subjects" ADD CONSTRAINT "resource_subjects_subject_id_subjects_id_fk" FOREIGN KEY ("subject_id") REFERENCES "public"."subjects"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "resources" ADD CONSTRAINT "resources_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "resources" ADD CONSTRAINT "resources_resource_stats_id_resource_stats_id_fk" FOREIGN KEY ("resource_stats_id") REFERENCES "public"."resource_stats"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "resources" ADD CONSTRAINT "resources_object_type_id_object_types_id_fk" FOREIGN KEY ("object_type_id") REFERENCES "public"."object_types"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "resources" ADD CONSTRAINT "resources_license_id_licenses_id_fk" FOREIGN KEY ("license_id") REFERENCES "public"."licenses"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "submissions" ADD CONSTRAINT "submissions_resource_id_resources_id_fk" FOREIGN KEY ("resource_id") REFERENCES "public"."resources"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "submissions" ADD CONSTRAINT "submissions_submitter_id_users_id_fk" FOREIGN KEY ("submitter_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "submissions" ADD CONSTRAINT "submissions_curator_id_users_id_fk" FOREIGN KEY ("curator_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "user_achievements" ADD CONSTRAINT "user_achievements_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "user_achievements" ADD CONSTRAINT "user_achievements_achievement_id_users_id_fk" FOREIGN KEY ("achievement_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "user_collections" ADD CONSTRAINT "user_collections_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "user_collections" ADD CONSTRAINT "user_collections_collection_id_collections_id_fk" FOREIGN KEY ("collection_id") REFERENCES "public"."collections"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "user_institutions" ADD CONSTRAINT "user_institutions_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "user_institutions" ADD CONSTRAINT "user_institutions_institution_id_institutions_id_fk" FOREIGN KEY ("institution_id") REFERENCES "public"."institutions"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "user_items" ADD CONSTRAINT "user_items_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "user_items" ADD CONSTRAINT "user_items_item_id_items_id_fk" FOREIGN KEY ("item_id") REFERENCES "public"."items"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "user_roles" ADD CONSTRAINT "user_roles_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "user_roles" ADD CONSTRAINT "user_roles_role_id_roles_id_fk" FOREIGN KEY ("role_id") REFERENCES "public"."roles"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "users" ADD CONSTRAINT "users_user_stats_id_user_stats_id_fk" FOREIGN KEY ("user_stats_id") REFERENCES "public"."user_stats"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; diff --git a/src/db/migrations/0001_bouncy_valkyrie.sql b/src/db/migrations/0001_bouncy_valkyrie.sql deleted file mode 100644 index 9f33f06..0000000 --- a/src/db/migrations/0001_bouncy_valkyrie.sql +++ /dev/null @@ -1 +0,0 @@ -DROP TABLE "notifications"; \ No newline at end of file diff --git a/src/db/migrations/0002_melodic_baron_strucker.sql b/src/db/migrations/0002_melodic_baron_strucker.sql deleted file mode 100644 index cca2115..0000000 --- a/src/db/migrations/0002_melodic_baron_strucker.sql +++ /dev/null @@ -1,4 +0,0 @@ -ALTER TABLE "resources" RENAME COLUMN "resource_state" TO "state";--> statement-breakpoint -ALTER TABLE "complaints" ADD COLUMN "q5" boolean;--> statement-breakpoint -ALTER TABLE "complaints" ADD COLUMN "q6" boolean;--> statement-breakpoint -ALTER TABLE "complaints" ADD COLUMN "q7" boolean; \ No newline at end of file diff --git a/src/db/migrations/0002_thankful_captain_midlands.sql b/src/db/migrations/0002_thankful_captain_midlands.sql deleted file mode 100644 index 031cfae..0000000 --- a/src/db/migrations/0002_thankful_captain_midlands.sql +++ /dev/null @@ -1,49 +0,0 @@ -CREATE TABLE IF NOT EXISTS "notifications" ( - "id" serial PRIMARY KEY NOT NULL, - "owner_id" integer NOT NULL, - "action_id" integer NOT NULL, - "actor_user_id" integer, - "target_user_id" integer, - "target_resource_id" integer, - "target_collection_id" integer, - "viewed" boolean DEFAULT false, - "created_at" timestamp DEFAULT now() NOT NULL, - "updated_at" timestamp DEFAULT now() NOT NULL, - CONSTRAINT "notifications_id_unique" UNIQUE("id") -); ---> statement-breakpoint -DO $$ BEGIN - ALTER TABLE "notifications" ADD CONSTRAINT "notifications_owner_id_users_id_fk" FOREIGN KEY ("owner_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; -EXCEPTION - WHEN duplicate_object THEN null; -END $$; ---> statement-breakpoint -DO $$ BEGIN - ALTER TABLE "notifications" ADD CONSTRAINT "notifications_action_id_actions_id_fk" FOREIGN KEY ("action_id") REFERENCES "public"."actions"("id") ON DELETE cascade ON UPDATE no action; -EXCEPTION - WHEN duplicate_object THEN null; -END $$; ---> statement-breakpoint -DO $$ BEGIN - ALTER TABLE "notifications" ADD CONSTRAINT "notifications_actor_user_id_users_id_fk" FOREIGN KEY ("actor_user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; -EXCEPTION - WHEN duplicate_object THEN null; -END $$; ---> statement-breakpoint -DO $$ BEGIN - ALTER TABLE "notifications" ADD CONSTRAINT "notifications_target_user_id_users_id_fk" FOREIGN KEY ("target_user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; -EXCEPTION - WHEN duplicate_object THEN null; -END $$; ---> statement-breakpoint -DO $$ BEGIN - ALTER TABLE "notifications" ADD CONSTRAINT "notifications_target_resource_id_resources_id_fk" FOREIGN KEY ("target_resource_id") REFERENCES "public"."resources"("id") ON DELETE cascade ON UPDATE no action; -EXCEPTION - WHEN duplicate_object THEN null; -END $$; ---> statement-breakpoint -DO $$ BEGIN - ALTER TABLE "notifications" ADD CONSTRAINT "notifications_target_collection_id_collections_id_fk" FOREIGN KEY ("target_collection_id") REFERENCES "public"."collections"("id") ON DELETE cascade ON UPDATE no action; -EXCEPTION - WHEN duplicate_object THEN null; -END $$; diff --git a/src/db/migrations/0003_mysterious_the_fallen.sql b/src/db/migrations/0003_mysterious_the_fallen.sql deleted file mode 100644 index 9d889c1..0000000 --- a/src/db/migrations/0003_mysterious_the_fallen.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE "notifications" ALTER COLUMN "actor_user_id" SET NOT NULL; \ No newline at end of file diff --git a/src/db/migrations/meta/0000_snapshot.json b/src/db/migrations/meta/0000_snapshot.json index 62c7e28..614bf45 100644 --- a/src/db/migrations/meta/0000_snapshot.json +++ b/src/db/migrations/meta/0000_snapshot.json @@ -1,5 +1,5 @@ { - "id": "69415c6c-8351-4948-b467-c4c262bf063e", + "id": "17e5bf00-dd96-41e3-bf35-afd7c7d13881", "prevId": "00000000-0000-0000-0000-000000000000", "version": "7", "dialect": "postgresql", @@ -1183,7 +1183,7 @@ "name": "actor_user_id", "type": "integer", "primaryKey": false, - "notNull": false + "notNull": true }, "target_user_id": { "name": "target_user_id", @@ -1682,8 +1682,8 @@ "primaryKey": true, "notNull": true }, - "resource_state": { - "name": "resource_state", + "state": { + "name": "state", "type": "resource_state", "typeSchema": "public", "primaryKey": false, @@ -2505,13 +2505,13 @@ "name": "username", "type": "varchar(255)", "primaryKey": false, - "notNull": true + "notNull": false }, "password": { "name": "password", "type": "varchar(255)", "primaryKey": false, - "notNull": true + "notNull": false }, "email": { "name": "email", @@ -2530,7 +2530,7 @@ "name": "birthday", "type": "timestamp", "primaryKey": false, - "notNull": true + "notNull": false }, "cpf": { "name": "cpf", diff --git a/src/db/migrations/meta/0002_snapshot.json b/src/db/migrations/meta/0002_snapshot.json deleted file mode 100644 index a0d9e2d..0000000 --- a/src/db/migrations/meta/0002_snapshot.json +++ /dev/null @@ -1,2714 +0,0 @@ -{ - "id": "9feef775-e14c-4a3d-a342-bb281dd95fa3", - "prevId": "5839f5ff-e09a-433f-9517-b6d374d4521f", - "version": "7", - "dialect": "postgresql", - "tables": { - "public.achievements": { - "name": "achievements", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "reward_experience": { - "name": "reward_experience", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "reward_points": { - "name": "reward_points", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "review_state": { - "name": "review_state", - "type": "review_state", - "typeSchema": "public", - "primaryKey": false, - "notNull": true, - "default": "'under_review'" - }, - "repeatable": { - "name": "repeatable", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "is_resettable": { - "name": "is_resettable", - "type": "boolean", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "achievements_id_unique": { - "name": "achievements_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.actions": { - "name": "actions", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "actions_id_unique": { - "name": "actions_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.collection_likes": { - "name": "collection_likes", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "collection_id": { - "name": "collection_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "collection_likes_user_id_users_id_fk": { - "name": "collection_likes_user_id_users_id_fk", - "tableFrom": "collection_likes", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "collection_likes_collection_id_collections_id_fk": { - "name": "collection_likes_collection_id_collections_id_fk", - "tableFrom": "collection_likes", - "tableTo": "collections", - "columnsFrom": [ - "collection_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "collection_likes_id_unique": { - "name": "collection_likes_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.collection_resources": { - "name": "collection_resources", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "collection_id": { - "name": "collection_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "resource_id": { - "name": "resource_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "collection_resources_collection_id_collections_id_fk": { - "name": "collection_resources_collection_id_collections_id_fk", - "tableFrom": "collection_resources", - "tableTo": "collections", - "columnsFrom": [ - "collection_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "collection_resources_resource_id_resources_id_fk": { - "name": "collection_resources_resource_id_resources_id_fk", - "tableFrom": "collection_resources", - "tableTo": "resources", - "columnsFrom": [ - "resource_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "collection_resources_id_unique": { - "name": "collection_resources_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.collection_stats": { - "name": "collection_stats", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "views": { - "name": "views", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "downloads": { - "name": "downloads", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "likes": { - "name": "likes", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "shares": { - "name": "shares", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "score": { - "name": "score", - "type": "numeric", - "primaryKey": false, - "notNull": true, - "default": "'0.0'" - }, - "follows": { - "name": "follows", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "collection_stats_id_unique": { - "name": "collection_stats_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.collections": { - "name": "collections", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "is_private": { - "name": "is_private", - "type": "boolean", - "primaryKey": false, - "notNull": false, - "default": false - }, - "is_active": { - "name": "is_active", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "deleted_at": { - "name": "deleted_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "thumbnail": { - "name": "thumbnail", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "collection_stats_id": { - "name": "collection_stats_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "collections_user_id_users_id_fk": { - "name": "collections_user_id_users_id_fk", - "tableFrom": "collections", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "collections_collection_stats_id_collection_stats_id_fk": { - "name": "collections_collection_stats_id_collection_stats_id_fk", - "tableFrom": "collections", - "tableTo": "collection_stats", - "columnsFrom": [ - "collection_stats_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "collections_id_unique": { - "name": "collections_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - }, - "collections_collection_stats_id_unique": { - "name": "collections_collection_stats_id_unique", - "nullsNotDistinct": false, - "columns": [ - "collection_stats_id" - ] - } - } - }, - "public.commentReply": { - "name": "commentReply", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "comment_id": { - "name": "comment_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "text": { - "name": "text", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "deleted_at": { - "name": "deleted_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "update_at": { - "name": "update_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "commentReply_user_id_users_id_fk": { - "name": "commentReply_user_id_users_id_fk", - "tableFrom": "commentReply", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "commentReply_comment_id_comments_id_fk": { - "name": "commentReply_comment_id_comments_id_fk", - "tableFrom": "commentReply", - "tableTo": "comments", - "columnsFrom": [ - "comment_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "commentReply_id_unique": { - "name": "commentReply_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.comments": { - "name": "comments", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "resource_id": { - "name": "resource_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "text": { - "name": "text", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "deleted_at": { - "name": "deleted_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "comments_user_id_users_id_fk": { - "name": "comments_user_id_users_id_fk", - "tableFrom": "comments", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "comments_resource_id_resources_id_fk": { - "name": "comments_resource_id_resources_id_fk", - "tableFrom": "comments", - "tableTo": "resources", - "columnsFrom": [ - "resource_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "comments_id_unique": { - "name": "comments_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.complaints": { - "name": "complaints", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "state": { - "name": "state", - "type": "complaints_state", - "typeSchema": "public", - "primaryKey": false, - "notNull": true, - "default": "'complained'" - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "denouncer_id": { - "name": "denouncer_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "resource_id": { - "name": "resource_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "collection_id": { - "name": "collection_id", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "evaluated_at": { - "name": "evaluated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "q1": { - "name": "q1", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "q2": { - "name": "q2", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "q3": { - "name": "q3", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "q4": { - "name": "q4", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "q5": { - "name": "q5", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "q6": { - "name": "q6", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "q7": { - "name": "q7", - "type": "boolean", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "complaints_denouncer_id_users_id_fk": { - "name": "complaints_denouncer_id_users_id_fk", - "tableFrom": "complaints", - "tableTo": "users", - "columnsFrom": [ - "denouncer_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "complaints_resource_id_resources_id_fk": { - "name": "complaints_resource_id_resources_id_fk", - "tableFrom": "complaints", - "tableTo": "resources", - "columnsFrom": [ - "resource_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "complaints_collection_id_collections_id_fk": { - "name": "complaints_collection_id_collections_id_fk", - "tableFrom": "complaints", - "tableTo": "collections", - "columnsFrom": [ - "collection_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "complaints_user_id_users_id_fk": { - "name": "complaints_user_id_users_id_fk", - "tableFrom": "complaints", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "complaints_id_unique": { - "name": "complaints_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.educational_stages": { - "name": "educational_stages", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "educational_stages_id_unique": { - "name": "educational_stages_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.followers": { - "name": "followers", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "follower_id": { - "name": "follower_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "followers_user_id_users_id_fk": { - "name": "followers_user_id_users_id_fk", - "tableFrom": "followers", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "followers_follower_id_users_id_fk": { - "name": "followers_follower_id_users_id_fk", - "tableFrom": "followers", - "tableTo": "users", - "columnsFrom": [ - "follower_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "followers_id_unique": { - "name": "followers_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.institutions": { - "name": "institutions", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "uf": { - "name": "uf", - "type": "varchar(2)", - "primaryKey": false, - "notNull": false - }, - "city": { - "name": "city", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "cep": { - "name": "cep", - "type": "varchar(10)", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "institutions_id_unique": { - "name": "institutions_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.item_achievements": { - "name": "item_achievements", - "schema": "", - "columns": { - "item_id": { - "name": "item_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "achievement_id": { - "name": "achievement_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "item_achievements_item_id_items_id_fk": { - "name": "item_achievements_item_id_items_id_fk", - "tableFrom": "item_achievements", - "tableTo": "items", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "item_achievements_achievement_id_achievements_id_fk": { - "name": "item_achievements_achievement_id_achievements_id_fk", - "tableFrom": "item_achievements", - "tableTo": "achievements", - "columnsFrom": [ - "achievement_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "item_achievements_item_id_achievement_id_pk": { - "name": "item_achievements_item_id_achievement_id_pk", - "columns": [ - "item_id", - "achievement_id" - ] - } - }, - "uniqueConstraints": {} - }, - "public.items": { - "name": "items", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "price": { - "name": "price", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "discount": { - "name": "discount", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "is_active": { - "name": "is_active", - "type": "boolean", - "primaryKey": false, - "notNull": false, - "default": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "items_id_unique": { - "name": "items_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.languages": { - "name": "languages", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "code": { - "name": "code", - "type": "varchar(10)", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "languages_id_unique": { - "name": "languages_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - }, - "languages_code_unique": { - "name": "languages_code_unique", - "nullsNotDistinct": false, - "columns": [ - "code" - ] - } - } - }, - "public.licenses": { - "name": "licenses", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "url": { - "name": "url", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "licenses_id_unique": { - "name": "licenses_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.notifications": { - "name": "notifications", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "owner_id": { - "name": "owner_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "action_id": { - "name": "action_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "actor_user_id": { - "name": "actor_user_id", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "target_user_id": { - "name": "target_user_id", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "target_resource_id": { - "name": "target_resource_id", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "target_collection_id": { - "name": "target_collection_id", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "viewed": { - "name": "viewed", - "type": "boolean", - "primaryKey": false, - "notNull": false, - "default": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "notifications_owner_id_users_id_fk": { - "name": "notifications_owner_id_users_id_fk", - "tableFrom": "notifications", - "tableTo": "users", - "columnsFrom": [ - "owner_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "notifications_action_id_actions_id_fk": { - "name": "notifications_action_id_actions_id_fk", - "tableFrom": "notifications", - "tableTo": "actions", - "columnsFrom": [ - "action_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "notifications_actor_user_id_users_id_fk": { - "name": "notifications_actor_user_id_users_id_fk", - "tableFrom": "notifications", - "tableTo": "users", - "columnsFrom": [ - "actor_user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "notifications_target_user_id_users_id_fk": { - "name": "notifications_target_user_id_users_id_fk", - "tableFrom": "notifications", - "tableTo": "users", - "columnsFrom": [ - "target_user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "notifications_target_resource_id_resources_id_fk": { - "name": "notifications_target_resource_id_resources_id_fk", - "tableFrom": "notifications", - "tableTo": "resources", - "columnsFrom": [ - "target_resource_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "notifications_target_collection_id_collections_id_fk": { - "name": "notifications_target_collection_id_collections_id_fk", - "tableFrom": "notifications", - "tableTo": "collections", - "columnsFrom": [ - "target_collection_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "notifications_id_unique": { - "name": "notifications_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.object_types": { - "name": "object_types", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "object_types_id_unique": { - "name": "object_types_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.resource_educational_stages": { - "name": "resource_educational_stages", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "resource_id": { - "name": "resource_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "educational_stage_id": { - "name": "educational_stage_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "resource_educational_stages_resource_id_resources_id_fk": { - "name": "resource_educational_stages_resource_id_resources_id_fk", - "tableFrom": "resource_educational_stages", - "tableTo": "resources", - "columnsFrom": [ - "resource_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "resource_educational_stages_educational_stage_id_educational_stages_id_fk": { - "name": "resource_educational_stages_educational_stage_id_educational_stages_id_fk", - "tableFrom": "resource_educational_stages", - "tableTo": "educational_stages", - "columnsFrom": [ - "educational_stage_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "resource_educational_stages_id_unique": { - "name": "resource_educational_stages_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.resource_languages": { - "name": "resource_languages", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "resource_id": { - "name": "resource_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "language_id": { - "name": "language_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "resource_languages_resource_id_resources_id_fk": { - "name": "resource_languages_resource_id_resources_id_fk", - "tableFrom": "resource_languages", - "tableTo": "resources", - "columnsFrom": [ - "resource_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "resource_languages_language_id_languages_id_fk": { - "name": "resource_languages_language_id_languages_id_fk", - "tableFrom": "resource_languages", - "tableTo": "languages", - "columnsFrom": [ - "language_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "resource_languages_id_unique": { - "name": "resource_languages_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.resource_likes": { - "name": "resource_likes", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "resource_id": { - "name": "resource_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "resource_likes_user_id_users_id_fk": { - "name": "resource_likes_user_id_users_id_fk", - "tableFrom": "resource_likes", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "resource_likes_resource_id_resources_id_fk": { - "name": "resource_likes_resource_id_resources_id_fk", - "tableFrom": "resource_likes", - "tableTo": "resources", - "columnsFrom": [ - "resource_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "resource_likes_id_unique": { - "name": "resource_likes_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.resource_stats": { - "name": "resource_stats", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "views": { - "name": "views", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "downloads": { - "name": "downloads", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "likes": { - "name": "likes", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "shares": { - "name": "shares", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "score": { - "name": "score", - "type": "numeric", - "primaryKey": false, - "notNull": true, - "default": "'0.0'" - }, - "follows": { - "name": "follows", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "comments": { - "name": "comments", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "resource_stats_id_unique": { - "name": "resource_stats_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.resource_subjects": { - "name": "resource_subjects", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "resource_id": { - "name": "resource_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "subject_id": { - "name": "subject_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "resource_subjects_resource_id_resources_id_fk": { - "name": "resource_subjects_resource_id_resources_id_fk", - "tableFrom": "resource_subjects", - "tableTo": "resources", - "columnsFrom": [ - "resource_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "resource_subjects_subject_id_subjects_id_fk": { - "name": "resource_subjects_subject_id_subjects_id_fk", - "tableFrom": "resource_subjects", - "tableTo": "subjects", - "columnsFrom": [ - "subject_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "resource_subjects_id_unique": { - "name": "resource_subjects_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.resources": { - "name": "resources", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "resource_state": { - "name": "resource_state", - "type": "resource_state", - "typeSchema": "public", - "primaryKey": false, - "notNull": true, - "default": "'draft'" - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "author": { - "name": "author", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "link": { - "name": "link", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "thumbnail": { - "name": "thumbnail", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "published_at": { - "name": "published_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "submitted_at": { - "name": "submitted_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "deleted_at": { - "name": "deleted_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "resource_stats_id": { - "name": "resource_stats_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "object_type_id": { - "name": "object_type_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "license_id": { - "name": "license_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "resources_user_id_users_id_fk": { - "name": "resources_user_id_users_id_fk", - "tableFrom": "resources", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "resources_resource_stats_id_resource_stats_id_fk": { - "name": "resources_resource_stats_id_resource_stats_id_fk", - "tableFrom": "resources", - "tableTo": "resource_stats", - "columnsFrom": [ - "resource_stats_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "resources_object_type_id_object_types_id_fk": { - "name": "resources_object_type_id_object_types_id_fk", - "tableFrom": "resources", - "tableTo": "object_types", - "columnsFrom": [ - "object_type_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "resources_license_id_licenses_id_fk": { - "name": "resources_license_id_licenses_id_fk", - "tableFrom": "resources", - "tableTo": "licenses", - "columnsFrom": [ - "license_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "resources_id_unique": { - "name": "resources_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - }, - "resources_resource_stats_id_unique": { - "name": "resources_resource_stats_id_unique", - "nullsNotDistinct": false, - "columns": [ - "resource_stats_id" - ] - } - } - }, - "public.roles": { - "name": "roles", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "roles_id_unique": { - "name": "roles_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - }, - "roles_name_unique": { - "name": "roles_name_unique", - "nullsNotDistinct": false, - "columns": [ - "name" - ] - } - } - }, - "public.subjects": { - "name": "subjects", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "subjects_id_unique": { - "name": "subjects_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.submissions": { - "name": "submissions", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "is_accepted": { - "name": "is_accepted", - "type": "boolean", - "primaryKey": false, - "notNull": true, - "default": false - }, - "justification": { - "name": "justification", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "resource_id": { - "name": "resource_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "submitter_id": { - "name": "submitter_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "curator_id": { - "name": "curator_id", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "answered_at": { - "name": "answered_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "q1": { - "name": "q1", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "q2": { - "name": "q2", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "q3": { - "name": "q3", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "q4": { - "name": "q4", - "type": "boolean", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "submissions_resource_id_resources_id_fk": { - "name": "submissions_resource_id_resources_id_fk", - "tableFrom": "submissions", - "tableTo": "resources", - "columnsFrom": [ - "resource_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "submissions_submitter_id_users_id_fk": { - "name": "submissions_submitter_id_users_id_fk", - "tableFrom": "submissions", - "tableTo": "users", - "columnsFrom": [ - "submitter_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "submissions_curator_id_users_id_fk": { - "name": "submissions_curator_id_users_id_fk", - "tableFrom": "submissions", - "tableTo": "users", - "columnsFrom": [ - "curator_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "submissions_id_unique": { - "name": "submissions_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.user_achievements": { - "name": "user_achievements", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "achievement_id": { - "name": "achievement_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "user_achievements_user_id_users_id_fk": { - "name": "user_achievements_user_id_users_id_fk", - "tableFrom": "user_achievements", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "user_achievements_achievement_id_users_id_fk": { - "name": "user_achievements_achievement_id_users_id_fk", - "tableFrom": "user_achievements", - "tableTo": "users", - "columnsFrom": [ - "achievement_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "user_achievements_id_unique": { - "name": "user_achievements_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.user_collections": { - "name": "user_collections", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "collection_id": { - "name": "collection_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "user_collections_user_id_users_id_fk": { - "name": "user_collections_user_id_users_id_fk", - "tableFrom": "user_collections", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "user_collections_collection_id_collections_id_fk": { - "name": "user_collections_collection_id_collections_id_fk", - "tableFrom": "user_collections", - "tableTo": "collections", - "columnsFrom": [ - "collection_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "user_collections_id_unique": { - "name": "user_collections_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.user_institutions": { - "name": "user_institutions", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "institution_id": { - "name": "institution_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "user_institutions_user_id_users_id_fk": { - "name": "user_institutions_user_id_users_id_fk", - "tableFrom": "user_institutions", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "user_institutions_institution_id_institutions_id_fk": { - "name": "user_institutions_institution_id_institutions_id_fk", - "tableFrom": "user_institutions", - "tableTo": "institutions", - "columnsFrom": [ - "institution_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "user_institutions_id_unique": { - "name": "user_institutions_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.user_items": { - "name": "user_items", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "item_id": { - "name": "item_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "user_items_user_id_users_id_fk": { - "name": "user_items_user_id_users_id_fk", - "tableFrom": "user_items", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "user_items_item_id_items_id_fk": { - "name": "user_items_item_id_items_id_fk", - "tableFrom": "user_items", - "tableTo": "items", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "user_items_id_unique": { - "name": "user_items_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.user_roles": { - "name": "user_roles", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "role_id": { - "name": "role_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "user_roles_user_id_users_id_fk": { - "name": "user_roles_user_id_users_id_fk", - "tableFrom": "user_roles", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "user_roles_role_id_roles_id_fk": { - "name": "user_roles_role_id_roles_id_fk", - "tableFrom": "user_roles", - "tableTo": "roles", - "columnsFrom": [ - "role_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "user_roles_id_unique": { - "name": "user_roles_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.user_stats": { - "name": "user_stats", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "score": { - "name": "score", - "type": "numeric", - "primaryKey": false, - "notNull": true, - "default": "'0.0'" - }, - "likes": { - "name": "likes", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "likes_received": { - "name": "likes_received", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "follows": { - "name": "follows", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "followers": { - "name": "followers", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "collections": { - "name": "collections", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "submitted_resources": { - "name": "submitted_resources", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "approved_resources": { - "name": "approved_resources", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "reviewed_resources": { - "name": "reviewed_resources", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "comments": { - "name": "comments", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "user_stats_id_unique": { - "name": "user_stats_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.users": { - "name": "users", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "username": { - "name": "username", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "password": { - "name": "password", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "email": { - "name": "email", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "default": "'sem descrição'" - }, - "birthday": { - "name": "birthday", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "cpf": { - "name": "cpf", - "type": "varchar(11)", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "confirmed_at": { - "name": "confirmed_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "confirmation_sent_at": { - "name": "confirmation_sent_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "deleted_at": { - "name": "deleted_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "reactivated_at": { - "name": "reactivated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "is_active": { - "name": "is_active", - "type": "boolean", - "primaryKey": false, - "notNull": false, - "default": true - }, - "user_stats_id": { - "name": "user_stats_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "level": { - "name": "level", - "type": "integer", - "primaryKey": false, - "notNull": false, - "default": 1 - }, - "experience": { - "name": "experience", - "type": "integer", - "primaryKey": false, - "notNull": false, - "default": 0 - }, - "points": { - "name": "points", - "type": "integer", - "primaryKey": false, - "notNull": false, - "default": 0 - }, - "level_xp": { - "name": "level_xp", - "type": "integer", - "primaryKey": false, - "notNull": false, - "default": 0 - } - }, - "indexes": {}, - "foreignKeys": { - "users_user_stats_id_user_stats_id_fk": { - "name": "users_user_stats_id_user_stats_id_fk", - "tableFrom": "users", - "tableTo": "user_stats", - "columnsFrom": [ - "user_stats_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "users_id_unique": { - "name": "users_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - }, - "users_username_unique": { - "name": "users_username_unique", - "nullsNotDistinct": false, - "columns": [ - "username" - ] - }, - "users_email_unique": { - "name": "users_email_unique", - "nullsNotDistinct": false, - "columns": [ - "email" - ] - }, - "users_cpf_unique": { - "name": "users_cpf_unique", - "nullsNotDistinct": false, - "columns": [ - "cpf" - ] - }, - "users_user_stats_id_unique": { - "name": "users_user_stats_id_unique", - "nullsNotDistinct": false, - "columns": [ - "user_stats_id" - ] - } - } - } - }, - "enums": { - "public.complaints_state": { - "name": "complaints_state", - "schema": "public", - "values": [ - "complained", - "rejected", - "accepted" - ] - }, - "public.resource_state": { - "name": "resource_state", - "schema": "public", - "values": [ - "draft", - "submitted", - "accepted", - "reported", - "deleted" - ] - }, - "public.review_state": { - "name": "review_state", - "schema": "public", - "values": [ - "active", - "inactive", - "under_review" - ] - } - }, - "schemas": {}, - "_meta": { - "columns": {}, - "schemas": {}, - "tables": {} - } -} \ No newline at end of file diff --git a/src/db/migrations/meta/0003_snapshot.json b/src/db/migrations/meta/0003_snapshot.json deleted file mode 100644 index f8eb3db..0000000 --- a/src/db/migrations/meta/0003_snapshot.json +++ /dev/null @@ -1,2714 +0,0 @@ -{ - "id": "50829ae2-c646-4fc2-aaeb-40af6e5e926c", - "prevId": "9feef775-e14c-4a3d-a342-bb281dd95fa3", - "version": "7", - "dialect": "postgresql", - "tables": { - "public.achievements": { - "name": "achievements", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "reward_experience": { - "name": "reward_experience", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "reward_points": { - "name": "reward_points", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "review_state": { - "name": "review_state", - "type": "review_state", - "typeSchema": "public", - "primaryKey": false, - "notNull": true, - "default": "'under_review'" - }, - "repeatable": { - "name": "repeatable", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "is_resettable": { - "name": "is_resettable", - "type": "boolean", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "achievements_id_unique": { - "name": "achievements_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.actions": { - "name": "actions", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "actions_id_unique": { - "name": "actions_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.collection_likes": { - "name": "collection_likes", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "collection_id": { - "name": "collection_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "collection_likes_user_id_users_id_fk": { - "name": "collection_likes_user_id_users_id_fk", - "tableFrom": "collection_likes", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "collection_likes_collection_id_collections_id_fk": { - "name": "collection_likes_collection_id_collections_id_fk", - "tableFrom": "collection_likes", - "tableTo": "collections", - "columnsFrom": [ - "collection_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "collection_likes_id_unique": { - "name": "collection_likes_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.collection_resources": { - "name": "collection_resources", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "collection_id": { - "name": "collection_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "resource_id": { - "name": "resource_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "collection_resources_collection_id_collections_id_fk": { - "name": "collection_resources_collection_id_collections_id_fk", - "tableFrom": "collection_resources", - "tableTo": "collections", - "columnsFrom": [ - "collection_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "collection_resources_resource_id_resources_id_fk": { - "name": "collection_resources_resource_id_resources_id_fk", - "tableFrom": "collection_resources", - "tableTo": "resources", - "columnsFrom": [ - "resource_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "collection_resources_id_unique": { - "name": "collection_resources_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.collection_stats": { - "name": "collection_stats", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "views": { - "name": "views", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "downloads": { - "name": "downloads", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "likes": { - "name": "likes", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "shares": { - "name": "shares", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "score": { - "name": "score", - "type": "numeric", - "primaryKey": false, - "notNull": true, - "default": "'0.0'" - }, - "follows": { - "name": "follows", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "collection_stats_id_unique": { - "name": "collection_stats_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.collections": { - "name": "collections", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "is_private": { - "name": "is_private", - "type": "boolean", - "primaryKey": false, - "notNull": false, - "default": false - }, - "is_active": { - "name": "is_active", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "deleted_at": { - "name": "deleted_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "thumbnail": { - "name": "thumbnail", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "collection_stats_id": { - "name": "collection_stats_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "collections_user_id_users_id_fk": { - "name": "collections_user_id_users_id_fk", - "tableFrom": "collections", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "collections_collection_stats_id_collection_stats_id_fk": { - "name": "collections_collection_stats_id_collection_stats_id_fk", - "tableFrom": "collections", - "tableTo": "collection_stats", - "columnsFrom": [ - "collection_stats_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "collections_id_unique": { - "name": "collections_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - }, - "collections_collection_stats_id_unique": { - "name": "collections_collection_stats_id_unique", - "nullsNotDistinct": false, - "columns": [ - "collection_stats_id" - ] - } - } - }, - "public.commentReply": { - "name": "commentReply", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "comment_id": { - "name": "comment_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "text": { - "name": "text", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "deleted_at": { - "name": "deleted_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "update_at": { - "name": "update_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "commentReply_user_id_users_id_fk": { - "name": "commentReply_user_id_users_id_fk", - "tableFrom": "commentReply", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "commentReply_comment_id_comments_id_fk": { - "name": "commentReply_comment_id_comments_id_fk", - "tableFrom": "commentReply", - "tableTo": "comments", - "columnsFrom": [ - "comment_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "commentReply_id_unique": { - "name": "commentReply_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.comments": { - "name": "comments", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "resource_id": { - "name": "resource_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "text": { - "name": "text", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "deleted_at": { - "name": "deleted_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "comments_user_id_users_id_fk": { - "name": "comments_user_id_users_id_fk", - "tableFrom": "comments", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "comments_resource_id_resources_id_fk": { - "name": "comments_resource_id_resources_id_fk", - "tableFrom": "comments", - "tableTo": "resources", - "columnsFrom": [ - "resource_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "comments_id_unique": { - "name": "comments_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.complaints": { - "name": "complaints", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "state": { - "name": "state", - "type": "complaints_state", - "typeSchema": "public", - "primaryKey": false, - "notNull": true, - "default": "'complained'" - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "denouncer_id": { - "name": "denouncer_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "resource_id": { - "name": "resource_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "collection_id": { - "name": "collection_id", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "evaluated_at": { - "name": "evaluated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "q1": { - "name": "q1", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "q2": { - "name": "q2", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "q3": { - "name": "q3", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "q4": { - "name": "q4", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "q5": { - "name": "q5", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "q6": { - "name": "q6", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "q7": { - "name": "q7", - "type": "boolean", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "complaints_denouncer_id_users_id_fk": { - "name": "complaints_denouncer_id_users_id_fk", - "tableFrom": "complaints", - "tableTo": "users", - "columnsFrom": [ - "denouncer_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "complaints_resource_id_resources_id_fk": { - "name": "complaints_resource_id_resources_id_fk", - "tableFrom": "complaints", - "tableTo": "resources", - "columnsFrom": [ - "resource_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "complaints_collection_id_collections_id_fk": { - "name": "complaints_collection_id_collections_id_fk", - "tableFrom": "complaints", - "tableTo": "collections", - "columnsFrom": [ - "collection_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "complaints_user_id_users_id_fk": { - "name": "complaints_user_id_users_id_fk", - "tableFrom": "complaints", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "complaints_id_unique": { - "name": "complaints_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.educational_stages": { - "name": "educational_stages", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "educational_stages_id_unique": { - "name": "educational_stages_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.followers": { - "name": "followers", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "follower_id": { - "name": "follower_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "followers_user_id_users_id_fk": { - "name": "followers_user_id_users_id_fk", - "tableFrom": "followers", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "followers_follower_id_users_id_fk": { - "name": "followers_follower_id_users_id_fk", - "tableFrom": "followers", - "tableTo": "users", - "columnsFrom": [ - "follower_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "followers_id_unique": { - "name": "followers_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.institutions": { - "name": "institutions", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "uf": { - "name": "uf", - "type": "varchar(2)", - "primaryKey": false, - "notNull": false - }, - "city": { - "name": "city", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "cep": { - "name": "cep", - "type": "varchar(10)", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "institutions_id_unique": { - "name": "institutions_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.item_achievements": { - "name": "item_achievements", - "schema": "", - "columns": { - "item_id": { - "name": "item_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "achievement_id": { - "name": "achievement_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "item_achievements_item_id_items_id_fk": { - "name": "item_achievements_item_id_items_id_fk", - "tableFrom": "item_achievements", - "tableTo": "items", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "item_achievements_achievement_id_achievements_id_fk": { - "name": "item_achievements_achievement_id_achievements_id_fk", - "tableFrom": "item_achievements", - "tableTo": "achievements", - "columnsFrom": [ - "achievement_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": { - "item_achievements_item_id_achievement_id_pk": { - "name": "item_achievements_item_id_achievement_id_pk", - "columns": [ - "item_id", - "achievement_id" - ] - } - }, - "uniqueConstraints": {} - }, - "public.items": { - "name": "items", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "price": { - "name": "price", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "discount": { - "name": "discount", - "type": "numeric", - "primaryKey": false, - "notNull": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "is_active": { - "name": "is_active", - "type": "boolean", - "primaryKey": false, - "notNull": false, - "default": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "items_id_unique": { - "name": "items_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.languages": { - "name": "languages", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "code": { - "name": "code", - "type": "varchar(10)", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "languages_id_unique": { - "name": "languages_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - }, - "languages_code_unique": { - "name": "languages_code_unique", - "nullsNotDistinct": false, - "columns": [ - "code" - ] - } - } - }, - "public.licenses": { - "name": "licenses", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "url": { - "name": "url", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "licenses_id_unique": { - "name": "licenses_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.notifications": { - "name": "notifications", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "owner_id": { - "name": "owner_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "action_id": { - "name": "action_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "actor_user_id": { - "name": "actor_user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "target_user_id": { - "name": "target_user_id", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "target_resource_id": { - "name": "target_resource_id", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "target_collection_id": { - "name": "target_collection_id", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "viewed": { - "name": "viewed", - "type": "boolean", - "primaryKey": false, - "notNull": false, - "default": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "notifications_owner_id_users_id_fk": { - "name": "notifications_owner_id_users_id_fk", - "tableFrom": "notifications", - "tableTo": "users", - "columnsFrom": [ - "owner_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "notifications_action_id_actions_id_fk": { - "name": "notifications_action_id_actions_id_fk", - "tableFrom": "notifications", - "tableTo": "actions", - "columnsFrom": [ - "action_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "notifications_actor_user_id_users_id_fk": { - "name": "notifications_actor_user_id_users_id_fk", - "tableFrom": "notifications", - "tableTo": "users", - "columnsFrom": [ - "actor_user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "notifications_target_user_id_users_id_fk": { - "name": "notifications_target_user_id_users_id_fk", - "tableFrom": "notifications", - "tableTo": "users", - "columnsFrom": [ - "target_user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "notifications_target_resource_id_resources_id_fk": { - "name": "notifications_target_resource_id_resources_id_fk", - "tableFrom": "notifications", - "tableTo": "resources", - "columnsFrom": [ - "target_resource_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "notifications_target_collection_id_collections_id_fk": { - "name": "notifications_target_collection_id_collections_id_fk", - "tableFrom": "notifications", - "tableTo": "collections", - "columnsFrom": [ - "target_collection_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "notifications_id_unique": { - "name": "notifications_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.object_types": { - "name": "object_types", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "object_types_id_unique": { - "name": "object_types_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.resource_educational_stages": { - "name": "resource_educational_stages", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "resource_id": { - "name": "resource_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "educational_stage_id": { - "name": "educational_stage_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "resource_educational_stages_resource_id_resources_id_fk": { - "name": "resource_educational_stages_resource_id_resources_id_fk", - "tableFrom": "resource_educational_stages", - "tableTo": "resources", - "columnsFrom": [ - "resource_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "resource_educational_stages_educational_stage_id_educational_stages_id_fk": { - "name": "resource_educational_stages_educational_stage_id_educational_stages_id_fk", - "tableFrom": "resource_educational_stages", - "tableTo": "educational_stages", - "columnsFrom": [ - "educational_stage_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "resource_educational_stages_id_unique": { - "name": "resource_educational_stages_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.resource_languages": { - "name": "resource_languages", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "resource_id": { - "name": "resource_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "language_id": { - "name": "language_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "resource_languages_resource_id_resources_id_fk": { - "name": "resource_languages_resource_id_resources_id_fk", - "tableFrom": "resource_languages", - "tableTo": "resources", - "columnsFrom": [ - "resource_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "resource_languages_language_id_languages_id_fk": { - "name": "resource_languages_language_id_languages_id_fk", - "tableFrom": "resource_languages", - "tableTo": "languages", - "columnsFrom": [ - "language_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "resource_languages_id_unique": { - "name": "resource_languages_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.resource_likes": { - "name": "resource_likes", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "resource_id": { - "name": "resource_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "resource_likes_user_id_users_id_fk": { - "name": "resource_likes_user_id_users_id_fk", - "tableFrom": "resource_likes", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "resource_likes_resource_id_resources_id_fk": { - "name": "resource_likes_resource_id_resources_id_fk", - "tableFrom": "resource_likes", - "tableTo": "resources", - "columnsFrom": [ - "resource_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "resource_likes_id_unique": { - "name": "resource_likes_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.resource_stats": { - "name": "resource_stats", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "views": { - "name": "views", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "downloads": { - "name": "downloads", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "likes": { - "name": "likes", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "shares": { - "name": "shares", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "score": { - "name": "score", - "type": "numeric", - "primaryKey": false, - "notNull": true, - "default": "'0.0'" - }, - "follows": { - "name": "follows", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "comments": { - "name": "comments", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "resource_stats_id_unique": { - "name": "resource_stats_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.resource_subjects": { - "name": "resource_subjects", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "resource_id": { - "name": "resource_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "subject_id": { - "name": "subject_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "resource_subjects_resource_id_resources_id_fk": { - "name": "resource_subjects_resource_id_resources_id_fk", - "tableFrom": "resource_subjects", - "tableTo": "resources", - "columnsFrom": [ - "resource_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "resource_subjects_subject_id_subjects_id_fk": { - "name": "resource_subjects_subject_id_subjects_id_fk", - "tableFrom": "resource_subjects", - "tableTo": "subjects", - "columnsFrom": [ - "subject_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "resource_subjects_id_unique": { - "name": "resource_subjects_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.resources": { - "name": "resources", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "resource_state": { - "name": "resource_state", - "type": "resource_state", - "typeSchema": "public", - "primaryKey": false, - "notNull": true, - "default": "'draft'" - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "author": { - "name": "author", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "link": { - "name": "link", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "thumbnail": { - "name": "thumbnail", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "published_at": { - "name": "published_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "submitted_at": { - "name": "submitted_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "deleted_at": { - "name": "deleted_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "resource_stats_id": { - "name": "resource_stats_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "object_type_id": { - "name": "object_type_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "license_id": { - "name": "license_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "resources_user_id_users_id_fk": { - "name": "resources_user_id_users_id_fk", - "tableFrom": "resources", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "resources_resource_stats_id_resource_stats_id_fk": { - "name": "resources_resource_stats_id_resource_stats_id_fk", - "tableFrom": "resources", - "tableTo": "resource_stats", - "columnsFrom": [ - "resource_stats_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "resources_object_type_id_object_types_id_fk": { - "name": "resources_object_type_id_object_types_id_fk", - "tableFrom": "resources", - "tableTo": "object_types", - "columnsFrom": [ - "object_type_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "resources_license_id_licenses_id_fk": { - "name": "resources_license_id_licenses_id_fk", - "tableFrom": "resources", - "tableTo": "licenses", - "columnsFrom": [ - "license_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "resources_id_unique": { - "name": "resources_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - }, - "resources_resource_stats_id_unique": { - "name": "resources_resource_stats_id_unique", - "nullsNotDistinct": false, - "columns": [ - "resource_stats_id" - ] - } - } - }, - "public.roles": { - "name": "roles", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "roles_id_unique": { - "name": "roles_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - }, - "roles_name_unique": { - "name": "roles_name_unique", - "nullsNotDistinct": false, - "columns": [ - "name" - ] - } - } - }, - "public.subjects": { - "name": "subjects", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "subjects_id_unique": { - "name": "subjects_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.submissions": { - "name": "submissions", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "is_accepted": { - "name": "is_accepted", - "type": "boolean", - "primaryKey": false, - "notNull": true, - "default": false - }, - "justification": { - "name": "justification", - "type": "text", - "primaryKey": false, - "notNull": false - }, - "resource_id": { - "name": "resource_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "submitter_id": { - "name": "submitter_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "curator_id": { - "name": "curator_id", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "answered_at": { - "name": "answered_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "q1": { - "name": "q1", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "q2": { - "name": "q2", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "q3": { - "name": "q3", - "type": "boolean", - "primaryKey": false, - "notNull": false - }, - "q4": { - "name": "q4", - "type": "boolean", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": { - "submissions_resource_id_resources_id_fk": { - "name": "submissions_resource_id_resources_id_fk", - "tableFrom": "submissions", - "tableTo": "resources", - "columnsFrom": [ - "resource_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "submissions_submitter_id_users_id_fk": { - "name": "submissions_submitter_id_users_id_fk", - "tableFrom": "submissions", - "tableTo": "users", - "columnsFrom": [ - "submitter_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "submissions_curator_id_users_id_fk": { - "name": "submissions_curator_id_users_id_fk", - "tableFrom": "submissions", - "tableTo": "users", - "columnsFrom": [ - "curator_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "submissions_id_unique": { - "name": "submissions_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.user_achievements": { - "name": "user_achievements", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "achievement_id": { - "name": "achievement_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "user_achievements_user_id_users_id_fk": { - "name": "user_achievements_user_id_users_id_fk", - "tableFrom": "user_achievements", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "user_achievements_achievement_id_users_id_fk": { - "name": "user_achievements_achievement_id_users_id_fk", - "tableFrom": "user_achievements", - "tableTo": "users", - "columnsFrom": [ - "achievement_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "user_achievements_id_unique": { - "name": "user_achievements_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.user_collections": { - "name": "user_collections", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "collection_id": { - "name": "collection_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "user_collections_user_id_users_id_fk": { - "name": "user_collections_user_id_users_id_fk", - "tableFrom": "user_collections", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "user_collections_collection_id_collections_id_fk": { - "name": "user_collections_collection_id_collections_id_fk", - "tableFrom": "user_collections", - "tableTo": "collections", - "columnsFrom": [ - "collection_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "user_collections_id_unique": { - "name": "user_collections_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.user_institutions": { - "name": "user_institutions", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "institution_id": { - "name": "institution_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "user_institutions_user_id_users_id_fk": { - "name": "user_institutions_user_id_users_id_fk", - "tableFrom": "user_institutions", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "user_institutions_institution_id_institutions_id_fk": { - "name": "user_institutions_institution_id_institutions_id_fk", - "tableFrom": "user_institutions", - "tableTo": "institutions", - "columnsFrom": [ - "institution_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "user_institutions_id_unique": { - "name": "user_institutions_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.user_items": { - "name": "user_items", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "item_id": { - "name": "item_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "user_items_user_id_users_id_fk": { - "name": "user_items_user_id_users_id_fk", - "tableFrom": "user_items", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "user_items_item_id_items_id_fk": { - "name": "user_items_item_id_items_id_fk", - "tableFrom": "user_items", - "tableTo": "items", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "user_items_id_unique": { - "name": "user_items_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.user_roles": { - "name": "user_roles", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "role_id": { - "name": "role_id", - "type": "integer", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "user_roles_user_id_users_id_fk": { - "name": "user_roles_user_id_users_id_fk", - "tableFrom": "user_roles", - "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "user_roles_role_id_roles_id_fk": { - "name": "user_roles_role_id_roles_id_fk", - "tableFrom": "user_roles", - "tableTo": "roles", - "columnsFrom": [ - "role_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "user_roles_id_unique": { - "name": "user_roles_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.user_stats": { - "name": "user_stats", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "score": { - "name": "score", - "type": "numeric", - "primaryKey": false, - "notNull": true, - "default": "'0.0'" - }, - "likes": { - "name": "likes", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "likes_received": { - "name": "likes_received", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "follows": { - "name": "follows", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "followers": { - "name": "followers", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "collections": { - "name": "collections", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "submitted_resources": { - "name": "submitted_resources", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "approved_resources": { - "name": "approved_resources", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "reviewed_resources": { - "name": "reviewed_resources", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - }, - "comments": { - "name": "comments", - "type": "integer", - "primaryKey": false, - "notNull": true, - "default": 0 - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "user_stats_id_unique": { - "name": "user_stats_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - } - } - }, - "public.users": { - "name": "users", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "username": { - "name": "username", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "password": { - "name": "password", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "email": { - "name": "email", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "default": "'sem descrição'" - }, - "birthday": { - "name": "birthday", - "type": "timestamp", - "primaryKey": false, - "notNull": true - }, - "cpf": { - "name": "cpf", - "type": "varchar(11)", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "confirmed_at": { - "name": "confirmed_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "confirmation_sent_at": { - "name": "confirmation_sent_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "deleted_at": { - "name": "deleted_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "reactivated_at": { - "name": "reactivated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "is_active": { - "name": "is_active", - "type": "boolean", - "primaryKey": false, - "notNull": false, - "default": true - }, - "user_stats_id": { - "name": "user_stats_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "level": { - "name": "level", - "type": "integer", - "primaryKey": false, - "notNull": false, - "default": 1 - }, - "experience": { - "name": "experience", - "type": "integer", - "primaryKey": false, - "notNull": false, - "default": 0 - }, - "points": { - "name": "points", - "type": "integer", - "primaryKey": false, - "notNull": false, - "default": 0 - }, - "level_xp": { - "name": "level_xp", - "type": "integer", - "primaryKey": false, - "notNull": false, - "default": 0 - } - }, - "indexes": {}, - "foreignKeys": { - "users_user_stats_id_user_stats_id_fk": { - "name": "users_user_stats_id_user_stats_id_fk", - "tableFrom": "users", - "tableTo": "user_stats", - "columnsFrom": [ - "user_stats_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "users_id_unique": { - "name": "users_id_unique", - "nullsNotDistinct": false, - "columns": [ - "id" - ] - }, - "users_username_unique": { - "name": "users_username_unique", - "nullsNotDistinct": false, - "columns": [ - "username" - ] - }, - "users_email_unique": { - "name": "users_email_unique", - "nullsNotDistinct": false, - "columns": [ - "email" - ] - }, - "users_cpf_unique": { - "name": "users_cpf_unique", - "nullsNotDistinct": false, - "columns": [ - "cpf" - ] - }, - "users_user_stats_id_unique": { - "name": "users_user_stats_id_unique", - "nullsNotDistinct": false, - "columns": [ - "user_stats_id" - ] - } - } - } - }, - "enums": { - "public.complaints_state": { - "name": "complaints_state", - "schema": "public", - "values": [ - "complained", - "rejected", - "accepted" - ] - }, - "public.resource_state": { - "name": "resource_state", - "schema": "public", - "values": [ - "draft", - "submitted", - "accepted", - "reported", - "deleted" - ] - }, - "public.review_state": { - "name": "review_state", - "schema": "public", - "values": [ - "active", - "inactive", - "under_review" - ] - } - }, - "schemas": {}, - "_meta": { - "columns": {}, - "schemas": {}, - "tables": {} - } -} \ No newline at end of file diff --git a/src/db/migrations/meta/_journal.json b/src/db/migrations/meta/_journal.json index a7e0211..1487bcc 100644 --- a/src/db/migrations/meta/_journal.json +++ b/src/db/migrations/meta/_journal.json @@ -1,5 +1,13 @@ { "version": "7", "dialect": "postgresql", - "entries": [] -} + "entries": [ + { + "idx": 0, + "version": "7", + "when": 1747659017843, + "tag": "0000_daffy_sentinel", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/src/db/repo/resource-educational-stages.repo.ts b/src/db/repo/resource-educational-stages.repo.ts index a1e49ea..f4de4fe 100644 --- a/src/db/repo/resource-educational-stages.repo.ts +++ b/src/db/repo/resource-educational-stages.repo.ts @@ -154,4 +154,6 @@ export class resourceEducationalStagesRepo { .execute(); } } + + } \ No newline at end of file diff --git a/src/db/repo/resource.repo.ts b/src/db/repo/resource.repo.ts index 8418ce4..5f00771 100644 --- a/src/db/repo/resource.repo.ts +++ b/src/db/repo/resource.repo.ts @@ -8,7 +8,6 @@ import { eq, sql, and } from 'drizzle-orm' export class ResourceRepo { async create(resource: ResourceInput ): Promise<ResourceModel> { - console.log("Teste do resource: ", resource) const [ret] = await db .insert(resourceTable) .values(resource) @@ -50,7 +49,19 @@ export class ResourceRepo { return resourceSchema.model.parse(ret) } + async updatePublishedAt(id: ResourceModel['id']): Promise<ResourceModel> { + const [ret] = await db + .update(resourceTable) + .set({ + published_at: sql`NOW()` + }) + .where(eq(resourceTable.id, id)) + .returning() + + return resourceSchema.model.parse(ret) + } + async setResourceState(id: ResourceModel['id']): Promise<ResourceModel> { const [ret] = await db .update(resourceTable) diff --git a/src/db/repo/search.repo.ts b/src/db/repo/search.repo.ts index b8e1048..a6e0a84 100644 --- a/src/db/repo/search.repo.ts +++ b/src/db/repo/search.repo.ts @@ -23,6 +23,7 @@ export class SearchRepo { object_type: sql`ot.name`, state: sql`re.state`, user: sql`us.name`, + user_id: sql`re.user_id`, views: sql`rest.views`, downloads: sql`rest.downloads`, likes: sql`rest.likes`, @@ -31,8 +32,8 @@ export class SearchRepo { comments: sql`rest.comments`, }) .from(sql`resources re`) - .leftJoin(sql`resource_educational_stage res`, sql`res.resource_id = re.id`) - .leftJoin(sql`educational_stages es`, sql`res.educational_stage_id = es.id`) + .leftJoin(sql`resource_educational_stages resed`, sql`resed.resource_id = re.id`) + .leftJoin(sql`educational_stages es`, sql`resed.educational_stage_id = es.id`) .leftJoin(sql`resource_languages rel`, sql`rel.resource_id = re.id`) .leftJoin(sql`languages lg`, sql`rel.language_id = lg.id`) .leftJoin(sql`resource_subjects res`, sql`res.resource_id = re.id`) @@ -50,13 +51,10 @@ export class SearchRepo { sql`re.link`, sql`re.published_at`, sql`re.state`, - sql`re.views_count`, - sql`re.downloads_count`, - sql`re.likes_count`, - sql`re.shares_count`, sql`ot.name`, sql`lc.name`, sql`us.name`, + sql`re.user_id`, sql`rest.views`, sql`rest.downloads`, sql`rest.likes`, @@ -65,9 +63,11 @@ export class SearchRepo { sql`rest.comments` ); - const results = await query.execute(); + let results = await query.execute(); - // Parse and validate each result using Zod schema + // O driver do postgres (pg) usado no drizzle retorna Numeric como uma string por padrão + // para evitar problemas com precisão numérica. Por isso precisamos parsear o score aqui + results = results.map(result => ({ ...result, score: Number(result.score) })); return results.map((result) => resourceIndexSchema.parse(result)); } diff --git a/src/db/schema/search.schema.ts b/src/db/schema/search.schema.ts index 8582ac8..f969933 100644 --- a/src/db/schema/search.schema.ts +++ b/src/db/schema/search.schema.ts @@ -6,14 +6,15 @@ export const resourceIndexSchema = z.object({ author: z.string().nullable(), description: z.string().nullable(), link: z.string().nullable(), - created_at: z.string(), + created_at: z.string().optional().nullable(), educational_stages: z.string().nullable(), languages: z.string(), subjects: z.string().nullable(), license: z.string(), object_type: z.string(), - state: z.number(), + state: z.enum(['draft', 'submitted', 'accepted', 'reported', 'deleted']), user: z.string(), + user_id: z.number(), views: z.number(), downloads: z.number(), likes: z.number(), diff --git a/src/db/seeds/object-type.seed.ts b/src/db/seeds/object-type.seed.ts index 4c11de7..49648f6 100644 --- a/src/db/seeds/object-type.seed.ts +++ b/src/db/seeds/object-type.seed.ts @@ -55,49 +55,4 @@ const objectTypeData: ObjectTypeInput[] = [ { name: 'Livro Digital', }, - { - name: 'Imagem', - }, - { - name: 'Mapa', - }, - { - name: 'Software Educacional', - }, - { - name: 'Experimento Prático', - }, - { - name: 'Texto', - }, - { - name: 'Áudio', - }, - { - name: 'Vídeo', - }, - { - name: 'Animação', - }, - { - name: 'Plano de Aula', - }, - { - name: 'Website Externo', - }, - { - name: 'Apresentação', - }, - { - name: 'Infrográfico', - }, - { - name: 'Jogo', - }, - { - name: 'Aplicativo Móvel', - }, - { - name: 'Livro Digital', - } ] \ No newline at end of file diff --git a/src/db/seeds/subjects.seed.ts b/src/db/seeds/subjects.seed.ts index 748f30c..06ea728 100644 --- a/src/db/seeds/subjects.seed.ts +++ b/src/db/seeds/subjects.seed.ts @@ -45,196 +45,6 @@ const subjectsData: SubjectInput[] = [ }, { name: 'Sociologia' - },{ - name: 'Matemática' - }, - { - name: 'Português' - }, - { - name: 'História' - }, - { - name: 'Geografia' - }, - { - name: 'Biologia' - }, - { - name: 'Física' - }, - { - name: 'Química' - }, - { - name: 'Inglês' - }, - { - name: 'Espanhol' - }, - { - name: 'Artes' - }, - { - name: 'Educação Física' - }, - { - name: 'Filosofia' - }, - { - name: 'Sociologia' - },{ - name: 'Matemática' - }, - { - name: 'Português' - }, - { - name: 'História' - }, - { - name: 'Geografia' - }, - { - name: 'Biologia' - }, - { - name: 'Física' - }, - { - name: 'Química' - }, - { - name: 'Inglês' - }, - { - name: 'Espanhol' - }, - { - name: 'Artes' - }, - { - name: 'Educação Física' - }, - { - name: 'Filosofia' - }, - { - name: 'Sociologia' - },{ - name: 'Matemática' - }, - { - name: 'Português' - }, - { - name: 'História' - }, - { - name: 'Geografia' - }, - { - name: 'Biologia' - }, - { - name: 'Física' - }, - { - name: 'Química' - }, - { - name: 'Inglês' - }, - { - name: 'Espanhol' - }, - { - name: 'Artes' - }, - { - name: 'Educação Física' - }, - { - name: 'Filosofia' - }, - { - name: 'Sociologia' - },{ - name: 'Matemática' - }, - { - name: 'Português' - }, - { - name: 'História' - }, - { - name: 'Geografia' - }, - { - name: 'Biologia' - }, - { - name: 'Física' - }, - { - name: 'Química' - }, - { - name: 'Inglês' - }, - { - name: 'Espanhol' - }, - { - name: 'Artes' - }, - { - name: 'Educação Física' - }, - { - name: 'Filosofia' - }, - { - name: 'Sociologia' - },{ - name: 'Matemática' - }, - { - name: 'Português' - }, - { - name: 'História' - }, - { - name: 'Geografia' - }, - { - name: 'Biologia' - }, - { - name: 'Física' - }, - { - name: 'Química' - }, - { - name: 'Inglês' - }, - { - name: 'Espanhol' - }, - { - name: 'Artes' - }, - { - name: 'Educação Física' - }, - { - name: 'Filosofia' - }, - { - name: 'Sociologia' - }, + } ] diff --git a/src/env.ts b/src/env.ts index b998d39..272cd12 100644 --- a/src/env.ts +++ b/src/env.ts @@ -31,7 +31,7 @@ const EnvSchema = z.object({ GOVBR_TOKEN_URL: z.string(), GOVBR_PUBLIC_KEY_URL: z.string(), FRONT_END_RETURN_URL: z.string(), - URL: z.string(), + EMAIL_URL: z.string(), ELASTICSEARCH_USER: z.string(), ELASTICSEARCH_PASSWORD: z.string(), diff --git a/src/routes/homologation.route.ts b/src/routes/homologation.route.ts index 71b7c4a..e3f4572 100644 --- a/src/routes/homologation.route.ts +++ b/src/routes/homologation.route.ts @@ -110,6 +110,7 @@ export const homologationRouter = honoWithJwt() if (acceptedSubmissionsCount >= 3) { await serviceResource.setResourceState(validInput.resource_id); await searchService.indexResource(validInput.resource_id); + await serviceResource.updatePublishedAt(validInput.resource_id); } return c.json({ message: "Homologação feita com sucesso!", data: homologation }) diff --git a/src/routes/resource.route.ts b/src/routes/resource.route.ts index 336c043..012551d 100644 --- a/src/routes/resource.route.ts +++ b/src/routes/resource.route.ts @@ -28,6 +28,7 @@ import { downloadResourceRoute } from "../documentation/resourceDescriber" import { z } from "zod"; +import { HomologationService } from "@/services/homologation.service"; const service = Container.get(ResourceService); @@ -38,6 +39,7 @@ const resourceEducationalStagesService = Container.get(ResourceEducationalStages const resourceSubjectsService = Container.get(ResourceSubjectsService); const userService = Container.get(UserService); const searchService = Container.get(SearchService); +const serviceHomologation = Container.get(HomologationService); //define um novo Model type ResourceWithObjectTypeName = ResourceModel & { @@ -61,11 +63,12 @@ export const resourceSchemaJson = { educational_stages: z.array(z.number()), user_id: z.number(), link: z.string().optional().nullable(), - thumbnail:z.string().optional().nullable(), + thumbnail: z.string().optional().nullable(), state: z.enum(['draft', 'submitted', 'accepted', 'reported', 'deleted']).optional(), resource_stats_id: z.number().optional(), }), input: z.object({ + name: z.string().min(1).max(100), description: z.string().min(1).max(1500), object_type_id: z.number().int(), @@ -162,6 +165,10 @@ export const resourceRouter = honoWithJwt() const languageIds = languages.map((l) => l.id); const educationalStageIds = educationalStages.map((e) => e.id); + //indexando + await searchService.indexResource(resource.id) + + // 5. Retorna o recurso com os arrays de IDs return c.json({ ...resourceSchema.return.parse(resource), @@ -190,11 +197,21 @@ export const resourceRouter = honoWithJwt() // update a resource .post('/update', updateResourceRoute, zValidator('json', resourceSchemaJson.update), + async (c) => { + const user = c.get('jwtPayload').id; + try { const input = c.req.valid('json') const resource = resourceSchema.dto.parse(await service.update(input)) + //verifica se tem a permissao + const userRoles = await serviceHomologation.findRolesByUserId(user); + // definido que 1: user, 2: admin, 3: contribuidor + if(userRoles.some(role => role === 2 || role === 3)){ + await service.updatePublishedAt(input.id); + } + // Atualiza as associações usando os métodos que você já tem await Promise.all([ @@ -216,6 +233,8 @@ export const resourceRouter = honoWithJwt() const languageIds = languages.map((l) => l.id); const educationalStagesId = educationalStages.map((e) => e.id); //educational stage retorna o objeto inteiro + //indexando + await searchService.indexResource(resource.id) // 5. Retorna o recurso com os arrays de IDs return c.json({ diff --git a/src/routes/search.route.ts b/src/routes/search.route.ts index c0f9a0b..2cf6112 100644 --- a/src/routes/search.route.ts +++ b/src/routes/search.route.ts @@ -11,18 +11,31 @@ const searchService = Container.get(SearchService); export const searchRouter = new Hono() .get( '/search', + zValidator( 'query', z.object({ - query: z.string().min(1, 'Query is required'), + query: z.string().optional(), + sortBy: z.enum(['created_at']).optional(), + sortOrder: z.enum(['asc', 'desc']).optional(), + offset: z.coerce.number().int().nonnegative().optional(), + page_size: z.coerce.number().int().positive().optional(), + + // filters + language: z.string().optional(), + objectType: z.string().optional(), + institution: z.string().optional(), }) ), + async (c) => { + try { const { query } = c.req.valid('query'); const results = await searchService.searchIndex(query); + console.log("results", results) return c.json({ results }); } catch (e) { console.log(e) @@ -41,13 +54,13 @@ export const searchRouter = new Hono() ) .post( - '/index/resource/:id', + '/index/resource/:id', async (c) => { try { const id: number = +c.req.param('id') - + await searchService.indexResource(id); - return c.json({ message: `resource indexed successfully`}); + return c.json({ message: `resource indexed successfully` }); } catch (e) { return c.json( createApexError({ @@ -64,13 +77,13 @@ export const searchRouter = new Hono() ) .post( - '/index/collection/:id', + '/index/collection/:id', async (c) => { try { const id: number = +c.req.param('id') - + await searchService.indexCollection(id); - return c.json({ message: `collection indexed successfully`}); + return c.json({ message: `collection indexed successfully` }); } catch (e) { return c.json( createApexError({ @@ -87,14 +100,14 @@ export const searchRouter = new Hono() ) .post( - '/index/user/:id', + '/index/user/:id', async (c) => { try { const id: number = +c.req.param('id') - + await searchService.indexUser(id); - return c.json({ message: `user indexed successfully`}); + return c.json({ message: `user indexed successfully` }); } catch (e) { return c.json( createApexError({ diff --git a/src/routes/subjects.route.ts b/src/routes/subjects.route.ts index 97ff367..503d76d 100644 --- a/src/routes/subjects.route.ts +++ b/src/routes/subjects.route.ts @@ -94,7 +94,7 @@ export const publicSubjectsRouter = new Hono() async (c) => { try { const subjects = await service.findMany() - return c.json({ subjects }) + return c.json( subjects ) } catch (e) { return c.json( createApexError({ diff --git a/src/services/auth.service.ts b/src/services/auth.service.ts index 8280f2b..4cb3d9b 100644 --- a/src/services/auth.service.ts +++ b/src/services/auth.service.ts @@ -81,7 +81,7 @@ export class AuthService { } async sendConfirmationEmail(receiver: string, subject: string, userName: string, userEmail: string) { - const link: string = `${env.URL}/entrar`; + const link: string = `${env.EMAIL_URL}/entrar`; const text = ` <head> <style> @@ -126,7 +126,7 @@ export class AuthService { <body> <div class="container" > - <a href="${process.env["URL"]}"></a> + <a href="${process.env["EMAIL_URL"]}"></a> <h1 style="color:#00bacc; font-size: 30px; font-weight: 800; margin-top: 5px; margin-bottom: 5px">Recuperação de senha</h1> <br> <p>Olá, ${userName}!</p> @@ -155,7 +155,7 @@ export class AuthService { } async passwordRecoveryEmail(resetTicket: string, receiver: string, subject: string, userEmail: string) { - const token_link: string = `${env.URL}novaSenha?token=${resetTicket}&email=${userEmail}`; + const token_link: string = `${env.EMAIL_URL}novaSenha?token=${resetTicket}&email=${userEmail}`; const text = ` <head> <style> @@ -200,7 +200,7 @@ export class AuthService { <body> <div class="container" > - <a href="${process.env["URL"]}"></a> + <a href="${process.env["EMAIL_URL"]}"></a> <h1 style="color:#00bacc; font-size: 30px; font-weight: 800; margin-top: 5px; margin-bottom: 5px">Recuperação de senha</h1> <br> <p>Este e-mail foi enviado para confirmar que você é o proprietário do endereço de e-mail fornecido no cadastro da MECRED. diff --git a/src/services/contact.service.ts b/src/services/contact.service.ts index 6c7eccd..0f6ffe9 100644 --- a/src/services/contact.service.ts +++ b/src/services/contact.service.ts @@ -48,7 +48,7 @@ export class ContactService { <body> <div class="container" > - <a href="${process.env["URL"]}"></a> + <a href="${process.env["EMAIL_URL"]}"></a> <h1 style="color:#00bacc; font-size: 30px; font-weight: 800; margin-top: 5px; margin-bottom: 5px">Contato de ${name}</h1> <br> <p>${text}</p> diff --git a/src/services/resource-educational-stages.service.ts b/src/services/resource-educational-stages.service.ts index 437028e..0c4bdd0 100644 --- a/src/services/resource-educational-stages.service.ts +++ b/src/services/resource-educational-stages.service.ts @@ -30,6 +30,8 @@ export class ResourceEducationalStagesService { async updateResourceEducationalStages(resourceId: ResourceModel['id'], newEducationalStageIds: EducationalStagesModel['id'][]): Promise<void> { await this.repo.updateResourceEducationalStages(resourceId, newEducationalStageIds); - } + } + + } \ No newline at end of file diff --git a/src/services/resource.service.ts b/src/services/resource.service.ts index 196df45..3c6c831 100644 --- a/src/services/resource.service.ts +++ b/src/services/resource.service.ts @@ -31,6 +31,10 @@ export class ResourceService { return this.repo.setResourceState(id) } + async updatePublishedAt(id: ResourceModel['id']): Promise<ResourceModel> { + return this.repo.updatePublishedAt(id) + } + async allResourceByUser(id_user: ResourceModel['user_id']): Promise <ResourceModel[]>{ return this.repo.allResourceByUser(id_user) } diff --git a/src/services/search.service.ts b/src/services/search.service.ts index 3351cb7..0504e8d 100644 --- a/src/services/search.service.ts +++ b/src/services/search.service.ts @@ -56,6 +56,7 @@ export class SearchService { objectType: document.object_type, state: document.state, user: document.user, + user_id: document.user_id, views: document.views, downloads: document.downloads, likes: document.likes, @@ -145,7 +146,7 @@ export class SearchService { // offset: offset da paginação, número da página // page_size: tamanho da página async searchIndex( - query: string, + query: string | undefined, filters: Partial<ExactFilterFields> = {}, sortBy: Partial<SortableFilterFields> = {}, // sortBy?: 'created_at', @@ -177,6 +178,41 @@ export class SearchService { ]; } + const searchQuery = query + ? { + multi_match: { + query, + fuzziness: "AUTO", + fields: [ + 'name', + 'author', + 'description', + 'link', + 'fileFormats', + 'educational_stages', + 'languages', + 'subjects', + 'license', + 'object_type', + 'state', + 'user', + 'roles', + 'institution', + 'city', + 'views', + 'downloads', + 'likes', + 'shares', + 'score', + 'comments', + 'created_at' + ], + }, + } + : { + match_all: {}, + } + const result = await this.esClient.search({ index: index, body: { @@ -184,35 +220,7 @@ export class SearchService { size: page_size, query: { bool: { - must: [ - { - multi_match: { - query, - fuzziness: "AUTO", - fields: ['name', - 'author', - 'description', - 'link', - 'educational_stages', - 'languages', - 'subjects', - 'license', - 'object_type', - 'state', - 'user', - 'roles', - 'institution', - 'city', - // 'views', - // 'downloads', - // 'likes', - 'shares', - 'score', - 'comments', - 'created_at'], - }, - }, - ], + must: [searchQuery], filter: userFilters, }, }, -- GitLab