From 871861e66e6916ed9b9b3dbd81d8cb74c50eb8bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Pons?= Date: Tue, 29 Apr 2025 17:48:49 +0200 Subject: [PATCH] Add public characters and visibility flag --- db.sqlite | Bin 614400 -> 614400 bytes db.sqlite-shm | Bin 32768 -> 32768 bytes db.sqlite-wal | Bin 119512 -> 74192 bytes db/schema.ts | 1 + drizzle/0009_thin_omega_sentinel.sql | 1 + drizzle/meta/0009_snapshot.json | 434 +++++++++++++++++++++++++++ drizzle/meta/_journal.json | 7 + layouts/default.vue | 6 +- pages/character/[id]/edit.client.vue | 17 +- pages/character/index.client.vue | 97 +++--- pages/character/list.client.vue | 27 ++ server/api/auth/register.post.ts | 4 +- server/api/character.get.ts | 83 ++++- server/api/character/[id].get.ts | 3 +- types/character.ts | 3 +- 15 files changed, 623 insertions(+), 60 deletions(-) create mode 100644 drizzle/0009_thin_omega_sentinel.sql create mode 100644 drizzle/meta/0009_snapshot.json create mode 100644 pages/character/list.client.vue diff --git a/db.sqlite b/db.sqlite index 4d0ba03a4585f085c155bb11bf12d20a7d328c15..73ade66b823e509dd63cfa0ef7c117664a0bdd0f 100644 GIT binary patch delta 450 zcmZoTpxSUib%L~@3IhYfG$1YqVs0RonW$sTqr#xqrpe2#${@%rH8ER>QEFpf4-;2Y zi3Gd2ygXy8`Q#wxm&ytWWtqj9NtrpBC6x&ZC8-r93NEg0j-fsw3hD(#nPrJ3shbU0 zu5e3m@%&@p-^`!JFUfa?ub$6{_bKlTUT>a%n-v8f@%Vaku`)FBvKkwi87CX0rX(At zC8i{qCYxF$TNtL87$uq|nk6ThTc(*B0C94nsbPwRrHQdciltdvs)dQUfl+E&a+;lp%kE^7;Nm~e!2gH;JO3yCxBM^oAM@YizsY}v|NLe}h3))|T$``xKi6Xx z_>wYtUz`rplYq@{;sg{y{LTOCzsfUmH-DYK{p);2kq7J!Z0-E!Oe=s6oxvp99>dMa zV9D86${;B1oL`Wcs*sYZu)VCC=^!&_buHA#+uPfi7BewQZrAQ)5@q6PFJa?kPzUJ= zmWC+Rs#eNKP0T6DP_i<$&{4`w%u58ajCGU}i*oael&lO*4Pa)qoA)yTF*6Xe05K~N OvjH*tcJqFYlNSK`)Q=ee delta 349 zcmZoTpxSUib%L~@G6Ms{G$1YqVs0Roo~UEYqs*Y!rpe2#${@(>F)>?-(PLv@57Xph z%t~ThoNoR>uAc6G3f`_wZW8R`^74!=(UVn}Uv9Q$Ims=?$?MI)znMRcUy|<(Up=1@ z?^E6xyxyA?6%2Vdd&}-*6655*!odHB|2zLD{9P6dH*o@r%sfEG|N5`;j9krM=WqWypHbuidk$MWzd6&X&58oMn1tJ{ zxY!viIs4ohobwAZQx#HD6}B68GHEh0T27DdVp5%++{Pp|J*l5bW%|-CCb{V!TA0+P zyS6h)On=$M6g>Sw4-?CF>t?1*M#kFh?QKkpnHXKSYj-k*NpNEWB(C91L6xJPdpc0t`Yx;s5FYnp`y9 delta 254 zcmZo@U}|V!s+V}A%K!qhK+MR%AONDL0kQPKZLelOt^fM5=yh4}Y3JHwPd^+tf2LPS zs(PSNU;r}rKN5fnPpp?@)STFBt*QwWU;|wcGcqs(RdO(JG4L?( zF$gdSF^DoqGRSPa_>^_>hj12Qb_PxcZU$Zkeg;7XVFobvNDJ;h%-nq KNN>F8$qE1pPC>>1 diff --git a/db.sqlite-wal b/db.sqlite-wal index ac14c9dd186ae4d88ee0a51e5cd2a30eb177f934..4d15251a35618c8d65826f0d0aadcfb1ae233abe 100644 GIT binary patch delta 633 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 D)A1a@ diff --git a/db/schema.ts b/db/schema.ts index 8ae7185..0ddf7b5 100644 --- a/db/schema.ts +++ b/db/schema.ts @@ -59,6 +59,7 @@ export const characterTable = sqliteTable("character", { owner: int().notNull().references(() => usersTable.id, { onDelete: 'cascade', onUpdate: 'cascade' }), progress: text({ mode: 'json' }).notNull(), values: text({ mode: 'json' }).notNull().default({}), + visibility: text({ enum: ['private', 'public'] }).notNull().default('private'), thumbnail: blob(), }) diff --git a/drizzle/0009_thin_omega_sentinel.sql b/drizzle/0009_thin_omega_sentinel.sql new file mode 100644 index 0000000..2b25323 --- /dev/null +++ b/drizzle/0009_thin_omega_sentinel.sql @@ -0,0 +1 @@ +ALTER TABLE `character` ADD `visibility` text DEFAULT 'private' NOT NULL; \ No newline at end of file diff --git a/drizzle/meta/0009_snapshot.json b/drizzle/meta/0009_snapshot.json new file mode 100644 index 0000000..c0ead7e --- /dev/null +++ b/drizzle/meta/0009_snapshot.json @@ -0,0 +1,434 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "bffde16c-d716-40ec-9d92-cb49814815d7", + "prevId": "eb68cf2f-c7e2-4111-910d-a26b0fc438cc", + "tables": { + "character": { + "name": "character", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "owner": { + "name": "owner", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "progress": { + "name": "progress", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "values": { + "name": "values", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'{}'" + }, + "visibility": { + "name": "visibility", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'private'" + }, + "thumbnail": { + "name": "thumbnail", + "type": "blob", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "character_owner_users_id_fk": { + "name": "character_owner_users_id_fk", + "tableFrom": "character", + "tableTo": "users", + "columnsFrom": [ + "owner" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "email_validation": { + "name": "email_validation", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "timestamp": { + "name": "timestamp", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "explorer_content": { + "name": "explorer_content", + "columns": { + "path": { + "name": "path", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "owner": { + "name": "owner", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content": { + "name": "content", + "type": "blob", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "navigable": { + "name": "navigable", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "private": { + "name": "private", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "visit": { + "name": "visit", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "timestamp": { + "name": "timestamp", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "explorer_content_owner_users_id_fk": { + "name": "explorer_content_owner_users_id_fk", + "tableFrom": "explorer_content", + "tableTo": "users", + "columnsFrom": [ + "owner" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "user_permissions": { + "name": "user_permissions", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission": { + "name": "permission", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "user_permissions_id_users_id_fk": { + "name": "user_permissions_id_users_id_fk", + "tableFrom": "user_permissions", + "tableTo": "users", + "columnsFrom": [ + "id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "user_permissions_id_permission_pk": { + "columns": [ + "id", + "permission" + ], + "name": "user_permissions_id_permission_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "user_sessions": { + "name": "user_sessions", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "timestamp": { + "name": "timestamp", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "user_sessions_user_id_users_id_fk": { + "name": "user_sessions_user_id_users_id_fk", + "tableFrom": "user_sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "user_sessions_id_user_id_pk": { + "columns": [ + "id", + "user_id" + ], + "name": "user_sessions_id_user_id_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "users_data": { + "name": "users_data", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "signin": { + "name": "signin", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "lastTimestamp": { + "name": "lastTimestamp", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "logCount": { + "name": "logCount", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": {}, + "foreignKeys": { + "users_data_id_users_id_fk": { + "name": "users_data_id_users_id_fk", + "tableFrom": "users_data", + "tableTo": "users", + "columnsFrom": [ + "id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "users": { + "name": "users", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "state": { + "name": "state", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "users_username_unique": { + "name": "users_username_unique", + "columns": [ + "username" + ], + "isUnique": true + }, + "users_email_unique": { + "name": "users_email_unique", + "columns": [ + "email" + ], + "isUnique": true + }, + "users_hash_unique": { + "name": "users_hash_unique", + "columns": [ + "hash" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "views": {}, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index 9d1f110..a1e2b07 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -64,6 +64,13 @@ "when": 1745675022171, "tag": "0008_glorious_johnny_blaze", "breakpoints": true + }, + { + "idx": 9, + "version": "6", + "when": 1745920443528, + "tag": "0009_thin_omega_sentinel", + "breakpoints": true } ] } \ No newline at end of file diff --git a/layouts/default.vue b/layouts/default.vue index 549af63..dd009e7 100644 --- a/layouts/default.vue +++ b/layouts/default.vue @@ -15,8 +15,7 @@
- Parcourir les projets - Créer du contenu + Mes personnages