mirror of
https://github.com/ArthurDanjou/arthome.git
synced 2026-01-24 16:40:27 +01:00
Working
This commit is contained in:
@@ -8,12 +8,7 @@ export default defineEventHandler(async (event) => {
|
||||
const body = await useValidatedBody(event, UpdateCategorySchema)
|
||||
await useDrizzle()
|
||||
.update(tables.categories)
|
||||
.set({
|
||||
name: body.name,
|
||||
icon: body.icon,
|
||||
color: body.color,
|
||||
nameVisible: body.nameVisible,
|
||||
})
|
||||
.set(body)
|
||||
.where(
|
||||
and(
|
||||
eq(tables.categories.id, id),
|
||||
|
||||
@@ -6,11 +6,8 @@ export default defineEventHandler(async (event) => {
|
||||
const user = await getUserSession(event)
|
||||
const body = await useValidatedBody(event, CreateCategorySchema)
|
||||
await useDrizzle().insert(tables.categories).values({
|
||||
name: body.name,
|
||||
icon: body.icon,
|
||||
color: body.color,
|
||||
nameVisible: body.nameVisible,
|
||||
userId: user.id,
|
||||
...body,
|
||||
})
|
||||
return { statusCode: 200 }
|
||||
}
|
||||
|
||||
@@ -7,13 +7,7 @@ export default defineEventHandler(async (event) => {
|
||||
const body = await useValidatedBody(event, UpdateTabSchema)
|
||||
await useDrizzle()
|
||||
.update(tables.tabs)
|
||||
.set({
|
||||
name: body.name,
|
||||
icon: body.icon,
|
||||
color: body.color,
|
||||
primary: body.primary,
|
||||
link: body.link,
|
||||
})
|
||||
.set(body)
|
||||
.where(
|
||||
and(
|
||||
eq(tables.tabs.id, id),
|
||||
|
||||
@@ -4,14 +4,7 @@ import { CreateTabSchema } from '~~/types/types'
|
||||
export default defineEventHandler(async (event) => {
|
||||
try {
|
||||
const body = await useValidatedBody(event, CreateTabSchema)
|
||||
await useDrizzle().insert(tables.tabs).values({
|
||||
name: body.name,
|
||||
icon: body.icon,
|
||||
color: body.color,
|
||||
nameVisible: body.nameVisible,
|
||||
categoryId: body.categoryId,
|
||||
link: body.link,
|
||||
})
|
||||
await useDrizzle().insert(tables.tabs).values(body)
|
||||
return { statusCode: 200 }
|
||||
}
|
||||
catch (err) {
|
||||
|
||||
19
server/api/users/[username].get.ts
Normal file
19
server/api/users/[username].get.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
export default defineEventHandler(async (event) => {
|
||||
const { username } = await getRouterParams(event)
|
||||
const user = await useDrizzle()
|
||||
.query
|
||||
.users
|
||||
.findFirst({
|
||||
where: eq(tables.users.username, username.toLowerCase()),
|
||||
with: {
|
||||
categories: {
|
||||
with: {
|
||||
tabs: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
return user || {
|
||||
message: 'User not found',
|
||||
}
|
||||
})
|
||||
24
server/api/users/avatars/index.delete.ts
Normal file
24
server/api/users/avatars/index.delete.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
export default defineEventHandler(async (event) => {
|
||||
const { user, session } = await requireUserSession(event)
|
||||
|
||||
if (!user.avatar) {
|
||||
return sendNoContent(event, 204)
|
||||
}
|
||||
|
||||
await deleteProfilePicture(user.avatar)
|
||||
|
||||
const updatedUser = {
|
||||
...user,
|
||||
avatar: null,
|
||||
}
|
||||
await updateUser(user.id, { avatar: updatedUser.avatar })
|
||||
await replaceUserSession(event, {
|
||||
id: user.id,
|
||||
user: updatedUser,
|
||||
})
|
||||
|
||||
return {
|
||||
statusCode: 204,
|
||||
message: 'Avatar deleted',
|
||||
}
|
||||
})
|
||||
40
server/api/users/avatars/index.post.ts
Normal file
40
server/api/users/avatars/index.post.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
import { randomUUID } from 'uncrypto'
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const { user } = await requireUserSession(event)
|
||||
|
||||
const form = await readFormData(event)
|
||||
const file = form.get('file') as File
|
||||
|
||||
if (!file || !file.size) {
|
||||
throw createError({ statusCode: 400, message: 'No file provided' })
|
||||
}
|
||||
|
||||
ensureBlob(file, {
|
||||
maxSize: '1MB',
|
||||
types: ['image'],
|
||||
})
|
||||
|
||||
if (user.avatar) {
|
||||
await deleteProfilePicture(user.avatar)
|
||||
}
|
||||
|
||||
const filename = randomUUID()
|
||||
|
||||
const avatar = await hubBlob().put(filename, file, {
|
||||
addRandomSuffix: false,
|
||||
prefix: 'avatars/',
|
||||
})
|
||||
|
||||
const updatedUser = {
|
||||
...user,
|
||||
avatar: avatar.pathname,
|
||||
}
|
||||
await updateUser(user.id, { avatar: updatedUser.avatar })
|
||||
await replaceUserSession(event, {
|
||||
id: user.id,
|
||||
user: updatedUser,
|
||||
})
|
||||
|
||||
return sendNoContent(event, 204)
|
||||
})
|
||||
13
server/api/users/limits.get.ts
Normal file
13
server/api/users/limits.get.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
export default defineEventHandler(async (event) => {
|
||||
const user = await requireUserSession(event)
|
||||
return useDrizzle().query.users.findFirst({
|
||||
where: eq(tables.users.id, user.id),
|
||||
with: {
|
||||
categories: {
|
||||
with: {
|
||||
tabs: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
})
|
||||
17
server/api/users/me.put.ts
Normal file
17
server/api/users/me.put.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
import { useValidatedBody } from 'h3-zod'
|
||||
import { UpdateUserSchema } from '~~/types/types'
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const { user } = await requireUserSession(event)
|
||||
const body = await useValidatedBody(event, UpdateUserSchema)
|
||||
|
||||
const updatedUser = {
|
||||
...user,
|
||||
...body,
|
||||
}
|
||||
|
||||
await updateUser(user.id, updatedUser)
|
||||
await replaceUserSession(event, updatedUser)
|
||||
|
||||
return sendNoContent(event, 204)
|
||||
})
|
||||
@@ -1,61 +0,0 @@
|
||||
DO $$ BEGIN
|
||||
CREATE TYPE "public"."subscription" AS ENUM('free', 'paid');
|
||||
EXCEPTION
|
||||
WHEN duplicate_object THEN null;
|
||||
END $$;
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE IF NOT EXISTS "categories" (
|
||||
"id" serial PRIMARY KEY NOT NULL,
|
||||
"name" text DEFAULT '',
|
||||
"name_visible" boolean DEFAULT true,
|
||||
"icon" text DEFAULT 'i-ph:circle-wavy-question-duotone',
|
||||
"color" text DEFAULT 'gray',
|
||||
"user_id" integer NOT NULL,
|
||||
"created_at" timestamp (3) DEFAULT now(),
|
||||
"updated_at" timestamp (3)
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE IF NOT EXISTS "tabs" (
|
||||
"id" serial PRIMARY KEY NOT NULL,
|
||||
"name" text DEFAULT '',
|
||||
"name_visible" boolean DEFAULT true,
|
||||
"icon" text DEFAULT 'i-ph:circle-wavy-question-duotone',
|
||||
"color" text DEFAULT 'gray',
|
||||
"category_id" integer NOT NULL,
|
||||
"created_at" timestamp (3) DEFAULT now(),
|
||||
"updated_at" timestamp (3)
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE IF NOT EXISTS "users" (
|
||||
"id" serial PRIMARY KEY NOT NULL,
|
||||
"username" text NOT NULL,
|
||||
"name" text NOT NULL,
|
||||
"email" text NOT NULL,
|
||||
"github_id" text,
|
||||
"github_token" text,
|
||||
"google_id" text,
|
||||
"google_token" text,
|
||||
"description" text DEFAULT '',
|
||||
"avatar" text DEFAULT '',
|
||||
"private" boolean DEFAULT false,
|
||||
"language" text DEFAULT 'en-EN',
|
||||
"location" text DEFAULT 'unknown',
|
||||
"subscription" "subscription" DEFAULT 'free',
|
||||
"created_at" timestamp (3) DEFAULT now(),
|
||||
"updated_at" timestamp (3),
|
||||
CONSTRAINT "users_email_unique" UNIQUE("email"),
|
||||
CONSTRAINT "users_github_id_unique" UNIQUE("github_id"),
|
||||
CONSTRAINT "users_google_id_unique" UNIQUE("google_id")
|
||||
);
|
||||
--> statement-breakpoint
|
||||
DO $$ BEGIN
|
||||
ALTER TABLE "categories" ADD CONSTRAINT "categories_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 "tabs" ADD CONSTRAINT "tabs_category_id_categories_id_fk" FOREIGN KEY ("category_id") REFERENCES "public"."categories"("id") ON DELETE cascade ON UPDATE no action;
|
||||
EXCEPTION
|
||||
WHEN duplicate_object THEN null;
|
||||
END $$;
|
||||
@@ -1 +0,0 @@
|
||||
ALTER TABLE "tabs" ADD COLUMN "link" text DEFAULT '';
|
||||
@@ -1,2 +0,0 @@
|
||||
ALTER TABLE "tabs" ADD COLUMN "primary" boolean DEFAULT false;--> statement-breakpoint
|
||||
ALTER TABLE "tabs" DROP COLUMN IF EXISTS "name_visible";
|
||||
@@ -1,315 +0,0 @@
|
||||
{
|
||||
"id": "c52dbfc1-beae-4a41-8725-66def9fdacea",
|
||||
"prevId": "00000000-0000-0000-0000-000000000000",
|
||||
"version": "7",
|
||||
"dialect": "postgresql",
|
||||
"tables": {
|
||||
"public.categories": {
|
||||
"name": "categories",
|
||||
"schema": "",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "serial",
|
||||
"primaryKey": true,
|
||||
"notNull": true
|
||||
},
|
||||
"name": {
|
||||
"name": "name",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "''"
|
||||
},
|
||||
"name_visible": {
|
||||
"name": "name_visible",
|
||||
"type": "boolean",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": true
|
||||
},
|
||||
"icon": {
|
||||
"name": "icon",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "'i-ph:circle-wavy-question-duotone'"
|
||||
},
|
||||
"color": {
|
||||
"name": "color",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "'gray'"
|
||||
},
|
||||
"user_id": {
|
||||
"name": "user_id",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true
|
||||
},
|
||||
"created_at": {
|
||||
"name": "created_at",
|
||||
"type": "timestamp (3)",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "now()"
|
||||
},
|
||||
"updated_at": {
|
||||
"name": "updated_at",
|
||||
"type": "timestamp (3)",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"categories_user_id_users_id_fk": {
|
||||
"name": "categories_user_id_users_id_fk",
|
||||
"tableFrom": "categories",
|
||||
"tableTo": "users",
|
||||
"columnsFrom": [
|
||||
"user_id"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"public.tabs": {
|
||||
"name": "tabs",
|
||||
"schema": "",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "serial",
|
||||
"primaryKey": true,
|
||||
"notNull": true
|
||||
},
|
||||
"name": {
|
||||
"name": "name",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "''"
|
||||
},
|
||||
"name_visible": {
|
||||
"name": "name_visible",
|
||||
"type": "boolean",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": true
|
||||
},
|
||||
"icon": {
|
||||
"name": "icon",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "'i-ph:circle-wavy-question-duotone'"
|
||||
},
|
||||
"color": {
|
||||
"name": "color",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "'gray'"
|
||||
},
|
||||
"category_id": {
|
||||
"name": "category_id",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true
|
||||
},
|
||||
"created_at": {
|
||||
"name": "created_at",
|
||||
"type": "timestamp (3)",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "now()"
|
||||
},
|
||||
"updated_at": {
|
||||
"name": "updated_at",
|
||||
"type": "timestamp (3)",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"tabs_category_id_categories_id_fk": {
|
||||
"name": "tabs_category_id_categories_id_fk",
|
||||
"tableFrom": "tabs",
|
||||
"tableTo": "categories",
|
||||
"columnsFrom": [
|
||||
"category_id"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"public.users": {
|
||||
"name": "users",
|
||||
"schema": "",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "serial",
|
||||
"primaryKey": true,
|
||||
"notNull": true
|
||||
},
|
||||
"username": {
|
||||
"name": "username",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true
|
||||
},
|
||||
"name": {
|
||||
"name": "name",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true
|
||||
},
|
||||
"email": {
|
||||
"name": "email",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true
|
||||
},
|
||||
"github_id": {
|
||||
"name": "github_id",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"github_token": {
|
||||
"name": "github_token",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"google_id": {
|
||||
"name": "google_id",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"google_token": {
|
||||
"name": "google_token",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"description": {
|
||||
"name": "description",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "''"
|
||||
},
|
||||
"avatar": {
|
||||
"name": "avatar",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "''"
|
||||
},
|
||||
"private": {
|
||||
"name": "private",
|
||||
"type": "boolean",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": false
|
||||
},
|
||||
"language": {
|
||||
"name": "language",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "'en-EN'"
|
||||
},
|
||||
"location": {
|
||||
"name": "location",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "'unknown'"
|
||||
},
|
||||
"subscription": {
|
||||
"name": "subscription",
|
||||
"type": "subscription",
|
||||
"typeSchema": "public",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "'free'"
|
||||
},
|
||||
"created_at": {
|
||||
"name": "created_at",
|
||||
"type": "timestamp (3)",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "now()"
|
||||
},
|
||||
"updated_at": {
|
||||
"name": "updated_at",
|
||||
"type": "timestamp (3)",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {
|
||||
"users_email_unique": {
|
||||
"name": "users_email_unique",
|
||||
"nullsNotDistinct": false,
|
||||
"columns": [
|
||||
"email"
|
||||
]
|
||||
},
|
||||
"users_github_id_unique": {
|
||||
"name": "users_github_id_unique",
|
||||
"nullsNotDistinct": false,
|
||||
"columns": [
|
||||
"github_id"
|
||||
]
|
||||
},
|
||||
"users_google_id_unique": {
|
||||
"name": "users_google_id_unique",
|
||||
"nullsNotDistinct": false,
|
||||
"columns": [
|
||||
"google_id"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"enums": {
|
||||
"public.subscription": {
|
||||
"name": "subscription",
|
||||
"schema": "public",
|
||||
"values": [
|
||||
"free",
|
||||
"paid"
|
||||
]
|
||||
}
|
||||
},
|
||||
"schemas": {},
|
||||
"sequences": {},
|
||||
"_meta": {
|
||||
"columns": {},
|
||||
"schemas": {},
|
||||
"tables": {}
|
||||
}
|
||||
}
|
||||
@@ -1,322 +0,0 @@
|
||||
{
|
||||
"id": "1a96f2ca-db04-445d-b671-d61aaeef8882",
|
||||
"prevId": "c52dbfc1-beae-4a41-8725-66def9fdacea",
|
||||
"version": "7",
|
||||
"dialect": "postgresql",
|
||||
"tables": {
|
||||
"public.categories": {
|
||||
"name": "categories",
|
||||
"schema": "",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "serial",
|
||||
"primaryKey": true,
|
||||
"notNull": true
|
||||
},
|
||||
"name": {
|
||||
"name": "name",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "''"
|
||||
},
|
||||
"name_visible": {
|
||||
"name": "name_visible",
|
||||
"type": "boolean",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": true
|
||||
},
|
||||
"icon": {
|
||||
"name": "icon",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "'i-ph:circle-wavy-question-duotone'"
|
||||
},
|
||||
"color": {
|
||||
"name": "color",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "'gray'"
|
||||
},
|
||||
"user_id": {
|
||||
"name": "user_id",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true
|
||||
},
|
||||
"created_at": {
|
||||
"name": "created_at",
|
||||
"type": "timestamp (3)",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "now()"
|
||||
},
|
||||
"updated_at": {
|
||||
"name": "updated_at",
|
||||
"type": "timestamp (3)",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"categories_user_id_users_id_fk": {
|
||||
"name": "categories_user_id_users_id_fk",
|
||||
"tableFrom": "categories",
|
||||
"tableTo": "users",
|
||||
"columnsFrom": [
|
||||
"user_id"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"public.tabs": {
|
||||
"name": "tabs",
|
||||
"schema": "",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "serial",
|
||||
"primaryKey": true,
|
||||
"notNull": true
|
||||
},
|
||||
"name": {
|
||||
"name": "name",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "''"
|
||||
},
|
||||
"name_visible": {
|
||||
"name": "name_visible",
|
||||
"type": "boolean",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": true
|
||||
},
|
||||
"icon": {
|
||||
"name": "icon",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "'i-ph:circle-wavy-question-duotone'"
|
||||
},
|
||||
"color": {
|
||||
"name": "color",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "'gray'"
|
||||
},
|
||||
"link": {
|
||||
"name": "link",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "''"
|
||||
},
|
||||
"category_id": {
|
||||
"name": "category_id",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true
|
||||
},
|
||||
"created_at": {
|
||||
"name": "created_at",
|
||||
"type": "timestamp (3)",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "now()"
|
||||
},
|
||||
"updated_at": {
|
||||
"name": "updated_at",
|
||||
"type": "timestamp (3)",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"tabs_category_id_categories_id_fk": {
|
||||
"name": "tabs_category_id_categories_id_fk",
|
||||
"tableFrom": "tabs",
|
||||
"tableTo": "categories",
|
||||
"columnsFrom": [
|
||||
"category_id"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"public.users": {
|
||||
"name": "users",
|
||||
"schema": "",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "serial",
|
||||
"primaryKey": true,
|
||||
"notNull": true
|
||||
},
|
||||
"username": {
|
||||
"name": "username",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true
|
||||
},
|
||||
"name": {
|
||||
"name": "name",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true
|
||||
},
|
||||
"email": {
|
||||
"name": "email",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true
|
||||
},
|
||||
"github_id": {
|
||||
"name": "github_id",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"github_token": {
|
||||
"name": "github_token",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"google_id": {
|
||||
"name": "google_id",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"google_token": {
|
||||
"name": "google_token",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"description": {
|
||||
"name": "description",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "''"
|
||||
},
|
||||
"avatar": {
|
||||
"name": "avatar",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "''"
|
||||
},
|
||||
"private": {
|
||||
"name": "private",
|
||||
"type": "boolean",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": false
|
||||
},
|
||||
"language": {
|
||||
"name": "language",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "'en-EN'"
|
||||
},
|
||||
"location": {
|
||||
"name": "location",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "'unknown'"
|
||||
},
|
||||
"subscription": {
|
||||
"name": "subscription",
|
||||
"type": "subscription",
|
||||
"typeSchema": "public",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "'free'"
|
||||
},
|
||||
"created_at": {
|
||||
"name": "created_at",
|
||||
"type": "timestamp (3)",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "now()"
|
||||
},
|
||||
"updated_at": {
|
||||
"name": "updated_at",
|
||||
"type": "timestamp (3)",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {
|
||||
"users_email_unique": {
|
||||
"name": "users_email_unique",
|
||||
"nullsNotDistinct": false,
|
||||
"columns": [
|
||||
"email"
|
||||
]
|
||||
},
|
||||
"users_github_id_unique": {
|
||||
"name": "users_github_id_unique",
|
||||
"nullsNotDistinct": false,
|
||||
"columns": [
|
||||
"github_id"
|
||||
]
|
||||
},
|
||||
"users_google_id_unique": {
|
||||
"name": "users_google_id_unique",
|
||||
"nullsNotDistinct": false,
|
||||
"columns": [
|
||||
"google_id"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"enums": {
|
||||
"public.subscription": {
|
||||
"name": "subscription",
|
||||
"schema": "public",
|
||||
"values": [
|
||||
"free",
|
||||
"paid"
|
||||
]
|
||||
}
|
||||
},
|
||||
"schemas": {},
|
||||
"sequences": {},
|
||||
"_meta": {
|
||||
"columns": {},
|
||||
"schemas": {},
|
||||
"tables": {}
|
||||
}
|
||||
}
|
||||
@@ -1,322 +0,0 @@
|
||||
{
|
||||
"id": "b9aba4fe-7f04-4acc-b47f-2d29d739df98",
|
||||
"prevId": "1a96f2ca-db04-445d-b671-d61aaeef8882",
|
||||
"version": "7",
|
||||
"dialect": "postgresql",
|
||||
"tables": {
|
||||
"public.categories": {
|
||||
"name": "categories",
|
||||
"schema": "",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "serial",
|
||||
"primaryKey": true,
|
||||
"notNull": true
|
||||
},
|
||||
"name": {
|
||||
"name": "name",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "''"
|
||||
},
|
||||
"name_visible": {
|
||||
"name": "name_visible",
|
||||
"type": "boolean",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": true
|
||||
},
|
||||
"icon": {
|
||||
"name": "icon",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "'i-ph:circle-wavy-question-duotone'"
|
||||
},
|
||||
"color": {
|
||||
"name": "color",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "'gray'"
|
||||
},
|
||||
"user_id": {
|
||||
"name": "user_id",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true
|
||||
},
|
||||
"created_at": {
|
||||
"name": "created_at",
|
||||
"type": "timestamp (3)",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "now()"
|
||||
},
|
||||
"updated_at": {
|
||||
"name": "updated_at",
|
||||
"type": "timestamp (3)",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"categories_user_id_users_id_fk": {
|
||||
"name": "categories_user_id_users_id_fk",
|
||||
"tableFrom": "categories",
|
||||
"tableTo": "users",
|
||||
"columnsFrom": [
|
||||
"user_id"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"public.tabs": {
|
||||
"name": "tabs",
|
||||
"schema": "",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "serial",
|
||||
"primaryKey": true,
|
||||
"notNull": true
|
||||
},
|
||||
"name": {
|
||||
"name": "name",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "''"
|
||||
},
|
||||
"primary": {
|
||||
"name": "primary",
|
||||
"type": "boolean",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": false
|
||||
},
|
||||
"icon": {
|
||||
"name": "icon",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "'i-ph:circle-wavy-question-duotone'"
|
||||
},
|
||||
"color": {
|
||||
"name": "color",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "'gray'"
|
||||
},
|
||||
"link": {
|
||||
"name": "link",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "''"
|
||||
},
|
||||
"category_id": {
|
||||
"name": "category_id",
|
||||
"type": "integer",
|
||||
"primaryKey": false,
|
||||
"notNull": true
|
||||
},
|
||||
"created_at": {
|
||||
"name": "created_at",
|
||||
"type": "timestamp (3)",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "now()"
|
||||
},
|
||||
"updated_at": {
|
||||
"name": "updated_at",
|
||||
"type": "timestamp (3)",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {
|
||||
"tabs_category_id_categories_id_fk": {
|
||||
"name": "tabs_category_id_categories_id_fk",
|
||||
"tableFrom": "tabs",
|
||||
"tableTo": "categories",
|
||||
"columnsFrom": [
|
||||
"category_id"
|
||||
],
|
||||
"columnsTo": [
|
||||
"id"
|
||||
],
|
||||
"onDelete": "cascade",
|
||||
"onUpdate": "no action"
|
||||
}
|
||||
},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {}
|
||||
},
|
||||
"public.users": {
|
||||
"name": "users",
|
||||
"schema": "",
|
||||
"columns": {
|
||||
"id": {
|
||||
"name": "id",
|
||||
"type": "serial",
|
||||
"primaryKey": true,
|
||||
"notNull": true
|
||||
},
|
||||
"username": {
|
||||
"name": "username",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true
|
||||
},
|
||||
"name": {
|
||||
"name": "name",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true
|
||||
},
|
||||
"email": {
|
||||
"name": "email",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": true
|
||||
},
|
||||
"github_id": {
|
||||
"name": "github_id",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"github_token": {
|
||||
"name": "github_token",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"google_id": {
|
||||
"name": "google_id",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"google_token": {
|
||||
"name": "google_token",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
},
|
||||
"description": {
|
||||
"name": "description",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "''"
|
||||
},
|
||||
"avatar": {
|
||||
"name": "avatar",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "''"
|
||||
},
|
||||
"private": {
|
||||
"name": "private",
|
||||
"type": "boolean",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": false
|
||||
},
|
||||
"language": {
|
||||
"name": "language",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "'en-EN'"
|
||||
},
|
||||
"location": {
|
||||
"name": "location",
|
||||
"type": "text",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "'unknown'"
|
||||
},
|
||||
"subscription": {
|
||||
"name": "subscription",
|
||||
"type": "subscription",
|
||||
"typeSchema": "public",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "'free'"
|
||||
},
|
||||
"created_at": {
|
||||
"name": "created_at",
|
||||
"type": "timestamp (3)",
|
||||
"primaryKey": false,
|
||||
"notNull": false,
|
||||
"default": "now()"
|
||||
},
|
||||
"updated_at": {
|
||||
"name": "updated_at",
|
||||
"type": "timestamp (3)",
|
||||
"primaryKey": false,
|
||||
"notNull": false
|
||||
}
|
||||
},
|
||||
"indexes": {},
|
||||
"foreignKeys": {},
|
||||
"compositePrimaryKeys": {},
|
||||
"uniqueConstraints": {
|
||||
"users_email_unique": {
|
||||
"name": "users_email_unique",
|
||||
"nullsNotDistinct": false,
|
||||
"columns": [
|
||||
"email"
|
||||
]
|
||||
},
|
||||
"users_github_id_unique": {
|
||||
"name": "users_github_id_unique",
|
||||
"nullsNotDistinct": false,
|
||||
"columns": [
|
||||
"github_id"
|
||||
]
|
||||
},
|
||||
"users_google_id_unique": {
|
||||
"name": "users_google_id_unique",
|
||||
"nullsNotDistinct": false,
|
||||
"columns": [
|
||||
"google_id"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"enums": {
|
||||
"public.subscription": {
|
||||
"name": "subscription",
|
||||
"schema": "public",
|
||||
"values": [
|
||||
"free",
|
||||
"paid"
|
||||
]
|
||||
}
|
||||
},
|
||||
"schemas": {},
|
||||
"sequences": {},
|
||||
"_meta": {
|
||||
"columns": {},
|
||||
"schemas": {},
|
||||
"tables": {}
|
||||
}
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
{
|
||||
"version": "7",
|
||||
"dialect": "postgresql",
|
||||
"entries": [
|
||||
{
|
||||
"idx": 0,
|
||||
"version": "7",
|
||||
"when": 1724865045534,
|
||||
"tag": "0000_giant_stranger",
|
||||
"breakpoints": true
|
||||
},
|
||||
{
|
||||
"idx": 1,
|
||||
"version": "7",
|
||||
"when": 1724884620789,
|
||||
"tag": "0001_fancy_tyger_tiger",
|
||||
"breakpoints": true
|
||||
},
|
||||
{
|
||||
"idx": 2,
|
||||
"version": "7",
|
||||
"when": 1725015619221,
|
||||
"tag": "0002_cool_dexter_bennett",
|
||||
"breakpoints": true
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -7,7 +7,7 @@ export const subscriptionEnum = pgEnum('subscription', Subscription)
|
||||
|
||||
export const users = pgTable('users', {
|
||||
id,
|
||||
username: text('username').notNull(),
|
||||
username: text('username').notNull().unique(),
|
||||
name: text('name').notNull(),
|
||||
email: text('email').notNull().unique(),
|
||||
githubId: text('github_id').unique(),
|
||||
@@ -59,3 +59,10 @@ export const categoriesRelations = relations(categories, ({ one, many }) => ({
|
||||
}),
|
||||
tabs: many(tabs),
|
||||
}))
|
||||
|
||||
export const tabsRelations = relations(tabs, ({ one }) => ({
|
||||
category: one(categories, {
|
||||
fields: [tabs.categoryId],
|
||||
references: [categories.id],
|
||||
}),
|
||||
}))
|
||||
|
||||
@@ -63,14 +63,14 @@ export default oauthGitHubEventHandler({
|
||||
|
||||
// If the user is not signed in and no user exists with that GitHub ID or email address, create a new user
|
||||
const createdUser = await createUser({
|
||||
username: oauthUser.login as string,
|
||||
username: oauthUser.login.toLowerCase() as string,
|
||||
description: oauthUser.bio as string,
|
||||
name: oauthUser.name as string,
|
||||
email: oauthUser.email as string,
|
||||
avatar: oauthUser.avatar_url as string,
|
||||
githubId: oauthUser.id as number,
|
||||
githubToken: tokens.access_token as string,
|
||||
language: 'en-US',
|
||||
language: 'en-EN',
|
||||
location: 'unknown',
|
||||
private: false,
|
||||
subscription: 'free',
|
||||
|
||||
@@ -64,14 +64,14 @@ export default oauthGoogleEventHandler({
|
||||
|
||||
// If the user is not signed in and no user exists with that Google ID or email address, create a new user
|
||||
const createdUser = await createUser({
|
||||
username: oauthUser.name as string,
|
||||
username: oauthUser.name.toLowerCase() as string,
|
||||
description: '',
|
||||
name: `${oauthUser.given_name} ${oauthUser.family_name}`,
|
||||
email: oauthUser.email as string,
|
||||
avatar: oauthUser.picture as string,
|
||||
googleId: oauthUser.sub as number,
|
||||
googleToken: tokens.access_token as string,
|
||||
language: 'en-US',
|
||||
language: 'en-EN',
|
||||
location: 'unknown',
|
||||
private: false,
|
||||
subscription: 'free',
|
||||
|
||||
@@ -10,3 +10,5 @@ export function useDrizzle() {
|
||||
const config = useRuntimeConfig()
|
||||
return drizzle(postgres(config.postgres.url, { prepare: false, max: 50 }), { schema })
|
||||
}
|
||||
|
||||
export type UserInsert = typeof schema.users.$inferInsert
|
||||
|
||||
@@ -45,14 +45,14 @@ export async function createUser(user: UserInsert) {
|
||||
}
|
||||
|
||||
export async function updateUser(userId: number, user: Partial<UserInsert>) {
|
||||
return useDrizzle()
|
||||
await useDrizzle()
|
||||
.update(tables.users)
|
||||
.set(user)
|
||||
.where(eq(tables.users.id, userId))
|
||||
}
|
||||
|
||||
export async function deleteProfilePicture(avatar: string) {
|
||||
if (avatar.startsWith('profile-pictures/')) {
|
||||
await hubBlob().delete(avatar)
|
||||
if (avatar.startsWith('avatars/')) {
|
||||
await hubBlob().del(avatar)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user