@triskcraft/db 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/README.md +45 -0
  2. package/dist/generated/browser.d.ts +110 -0
  3. package/dist/generated/browser.d.ts.map +1 -0
  4. package/dist/generated/browser.js +18 -0
  5. package/dist/generated/browser.js.map +1 -0
  6. package/dist/generated/client.d.ts +129 -0
  7. package/dist/generated/client.d.ts.map +1 -0
  8. package/dist/generated/client.js +35 -0
  9. package/dist/generated/client.js.map +1 -0
  10. package/dist/generated/commonInputTypes.d.ts +501 -0
  11. package/dist/generated/commonInputTypes.d.ts.map +1 -0
  12. package/dist/generated/commonInputTypes.js +11 -0
  13. package/dist/generated/commonInputTypes.js.map +1 -0
  14. package/dist/generated/enums.d.ts +19 -0
  15. package/dist/generated/enums.d.ts.map +1 -0
  16. package/dist/generated/enums.js +25 -0
  17. package/dist/generated/enums.js.map +1 -0
  18. package/dist/generated/internal/class.d.ts +363 -0
  19. package/dist/generated/internal/class.d.ts.map +1 -0
  20. package/dist/generated/internal/class.js +52 -0
  21. package/dist/generated/internal/class.js.map +1 -0
  22. package/dist/generated/internal/prismaNamespace.d.ts +2282 -0
  23. package/dist/generated/internal/prismaNamespace.d.ts.map +1 -0
  24. package/dist/generated/internal/prismaNamespace.js +262 -0
  25. package/dist/generated/internal/prismaNamespace.js.map +1 -0
  26. package/dist/generated/internal/prismaNamespaceBrowser.d.ts +243 -0
  27. package/dist/generated/internal/prismaNamespaceBrowser.d.ts.map +1 -0
  28. package/dist/generated/internal/prismaNamespaceBrowser.js +233 -0
  29. package/dist/generated/internal/prismaNamespaceBrowser.js.map +1 -0
  30. package/dist/generated/models/AuthorizationCode.d.ts +1445 -0
  31. package/dist/generated/models/AuthorizationCode.d.ts.map +1 -0
  32. package/dist/generated/models/AuthorizationCode.js +2 -0
  33. package/dist/generated/models/AuthorizationCode.js.map +1 -0
  34. package/dist/generated/models/Client.d.ts +1301 -0
  35. package/dist/generated/models/Client.d.ts.map +1 -0
  36. package/dist/generated/models/Client.js +2 -0
  37. package/dist/generated/models/Client.js.map +1 -0
  38. package/dist/generated/models/DiscordUser.d.ts +1335 -0
  39. package/dist/generated/models/DiscordUser.d.ts.map +1 -0
  40. package/dist/generated/models/DiscordUser.js +2 -0
  41. package/dist/generated/models/DiscordUser.js.map +1 -0
  42. package/dist/generated/models/InactivityPeriod.d.ts +1255 -0
  43. package/dist/generated/models/InactivityPeriod.d.ts.map +1 -0
  44. package/dist/generated/models/InactivityPeriod.js +2 -0
  45. package/dist/generated/models/InactivityPeriod.js.map +1 -0
  46. package/dist/generated/models/LinkCode.d.ts +1100 -0
  47. package/dist/generated/models/LinkCode.d.ts.map +1 -0
  48. package/dist/generated/models/LinkCode.js +2 -0
  49. package/dist/generated/models/LinkCode.js.map +1 -0
  50. package/dist/generated/models/LinkedMinecraftRole.d.ts +1162 -0
  51. package/dist/generated/models/LinkedMinecraftRole.d.ts.map +1 -0
  52. package/dist/generated/models/LinkedMinecraftRole.js +2 -0
  53. package/dist/generated/models/LinkedMinecraftRole.js.map +1 -0
  54. package/dist/generated/models/LinkedRole.d.ts +1162 -0
  55. package/dist/generated/models/LinkedRole.d.ts.map +1 -0
  56. package/dist/generated/models/LinkedRole.js +2 -0
  57. package/dist/generated/models/LinkedRole.js.map +1 -0
  58. package/dist/generated/models/Media.d.ts +1146 -0
  59. package/dist/generated/models/Media.d.ts.map +1 -0
  60. package/dist/generated/models/Media.js +2 -0
  61. package/dist/generated/models/Media.js.map +1 -0
  62. package/dist/generated/models/MinecraftRole.d.ts +1064 -0
  63. package/dist/generated/models/MinecraftRole.d.ts.map +1 -0
  64. package/dist/generated/models/MinecraftRole.js +2 -0
  65. package/dist/generated/models/MinecraftRole.js.map +1 -0
  66. package/dist/generated/models/Player.d.ts +1458 -0
  67. package/dist/generated/models/Player.d.ts.map +1 -0
  68. package/dist/generated/models/Player.js +2 -0
  69. package/dist/generated/models/Player.js.map +1 -0
  70. package/dist/generated/models/Post.d.ts +1534 -0
  71. package/dist/generated/models/Post.d.ts.map +1 -0
  72. package/dist/generated/models/Post.js +2 -0
  73. package/dist/generated/models/Post.js.map +1 -0
  74. package/dist/generated/models/PostBlockMedia.d.ts +1243 -0
  75. package/dist/generated/models/PostBlockMedia.d.ts.map +1 -0
  76. package/dist/generated/models/PostBlockMedia.js +2 -0
  77. package/dist/generated/models/PostBlockMedia.js.map +1 -0
  78. package/dist/generated/models/PostBlocks.d.ts +1506 -0
  79. package/dist/generated/models/PostBlocks.d.ts.map +1 -0
  80. package/dist/generated/models/PostBlocks.js +2 -0
  81. package/dist/generated/models/PostBlocks.js.map +1 -0
  82. package/dist/generated/models/PostMedia.d.ts +1497 -0
  83. package/dist/generated/models/PostMedia.d.ts.map +1 -0
  84. package/dist/generated/models/PostMedia.js +2 -0
  85. package/dist/generated/models/PostMedia.js.map +1 -0
  86. package/dist/generated/models/Role.d.ts +1144 -0
  87. package/dist/generated/models/Role.d.ts.map +1 -0
  88. package/dist/generated/models/Role.js +2 -0
  89. package/dist/generated/models/Role.js.map +1 -0
  90. package/dist/generated/models/RoleStatistic.d.ts +1077 -0
  91. package/dist/generated/models/RoleStatistic.d.ts.map +1 -0
  92. package/dist/generated/models/RoleStatistic.js +2 -0
  93. package/dist/generated/models/RoleStatistic.js.map +1 -0
  94. package/dist/generated/models/Session.d.ts +1366 -0
  95. package/dist/generated/models/Session.d.ts.map +1 -0
  96. package/dist/generated/models/Session.js +2 -0
  97. package/dist/generated/models/Session.js.map +1 -0
  98. package/dist/generated/models/State.d.ts +970 -0
  99. package/dist/generated/models/State.d.ts.map +1 -0
  100. package/dist/generated/models/State.js +2 -0
  101. package/dist/generated/models/State.js.map +1 -0
  102. package/dist/generated/models/TrackedRole.d.ts +947 -0
  103. package/dist/generated/models/TrackedRole.d.ts.map +1 -0
  104. package/dist/generated/models/TrackedRole.js +2 -0
  105. package/dist/generated/models/TrackedRole.js.map +1 -0
  106. package/dist/generated/models/User.d.ts +1842 -0
  107. package/dist/generated/models/User.d.ts.map +1 -0
  108. package/dist/generated/models/User.js +2 -0
  109. package/dist/generated/models/User.js.map +1 -0
  110. package/dist/generated/models/WebhookToken.d.ts +1219 -0
  111. package/dist/generated/models/WebhookToken.d.ts.map +1 -0
  112. package/dist/generated/models/WebhookToken.js +2 -0
  113. package/dist/generated/models/WebhookToken.js.map +1 -0
  114. package/dist/generated/models.d.ts +23 -0
  115. package/dist/generated/models.d.ts.map +1 -0
  116. package/dist/generated/models.js +2 -0
  117. package/dist/generated/models.js.map +1 -0
  118. package/dist/index.d.ts +6 -0
  119. package/dist/index.d.ts.map +1 -0
  120. package/dist/index.js +15 -0
  121. package/dist/index.js.map +1 -0
  122. package/package.json +50 -0
  123. package/prisma/migrations/20251231000230_init/migration.sql +156 -0
  124. package/prisma/migrations/20251231011118_add_rank/migration.sql +2 -0
  125. package/prisma/migrations/20251231014040_discord_code/migration.sql +2 -0
  126. package/prisma/migrations/20260107232913_webhook_tokens/migration.sql +13 -0
  127. package/prisma/migrations/20260108014222_token_name/migration.sql +8 -0
  128. package/prisma/migrations/20260120042444_states/migration.sql +13 -0
  129. package/prisma/migrations/20260120052250_at/migration.sql +10 -0
  130. package/prisma/migrations/20260120061112_uq_token/migration.sql +8 -0
  131. package/prisma/migrations/20260121013517_uq_nick/migration.sql +8 -0
  132. package/prisma/migrations/20260125034645_mc_rank/migration.sql +2 -0
  133. package/prisma/migrations/20260202222436_remove_rank_from_discord/migration.sql +8 -0
  134. package/prisma/migrations/20260202234919_discord_user_username/migration.sql +2 -0
  135. package/prisma/migrations/20260202235832_uq_discord_username/migration.sql +12 -0
  136. package/prisma/migrations/20260301230127_blog/migration.sql +45 -0
  137. package/prisma/migrations/20260308062159_player_status/migration.sql +5 -0
  138. package/prisma/migrations/20260314152500_last_seen/migration.sql +2 -0
  139. package/prisma/migrations/20260430073735_oauth_prepare/migration.sql +102 -0
  140. package/prisma/migrations/20260603052836_scopes/migration.sql +11 -0
  141. package/prisma/migrations/20260603055719_scopes_sesion/migration.sql +2 -0
  142. package/prisma/migrations/20260603201228_user_roles/migration.sql +38 -0
  143. package/prisma/migrations/20260608060633_blog_media/migration.sql +61 -0
  144. package/prisma/migrations/20260612000040_prepare_post_users/migration.sql +5 -0
  145. package/prisma/migrations/20260612165923_prepare_webhook_user/migration.sql +53 -0
  146. package/prisma/migrations/20260612210328_remove_webhook_discord_user/migration.sql +19 -0
  147. package/prisma/migrations/migration_lock.toml +3 -0
  148. package/prisma/schema.prisma +325 -0
@@ -0,0 +1,11 @@
1
+ /*
2
+ Warnings:
3
+
4
+ - Added the required column `scope` to the `authorization_codes` table without a default value. This is not possible if the table is not empty.
5
+
6
+ */
7
+ -- AlterTable
8
+ ALTER TABLE "authorization_codes" ADD COLUMN "scope" TEXT NOT NULL;
9
+
10
+ -- AlterTable
11
+ ALTER TABLE "clients" ADD COLUMN "scopes" TEXT[];
@@ -0,0 +1,2 @@
1
+ -- AlterTable
2
+ ALTER TABLE "sessions" ADD COLUMN "scope" TEXT NOT NULL DEFAULT '';
@@ -0,0 +1,38 @@
1
+ /*
2
+ Warnings:
3
+
4
+ - You are about to drop the column `rank` on the `minecraft_users` table. All the data in the column will be lost.
5
+ - You are about to drop the column `rank` on the `users` table. All the data in the column will be lost.
6
+
7
+ */
8
+ -- AlterTable
9
+ ALTER TABLE "minecraft_users" DROP COLUMN "rank";
10
+
11
+ -- AlterTable
12
+ ALTER TABLE "users" DROP COLUMN "rank";
13
+
14
+ -- CreateTable
15
+ CREATE TABLE "user_roles" (
16
+ "id" TEXT NOT NULL DEFAULT snowflake(),
17
+ "name" TEXT NOT NULL,
18
+ "permissions" BIGINT NOT NULL DEFAULT 0,
19
+
20
+ CONSTRAINT "user_roles_pkey" PRIMARY KEY ("id")
21
+ );
22
+
23
+ -- CreateTable
24
+ CREATE TABLE "linked_user_roles" (
25
+ "user_id" TEXT NOT NULL,
26
+ "role_id" TEXT NOT NULL,
27
+
28
+ CONSTRAINT "linked_user_roles_pkey" PRIMARY KEY ("user_id","role_id")
29
+ );
30
+
31
+ -- CreateIndex
32
+ CREATE UNIQUE INDEX "user_roles_name_key" ON "user_roles"("name");
33
+
34
+ -- AddForeignKey
35
+ ALTER TABLE "linked_user_roles" ADD CONSTRAINT "linked_user_roles_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
36
+
37
+ -- AddForeignKey
38
+ ALTER TABLE "linked_user_roles" ADD CONSTRAINT "linked_user_roles_role_id_fkey" FOREIGN KEY ("role_id") REFERENCES "user_roles"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
@@ -0,0 +1,61 @@
1
+ /*
2
+ Warnings:
3
+
4
+ - You are about to drop the column `attachments` on the `post_blocks` table. All the data in the column will be lost.
5
+ - A unique constraint covering the columns `[cover_media_id]` on the table `posts` will be added. If there are existing duplicate values, this will fail.
6
+
7
+ */
8
+ -- CreateEnum
9
+ CREATE TYPE "POST_BLOCK_MEDIA_TYPE" AS ENUM ('IMAGE', 'VIDEO', 'AUDIO', 'FILE');
10
+
11
+ -- AlterTable
12
+ ALTER TABLE "post_blocks" DROP COLUMN "attachments";
13
+
14
+ -- AlterTable
15
+ ALTER TABLE "posts" ADD COLUMN "cover_media_id" TEXT;
16
+
17
+ -- CreateTable
18
+ CREATE TABLE "post_media" (
19
+ "id" TEXT NOT NULL DEFAULT snowflake(),
20
+ "filename" TEXT NOT NULL,
21
+ "url" TEXT NOT NULL,
22
+ "content_type" TEXT,
23
+ "media_type" "POST_BLOCK_MEDIA_TYPE" NOT NULL,
24
+ "size" INTEGER NOT NULL,
25
+ "width" INTEGER,
26
+ "height" INTEGER,
27
+ "description" TEXT,
28
+ "hash" TEXT,
29
+
30
+ CONSTRAINT "post_media_pkey" PRIMARY KEY ("id")
31
+ );
32
+
33
+ -- CreateTable
34
+ CREATE TABLE "post_block_media" (
35
+ "post_block_message_id" TEXT NOT NULL,
36
+ "media_id" TEXT NOT NULL,
37
+ "position" INTEGER NOT NULL DEFAULT 0,
38
+
39
+ CONSTRAINT "post_block_media_pkey" PRIMARY KEY ("post_block_message_id","media_id","position")
40
+ );
41
+
42
+ -- CreateIndex
43
+ CREATE INDEX "post_media_hash_idx" ON "post_media"("hash");
44
+
45
+ -- CreateIndex
46
+ CREATE INDEX "post_media_media_type_idx" ON "post_media"("media_type");
47
+
48
+ -- CreateIndex
49
+ CREATE INDEX "post_block_media_media_id_idx" ON "post_block_media"("media_id");
50
+
51
+ -- CreateIndex
52
+ CREATE UNIQUE INDEX "posts_cover_media_id_key" ON "posts"("cover_media_id");
53
+
54
+ -- AddForeignKey
55
+ ALTER TABLE "posts" ADD CONSTRAINT "posts_cover_media_id_fkey" FOREIGN KEY ("cover_media_id") REFERENCES "post_media"("id") ON DELETE SET NULL ON UPDATE CASCADE;
56
+
57
+ -- AddForeignKey
58
+ ALTER TABLE "post_block_media" ADD CONSTRAINT "post_block_media_post_block_message_id_fkey" FOREIGN KEY ("post_block_message_id") REFERENCES "post_blocks"("message_id") ON DELETE CASCADE ON UPDATE CASCADE;
59
+
60
+ -- AddForeignKey
61
+ ALTER TABLE "post_block_media" ADD CONSTRAINT "post_block_media_media_id_fkey" FOREIGN KEY ("media_id") REFERENCES "post_media"("id") ON DELETE CASCADE ON UPDATE CASCADE;
@@ -0,0 +1,5 @@
1
+ -- AlterTable
2
+ ALTER TABLE "posts" ADD COLUMN "user_id" TEXT;
3
+
4
+ -- AddForeignKey
5
+ ALTER TABLE "posts" ADD CONSTRAINT "posts_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
@@ -0,0 +1,53 @@
1
+ -- AlterTable
2
+ ALTER TABLE "webhook_tokens" ADD COLUMN "user_id" TEXT;
3
+
4
+ -- Create missing application users before moving existing relations.
5
+ INSERT INTO "users" ("discord_user_id", "created_at", "updated_at")
6
+ SELECT "id", CURRENT_TIMESTAMP, CURRENT_TIMESTAMP
7
+ FROM "discord_users"
8
+ ON CONFLICT ("discord_user_id") DO NOTHING;
9
+
10
+ -- Link application users to their existing Minecraft players.
11
+ UPDATE "users" AS "user"
12
+ SET
13
+ "mc_player_uuid" = "player"."uuid",
14
+ "updated_at" = CURRENT_TIMESTAMP
15
+ FROM "minecraft_users" AS "player"
16
+ WHERE
17
+ "user"."discord_user_id" = "player"."discord_user_id"
18
+ AND "user"."mc_player_uuid" IS DISTINCT FROM "player"."uuid";
19
+
20
+ -- Move post ownership to application users.
21
+ UPDATE "posts" AS "post"
22
+ SET "user_id" = "user"."id"
23
+ FROM "users" AS "user"
24
+ WHERE "user"."discord_user_id" = "post"."discord_user_id";
25
+
26
+ -- Associate existing webhook tokens with their application users.
27
+ UPDATE "webhook_tokens" AS "token"
28
+ SET "user_id" = "user"."id"
29
+ FROM "users" AS "user"
30
+ WHERE "user"."discord_user_id" = "token"."discord_user_id";
31
+
32
+ -- DropForeignKey
33
+ ALTER TABLE "minecraft_users" DROP CONSTRAINT "minecraft_users_discord_user_id_fkey";
34
+
35
+ -- DropForeignKey
36
+ ALTER TABLE "posts" DROP CONSTRAINT "posts_discord_user_id_fkey";
37
+
38
+ -- DropForeignKey
39
+ ALTER TABLE "posts" DROP CONSTRAINT "posts_minecraft_player_uuid_fkey";
40
+
41
+ -- DropIndex
42
+ DROP INDEX "minecraft_users_discord_user_id_key";
43
+
44
+ -- AlterTable
45
+ ALTER TABLE "minecraft_users" DROP COLUMN "discord_user_id";
46
+
47
+ -- AlterTable
48
+ ALTER TABLE "posts" DROP COLUMN "discord_user_id",
49
+ DROP COLUMN "minecraft_player_uuid",
50
+ ALTER COLUMN "user_id" SET NOT NULL;
51
+
52
+ -- AddForeignKey
53
+ ALTER TABLE "webhook_tokens" ADD CONSTRAINT "webhook_tokens_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE;
@@ -0,0 +1,19 @@
1
+ /*
2
+ Warnings:
3
+
4
+ - You are about to drop the column `discord_user_id` on the `webhook_tokens` table. All the data in the column will be lost.
5
+ - Made the column `user_id` on table `webhook_tokens` required. This step will fail if there are existing NULL values in that column.
6
+
7
+ */
8
+ -- DropForeignKey
9
+ ALTER TABLE "webhook_tokens" DROP CONSTRAINT "webhook_tokens_discord_user_id_fkey";
10
+
11
+ -- DropForeignKey
12
+ ALTER TABLE "webhook_tokens" DROP CONSTRAINT "webhook_tokens_user_id_fkey";
13
+
14
+ -- AlterTable
15
+ ALTER TABLE "webhook_tokens" DROP COLUMN "discord_user_id",
16
+ ALTER COLUMN "user_id" SET NOT NULL;
17
+
18
+ -- AddForeignKey
19
+ ALTER TABLE "webhook_tokens" ADD CONSTRAINT "webhook_tokens_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
@@ -0,0 +1,3 @@
1
+ # Please do not edit this file manually
2
+ # It should be added in your version-control system (e.g., Git)
3
+ provider = "postgresql"
@@ -0,0 +1,325 @@
1
+ datasource db {
2
+ provider = "postgresql"
3
+ }
4
+
5
+ /// Configuración del cliente de Prisma orientado a TypeScript con soporte
6
+ /// para ESM y rutas generadas bajo `src/prisma/generated`.
7
+ generator client {
8
+ provider = "prisma-client"
9
+ engineType = "client"
10
+ output = "../src/generated"
11
+ runtime = "nodejs"
12
+ moduleFormat = "esm"
13
+ generatedFileExtension = "ts"
14
+ importFileExtension = "ts"
15
+ previewFeatures = ["typedSql"]
16
+ }
17
+
18
+ /// Periodo de inactividad declarado por un usuario de Discord.
19
+ model InactivityPeriod {
20
+ user_id String @id
21
+ guild_id String
22
+ role_snapshot String
23
+ started_at DateTime @default(now())
24
+ ends_at DateTime
25
+ source String
26
+ notified Boolean @default(false)
27
+
28
+ discord_user DiscordUser @relation(fields: [user_id], references: [id])
29
+
30
+ @@map("inactivity_periods")
31
+ }
32
+
33
+ /// Rol monitoreado dentro de un servidor de Discord.
34
+ model TrackedRole {
35
+ guild_id String
36
+ role_id String
37
+ created_at DateTime @default(now())
38
+
39
+ @@id([guild_id, role_id])
40
+ @@map("tracked_roles")
41
+ }
42
+
43
+ /// Instantáneas de actividad/inactividad por rol para graficar tendencias.
44
+ model RoleStatistic {
45
+ id String @id @default(dbgenerated("snowflake()"))
46
+ guild_id String
47
+ role_id String
48
+ inactive_count Int @default(0)
49
+ active_count Int @default(0)
50
+ captured_at DateTime @default(now())
51
+
52
+ @@map("role_statistics")
53
+ }
54
+
55
+ /// Código temporal utilizado para vincular cuentas externas con Discord.
56
+ model LinkCode {
57
+ id String @id @default(dbgenerated("snowflake()"))
58
+ discord_id String @unique
59
+ discord_nickname String
60
+ code String @unique
61
+
62
+ discord_user DiscordUser @relation(fields: [discord_id], references: [id])
63
+
64
+ @@map("link_codes")
65
+ }
66
+
67
+ /// Catálogo de roles disponibles para usuarios de Minecraft.
68
+ model MinecraftRole {
69
+ id String @id @default(dbgenerated("snowflake()"))
70
+ name String @unique
71
+
72
+ linked_roles LinkedMinecraftRole[]
73
+
74
+ @@map("roles")
75
+ }
76
+
77
+ /// Relación N:M entre usuarios de Minecraft y los roles asignados.
78
+ model LinkedMinecraftRole {
79
+ mc_user_uuid String
80
+ role_id String
81
+
82
+ role MinecraftRole @relation(fields: [role_id], references: [id])
83
+ player Player @relation(fields: [mc_user_uuid], references: [uuid])
84
+
85
+ @@id([mc_user_uuid, role_id])
86
+ @@map("linked_roles")
87
+ }
88
+
89
+ /// Medios o enlaces externos asociados a cada jugador de Minecraft.
90
+ model Media {
91
+ id String @id @default(dbgenerated("snowflake()"))
92
+ mc_user_uuid String
93
+ type String
94
+ url String
95
+
96
+ player Player @relation(fields: [mc_user_uuid], references: [uuid])
97
+
98
+ @@unique([mc_user_uuid, type])
99
+ @@map("medias")
100
+ }
101
+
102
+ enum PLAYER_STATUS {
103
+ ACTIVE
104
+ DELETED
105
+ }
106
+
107
+ /// Información de jugador de Minecraft enlazada con su usuario de Discord.
108
+ model Player {
109
+ /// El uuid del jugador en formato UUID
110
+ uuid String @id
111
+ nickname String @unique
112
+ digs Int @default(0)
113
+ description String @default("")
114
+ status PLAYER_STATUS @default(ACTIVE)
115
+ /// La ultima vez que entró
116
+ last_seen DateTime?
117
+
118
+ linked_roles LinkedMinecraftRole[]
119
+ medias Media[]
120
+ user User?
121
+
122
+ @@map("minecraft_users")
123
+ }
124
+
125
+ /// Representa a un usuario de Discord, incluyendo su rango y relaciones.
126
+ model DiscordUser {
127
+ id String @id
128
+ username String @unique
129
+
130
+ inactivity_periods InactivityPeriod[]
131
+ link_code LinkCode?
132
+ post_blocks PostBlocks[]
133
+ user User?
134
+
135
+ @@map("discord_users")
136
+ }
137
+
138
+ model WebhookToken {
139
+ id String @id @default(dbgenerated("snowflake()"))
140
+ name String @unique
141
+ user_id String
142
+ secret String
143
+ permissions String[]
144
+ created_at DateTime @default(now())
145
+
146
+ user User @relation(fields: [user_id], references: [id])
147
+
148
+ @@map("webhook_tokens")
149
+ }
150
+
151
+ model State {
152
+ id String @id @default(dbgenerated("snowflake()"))
153
+ key String @unique
154
+ value String
155
+ updated_at DateTime @updatedAt
156
+
157
+ @@map("states")
158
+ }
159
+
160
+ enum POST_STATUS {
161
+ DRAFT
162
+ PUBLISHED
163
+ OUTDATED
164
+ }
165
+
166
+ model Post {
167
+ id String @id @default(dbgenerated("snowflake()"))
168
+ title String @unique
169
+ user_id String
170
+ thread_id String
171
+ status POST_STATUS @default(DRAFT)
172
+ cover_media_id String? @unique
173
+ created_at DateTime @default(now())
174
+ updated_at DateTime @updatedAt
175
+
176
+ user User @relation(fields: [user_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
177
+ post_blocks PostBlocks[]
178
+ cover_media PostMedia? @relation("PostCoverMedia", fields: [cover_media_id], references: [id], onDelete: SetNull, onUpdate: Cascade)
179
+
180
+ @@map("posts")
181
+ }
182
+
183
+ model PostBlocks {
184
+ message_id String @id
185
+ post_id String
186
+ timestamp DateTime
187
+ content String?
188
+ components Json[] @default([])
189
+ embeds Json[] @default([])
190
+ author_id String
191
+
192
+ author DiscordUser @relation(fields: [author_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
193
+ post Post @relation(fields: [post_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
194
+ media PostBlockMedia[]
195
+
196
+ @@map("post_blocks")
197
+ }
198
+
199
+ enum POST_BLOCK_MEDIA_TYPE {
200
+ IMAGE
201
+ VIDEO
202
+ AUDIO
203
+ FILE
204
+ }
205
+
206
+ model PostMedia {
207
+ id String @id @default(dbgenerated("snowflake()"))
208
+ filename String
209
+ url String
210
+ content_type String?
211
+ media_type POST_BLOCK_MEDIA_TYPE
212
+ size Int
213
+ width Int?
214
+ height Int?
215
+ description String?
216
+ hash String?
217
+
218
+ post_blocks PostBlockMedia[]
219
+ cover_for_post Post? @relation("PostCoverMedia")
220
+
221
+ @@index([hash])
222
+ @@index([media_type])
223
+ @@map("post_media")
224
+ }
225
+
226
+ model PostBlockMedia {
227
+ post_block_message_id String
228
+ media_id String
229
+ position Int @default(0)
230
+
231
+ post_block PostBlocks @relation(fields: [post_block_message_id], references: [message_id], onDelete: Cascade, onUpdate: Cascade)
232
+ media PostMedia @relation(fields: [media_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
233
+
234
+ @@id([post_block_message_id, media_id, position])
235
+ @@index([media_id])
236
+ @@map("post_block_media")
237
+ }
238
+
239
+ model User {
240
+ id String @id @default(dbgenerated("snowflake()"))
241
+ mc_player_uuid String? @unique
242
+ discord_user_id String @unique
243
+ created_at DateTime @default(now())
244
+ updated_at DateTime @updatedAt
245
+
246
+ mc_player Player? @relation(fields: [mc_player_uuid], references: [uuid], onDelete: SetNull, onUpdate: Cascade)
247
+ discord_user DiscordUser @relation(fields: [discord_user_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
248
+
249
+ authorization_codes AuthorizationCode[]
250
+ sessions Session[]
251
+ linked_roles LinkedRole[]
252
+ posts Post[]
253
+ webhook_tokens WebhookToken[]
254
+
255
+ @@map("users")
256
+ }
257
+
258
+ model Client {
259
+ id String @id
260
+ client_secret String?
261
+ redirect_uris String[]
262
+ created_at DateTime @default(now())
263
+ updated_at DateTime @updatedAt
264
+ scopes String[]
265
+
266
+ authorization_codes AuthorizationCode[]
267
+ sessions Session[]
268
+
269
+ @@map("clients")
270
+ }
271
+
272
+ model AuthorizationCode {
273
+ id String @id @default(dbgenerated("snowflake()"))
274
+ code String @unique
275
+ user_id String
276
+ client_id String
277
+ redirect_uri String
278
+ code_challenge String
279
+ expires_at DateTime
280
+ created_at DateTime @default(now())
281
+ scope String
282
+
283
+ user User @relation(fields: [user_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
284
+ client Client @relation(fields: [client_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
285
+
286
+ @@map("authorization_codes")
287
+ }
288
+
289
+ model Session {
290
+ id String @id @default(dbgenerated("snowflake()"))
291
+ user_id String
292
+ /// Hashed
293
+ refresh_token String @unique
294
+ client_id String
295
+ scope String @default("")
296
+ expires_at DateTime
297
+ created_at DateTime @default(now())
298
+
299
+ user User @relation(fields: [user_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
300
+ client Client @relation(fields: [client_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
301
+
302
+ @@map("sessions")
303
+ }
304
+
305
+ model Role {
306
+ id String @id @default(dbgenerated("snowflake()"))
307
+ name String @unique
308
+ /// permisos como Bit Flags
309
+ permissions BigInt @default(0)
310
+
311
+ linked_roles LinkedRole[]
312
+
313
+ @@map("user_roles")
314
+ }
315
+
316
+ model LinkedRole {
317
+ user_id String
318
+ role_id String
319
+
320
+ user User @relation(fields: [user_id], references: [id])
321
+ role Role @relation(fields: [role_id], references: [id])
322
+
323
+ @@id([user_id, role_id])
324
+ @@map("linked_user_roles")
325
+ }