diff --git a/package.json b/package.json
index dfb0d0a2239c1375978be26cce4a602012758da3..2da5428a0b6ab9bd54ae52dbc2d9a2a25f1405e2 100644
--- a/package.json
+++ b/package.json
@@ -9,6 +9,8 @@
     "route:test": "bun db:seed && bun test"
   },
   "dependencies": {
+    "@hono/swagger-ui": "^0.5.0",
+    "@hono/zod-openapi": "^0.18.3",
     "@hono/zod-validator": "^0.2.2",
     "dotenv": "^16.4.5",
     "dotenv-expand": "^11.0.6",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index cbe49e21cccdf70028d775719e829c4c701987fc..a404230c666ef35767bd4dcd9ab3af6c04a2813a 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -8,6 +8,12 @@ importers:
 
   .:
     dependencies:
+      '@hono/swagger-ui':
+        specifier: ^0.5.0
+        version: 0.5.0(hono@4.6.1)
+      '@hono/zod-openapi':
+        specifier: ^0.18.3
+        version: 0.18.3(hono@4.6.1)(zod@3.23.8)
       '@hono/zod-validator':
         specifier: ^0.2.2
         version: 0.2.2(hono@4.6.1)(zod@3.23.8)
@@ -69,6 +75,11 @@ importers:
 
 packages:
 
+  '@asteasolutions/zod-to-openapi@7.3.0':
+    resolution: {integrity: sha512-7tE/r1gXwMIvGnXVUdIqUhCU1RevEFC4Jk6Bussa0fk1ecbnnINkZzj1EOAJyE/M3AI25DnHT/zKQL1/FPFi8Q==}
+    peerDependencies:
+      zod: ^3.20.2
+
   '@esbuild-kit/core-utils@3.3.2':
     resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==}
     deprecated: 'Merged into tsx: https://tsx.is'
@@ -377,12 +388,30 @@ packages:
     resolution: {integrity: sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
+  '@hono/swagger-ui@0.5.0':
+    resolution: {integrity: sha512-MWYYSv9kC8IwFBLZdwgZZMT9zUq2C/4/ekuyEYOkHEgUMqu+FG3eebtBZ4ofMh60xYRxRR2BgQGoNIILys/PFg==}
+    peerDependencies:
+      hono: '*'
+
+  '@hono/zod-openapi@0.18.3':
+    resolution: {integrity: sha512-bNlRDODnp7P9Fs13ZPajEOt13G0XwXKfKRHMEFCphQsFiD1Y+twzHaglpNAhNcflzR1DQwHY92ZS06b4LTPbIQ==}
+    engines: {node: '>=16.0.0'}
+    peerDependencies:
+      hono: '>=4.3.6'
+      zod: 3.*
+
   '@hono/zod-validator@0.2.2':
     resolution: {integrity: sha512-dSDxaPV70Py8wuIU2QNpoVEIOSzSXZ/6/B/h4xA7eOMz7+AarKTSGV8E6QwrdcCbBLkpqfJ4Q2TmBO0eP1tCBQ==}
     peerDependencies:
       hono: '>=3.9.0'
       zod: ^3.19.1
 
+  '@hono/zod-validator@0.4.2':
+    resolution: {integrity: sha512-1rrlBg+EpDPhzOV4hT9pxr5+xDVmKuz6YJl+la7VCwK6ass5ldyKm5fD+umJdV2zhHD6jROoCCv8NbTwyfhT0g==}
+    peerDependencies:
+      hono: '>=3.9.0'
+      zod: ^3.19.1
+
   '@humanwhocodes/module-importer@1.0.1':
     resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
     engines: {node: '>=12.22'}
@@ -882,6 +911,9 @@ packages:
   natural-compare@1.4.0:
     resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
 
+  openapi3-ts@4.4.0:
+    resolution: {integrity: sha512-9asTNB9IkKEzWMcHmVZE7Ts3kC9G7AFHfs8i7caD8HbI76gEjdkId4z/AkP83xdZsH7PLAnnbl47qZkXuxpArw==}
+
   optionator@0.9.4:
     resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
     engines: {node: '>= 0.8.0'}
@@ -1037,6 +1069,11 @@ packages:
     resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
     engines: {node: '>=0.10.0'}
 
+  yaml@2.7.0:
+    resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==}
+    engines: {node: '>= 14'}
+    hasBin: true
+
   yocto-queue@0.1.0:
     resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
     engines: {node: '>=10'}
@@ -1046,6 +1083,11 @@ packages:
 
 snapshots:
 
+  '@asteasolutions/zod-to-openapi@7.3.0(zod@3.23.8)':
+    dependencies:
+      openapi3-ts: 4.4.0
+      zod: 3.23.8
+
   '@esbuild-kit/core-utils@3.3.2':
     dependencies:
       esbuild: 0.18.20
@@ -1228,11 +1270,27 @@ snapshots:
     dependencies:
       levn: 0.4.1
 
+  '@hono/swagger-ui@0.5.0(hono@4.6.1)':
+    dependencies:
+      hono: 4.6.1
+
+  '@hono/zod-openapi@0.18.3(hono@4.6.1)(zod@3.23.8)':
+    dependencies:
+      '@asteasolutions/zod-to-openapi': 7.3.0(zod@3.23.8)
+      '@hono/zod-validator': 0.4.2(hono@4.6.1)(zod@3.23.8)
+      hono: 4.6.1
+      zod: 3.23.8
+
   '@hono/zod-validator@0.2.2(hono@4.6.1)(zod@3.23.8)':
     dependencies:
       hono: 4.6.1
       zod: 3.23.8
 
+  '@hono/zod-validator@0.4.2(hono@4.6.1)(zod@3.23.8)':
+    dependencies:
+      hono: 4.6.1
+      zod: 3.23.8
+
   '@humanwhocodes/module-importer@1.0.1': {}
 
   '@humanwhocodes/retry@0.3.0': {}
@@ -1710,6 +1768,10 @@ snapshots:
 
   natural-compare@1.4.0: {}
 
+  openapi3-ts@4.4.0:
+    dependencies:
+      yaml: 2.7.0
+
   optionator@0.9.4:
     dependencies:
       deep-is: 0.1.4
@@ -1829,6 +1891,8 @@ snapshots:
 
   word-wrap@1.2.5: {}
 
+  yaml@2.7.0: {}
+
   yocto-queue@0.1.0: {}
 
   zod@3.23.8: {}
diff --git a/src/db/migrations/0000_secret_sharon_ventura.sql b/src/db/migrations/0000_secret_sharon_ventura.sql
new file mode 100644
index 0000000000000000000000000000000000000000..b18047a75834101b6c1688049597c4b6887881a2
--- /dev/null
+++ b/src/db/migrations/0000_secret_sharon_ventura.sql
@@ -0,0 +1,588 @@
+DO $$ BEGIN
+ CREATE TYPE "public"."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,
+	"state" "state" DEFAULT 'inactive' 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" 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),
+	"description" text,
+	"is_private" boolean DEFAULT false,
+	"is_active" boolean DEFAULT true,
+	"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")
+);
+--> statement-breakpoint
+CREATE TABLE IF NOT EXISTS "complaints" (
+	"id" serial PRIMARY KEY NOT NULL,
+	"state" "state" DEFAULT 'under_review' 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,
+	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 "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,
+	"achievement_id" integer,
+	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,
+	"action_id" integer NOT NULL,
+	"actor_user_id" integer NOT NULL,
+	"target_user_id" integer NOT NULL,
+	"target_resource_id" integer,
+	"target_collection_id" integer,
+	"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 "reset_tickets" (
+	"id" serial PRIMARY KEY NOT NULL,
+	"user_id" integer NOT NULL,
+	"token_hash" varchar(255) NOT NULL,
+	"expiration_date" timestamp NOT NULL,
+	"token_used" boolean DEFAULT false NOT NULL,
+	"valid_token" boolean DEFAULT true NOT NULL,
+	"created_at" timestamp DEFAULT now() NOT NULL,
+	"updated_at" timestamp DEFAULT now() NOT NULL,
+	CONSTRAINT "reset_tickets_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,
+	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,
+	"name" varchar(255) NOT NULL,
+	"author" varchar(255) NOT NULL,
+	"bucket_key" varchar(255),
+	"link" varchar(255),
+	"thumbnail" varchar(255) NOT NULL,
+	"description" text,
+	"active" boolean DEFAULT false NOT NULL,
+	"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_bucket_key_unique" UNIQUE("bucket_key"),
+	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_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) NOT NULL,
+	"password" varchar(255) NOT NULL,
+	"email" varchar(255) NOT NULL,
+	"description" text DEFAULT 'sem descrição',
+	"institution" text DEFAULT 'sem instituição',
+	"birthday" timestamp NOT NULL,
+	"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,
+	"active" boolean DEFAULT true,
+	"user_stats_id" integer NOT NULL,
+	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_collections_id_fk" FOREIGN KEY ("collection") 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 "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 "items" ADD CONSTRAINT "items_achievement_id_achievements_id_fk" FOREIGN KEY ("achievement_id") REFERENCES "public"."achievements"("id") ON DELETE no action 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 "reset_tickets" ADD CONSTRAINT "reset_tickets_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_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_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_strange_famine.sql b/src/db/migrations/0001_strange_famine.sql
new file mode 100644
index 0000000000000000000000000000000000000000..f705a5388412582fcfa03035ee57c1802576994d
--- /dev/null
+++ b/src/db/migrations/0001_strange_famine.sql
@@ -0,0 +1 @@
+ALTER TABLE "users" DROP CONSTRAINT "users_username_unique";
\ No newline at end of file
diff --git a/src/db/migrations/0002_sleepy_vin_gonzales.sql b/src/db/migrations/0002_sleepy_vin_gonzales.sql
new file mode 100644
index 0000000000000000000000000000000000000000..1292179562bd15de630a369dd759b659370d856a
--- /dev/null
+++ b/src/db/migrations/0002_sleepy_vin_gonzales.sql
@@ -0,0 +1 @@
+ALTER TABLE "users" ADD CONSTRAINT "users_username_unique" UNIQUE("username");
\ No newline at end of file
diff --git a/src/db/migrations/0003_tired_stone_men.sql b/src/db/migrations/0003_tired_stone_men.sql
new file mode 100644
index 0000000000000000000000000000000000000000..a5140ea269ed7f2a723c263772f0162cd469269a
--- /dev/null
+++ b/src/db/migrations/0003_tired_stone_men.sql
@@ -0,0 +1,611 @@
+DO $$ BEGIN
+ CREATE TYPE "public"."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,
+	"state" "state" DEFAULT 'inactive' 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" 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),
+	"description" text,
+	"is_private" boolean DEFAULT false,
+	"is_active" boolean DEFAULT true,
+	"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")
+);
+--> 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,
+	"update_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" "state" DEFAULT 'under_review' 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,
+	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 "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,
+	"achievement_id" integer,
+	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,
+	"action_id" integer NOT NULL,
+	"actor_user_id" integer NOT NULL,
+	"target_user_id" integer NOT NULL,
+	"target_resource_id" integer,
+	"target_collection_id" integer,
+	"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 "reset_tickets" (
+	"id" serial PRIMARY KEY NOT NULL,
+	"user_id" integer NOT NULL,
+	"token_hash" varchar(255) NOT NULL,
+	"expiration_date" timestamp NOT NULL,
+	"token_used" boolean DEFAULT false NOT NULL,
+	"valid_token" boolean DEFAULT true NOT NULL,
+	"created_at" timestamp DEFAULT now() NOT NULL,
+	"updated_at" timestamp DEFAULT now() NOT NULL,
+	CONSTRAINT "reset_tickets_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,
+	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,
+	"name" varchar(255) NOT NULL,
+	"author" varchar(255) NOT NULL,
+	"bucket_key" varchar(255),
+	"link" varchar(255),
+	"thumbnail" varchar(255) NOT NULL,
+	"description" text,
+	"active" boolean DEFAULT false NOT NULL,
+	"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_bucket_key_unique" UNIQUE("bucket_key"),
+	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_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) NOT NULL,
+	"password" varchar(255) NOT NULL,
+	"email" varchar(255) NOT NULL,
+	"description" text DEFAULT 'sem descrição',
+	"institution" text DEFAULT 'sem instituição',
+	"birthday" timestamp NOT NULL,
+	"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,
+	"active" boolean DEFAULT true,
+	"user_stats_id" integer NOT NULL,
+	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_collections_id_fk" FOREIGN KEY ("collection") 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 "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 "items" ADD CONSTRAINT "items_achievement_id_achievements_id_fk" FOREIGN KEY ("achievement_id") REFERENCES "public"."achievements"("id") ON DELETE no action 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 "reset_tickets" ADD CONSTRAINT "reset_tickets_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_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_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/0004_useful_paper_doll.sql b/src/db/migrations/0004_useful_paper_doll.sql
new file mode 100644
index 0000000000000000000000000000000000000000..2927b5a1760d3014b975aacd2daca5e2a28ff71c
--- /dev/null
+++ b/src/db/migrations/0004_useful_paper_doll.sql
@@ -0,0 +1,22 @@
+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
+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 $$;
diff --git a/src/db/migrations/0005_eager_darkstar.sql b/src/db/migrations/0005_eager_darkstar.sql
new file mode 100644
index 0000000000000000000000000000000000000000..96894d5b0079d30ce0c34b32902b383f4924d747
--- /dev/null
+++ b/src/db/migrations/0005_eager_darkstar.sql
@@ -0,0 +1 @@
+ALTER TABLE "resource_stats" ADD COLUMN "comments" integer DEFAULT 0 NOT NULL;
\ No newline at end of file
diff --git a/src/db/migrations/meta/0003_snapshot.json b/src/db/migrations/meta/0003_snapshot.json
new file mode 100644
index 0000000000000000000000000000000000000000..a71853c608b61810c0403e7a7c4d9005ce4aa7c7
--- /dev/null
+++ b/src/db/migrations/meta/0003_snapshot.json
@@ -0,0 +1,2523 @@
+{
+  "id": "9a77c1e8-63d4-4588-9c9f-bb93ff5fa910",
+  "prevId": "00000000-0000-0000-0000-000000000000",
+  "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
+        },
+        "state": {
+          "name": "state",
+          "type": "state",
+          "typeSchema": "public",
+          "primaryKey": false,
+          "notNull": true,
+          "default": "'inactive'"
+        },
+        "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": {
+          "name": "collection",
+          "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_collections_id_fk": {
+          "name": "collection_likes_collection_collections_id_fk",
+          "tableFrom": "collection_likes",
+          "tableTo": "collections",
+          "columnsFrom": [
+            "collection"
+          ],
+          "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": false
+        },
+        "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,
+          "default": 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()"
+        },
+        "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"
+          ]
+        }
+      }
+    },
+    "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
+        },
+        "update_at": {
+          "name": "update_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": "state",
+          "typeSchema": "public",
+          "primaryKey": false,
+          "notNull": true,
+          "default": "'under_review'"
+        },
+        "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
+        }
+      },
+      "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.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()"
+        },
+        "achievement_id": {
+          "name": "achievement_id",
+          "type": "integer",
+          "primaryKey": false,
+          "notNull": false
+        }
+      },
+      "indexes": {},
+      "foreignKeys": {
+        "items_achievement_id_achievements_id_fk": {
+          "name": "items_achievement_id_achievements_id_fk",
+          "tableFrom": "items",
+          "tableTo": "achievements",
+          "columnsFrom": [
+            "achievement_id"
+          ],
+          "columnsTo": [
+            "id"
+          ],
+          "onDelete": "no action",
+          "onUpdate": "no action"
+        }
+      },
+      "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
+        },
+        "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": true
+        },
+        "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
+        },
+        "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_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.reset_tickets": {
+      "name": "reset_tickets",
+      "schema": "",
+      "columns": {
+        "id": {
+          "name": "id",
+          "type": "serial",
+          "primaryKey": true,
+          "notNull": true
+        },
+        "user_id": {
+          "name": "user_id",
+          "type": "integer",
+          "primaryKey": false,
+          "notNull": true
+        },
+        "token_hash": {
+          "name": "token_hash",
+          "type": "varchar(255)",
+          "primaryKey": false,
+          "notNull": true
+        },
+        "expiration_date": {
+          "name": "expiration_date",
+          "type": "timestamp",
+          "primaryKey": false,
+          "notNull": true
+        },
+        "token_used": {
+          "name": "token_used",
+          "type": "boolean",
+          "primaryKey": false,
+          "notNull": true,
+          "default": false
+        },
+        "valid_token": {
+          "name": "valid_token",
+          "type": "boolean",
+          "primaryKey": false,
+          "notNull": true,
+          "default": 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": {
+        "reset_tickets_user_id_users_id_fk": {
+          "name": "reset_tickets_user_id_users_id_fk",
+          "tableFrom": "reset_tickets",
+          "tableTo": "users",
+          "columnsFrom": [
+            "user_id"
+          ],
+          "columnsTo": [
+            "id"
+          ],
+          "onDelete": "cascade",
+          "onUpdate": "no action"
+        }
+      },
+      "compositePrimaryKeys": {},
+      "uniqueConstraints": {
+        "reset_tickets_id_unique": {
+          "name": "reset_tickets_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
+        }
+      },
+      "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
+        },
+        "name": {
+          "name": "name",
+          "type": "varchar(255)",
+          "primaryKey": false,
+          "notNull": true
+        },
+        "author": {
+          "name": "author",
+          "type": "varchar(255)",
+          "primaryKey": false,
+          "notNull": true
+        },
+        "bucket_key": {
+          "name": "bucket_key",
+          "type": "varchar(255)",
+          "primaryKey": false,
+          "notNull": false
+        },
+        "link": {
+          "name": "link",
+          "type": "varchar(255)",
+          "primaryKey": false,
+          "notNull": false
+        },
+        "thumbnail": {
+          "name": "thumbnail",
+          "type": "varchar(255)",
+          "primaryKey": false,
+          "notNull": true
+        },
+        "description": {
+          "name": "description",
+          "type": "text",
+          "primaryKey": false,
+          "notNull": false
+        },
+        "active": {
+          "name": "active",
+          "type": "boolean",
+          "primaryKey": false,
+          "notNull": true,
+          "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()"
+        },
+        "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_bucket_key_unique": {
+          "name": "resources_bucket_key_unique",
+          "nullsNotDistinct": false,
+          "columns": [
+            "bucket_key"
+          ]
+        },
+        "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_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'"
+        },
+        "institution": {
+          "name": "institution",
+          "type": "text",
+          "primaryKey": false,
+          "notNull": false,
+          "default": "'sem instituiçã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
+        },
+        "active": {
+          "name": "active",
+          "type": "boolean",
+          "primaryKey": false,
+          "notNull": false,
+          "default": true
+        },
+        "user_stats_id": {
+          "name": "user_stats_id",
+          "type": "integer",
+          "primaryKey": false,
+          "notNull": true
+        }
+      },
+      "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.state": {
+      "name": "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/0004_snapshot.json b/src/db/migrations/meta/0004_snapshot.json
new file mode 100644
index 0000000000000000000000000000000000000000..f52c13c023bb88696174bfd86b06aa82ab817cec
--- /dev/null
+++ b/src/db/migrations/meta/0004_snapshot.json
@@ -0,0 +1,2612 @@
+{
+  "id": "e2262718-fe9a-4922-8886-5b981115dce9",
+  "prevId": "9a77c1e8-63d4-4588-9c9f-bb93ff5fa910",
+  "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
+        },
+        "state": {
+          "name": "state",
+          "type": "state",
+          "typeSchema": "public",
+          "primaryKey": false,
+          "notNull": true,
+          "default": "'inactive'"
+        },
+        "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": {
+          "name": "collection",
+          "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_collections_id_fk": {
+          "name": "collection_likes_collection_collections_id_fk",
+          "tableFrom": "collection_likes",
+          "tableTo": "collections",
+          "columnsFrom": [
+            "collection"
+          ],
+          "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": false
+        },
+        "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,
+          "default": 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()"
+        },
+        "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"
+          ]
+        }
+      }
+    },
+    "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
+        },
+        "update_at": {
+          "name": "update_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": "state",
+          "typeSchema": "public",
+          "primaryKey": false,
+          "notNull": true,
+          "default": "'under_review'"
+        },
+        "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
+        }
+      },
+      "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.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()"
+        },
+        "achievement_id": {
+          "name": "achievement_id",
+          "type": "integer",
+          "primaryKey": false,
+          "notNull": false
+        }
+      },
+      "indexes": {},
+      "foreignKeys": {
+        "items_achievement_id_achievements_id_fk": {
+          "name": "items_achievement_id_achievements_id_fk",
+          "tableFrom": "items",
+          "tableTo": "achievements",
+          "columnsFrom": [
+            "achievement_id"
+          ],
+          "columnsTo": [
+            "id"
+          ],
+          "onDelete": "no action",
+          "onUpdate": "no action"
+        }
+      },
+      "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
+        },
+        "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": true
+        },
+        "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
+        },
+        "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_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.reset_tickets": {
+      "name": "reset_tickets",
+      "schema": "",
+      "columns": {
+        "id": {
+          "name": "id",
+          "type": "serial",
+          "primaryKey": true,
+          "notNull": true
+        },
+        "user_id": {
+          "name": "user_id",
+          "type": "integer",
+          "primaryKey": false,
+          "notNull": true
+        },
+        "token_hash": {
+          "name": "token_hash",
+          "type": "varchar(255)",
+          "primaryKey": false,
+          "notNull": true
+        },
+        "expiration_date": {
+          "name": "expiration_date",
+          "type": "timestamp",
+          "primaryKey": false,
+          "notNull": true
+        },
+        "token_used": {
+          "name": "token_used",
+          "type": "boolean",
+          "primaryKey": false,
+          "notNull": true,
+          "default": false
+        },
+        "valid_token": {
+          "name": "valid_token",
+          "type": "boolean",
+          "primaryKey": false,
+          "notNull": true,
+          "default": 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": {
+        "reset_tickets_user_id_users_id_fk": {
+          "name": "reset_tickets_user_id_users_id_fk",
+          "tableFrom": "reset_tickets",
+          "tableTo": "users",
+          "columnsFrom": [
+            "user_id"
+          ],
+          "columnsTo": [
+            "id"
+          ],
+          "onDelete": "cascade",
+          "onUpdate": "no action"
+        }
+      },
+      "compositePrimaryKeys": {},
+      "uniqueConstraints": {
+        "reset_tickets_id_unique": {
+          "name": "reset_tickets_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
+        }
+      },
+      "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
+        },
+        "name": {
+          "name": "name",
+          "type": "varchar(255)",
+          "primaryKey": false,
+          "notNull": true
+        },
+        "author": {
+          "name": "author",
+          "type": "varchar(255)",
+          "primaryKey": false,
+          "notNull": true
+        },
+        "bucket_key": {
+          "name": "bucket_key",
+          "type": "varchar(255)",
+          "primaryKey": false,
+          "notNull": false
+        },
+        "link": {
+          "name": "link",
+          "type": "varchar(255)",
+          "primaryKey": false,
+          "notNull": false
+        },
+        "thumbnail": {
+          "name": "thumbnail",
+          "type": "varchar(255)",
+          "primaryKey": false,
+          "notNull": true
+        },
+        "description": {
+          "name": "description",
+          "type": "text",
+          "primaryKey": false,
+          "notNull": false
+        },
+        "active": {
+          "name": "active",
+          "type": "boolean",
+          "primaryKey": false,
+          "notNull": true,
+          "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()"
+        },
+        "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_bucket_key_unique": {
+          "name": "resources_bucket_key_unique",
+          "nullsNotDistinct": false,
+          "columns": [
+            "bucket_key"
+          ]
+        },
+        "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_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'"
+        },
+        "institution": {
+          "name": "institution",
+          "type": "text",
+          "primaryKey": false,
+          "notNull": false,
+          "default": "'sem instituiçã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
+        },
+        "active": {
+          "name": "active",
+          "type": "boolean",
+          "primaryKey": false,
+          "notNull": false,
+          "default": true
+        },
+        "user_stats_id": {
+          "name": "user_stats_id",
+          "type": "integer",
+          "primaryKey": false,
+          "notNull": true
+        }
+      },
+      "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.state": {
+      "name": "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/0005_snapshot.json b/src/db/migrations/meta/0005_snapshot.json
new file mode 100644
index 0000000000000000000000000000000000000000..6ec69bea3589a85c145d72b6440786d53bddf0ba
--- /dev/null
+++ b/src/db/migrations/meta/0005_snapshot.json
@@ -0,0 +1,2619 @@
+{
+  "id": "5b878977-1a6e-45e4-8290-26e30a5be5b5",
+  "prevId": "e2262718-fe9a-4922-8886-5b981115dce9",
+  "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
+        },
+        "state": {
+          "name": "state",
+          "type": "state",
+          "typeSchema": "public",
+          "primaryKey": false,
+          "notNull": true,
+          "default": "'inactive'"
+        },
+        "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": {
+          "name": "collection",
+          "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_collections_id_fk": {
+          "name": "collection_likes_collection_collections_id_fk",
+          "tableFrom": "collection_likes",
+          "tableTo": "collections",
+          "columnsFrom": [
+            "collection"
+          ],
+          "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": false
+        },
+        "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,
+          "default": 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()"
+        },
+        "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"
+          ]
+        }
+      }
+    },
+    "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
+        },
+        "update_at": {
+          "name": "update_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": "state",
+          "typeSchema": "public",
+          "primaryKey": false,
+          "notNull": true,
+          "default": "'under_review'"
+        },
+        "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
+        }
+      },
+      "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.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()"
+        },
+        "achievement_id": {
+          "name": "achievement_id",
+          "type": "integer",
+          "primaryKey": false,
+          "notNull": false
+        }
+      },
+      "indexes": {},
+      "foreignKeys": {
+        "items_achievement_id_achievements_id_fk": {
+          "name": "items_achievement_id_achievements_id_fk",
+          "tableFrom": "items",
+          "tableTo": "achievements",
+          "columnsFrom": [
+            "achievement_id"
+          ],
+          "columnsTo": [
+            "id"
+          ],
+          "onDelete": "no action",
+          "onUpdate": "no action"
+        }
+      },
+      "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
+        },
+        "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": true
+        },
+        "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
+        },
+        "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_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.reset_tickets": {
+      "name": "reset_tickets",
+      "schema": "",
+      "columns": {
+        "id": {
+          "name": "id",
+          "type": "serial",
+          "primaryKey": true,
+          "notNull": true
+        },
+        "user_id": {
+          "name": "user_id",
+          "type": "integer",
+          "primaryKey": false,
+          "notNull": true
+        },
+        "token_hash": {
+          "name": "token_hash",
+          "type": "varchar(255)",
+          "primaryKey": false,
+          "notNull": true
+        },
+        "expiration_date": {
+          "name": "expiration_date",
+          "type": "timestamp",
+          "primaryKey": false,
+          "notNull": true
+        },
+        "token_used": {
+          "name": "token_used",
+          "type": "boolean",
+          "primaryKey": false,
+          "notNull": true,
+          "default": false
+        },
+        "valid_token": {
+          "name": "valid_token",
+          "type": "boolean",
+          "primaryKey": false,
+          "notNull": true,
+          "default": 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": {
+        "reset_tickets_user_id_users_id_fk": {
+          "name": "reset_tickets_user_id_users_id_fk",
+          "tableFrom": "reset_tickets",
+          "tableTo": "users",
+          "columnsFrom": [
+            "user_id"
+          ],
+          "columnsTo": [
+            "id"
+          ],
+          "onDelete": "cascade",
+          "onUpdate": "no action"
+        }
+      },
+      "compositePrimaryKeys": {},
+      "uniqueConstraints": {
+        "reset_tickets_id_unique": {
+          "name": "reset_tickets_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
+        },
+        "name": {
+          "name": "name",
+          "type": "varchar(255)",
+          "primaryKey": false,
+          "notNull": true
+        },
+        "author": {
+          "name": "author",
+          "type": "varchar(255)",
+          "primaryKey": false,
+          "notNull": true
+        },
+        "bucket_key": {
+          "name": "bucket_key",
+          "type": "varchar(255)",
+          "primaryKey": false,
+          "notNull": false
+        },
+        "link": {
+          "name": "link",
+          "type": "varchar(255)",
+          "primaryKey": false,
+          "notNull": false
+        },
+        "thumbnail": {
+          "name": "thumbnail",
+          "type": "varchar(255)",
+          "primaryKey": false,
+          "notNull": true
+        },
+        "description": {
+          "name": "description",
+          "type": "text",
+          "primaryKey": false,
+          "notNull": false
+        },
+        "active": {
+          "name": "active",
+          "type": "boolean",
+          "primaryKey": false,
+          "notNull": true,
+          "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()"
+        },
+        "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_bucket_key_unique": {
+          "name": "resources_bucket_key_unique",
+          "nullsNotDistinct": false,
+          "columns": [
+            "bucket_key"
+          ]
+        },
+        "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_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'"
+        },
+        "institution": {
+          "name": "institution",
+          "type": "text",
+          "primaryKey": false,
+          "notNull": false,
+          "default": "'sem instituiçã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
+        },
+        "active": {
+          "name": "active",
+          "type": "boolean",
+          "primaryKey": false,
+          "notNull": false,
+          "default": true
+        },
+        "user_stats_id": {
+          "name": "user_stats_id",
+          "type": "integer",
+          "primaryKey": false,
+          "notNull": true
+        }
+      },
+      "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.state": {
+      "name": "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 eaa8fcf3b643329af83679deadefa3c53fdb6305..d5e1531d117d696ef983d6a89d491d589f7fd9d8 100644
--- a/src/db/migrations/meta/_journal.json
+++ b/src/db/migrations/meta/_journal.json
@@ -1,5 +1,48 @@
 {
   "version": "7",
   "dialect": "postgresql",
-  "entries": []
+  "entries": [
+    {
+      "idx": 0,
+      "version": "7",
+      "when": 1732716257048,
+      "tag": "0000_secret_sharon_ventura",
+      "breakpoints": true
+    },
+    {
+      "idx": 1,
+      "version": "7",
+      "when": 1732716382536,
+      "tag": "0001_strange_famine",
+      "breakpoints": true
+    },
+    {
+      "idx": 2,
+      "version": "7",
+      "when": 1732716630298,
+      "tag": "0002_sleepy_vin_gonzales",
+      "breakpoints": true
+    },
+    {
+      "idx": 3,
+      "version": "7",
+      "when": 1738594390624,
+      "tag": "0003_tired_stone_men",
+      "breakpoints": true
+    },
+    {
+      "idx": 4,
+      "version": "7",
+      "when": 1739363633612,
+      "tag": "0004_useful_paper_doll",
+      "breakpoints": true
+    },
+    {
+      "idx": 5,
+      "version": "7",
+      "when": 1739370229565,
+      "tag": "0005_eager_darkstar",
+      "breakpoints": true
+    }
+  ]
 }
\ No newline at end of file
diff --git a/src/db/repo/comment-reply.repo.ts b/src/db/repo/comment-reply.repo.ts
new file mode 100644
index 0000000000000000000000000000000000000000..93dee4b030957f876db8a1cadc39b0064fbb34cf
--- /dev/null
+++ b/src/db/repo/comment-reply.repo.ts
@@ -0,0 +1,78 @@
+import { Service } from "typedi";
+import type { CommentReplyInput, CommentReplyModel, CommentReplyUpdate,  } from "../schema/comment-reply.schema";
+import db from "..";
+import commentReplyTable, { commentReplySchema } from "../schema/comment-reply.schema";
+import { and, eq, isNull, sql } from "drizzle-orm";
+
+@Service()
+export class commentReplyRepo {
+    //cria a resposta do comentario
+    async create(commentReply: CommentReplyInput): Promise<CommentReplyModel> {
+        const [ret] = await db
+            .insert(commentReplyTable)
+            .values(commentReply)
+            .returning()
+        return commentReplySchema.model.parse(ret)
+    }
+
+    //atualiza a resposta do comentario
+    async update(commentReply: CommentReplyUpdate): Promise<CommentReplyModel> {
+        const [ret] = await db
+            .update(commentReplyTable)
+            .set(commentReply)
+            .where(eq(commentReplyTable.id, commentReply.id))
+            .returning()
+        return commentReplySchema.model.parse(ret)
+    }
+
+    //exclui o comentario do banco
+    async deleteData(id: CommentReplyModel['id']): Promise<CommentReplyModel> {
+        const [ret] = await db
+            .delete(commentReplyTable)
+            .where(eq(commentReplyTable.id, id))
+            .returning()
+        return commentReplySchema.model.parse(ret)
+    }
+
+    //seta o comentario como deletado, mas nao exclui do banco
+    async delete(id: CommentReplyModel['id']): Promise<CommentReplyModel> {
+        const [ret] = await db
+            .update(commentReplyTable)
+            .set({
+                deleted_at: sql`NOW()`
+            })
+            .where(eq(commentReplyTable.id, id))
+            .returning()
+
+        return commentReplySchema.model.parse(ret)
+    }
+
+
+    //encontra as respostas ativas do comentario
+    async findReplyByComment(id_comment: CommentReplyModel['comment_id']): Promise<CommentReplyModel[]> {
+        const commentsReply = await db
+            .select()
+            .from(commentReplyTable)
+            .where(and(eq(commentReplyTable.comment_id, id_comment), isNull(commentReplyTable.deleted_at)))
+        return commentReplySchema.model.array().parse(commentsReply)
+    }
+
+    //encontra todas as respostas do comentario, ativas ou nao
+    async findAllReplyByComment(id_comment: CommentReplyModel['comment_id']): Promise<CommentReplyModel[]> {
+        const commentsReply = await db
+            .select()
+            .from(commentReplyTable)
+            .where(eq(commentReplyTable.comment_id, id_comment))
+        return commentReplySchema.model.array().parse(commentsReply)
+    }
+
+     //encontra todas as respostas de comentarios de um usuario
+     async findAllReplyByUser(id_user: CommentReplyModel['user_id']): Promise<CommentReplyModel[]> {
+        const commentsReply = await db
+            .select()
+            .from(commentReplyTable)
+            .where(eq(commentReplyTable.user_id, id_user))
+        return commentReplySchema.model.array().parse(commentsReply)
+    }
+
+}
\ No newline at end of file
diff --git a/src/db/repo/comments.repo.ts b/src/db/repo/comments.repo.ts
new file mode 100644
index 0000000000000000000000000000000000000000..efb49297b7b9f2773f667f8edaff0b2ce7bb7417
--- /dev/null
+++ b/src/db/repo/comments.repo.ts
@@ -0,0 +1,109 @@
+import { Service } from "typedi";
+import type { CommentsInput, CommentsModel, CommentsUpdate } from "../schema/comments.schema";
+import db from "..";
+import commentsTable, { commentsSchema } from "../schema/comments.schema";
+import { and, eq, isNull, sql } from "drizzle-orm";
+
+
+@Service()
+export class commentsRepo {
+    async create(comments: CommentsInput): Promise<CommentsModel> {
+        const [ret] = await db
+            .insert(commentsTable)
+            .values(comments)
+            .returning()
+        return commentsSchema.model.parse(ret)
+    }
+
+    async update(comments: CommentsUpdate): Promise<CommentsModel> {
+        const [ret] = await db
+            .update(commentsTable)
+            .set(comments)
+            .where(eq(commentsTable.id, comments.id))
+            .returning()
+        return commentsSchema.model.parse(ret)
+    }
+
+    //deleta os dados do banco
+    async deleteData(id: CommentsModel['id']): Promise<CommentsModel> {
+        const [ret] = await db
+            .delete(commentsTable)
+            .where(eq(commentsTable.id, id))
+            .returning()
+        return commentsSchema.model.parse(ret)
+    }
+
+
+    //seta o comentario como deletado, mas nao exclui do banco
+    async delete(id: CommentsModel['id']): Promise<CommentsModel> {
+        const [ret] = await db
+            .update(commentsTable)
+            .set({
+                deleted_at: sql`NOW()`
+            })
+            .where(eq(commentsTable.id, id))
+            .returning()
+
+        return commentsSchema.model.parse(ret)
+    }
+
+    //encontra um comentario com base no id
+    async find(id: CommentsModel['id']): Promise<CommentsModel | undefined> {
+        const comment = await db.query.commentsTable.findFirst({
+            where: and(eq(commentsTable.id, id)),
+        })
+        return comment ? commentsSchema.model.parse(comment) : undefined;
+    }
+
+    //retorna todos os comentarios ativos
+    async findMany(): Promise<CommentsModel[]> {
+        const comments = await db
+            .select()
+            .from(commentsTable)
+            .where(isNull(commentsTable.deleted_at))
+
+        return commentsSchema.model.array().parse(comments)
+    }
+
+    //retorna os comentarios ativos de um recurso
+    async findCommentsByResource(id_resource: CommentsModel['resource_id']): Promise<CommentsModel[]> {
+        const comments = await db
+            .select()
+            .from(commentsTable)
+            .where(and(eq(commentsTable.resource_id, id_resource), isNull(commentsTable.deleted_at)))
+
+        return commentsSchema.model.array().parse(comments)
+    }
+
+    //retorna todos(ativos e inativos) os comentarios de um recurso
+    async findAllCommentsByResource(id_resource: CommentsModel['resource_id']): Promise<CommentsModel[]> {
+        const comments = await db
+            .select()
+            .from(commentsTable)
+            .where(and(eq(commentsTable.resource_id, id_resource)))
+
+        return commentsSchema.model.array().parse(comments)
+    }
+
+
+    //retorna os comentarios ativos de um usuario
+    async findCommentsByUser(id_user: CommentsModel['user_id']): Promise<CommentsModel[]> {
+        const comments = await db
+            .select()
+            .from(commentsTable)
+            .where(and(eq(commentsTable.user_id, id_user), isNull(commentsTable.deleted_at)))
+
+        return commentsSchema.model.array().parse(comments)
+    }
+
+    //retorna todos(ativos e inativos) os comentarios ativos de um usuario
+    async findAllCommentsByUser(id_user: CommentsModel['user_id']): Promise<CommentsModel[]> {
+        const comments = await db
+            .select()
+            .from(commentsTable)
+            .where(eq(commentsTable.user_id, id_user))
+
+        return commentsSchema.model.array().parse(comments)
+    }
+
+}
\ No newline at end of file
diff --git a/src/db/repo/resource-stats.repo.ts b/src/db/repo/resource-stats.repo.ts
index 5a6f75001bb5dd38515c9f52de70af6aa648133f..385e2166d28eb8585403a52d6a8573d820a9d762 100644
--- a/src/db/repo/resource-stats.repo.ts
+++ b/src/db/repo/resource-stats.repo.ts
@@ -83,4 +83,15 @@ export class statsResourceRepo {
         return resourceStatsSchema.model.array().parse(await db.query.resourceStatsTable.findMany())
     }
 
+    async updateComments(id: ResourceStatsModel['id']): Promise<ResourceStatsModel>{
+        const [ret] = await db
+        .update(resourceStatsTable)
+        .set({
+            comments: sql`${resourceStatsTable.comments} + 1` // Incrementa diretamente no SQL
+        })
+        .where(eq(resourceStatsTable.id, id))
+        .returning()
+        return resourceStatsSchema.model.parse(ret)
+    }
+
 }
\ No newline at end of file
diff --git a/src/db/repo/resource.repo.ts b/src/db/repo/resource.repo.ts
index 3d4a9bde532876fea39c1a0a2e0c2fe657bc748f..40a9991fe9cd827d2ca657555f97e93f6d467f67 100644
--- a/src/db/repo/resource.repo.ts
+++ b/src/db/repo/resource.repo.ts
@@ -64,6 +64,24 @@ export class ResourceRepo {
     }
 
 
+    async allResourceByUser(id_user: ResourceModel['user_id']): Promise<ResourceModel[]> {
+        const resources = await db
+            .select()
+            .from(resourceTable)
+            .where(eq(resourceTable.user_id, id_user));
+        return resourceSchema.model.array().safeParse(resources).success ? resources : [];
+    }
+
+    async activeResourceByUser(id_user: ResourceModel['user_id']): Promise<ResourceModel[]> {
+        return resourceSchema.model.array().parse(
+            await db
+                .select()
+                .from(resourceTable)
+                .where(and(eq(resourceTable.user_id, id_user), eq(resourceTable.active, true)))
+        )
+    }
+
+
     async find(id: ResourceModel['id']): Promise<ResourceModel | undefined> {
         const resource = await db.query.resourceTable.findFirst({
             where: and(eq(resourceTable.id, id), eq(resourceTable.active, true)),
diff --git a/src/db/repo/user-stats.repo.ts b/src/db/repo/user-stats.repo.ts
index a4ac9c2574aa45dcac9473ef149681fa1fa857f6..e7e1ffa3f78ba517cadc101e4bb385b7ea1e5aed 100644
--- a/src/db/repo/user-stats.repo.ts
+++ b/src/db/repo/user-stats.repo.ts
@@ -1,53 +1,69 @@
-import { eq } from "drizzle-orm";
+import { eq, sql } from "drizzle-orm";
 import { Service } from "typedi";
 import db from "@/db";
-import userStatsTable, { 
+import userStatsTable, {
   userStatsSchemas,
   type UserStatsInput,
-  type UserStatsModel, 
+  type UserStatsModel,
   type UserStatsUpdate
 } from "../schema/user-stats.schema";
 
 
 @Service()
 export class UserStatsRepo {
-    async findById(
-        id: UserStatsModel['id']
-    ): Promise<UserStatsModel | null> {
-        const userStats = await db.query.userStatsTable.findFirst({
-            where: eq(userStatsTable.id, id)
-        })
-        if(!userStats) return null
-        return userStatsSchemas.model.parse(userStats)
-    }
-
-    async create(tx?: db): Promise<UserStatsModel> {
-      const repo = tx ?? db
-      const userStats: UserStatsInput = {}
-      const [ret] = await repo
-        .insert(userStatsTable)
-        .values(userStats)
-        .returning()
-
-      return userStatsSchemas.model.parse(ret)
-    }
-
-    async update(userStats: UserStatsUpdate): Promise<UserStatsModel>{
-      const [ret] = await db
+
+  async findById(id: UserStatsModel['id']): Promise<UserStatsModel | null> {
+    const userStats = await db.query.userStatsTable.findFirst({
+      where: eq(userStatsTable.id, id)
+    })
+    if (!userStats) return null
+    return userStatsSchemas.model.parse(userStats)
+  }
+
+  async getAll(): Promise<UserStatsModel[]> {
+    const stats = await db.query.userStatsTable.findMany()
+    return stats.map(stat => userStatsSchemas.model.parse(stat))
+  }
+
+
+  async create(tx?: db): Promise<UserStatsModel> {
+    const repo = tx ?? db
+    const userStats: UserStatsInput = {}
+    const [ret] = await repo
+      .insert(userStatsTable)
+      .values(userStats)
+      .returning()
+
+    return userStatsSchemas.model.parse(ret)
+  }
+
+  async update(userStats: UserStatsUpdate): Promise<UserStatsModel> {
+    const [ret] = await db
       .update(userStatsTable)
       .set(userStats)
       .where(eq(userStatsTable.id, userStats.id))
       .returning()
 
-      return userStatsSchemas.model.parse(ret)
-    }
+    return userStatsSchemas.model.parse(ret)
+  }
 
-    async delete(id: UserStatsModel['id']): Promise<UserStatsModel>{
-      const [ret] = await db
+  async delete(id: UserStatsModel['id']): Promise<UserStatsModel> {
+    const [ret] = await db
       .delete(userStatsTable)
       .where(eq(userStatsTable.id, id))
       .returning()
 
-      return userStatsSchemas.model.parse(ret)
-    }
+    return userStatsSchemas.model.parse(ret)
+  }
+
+  async updateComments(user: UserStatsModel['id']): Promise<UserStatsModel> {
+    const [ret] = await db
+      .update(userStatsTable)
+      .set({
+        comments: sql`${userStatsTable.comments} + 1` // Incrementa diretamente no SQL
+      })
+      .where(eq(userStatsTable.id, user))
+      .returning()
+    return userStatsSchemas.model.parse(ret)
+  }
 }
\ No newline at end of file
diff --git a/src/db/schema/comment-reply.schema.ts b/src/db/schema/comment-reply.schema.ts
new file mode 100644
index 0000000000000000000000000000000000000000..17c97ff7df074d2dd4374b25add2fa957ca7b466
--- /dev/null
+++ b/src/db/schema/comment-reply.schema.ts
@@ -0,0 +1,35 @@
+import { integer, pgTable, serial, text, timestamp } from "drizzle-orm/pg-core";
+import userTable from "./user.schema";
+import commentsTable from "./comments.schema";
+import { sql } from "drizzle-orm";
+import { createInsertSchema, createSelectSchema } from "drizzle-zod";
+import type { z } from "zod";
+
+const commentReplyTable = pgTable('commentReply',{
+    id: serial('id').primaryKey().notNull().unique(),
+    user_id: integer('user_id').notNull().references(() => userTable.id, {onDelete: 'cascade'}),
+    comment_id:integer('comment_id').notNull().references(() => commentsTable.id, {onDelete: 'cascade'}),
+    text: text('text').notNull(),
+    created_at: timestamp('created_at', {mode:'string'}).notNull().defaultNow(),
+    deleted_at: timestamp('deleted_at',{mode:'string'}),
+    update_at: timestamp('update_at', {mode:'string'}).notNull().defaultNow().$onUpdate(() => sql`current_timestamp`)
+})
+
+const commentReplyModelSchema = createSelectSchema(commentReplyTable)
+const commentReplyDtoSchema = commentReplyModelSchema.omit({})
+const commentReplyInputSchema = createInsertSchema(commentReplyTable)
+const commentReplyUpdateSchema = commentReplyInputSchema.partial().required({id:true})
+
+export type CommentReplyModel = z.infer <typeof commentReplyModelSchema>
+export type CommentReplyDto = z.infer <typeof commentReplyDtoSchema>
+export type CommentReplyInput = z.infer <typeof commentReplyInputSchema>
+export type CommentReplyUpdate = z.infer <typeof commentReplyUpdateSchema>
+
+export const commentReplySchema = {
+    model: commentReplyModelSchema,
+    dto: commentReplyDtoSchema,
+    input: commentReplyInputSchema,
+    update: commentReplyUpdateSchema
+}
+
+export default commentReplyTable
\ No newline at end of file
diff --git a/src/db/schema/comments.schema.ts b/src/db/schema/comments.schema.ts
new file mode 100644
index 0000000000000000000000000000000000000000..50681793843d0b2fb97ba3229821cfa01fa45f26
--- /dev/null
+++ b/src/db/schema/comments.schema.ts
@@ -0,0 +1,36 @@
+import { integer, pgTable, serial, text, timestamp } from "drizzle-orm/pg-core";
+import userTable from "./user.schema";
+import resourceTable from "./resource.schema";
+import { sql } from "drizzle-orm";
+import { createInsertSchema, createSelectSchema } from "drizzle-zod";
+import type { z } from "zod";
+
+const commentsTable = pgTable('comments', {
+    id: serial('id').primaryKey().notNull().unique(),
+    user_id: integer('user_id').notNull().references(() => userTable.id, {onDelete: 'cascade'}),
+    resource_id: integer('resource_id').notNull().references(() => resourceTable.id, {onDelete: 'cascade'}),
+    text: text('text').notNull(),
+    created_at: timestamp('created_at', {mode:'string'}).notNull().defaultNow(),
+    deleted_at: timestamp('deleted_at',{mode:'string'}),
+    update_at: timestamp('update_at', {mode:'string'}).notNull().defaultNow().$onUpdate(() => sql`current_timestamp`)
+
+} )
+
+const commentsModelSchema = createSelectSchema(commentsTable)
+const commentsDtoSchema = commentsModelSchema.omit({})
+const commentsInputSchema = createInsertSchema(commentsTable)
+const commentsUpdateSchema = commentsInputSchema.partial().required({id:true})
+
+export type CommentsModel = z.infer<typeof commentsModelSchema>
+export type CommentsDto = z.infer<typeof commentsDtoSchema>
+export type CommentsInput = z.infer<typeof commentsInputSchema>
+export type CommentsUpdate = z.infer<typeof commentsUpdateSchema>
+
+export const commentsSchema = {
+    model: commentsModelSchema,
+    dto: commentsDtoSchema,
+    input: commentsInputSchema,
+    update: commentsUpdateSchema
+}
+
+export default commentsTable
\ No newline at end of file
diff --git a/src/db/schema/index.ts b/src/db/schema/index.ts
index 2c1a609a6248b705b10bd8d9cbcbad6c99bb1425..db2002d21c15b9c20dfff05ff79a26deb98ef5b1 100644
--- a/src/db/schema/index.ts
+++ b/src/db/schema/index.ts
@@ -32,6 +32,8 @@ import actionTable from './action.schema'
 import notificationRelationTable from '../relations/notification.relation'
 import userItemRelationTable from '../relations/user-item.relation'
 import stateEnum from './stateEnum.schema'
+import commentsTable from './comments.schema'
+import commentReplyTable from './comment-reply.schema'
 
 export {
   userTable,
@@ -67,6 +69,8 @@ export {
   notificationRelationTable,
   userItemRelationTable,
   stateEnum,
+  commentsTable,
+  commentReplyTable
 }
 
 export const tables = [
@@ -98,4 +102,7 @@ export const tables = [
   actionTable,
   notificationRelationTable,
   userItemRelationTable,
+  commentsTable,
+  commentReplyTable
+
 ]
diff --git a/src/db/schema/resource-stats.schema.ts b/src/db/schema/resource-stats.schema.ts
index 2c63b2d32a3870f939a9c6503f4e03cc0ea65383..a263a25dd0543f4c8b0f6673b5e467d253e528c0 100644
--- a/src/db/schema/resource-stats.schema.ts
+++ b/src/db/schema/resource-stats.schema.ts
@@ -1,43 +1,30 @@
 import {
-    pgTable,
-    serial,
-    integer,
-    numeric
+  pgTable,
+  serial,
+  integer,
+  numeric
 } from 'drizzle-orm/pg-core'
 import { createInsertSchema, createSelectSchema } from 'drizzle-zod'
 import type { z } from 'zod'
 
 
 const resourceStatsTable = pgTable('resource_stats', {
-    id: serial('id').notNull()
-      .primaryKey()
-      .unique(),
-    views: integer('views')
-      .notNull()
-      .default(0),
-    downloads: integer('downloads')
-      .notNull()
-      .default(0),
-    likes: integer('likes')
-      .notNull()
-      .default(0),
-    shares: integer('shares')
-      .notNull()
-      .default(0),
-    score: numeric('score')
-      .notNull()
-      .default('0.0'),
-    follows: integer('follows')
-      .notNull()
-      .default(0),
+  id: serial('id').notNull().primaryKey().unique(),
+  views: integer('views').notNull().default(0),
+  downloads: integer('downloads').notNull().default(0),
+  likes: integer('likes').notNull().default(0),
+  shares: integer('shares').notNull().default(0),
+  score: numeric('score').notNull().default('0.0'),
+  follows: integer('follows').notNull().default(0),
+  comments: integer('comments').notNull().default(0),
 })
 
 const resourceStatsModelSchema = createSelectSchema(resourceStatsTable)
 const resourceStatsDtoSchema = resourceStatsModelSchema.omit({})
 const resourceStatsInputSchema = createInsertSchema(resourceStatsTable)
 const resourceStatsUpdateSchema = resourceStatsInputSchema
-    .partial()
-    .required({ id: true })
+  .partial()
+  .required({ id: true })
 
 export type ResourceStatsModel = z.infer<typeof resourceStatsModelSchema>
 export type ResourceStatsDto = z.infer<typeof resourceStatsDtoSchema>
@@ -45,10 +32,10 @@ export type ResourceStatsInput = z.infer<typeof resourceStatsInputSchema>
 export type ResourceStatsUpdate = z.infer<typeof resourceStatsUpdateSchema>
 
 export const resourceStatsSchema = {
-    model: resourceStatsModelSchema,
-    dto: resourceStatsDtoSchema,
-    input: resourceStatsInputSchema,
-    update: resourceStatsUpdateSchema,
+  model: resourceStatsModelSchema,
+  dto: resourceStatsDtoSchema,
+  input: resourceStatsInputSchema,
+  update: resourceStatsUpdateSchema,
 }
 
 export default resourceStatsTable
diff --git a/src/db/schema/resource.schema.ts b/src/db/schema/resource.schema.ts
index 008644476d737ba8af441b179a652e07a861cf79..de04ef3cb0380c44c7400158c18ae2c9bc1c7091 100644
--- a/src/db/schema/resource.schema.ts
+++ b/src/db/schema/resource.schema.ts
@@ -1,15 +1,15 @@
 import {
-    pgTable,
-    serial,
-    varchar,
-    timestamp,
-    boolean,
-    text,
-    integer,
+  pgTable,
+  serial,
+  varchar,
+  timestamp,
+  boolean,
+  text,
+  integer,
 } from 'drizzle-orm/pg-core'
 import { relations, sql } from 'drizzle-orm'
 import { createInsertSchema, createSelectSchema } from 'drizzle-zod'
-import type { z } from 'zod'
+import { z } from 'zod'
 import resourceLanguagesTable from '../relations/resource-language.relation'
 import resourceSubjectsTable from '../relations/resource-subject.relation'
 import resourceEducationalStagesTable from '../relations/resource-educational-stage.relation'
@@ -48,24 +48,24 @@ const resourceTable = pgTable('resources', {
   deleted_at: timestamp('deleted_at', { mode: 'string' }),
   user_id: integer('user_id')
     .notNull()
-    .references(() => userTable.id, {onDelete: 'cascade'}),
+    .references(() => userTable.id, { onDelete: 'cascade' }),
   resource_stats_id: integer('resource_stats_id')
     .notNull()
     .unique()
-    .references(() => resourceStatsTable.id, {onDelete: 'cascade'}),
+    .references(() => resourceStatsTable.id, { onDelete: 'cascade' }),
   object_type_id: integer('object_type_id')
     .notNull()
-    .references(() => objectTypeTable.id, {onDelete: 'cascade'}),
+    .references(() => objectTypeTable.id, { onDelete: 'cascade' }),
   license_id: integer('license_id')
     .notNull()
-    .references(() => licenseTable.id, {onDelete: 'cascade'}),
-})
+    .references(() => licenseTable.id, { onDelete: 'cascade' }),
+  })
 
 
 export const resourceRelations = relations(resourceTable, ({ many }) => ({
-    resourceLanguages: many(resourceLanguagesTable),
-    resourceSubjects: many(resourceSubjectsTable),
-    resourceEducatinalStages: many(resourceEducationalStagesTable)
+  resourceLanguages: many(resourceLanguagesTable),
+  resourceSubjects: many(resourceSubjectsTable),
+  resourceEducatinalStages: many(resourceEducationalStagesTable)
 })
 )
 
@@ -73,9 +73,18 @@ export const resourceRelations = relations(resourceTable, ({ many }) => ({
 const resourceModelSchema = createSelectSchema(resourceTable)
 const resourceDtoSchema = resourceModelSchema.omit({})
 const resourceInputSchema = createInsertSchema(resourceTable)
+  .partial()
+  .extend({
+    resource_stats_id: z.number().optional(),
+  })
+  .omit({
+    active: true
+  })
+
 const resourceUpdateSchema = resourceInputSchema
-    .partial()
-    .required({ id: true })
+  .partial()
+  .required({ id: true })
+
 
 export type ResourceModel = z.infer<typeof resourceModelSchema>
 export type ResourceDto = z.infer<typeof resourceDtoSchema>
@@ -83,10 +92,10 @@ export type ResourceInput = z.infer<typeof resourceInputSchema>
 export type ResourceUpdate = z.infer<typeof resourceUpdateSchema>
 
 export const resourceSchema = {
-    model: resourceModelSchema,
-    dto: resourceDtoSchema,
-    input: resourceInputSchema,
-    update: resourceUpdateSchema,
+  model: resourceModelSchema,
+  dto: resourceDtoSchema,
+  input: resourceInputSchema,
+  update: resourceUpdateSchema,
 }
 
 export default resourceTable
\ No newline at end of file
diff --git a/src/db/schema/user-stats.schema.ts b/src/db/schema/user-stats.schema.ts
index 39e045da20a2ed1e1ff217641486ec05f051aa8a..1acfb6b0d00289bc033eadef36649b99f40b81ef 100644
--- a/src/db/schema/user-stats.schema.ts
+++ b/src/db/schema/user-stats.schema.ts
@@ -4,29 +4,29 @@ import type { z } from "zod";
 
 const userStatsTable = pgTable('user_stats', {
   id: serial('id').primaryKey()
-  .unique()
-  .notNull(),
+    .unique()
+    .notNull(),
   score: numeric('score')
-  .notNull()
-  .default('0.0'),
+    .notNull()
+    .default('0.0'),
   likes: integer('likes').notNull()
-  .default(0),
+    .default(0),
   likes_received: integer('likes_received').notNull()
-  .default(0),
+    .default(0),
   follows: integer('follows').notNull()
-  .default(0),
+    .default(0),
   followers: integer('followers').notNull()
-  .default(0),
+    .default(0),
   collections: integer('collections').notNull()
-  .default(0),
+    .default(0),
   submitted_resources: integer('submitted_resources').notNull()
-  .default(0),
+    .default(0),
   approved_resources: integer('approved_resources').notNull()
-  .default(0),
+    .default(0),
   reviewed_resources: integer('reviewed_resources').notNull()
-  .default(0),
+    .default(0),
   comments: integer('comments').notNull()
-  .default(0),
+    .default(0),
 })
 
 const userStatsModelSchema = createSelectSchema(userStatsTable)
@@ -34,7 +34,7 @@ const userStatsDtoSchema = userStatsModelSchema
 const userStatsInputSchema = createInsertSchema(userStatsTable)
 const userStatsUpdateSchema = userStatsInputSchema
   .partial()
-  .required({ id: true})
+  .required({ id: true })
 
 export type UserStatsModel = z.infer<typeof userStatsModelSchema>
 export type UserStatsDto = z.infer<typeof userStatsDtoSchema>
diff --git a/src/db/seed.ts b/src/db/seed.ts
index b70603a544967a72d077ff7da99e9cb646e91a7e..e4ae0e42c74ea79d904a5417f6a58237bb0075f5 100644
--- a/src/db/seed.ts
+++ b/src/db/seed.ts
@@ -26,6 +26,7 @@ await seeds.userSeed(db)
 await seeds.objectTypeSeed(db)
 await seeds.licenseSeed(db)
 await seeds.resourceStatsSeed(db)
+
 await seeds.resourceSeed(db)
 await seeds.collectionStatsSeed(db)
 await seeds.collectionSeed(db)
@@ -48,5 +49,6 @@ await seeds.achievementSeed(db)
 await seeds.itemsSeed(db)
 await seeds.userAchievementsSeed(db)
 await seeds.actionSeed(db)
+await seeds.commentsSeed(db)
 
 await connection.end()
diff --git a/src/db/seeds/comments.seed.ts b/src/db/seeds/comments.seed.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7f7c8fa3bb27915e98f41129171bc6d4b51df4dc
--- /dev/null
+++ b/src/db/seeds/comments.seed.ts
@@ -0,0 +1,40 @@
+import type db from '@/db'
+import  { type CommentsInput } from '../schema/comments.schema'
+import {commentsTable} from '../schema'
+
+export default async function seed(db:db){
+    await db.insert(commentsTable).values(commentsData)
+}
+
+const commentsData: CommentsInput[] = [
+    {
+        user_id: 1,
+        resource_id: 1,
+        text: 'comentarioooooooooooooo'
+    },
+    {
+        user_id: 1,
+        resource_id: 1,
+        text: 'comentario 2'
+    }, 
+       {
+        user_id: 1,
+        resource_id: 2,
+        text: 'comentarioooo aaaaaa'
+    },
+        {
+        user_id: 2,
+        resource_id: 1,
+        text: 'comentario usuario 2 recurso 1'
+    },
+        {
+        user_id: 2,
+        resource_id: 2,
+        text: 'comentario user 2 resource 2'
+    },
+        {
+        user_id: 1,
+        resource_id: 1,
+        text: 'comentario 3 user 1 resource 1'
+    }
+]
\ No newline at end of file
diff --git a/src/db/seeds/index.ts b/src/db/seeds/index.ts
index dcf31d806de05314f29237c043982ce836759537..3e9c104ebea11a2808c85345e2c7520351a12934 100644
--- a/src/db/seeds/index.ts
+++ b/src/db/seeds/index.ts
@@ -25,3 +25,4 @@ export { default as achievementSeed } from './achievement.seed'
 export { default as itemsSeed } from './items.seed'
 export { default as userAchievementsSeed } from './user-achievements.seed'
 export { default as actionSeed } from './action.seed'
+export { default as commentsSeed } from './comments.seed'
diff --git a/src/index.ts b/src/index.ts
index 0e8f3a5ee5132bb4ca80c614aee172875eaaf332..9061de7561eb69e575373fdcaab164240bcf712a 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -38,8 +38,14 @@ import { publicUserAchievementsRoute, userAchievementsRouter } from './routes/us
 import { actionRouter } from './routes/action.route'
 import { notificationRouter } from './routes/notification.route'
 import { userItemRouter } from './routes/user-item.route'
+import { swaggerUI } from '@hono/swagger-ui'
+import { OpenAPIHono } from "@hono/zod-openapi";
+import { commentsRouter, publicCommentsRoute } from './routes/comments.route'
+import { publicCommentsReplyRoute, commentReplyRouter } from './routes/comment-reply.route'
 
-const app = new Hono()
+
+
+const app = new OpenAPIHono();
 
 app.use('*', logger())
 app.use('*', prettyJSON())
@@ -50,6 +56,21 @@ app.use(
     secret: env.APP_SECRET,
   })
 )
+
+// The openapi.json will be available at /doc
+app.doc("/doc", {
+  openapi: "3.0.0",
+  info: {
+      version: "1.0.0",
+      title: "My API",
+  },
+});
+
+// swagger ui doc will be available at {server url}/ui
+// fell free to change the url
+// swaggerUI url must have same path as openapi.json
+app.get("/ui", swaggerUI({ url: "/doc" }));
+
 app.use(
   '/api/upload',
   bodyLimit({
@@ -94,6 +115,8 @@ app
   .route('/resourceLikes', publicResourceLikesRoutes)
   .route('/achievements', publicAchievementRouter)
   .route('/userAchievements', publicUserAchievementsRoute)
+  .route('/comments', publicCommentsRoute)
+  .route('/replyComment', publicCommentsReplyRoute)
 //rotas que precisam de token
 app
   .basePath('/api')
@@ -127,6 +150,9 @@ app
   .route('/userAchievements', userAchievementsRouter)
   .route('/notifications', notificationRouter)
   .route('/user-item', userItemRouter)
+  .route('/comments', commentsRouter)
+  .route('/replyComment', commentReplyRouter)
+
 export default app
 export type AppType = typeof app
 
diff --git a/src/routes/collection-resources.route.ts b/src/routes/collection-resources.route.ts
index f0f3d483ba050e049faf9826e0b1b7d59d0bb7e4..dcf0372aea2f909636d252dbd973ff8994b39258 100644
--- a/src/routes/collection-resources.route.ts
+++ b/src/routes/collection-resources.route.ts
@@ -14,6 +14,7 @@ const associateSchema = z.object({
 const service = Container.get(CollectionResourcesService);
 
 export const collectionResourcesRoutes = honoWithJwt()
+// associate resources with collection
   .post('/associate', zValidator('json', associateSchema),
     async (c) => {
       try {
@@ -58,7 +59,8 @@ export const collectionResourcesRoutes = honoWithJwt()
   
 
 export const publicCollectionResourcesRoutes = new Hono()
-  .get('/:collectionId/resources',
+// get all resources of a collection
+.get('/:collectionId/resources',
     async (c) => {
       try {
         const collectionId = +c.req.param('collectionId');
@@ -78,6 +80,7 @@ export const publicCollectionResourcesRoutes = new Hono()
       }
     }
   )  
+  // check if resource is associated with collection
   .get('/:collectionId/resources/:resourceId/exists',
     async (c) => {
       try {
@@ -99,6 +102,7 @@ export const publicCollectionResourcesRoutes = new Hono()
       }
     }
   )  
+  // get collections of a resource
   .get('/resource/:resourceId/collections',
     async (c) => {
       try {
diff --git a/src/routes/comment-reply.route.ts b/src/routes/comment-reply.route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fc67c8b753f980ed8cca7656c488812573aff49b
--- /dev/null
+++ b/src/routes/comment-reply.route.ts
@@ -0,0 +1,182 @@
+import { CommentReplyService } from "@/services/comment-reply.service";
+import Container from "typedi";
+import { honoWithJwt } from "..";
+import { zValidator } from "@hono/zod-validator";
+import { commentReplySchema } from "@/db/schema/comment-reply.schema";
+import { createApexError, HttpStatus } from "@/services/error.service";
+import { Hono } from "hono";
+import { UserStatsService } from "@/services/user-stats.service";
+import { ResourceStatsService } from "@/services/resource-stats.service";
+import { CommentsService } from "@/services/comments.sevice";
+
+const service = Container.get(CommentReplyService)
+const serviceUserStats = Container.get(UserStatsService)
+const serviceStatsResource = Container.get(ResourceStatsService)
+const serviceComment = Container.get(CommentsService)
+
+export const commentReplyRouter = honoWithJwt()
+
+    .post('/create',
+        zValidator('json', commentReplySchema.input),
+        async (c) => {
+            try {
+                const input = c.req.valid('json')
+                const commentReply = commentReplySchema.dto.parse(await service.create(input))
+
+                await serviceUserStats.updateComments(input.user_id)
+
+                const comment = await serviceComment.find(input.comment_id)
+                if (!comment) {
+                    throw new Error("Comment not found")
+                }
+    
+                await serviceStatsResource.updateComments(comment.resource_id)
+
+                return c.json(commentReply)
+            } catch (e) {
+                return c.json(
+                    createApexError({
+                        status: 'error',
+                        message: 'could not create the reply comment',
+                        code: HttpStatus.BAD_REQUEST,
+                        path: c.req.routePath,
+                        suggestion: 'check the json input and try again',
+                    }),
+                    HttpStatus.BAD_REQUEST
+                )
+            }
+        }
+    )
+
+
+    .post('/update',
+        zValidator('json', commentReplySchema.update),
+        async (c) => {
+            try {
+                const input = c.req.valid('json')
+                const commentReply = commentReplySchema.dto.parse(await service.update(input))
+                return c.json( commentReply )
+            } catch (e) {
+                return c.json(
+                    createApexError({
+                        status: 'error',
+                        message: 'could not update the reply comment',
+                        code: HttpStatus.BAD_REQUEST,
+                        path: c.req.routePath,
+                        suggestion: 'check the json update and try again'
+                    }),
+                    HttpStatus.BAD_REQUEST
+                )
+            }
+        }
+    )
+
+    .post('deleteData/:id',
+        async (c) => {
+            try {
+                const id = +c.req.param('id')
+                const comment = commentReplySchema.dto.parse(await service.deleteData(id))
+
+                return c.json(comment)
+            }
+            catch (e) {
+                return c.json(
+                    createApexError({
+                        status: 'error',
+                        message: 'could not delete the reply comment',
+                        code: HttpStatus.BAD_REQUEST,
+                        path: c.req.routePath,
+                        suggestion: 'check the id and try again',
+                    }),
+                    HttpStatus.BAD_REQUEST
+                )
+            }
+        }
+    )
+
+    .post('delete/:id',
+        async (c) => {
+            try {
+                const id = +c.req.param('id')
+                const comment = commentReplySchema.dto.parse(await service.delete(id))
+
+                return c.json(comment)
+            } catch (e) {
+                return c.json(
+                    createApexError({
+                        status: 'error',
+                        message: 'could not delete the reply comment',
+                        code: HttpStatus.BAD_REQUEST,
+                        path: c.req.routePath,
+                        suggestion: 'check the id and try again',
+                    }),
+                    HttpStatus.BAD_REQUEST
+                )
+            }
+        }
+    )
+
+export const publicCommentsReplyRoute = new Hono()
+
+    // get active reply by comment
+    .get('/findReplyByComment/:comment_id', async (c) => {
+        try {
+            const id_comment = +c.req.param('comment_id')
+            const comments = commentReplySchema.dto.array().parse(await service.findReplyByComment(id_comment));
+
+            return c.json(comments);
+        } catch (e) {
+            return c.json(
+                createApexError({
+                    status: 'error',
+                    message: 'Could not find active reply by comment',
+                    code: HttpStatus.BAD_REQUEST,
+                    path: c.req.routePath,
+                    suggestion: 'Are you sure the comment exists?',
+                }),
+                HttpStatus.BAD_REQUEST
+            );
+        }
+    })
+
+    // get all reply by comment
+    .get('/findAllReplyByComment/:comment_id', async (c) => {
+        try {
+            const id_comment = +c.req.param('comment_id')
+            const comments = commentReplySchema.dto.array().parse(await service.findAllReplyByComment(id_comment));
+
+            return c.json(comments);
+        } catch (e) {
+            return c.json(
+                createApexError({
+                    status: 'error',
+                    message: 'Could not find reply by comment',
+                    code: HttpStatus.BAD_REQUEST,
+                    path: c.req.routePath,
+                    suggestion: 'Are you sure the comment exists?',
+                }),
+                HttpStatus.BAD_REQUEST
+            );
+        }
+    })
+
+    // get all reply by user
+    .get('/findAllReplyByUser/:id_user', async (c) => {
+        try {
+            const id_user = +c.req.param('id_user')
+            const comments = commentReplySchema.dto.array().parse(await service.findAllReplyByUser(id_user));
+
+            return c.json(comments);
+        } catch (e) {
+            return c.json(
+                createApexError({
+                    status: 'error',
+                    message: 'Could not find reply by user',
+                    code: HttpStatus.BAD_REQUEST,
+                    path: c.req.routePath,
+                    suggestion: 'Are you sure the user exists?',
+                }),
+                HttpStatus.BAD_REQUEST
+            );
+        }
+    }) 
\ No newline at end of file
diff --git a/src/routes/comments.route.ts b/src/routes/comments.route.ts
new file mode 100644
index 0000000000000000000000000000000000000000..70fa6f0a51064b0936db6f7330f533e7ee9431d6
--- /dev/null
+++ b/src/routes/comments.route.ts
@@ -0,0 +1,249 @@
+import { zValidator } from "@hono/zod-validator";
+import { honoWithJwt } from "..";
+import { commentsSchema } from "@/db/schema/comments.schema";
+import Container from "typedi";
+import { CommentsService } from "@/services/comments.sevice";
+import { createApexError, HttpStatus } from "@/services/error.service";
+import { Hono } from "hono";
+import { UserStatsService } from "@/services/user-stats.service";
+import { ResourceStatsService } from "@/services/resource-stats.service";
+
+const service = Container.get(CommentsService);
+const serviceUserStats = Container.get(UserStatsService)
+const serviceStatsResource = Container.get(ResourceStatsService)
+
+
+export const commentsRouter = honoWithJwt()
+    //create a comment
+    .post('/create',
+        zValidator('json', commentsSchema.input),
+
+        async (c) => {
+            try {
+                const input = await c.req.valid('json')
+                const comment = commentsSchema.dto.parse(await service.create(input))
+
+                await serviceUserStats.updateComments(input.user_id)
+                await serviceStatsResource.updateComments(input.resource_id)
+
+                return c.json(comment)
+            }
+            catch (e) {
+                return c.json(
+                    createApexError({
+                        status: 'error',
+                        message: 'could not create the comment',
+                        code: HttpStatus.BAD_REQUEST,
+                        path: c.req.routePath,
+                        suggestion: 'check the json input and try again',
+                    }),
+                    HttpStatus.BAD_REQUEST
+                )
+            }
+        }
+    )
+
+
+    .post('/update',
+        zValidator('json', commentsSchema.update),
+        async (c) => {
+            try {
+                const input = await c.req.valid('json')
+                const comment = commentsSchema.dto.parse(await service.update(input))
+                return c.json( comment )
+            }
+            catch (e) {
+                return c.json(
+                    createApexError({
+                        status: 'error',
+                        message: 'could not update the comment',
+                        code: HttpStatus.BAD_REQUEST,
+                        path: c.req.routePath,
+                        suggestion: 'check the json update and try again'
+                    }),
+                    HttpStatus.BAD_REQUEST
+                )
+
+            }
+        }
+
+
+    )
+
+    .post('deleteData/:id',
+        async (c) => {
+            try {
+                const id = +c.req.param('id')
+                const comment = commentsSchema.dto.parse(await service.deleteData(id))
+
+                return c.json(comment)
+            }
+            catch (e) {
+                return c.json(
+                    createApexError({
+                        status: 'error',
+                        message: 'could not delete the comment',
+                        code: HttpStatus.BAD_REQUEST,
+                        path: c.req.routePath,
+                        suggestion: 'check the id and try again',
+                    }),
+                    HttpStatus.BAD_REQUEST
+                )
+            }
+        }
+    )
+
+    .post('delete/:id',
+        async (c) => {
+            try {
+                const id = +c.req.param('id')
+                const comment = commentsSchema.dto.parse(await service.delete(id))
+
+                return c.json(comment)
+            } catch (e) {
+                return c.json(
+                    createApexError({
+                        status: 'error',
+                        message: 'could not delete the comment',
+                        code: HttpStatus.BAD_REQUEST,
+                        path: c.req.routePath,
+                        suggestion: 'check the id and try again',
+                    }),
+                    HttpStatus.BAD_REQUEST
+                )
+            }
+        }
+    )
+
+export const publicCommentsRoute = new Hono()
+    .get('/all', async (c) => {
+        try {
+            const comment = commentsSchema.dto.array().parse(await service.findMany())
+            return c.json({ comment })
+        } catch (e) {
+            return c.json(
+                createApexError({
+                    status: 'error',
+                    message: 'could not find any comment',
+                    code: HttpStatus.NOT_FOUND,
+                    path: c.req.routePath,
+                    suggestion: 'are you sure there are comments?',
+                }),
+                HttpStatus.NOT_FOUND
+            )
+        }
+    }
+    )
+
+    // encontrar um comentário com base no id    
+    .get('/:id',
+        async (c) => {
+            try {
+                const id = +c.req.param('id')
+                const comment = commentsSchema.dto.parse(await service.find(id))
+
+                return c.json(comment)
+            } catch (e) {
+                return c.json(
+                    createApexError({
+                        status: 'error',
+                        message: 'could not find the comment',
+                        code: HttpStatus.BAD_REQUEST,
+                        path: c.req.routePath,
+                        suggestion: 'are you sure the comment exists?',
+
+                    }),
+                    HttpStatus.BAD_REQUEST
+                )
+            }
+        }
+    )
+
+     // get all resource by resource
+        .get('/findCommentsByResource/:resource_id', async (c) => {
+            try {
+                const id_resource = +c.req.param('resource_id')
+                const comments =commentsSchema.dto.array().parse( await service.findCommentsByResource(id_resource));
+    
+                return c.json(comments);
+            } catch (e) {
+                return c.json(
+                    createApexError({
+                        status: 'error',
+                        message: 'Could not find comments by resource',
+                        code: HttpStatus.BAD_REQUEST,
+                        path: c.req.routePath,
+                        suggestion: 'Are you sure the resource exists?',
+                    }),
+                    HttpStatus.BAD_REQUEST
+                );
+            }
+        })
+
+         // get active resource by resource
+            .get('/findAllCommentsByResource/:resource_id', async (c) => {
+                try {
+                    const id_resource = +c.req.param('resource_id')
+                    const resource = commentsSchema.dto.array().parse(await service.findAllCommentsByResource(id_resource))
+        
+                    return c.json(resource)
+                } catch (e) {
+                    return c.json(
+                        createApexError({
+                            status: 'error',
+                            message: 'could not find the comments',
+                            code: HttpStatus.BAD_REQUEST,
+                            path: c.req.routePath,
+                            suggestion: 'are you sure the resource exists?',
+        
+                        }),
+                        HttpStatus.BAD_REQUEST
+                    )
+                }
+            })
+
+
+
+                // get active resource by user
+                .get('/findCommentsByUser/:user_id', async (c) => {
+                    try {
+                        const user_id = +c.req.param('user_id')
+                        const resource = commentsSchema.dto.array().parse(await service.findCommentsByUser(user_id))
+            
+                        return c.json(resource)
+                    } catch (e) {
+                        return c.json(
+                            createApexError({
+                                status: 'error',
+                                message: 'could not find the comment',
+                                code: HttpStatus.BAD_REQUEST,
+                                path: c.req.routePath,
+                                suggestion: 'are you sure the user exists?',
+            
+                            }),
+                            HttpStatus.BAD_REQUEST
+                        )
+                    }
+                })
+
+
+                // get all comments by user
+                    .get('/findAllCommentsByUser/:user_id', async (c) => {
+                        try {
+                            const user_id = +c.req.param('user_id')
+                            const resources =commentsSchema.dto.array().parse( await service.findAllCommentsByUser(user_id));
+                
+                            return c.json(resources);
+                        } catch (e) {
+                            return c.json(
+                                createApexError({
+                                    status: 'error',
+                                    message: 'Could not find the comment',
+                                    code: HttpStatus.BAD_REQUEST,
+                                    path: c.req.routePath,
+                                    suggestion: 'Are you sure the user exists?',
+                                }),
+                                HttpStatus.BAD_REQUEST
+                            );
+                        }
+                    })
\ No newline at end of file
diff --git a/src/routes/resource-likes.route.ts b/src/routes/resource-likes.route.ts
index a2b817001b1e8ace3b092252b29a884f968f8218..a9e871666c6e5d17a791319cb260c6c62b582aa6 100644
--- a/src/routes/resource-likes.route.ts
+++ b/src/routes/resource-likes.route.ts
@@ -14,6 +14,7 @@ const associateSchema = z.object({
 const service = Container.get(ResourceLikesService);
 
 export const resourceLikesRoutes = honoWithJwt()
+// the user has liked the resource 
   .post('/associate', zValidator('json', associateSchema),
     async (c) => {
       try {
@@ -34,6 +35,7 @@ export const resourceLikesRoutes = honoWithJwt()
       }
     }
   )
+  // remove likes from resource, the user has unliked the resource
   .post('/:resourceId/delete/:userId',
     async (c) => {
       try {
@@ -57,6 +59,7 @@ export const resourceLikesRoutes = honoWithJwt()
   )
   
 export const publicResourceLikesRoutes = new Hono()
+// get likes by resource id
   .get('/:resourceId',
     async (c) => {
       try {
@@ -77,6 +80,8 @@ export const publicResourceLikesRoutes = new Hono()
       }
     }
   )
+
+  // verify if association exists, the user has liked the resource
   .get('/:resourceId/likes/:userId/exists', 
     async (c) => {
       try {
@@ -98,6 +103,8 @@ export const publicResourceLikesRoutes = new Hono()
       }
     }
   )
+
+  // get resources liked by user
   .get('/user/:userId/resources', 
     async (c) => {
       try {
diff --git a/src/routes/resource.route.ts b/src/routes/resource.route.ts
index 8dcdc0bfea0854891a7f001bb901b94ac4965305..318f099c4381d71df24e71236b07a9f008450c20 100644
--- a/src/routes/resource.route.ts
+++ b/src/routes/resource.route.ts
@@ -11,14 +11,18 @@ import { ResourceStatsService } from "@/services/resource-stats.service";
 const service = Container.get(ResourceService);
 const serviceStats = Container.get(ResourceStatsService);
 
+
+//aqui teremos a rota de acessar e uma de baixar recurso quando o s3 estiver okay
+
 export const resourceRouter = honoWithJwt()
-    // rota para criar um recurso
+    // create a resource
     .post('/create',
         zValidator('json', resourceSchema.input),
 
         async (c) => {
             try {
                 const input = await c.req.valid('json')
+              
                 //cria o stats do recurso correspondente
                 const stats = resourceStatsSchema.dto.parse(
                     await serviceStats.create()
@@ -46,7 +50,7 @@ export const resourceRouter = honoWithJwt()
         }
     )
 
-    // rota para atualizar um recurso    
+    // update a resource    
     .post('/update',
         zValidator('json', resourceSchema.update),
         async (c) => {
@@ -69,7 +73,7 @@ export const resourceRouter = honoWithJwt()
             }
         })
 
-    // rota para deletar um recurso        
+    // rota para deletar um recurso 
     .post('/deleteData/:id',
         async (c) => {
             try {
@@ -142,7 +146,7 @@ export const resourceRouter = honoWithJwt()
 
 
 export const publicResourceRouter = new Hono()
-// rota para listar todos os recursos    
+    // get all resources
     .get('/all', async (c) => {
         try {
             const resource = resourceSchema.dto.array().parse(await service.findMany())
@@ -162,7 +166,51 @@ export const publicResourceRouter = new Hono()
     }
     )
 
-// rota para pegar um recurso especifico    
+    // get all resource by user
+    .get('/allResourceByUser/:user_id', async (c) => {
+        try {
+            const user_id = +c.req.param('user_id')
+            const resources =resourceSchema.dto.array().parse( await service.allResourceByUser(user_id));
+
+            return c.json(resources);
+        } catch (e) {
+            return c.json(
+                createApexError({
+                    status: 'error',
+                    message: 'Could not find the resource',
+                    code: HttpStatus.BAD_REQUEST,
+                    path: c.req.routePath,
+                    suggestion: 'Are you sure the user exists?',
+                }),
+                HttpStatus.BAD_REQUEST
+            );
+        }
+    })
+
+
+    // get active resource by user
+    .get('/activeResourceByUser/:user_id', async (c) => {
+        try {
+            const user_id = +c.req.param('user_id')
+            const resource = resourceSchema.dto.array().parse(await service.activeResourceByUser(user_id))
+
+            return c.json(resource)
+        } catch (e) {
+            return c.json(
+                createApexError({
+                    status: 'error',
+                    message: 'could not find the resource',
+                    code: HttpStatus.BAD_REQUEST,
+                    path: c.req.routePath,
+                    suggestion: 'are you sure the user exists?',
+
+                }),
+                HttpStatus.BAD_REQUEST
+            )
+        }
+    })
+
+    // get resource by id
     .get('/:id',
         async (c) => {
             try {
diff --git a/src/routes/user-stats.route.ts b/src/routes/user-stats.route.ts
index bea7f752b4327b810864efacac6ddb958ff75e93..0e53ee7edb74de102e57bb13145411b382ac1f45 100644
--- a/src/routes/user-stats.route.ts
+++ b/src/routes/user-stats.route.ts
@@ -12,14 +12,14 @@ export const userStatsRouter = honoWithJwt()
   .post('/update',
     zValidator('json', userStatsSchemas.update),
     async (c) => {
-      try{
+      try {
 
         const input = await c.req.valid('json')
         const user_stats = userStatsSchemas.dto.parse(
           await service.update(input)
         )
-              
-        return c.json({user_stats})
+
+        return c.json({ user_stats })
       } catch (e) {
         return c.json(
           createApexError({
@@ -32,18 +32,19 @@ export const userStatsRouter = honoWithJwt()
           HttpStatus.BAD_REQUEST
         )
       }
-  })
+    })
+
   /* Nao deveria ter como deletar um user stats sozinho */
   .post('/delete/:id',
     zValidator('json', userStatsSchemas.update),
-    async (c) =>{
-      try{
+    async (c) => {
+      try {
         const id: number = +c.req.param('id')
         const user_stats = userStatsSchemas.dto.parse(
           await service.delete(id)
         )
         return c.json(user_stats)
-      } catch (e){
+      } catch (e) {
         return c.json(
           createApexError({
             status: 'error',
@@ -55,4 +56,79 @@ export const userStatsRouter = honoWithJwt()
           HttpStatus.BAD_REQUEST
         )
       }
-  })
\ No newline at end of file
+    })
+
+  .post('/updateComments/:id',
+    async (c) => {
+      try {
+        const id = +c.req.param('id')
+        const stats = userStatsSchemas.dto.parse(await service.updateComments(id))
+
+        return c.json(stats)
+      } catch (e) {
+        return c.json(
+          createApexError({
+            status: 'error',
+            message: 'could not update the stats resource',
+            code: HttpStatus.BAD_REQUEST,
+            path: c.req.routePath,
+            suggestion: 'check the id resource input and try again',
+          }),
+          HttpStatus.BAD_REQUEST
+        )
+      }
+    }
+  )
+
+  /* Obtém todos os user stats */
+  .get('/all', async (c) => {
+    try {
+      const stats = await service.getAll()
+      return c.json(stats)
+    } catch (e) {
+      return c.json(
+        createApexError({
+          status: 'error',
+          message: 'could not fetch user stats',
+          code: HttpStatus.BAD_REQUEST,
+          path: c.req.routePath,
+          suggestion: 'try again later',
+        }),
+        HttpStatus.BAD_REQUEST
+      )
+    }
+  })
+
+  /* Obtém um user stats específico */
+  .get('/:id', async (c) => {
+    try {
+      const id = +c.req.param('id')
+      const stat = await service.getById(id)
+
+      if (!stat) {
+        return c.json(
+          createApexError({
+            status: 'error',
+            message: 'user stats not found',
+            code: HttpStatus.NOT_FOUND,
+            path: c.req.routePath,
+            suggestion: 'check the id and try again',
+          }),
+          HttpStatus.NOT_FOUND
+        )
+      }
+
+      return c.json(stat)
+    } catch (e) {
+      return c.json(
+        createApexError({
+          status: 'error',
+          message: 'could not fetch user stats',
+          code: HttpStatus.BAD_REQUEST,
+          path: c.req.routePath,
+          suggestion: 'check the id and try again',
+        }),
+        HttpStatus.BAD_REQUEST
+      )
+    }
+  })
diff --git a/src/services/comment-reply.service.ts b/src/services/comment-reply.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..db6bb7000f175e44617aa9c03f79823788a531ab
--- /dev/null
+++ b/src/services/comment-reply.service.ts
@@ -0,0 +1,40 @@
+import { commentReplyRepo } from "@/db/repo/comment-reply.repo";
+import type { CommentReplyInput, CommentReplyModel, CommentReplyUpdate } from "@/db/schema/comment-reply.schema";
+import { Inject, Service } from "typedi";
+
+@Service()
+export class CommentReplyService{
+    @Inject()
+    private readonly repo: commentReplyRepo
+
+    async create(commentReply: CommentReplyInput): Promise<CommentReplyModel>{
+        return this.repo.create(commentReply)
+    }
+
+    async update(commentReply:CommentReplyUpdate): Promise<CommentReplyModel>{
+        return this.repo.update(commentReply)
+    }
+
+    async deleteData(id: CommentReplyModel['id']): Promise<CommentReplyModel>{
+     return this.repo.deleteData(id)   
+    }
+
+    async delete(id:CommentReplyModel['id']): Promise<CommentReplyModel>{
+        return this.repo.delete(id)
+    }
+
+    async findReplyByComment(id_comment: CommentReplyModel['comment_id']): Promise<CommentReplyModel[]>{
+        return this.repo.findReplyByComment(id_comment)
+    }
+
+    async findAllReplyByComment(id_comment: CommentReplyModel['comment_id']): Promise<CommentReplyModel[]>{
+        return this.repo.findAllReplyByComment(id_comment)
+    }
+
+    async findAllReplyByUser(id_user: CommentReplyModel['user_id']): Promise<CommentReplyModel[]>{
+        return this.repo.findAllReplyByUser(id_user)
+    }
+
+
+
+}
\ No newline at end of file
diff --git a/src/services/comments.sevice.ts b/src/services/comments.sevice.ts
new file mode 100644
index 0000000000000000000000000000000000000000..07f1d8ce6ba0a14c106ea8e4743f659a5ec6c64b
--- /dev/null
+++ b/src/services/comments.sevice.ts
@@ -0,0 +1,62 @@
+import { commentsRepo } from "@/db/repo/comments.repo";
+import type { CommentsInput, CommentsModel, CommentsUpdate } from "@/db/schema/comments.schema";
+import { Inject, Service } from "typedi";
+
+@Service()
+export class CommentsService {
+    @Inject()
+    private readonly repo: commentsRepo
+
+    async create(comments: CommentsInput): Promise<CommentsModel> {
+        return this.repo.create(comments)
+    }
+
+
+    async update(comments: CommentsUpdate): Promise<CommentsModel> {
+        return this.repo.update(comments)
+    }
+
+    //deleta os dados do banco
+    async deleteData(id: CommentsModel['id']): Promise<CommentsModel> {
+        return this.repo.deleteData(id)
+    }
+
+
+    //seta o comentario como deletado, mas nao exclui do banco
+    async delete(id: CommentsModel['id']): Promise<CommentsModel> {
+        return this.repo.delete(id)
+    }
+
+    //encontra um comentario com base no id
+    async find(id: CommentsModel['id']): Promise<CommentsModel | undefined> {
+        return this.repo.find(id)
+    }
+
+    //retorna todos os comentarios ativos
+    async findMany(): Promise<CommentsModel[]> {
+        return this.repo.findMany()
+    }
+
+    //retorna os comentarios ativos de um recurso
+    async findCommentsByResource(id_resource: CommentsModel['resource_id']): Promise<CommentsModel[]> {
+
+        return this.repo.findCommentsByResource(id_resource)
+    }
+
+    //retorna todos(ativos e inativos) os comentarios ativos de um recurso
+    async findAllCommentsByResource(id_resource: CommentsModel['resource_id']): Promise<CommentsModel[]> {
+        return this.repo.findAllCommentsByResource(id_resource)
+    }
+
+    //retorna os comentarios ativos de um usuario
+    async findCommentsByUser(id_user: CommentsModel['user_id']): Promise<CommentsModel[]> {
+        return this.repo.findCommentsByUser(id_user)
+    }
+
+    //retorna todos(ativos e inativos) os comentarios ativos de um usuario
+    async findAllCommentsByUser(id_user: CommentsModel['user_id']): Promise<CommentsModel[]> {
+        return this.repo.findAllCommentsByUser(id_user)
+    }
+
+
+}
\ No newline at end of file
diff --git a/src/services/resource-stats.service.ts b/src/services/resource-stats.service.ts
index e5f7928d52bad956de47e66de09af68470dc6e5b..811ba962c19c0bb77bd3a99fc4226365c53913f8 100644
--- a/src/services/resource-stats.service.ts
+++ b/src/services/resource-stats.service.ts
@@ -34,6 +34,9 @@ export class ResourceStatsService {
   async findById(id: ResourceStatsModel['id']): Promise<ResourceStatsModel | undefined> {
     return this.repo.find(id)
   }
+  async updateComments(id: ResourceStatsModel['id']): Promise<ResourceStatsModel>{
+    return this.repo.updateComments(id)
+  }
 
   async findMany(): Promise<ResourceStatsModel[]> {
 
diff --git a/src/services/resource.service.ts b/src/services/resource.service.ts
index 7d7f0e16da2ded254e7d8f362edda5b9b9ed4cc7..585b44fd67e8b4d6a359481f38b6ada4c21c61b5 100644
--- a/src/services/resource.service.ts
+++ b/src/services/resource.service.ts
@@ -27,6 +27,14 @@ export class ResourceService {
     return this.repo.active(id)
   }
 
+  async allResourceByUser(id_user: ResourceModel['user_id']): Promise <ResourceModel[]>{
+    return this.repo.allResourceByUser(id_user)
+  }
+
+  async activeResourceByUser(id_user: ResourceModel['user_id']): Promise <ResourceModel[]>{
+    return this.repo.activeResourceByUser(id_user)
+  }
+
   async findById(id: ResourceModel['id']): Promise<ResourceModel | undefined> {
     return this.repo.find(id)
   }
diff --git a/src/services/user-stats.service.ts b/src/services/user-stats.service.ts
index 3b4e3792e01a0fa0458358656ff8061c11d6d91e..0f9221b33b856de1bb3e976b7d28f478732df78e 100644
--- a/src/services/user-stats.service.ts
+++ b/src/services/user-stats.service.ts
@@ -4,31 +4,31 @@ import type { UserStatsModel, UserStatsUpdate } from "@/db/schema/user-stats.sch
 import { Inject, Service } from "typedi";
 
 @Service()
-export class UserStatsService{
+export class UserStatsService {
     @Inject()
     private readonly repo: UserStatsRepo
 
-    async findById(
-        userStats_id: UserStatsModel['id']
-    ): Promise<UserStatsModel | null>{
+    async getAll(): Promise<UserStatsModel[]> {
+        return await this.repo.getAll()
+    }
+
+    async getById(userStats_id: UserStatsModel['id']): Promise<UserStatsModel | null> {
         return await this.repo.findById(userStats_id)
     }
 
-    async create(
-        tx?: db
-    ): Promise<UserStatsModel>{
+    async create( tx?: db ): Promise<UserStatsModel> {
         return this.repo.create(tx)
     }
 
-    async update(
-        userStats: UserStatsUpdate
-    ): Promise<UserStatsModel>{
+    async update(  userStats: UserStatsUpdate ): Promise<UserStatsModel> {
         return this.repo.update(userStats)
     }
 
-    async delete(
-        userStats: UserStatsModel['id']
-    ): Promise<UserStatsModel>{
+    async delete( userStats: UserStatsModel['id'] ): Promise<UserStatsModel> {
         return this.repo.delete(userStats)
     }
+
+    async updateComments(user: UserStatsModel['id']): Promise<UserStatsModel>{
+        return this.repo.updateComments(user)
+    }
 }
\ No newline at end of file