4 changed files with 415 additions and 4 deletions
@ -1,8 +1,74 @@ |
|||||
import { integer, pgTable, varchar } from "drizzle-orm/pg-core"; |
import { |
||||
|
integer, |
||||
|
pgTable, |
||||
|
varchar, |
||||
|
timestamp, |
||||
|
text, |
||||
|
pgEnum, |
||||
|
uniqueIndex, |
||||
|
index, |
||||
|
} from "drizzle-orm/pg-core"; |
||||
|
|
||||
|
export const authChallengeTypeEnum = pgEnum("auth_challenge_type", [ |
||||
|
"email_verify", |
||||
|
"password_reset", |
||||
|
]); |
||||
|
|
||||
export const usersTable = pgTable("users_table", { |
export const usersTable = pgTable("users_table", { |
||||
id: integer().primaryKey().generatedAlwaysAsIdentity(), |
id: integer().primaryKey().generatedAlwaysAsIdentity(), |
||||
name: varchar().notNull(), |
name: varchar({ length: 255 }).notNull(), |
||||
age: integer().notNull(), |
age: integer().notNull(), |
||||
email: varchar().notNull().unique(), |
email: varchar({ length: 320 }).notNull().unique(), |
||||
|
passwordHash: text("password_hash").notNull(), |
||||
|
emailVerifiedAt: timestamp("email_verified_at", { |
||||
|
withTimezone: true, |
||||
|
}), |
||||
|
sessionVersion: integer("session_version").notNull().default(0), |
||||
|
createdAt: timestamp("created_at", { withTimezone: true }) |
||||
|
.notNull() |
||||
|
.defaultNow(), |
||||
|
updatedAt: timestamp("updated_at", { withTimezone: true }) |
||||
|
.notNull() |
||||
|
.defaultNow(), |
||||
}); |
}); |
||||
|
|
||||
|
export const authChallengesTable = pgTable( |
||||
|
"auth_challenges", |
||||
|
{ |
||||
|
id: integer().primaryKey().generatedAlwaysAsIdentity(), |
||||
|
userId: integer("user_id") |
||||
|
.notNull() |
||||
|
.references(() => usersTable.id, { onDelete: "cascade" }), |
||||
|
type: authChallengeTypeEnum("type").notNull(), |
||||
|
tokenHash: varchar("token_hash", { length: 64 }).notNull(), |
||||
|
expiresAt: timestamp("expires_at", { withTimezone: true }).notNull(), |
||||
|
consumedAt: timestamp("consumed_at", { withTimezone: true }), |
||||
|
createdAt: timestamp("created_at", { withTimezone: true }) |
||||
|
.notNull() |
||||
|
.defaultNow(), |
||||
|
}, |
||||
|
(t) => ({ |
||||
|
tokenHashIdx: index("auth_challenges_token_hash_idx").on(t.tokenHash), |
||||
|
}), |
||||
|
); |
||||
|
|
||||
|
export const linkedAccountsTable = pgTable( |
||||
|
"linked_accounts", |
||||
|
{ |
||||
|
id: integer().primaryKey().generatedAlwaysAsIdentity(), |
||||
|
userId: integer("user_id") |
||||
|
.notNull() |
||||
|
.references(() => usersTable.id, { onDelete: "cascade" }), |
||||
|
provider: varchar({ length: 64 }).notNull(), |
||||
|
providerUserId: varchar("provider_user_id", { length: 255 }).notNull(), |
||||
|
createdAt: timestamp("created_at", { withTimezone: true }) |
||||
|
.notNull() |
||||
|
.defaultNow(), |
||||
|
}, |
||||
|
(t) => ({ |
||||
|
providerUserUnique: uniqueIndex("linked_accounts_provider_uid").on( |
||||
|
t.provider, |
||||
|
t.providerUserId, |
||||
|
), |
||||
|
}), |
||||
|
); |
||||
|
|||||
@ -0,0 +1,32 @@ |
|||||
|
CREATE TYPE "public"."auth_challenge_type" AS ENUM('email_verify', 'password_reset');--> statement-breakpoint |
||||
|
CREATE TABLE "auth_challenges" ( |
||||
|
"id" integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY (sequence name "auth_challenges_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1), |
||||
|
"user_id" integer NOT NULL, |
||||
|
"type" "auth_challenge_type" NOT NULL, |
||||
|
"token_hash" varchar(64) NOT NULL, |
||||
|
"expires_at" timestamp with time zone NOT NULL, |
||||
|
"consumed_at" timestamp with time zone, |
||||
|
"created_at" timestamp with time zone DEFAULT now() NOT NULL |
||||
|
); |
||||
|
--> statement-breakpoint |
||||
|
CREATE TABLE "linked_accounts" ( |
||||
|
"id" integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY (sequence name "linked_accounts_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1), |
||||
|
"user_id" integer NOT NULL, |
||||
|
"provider" varchar(64) NOT NULL, |
||||
|
"provider_user_id" varchar(255) NOT NULL, |
||||
|
"created_at" timestamp with time zone DEFAULT now() NOT NULL |
||||
|
); |
||||
|
--> statement-breakpoint |
||||
|
ALTER TABLE "users_table" ALTER COLUMN "name" SET DATA TYPE varchar(255);--> statement-breakpoint |
||||
|
ALTER TABLE "users_table" ALTER COLUMN "email" SET DATA TYPE varchar(320);--> statement-breakpoint |
||||
|
ALTER TABLE "users_table" ADD COLUMN "password_hash" text;--> statement-breakpoint |
||||
|
UPDATE "users_table" SET "password_hash" = '$2b$10$eUiiFSTi9m98IWSuXJ80jun3VctJ0pKL44rRwvHT.9WOfxvc7r6Ey' WHERE "password_hash" IS NULL;--> statement-breakpoint |
||||
|
ALTER TABLE "users_table" ALTER COLUMN "password_hash" SET NOT NULL;--> statement-breakpoint |
||||
|
ALTER TABLE "users_table" ADD COLUMN "email_verified_at" timestamp with time zone;--> statement-breakpoint |
||||
|
ALTER TABLE "users_table" ADD COLUMN "session_version" integer DEFAULT 0 NOT NULL;--> statement-breakpoint |
||||
|
ALTER TABLE "users_table" ADD COLUMN "created_at" timestamp with time zone DEFAULT now() NOT NULL;--> statement-breakpoint |
||||
|
ALTER TABLE "users_table" ADD COLUMN "updated_at" timestamp with time zone DEFAULT now() NOT NULL;--> statement-breakpoint |
||||
|
ALTER TABLE "auth_challenges" ADD CONSTRAINT "auth_challenges_user_id_users_table_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users_table"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint |
||||
|
ALTER TABLE "linked_accounts" ADD CONSTRAINT "linked_accounts_user_id_users_table_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users_table"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint |
||||
|
CREATE INDEX "auth_challenges_token_hash_idx" ON "auth_challenges" USING btree ("token_hash");--> statement-breakpoint |
||||
|
CREATE UNIQUE INDEX "linked_accounts_provider_uid" ON "linked_accounts" USING btree ("provider","provider_user_id"); |
||||
@ -0,0 +1,306 @@ |
|||||
|
{ |
||||
|
"id": "d83420ac-013e-46cd-b8b4-82360fa63544", |
||||
|
"prevId": "ccacc841-1a4a-434b-bfaa-8d18a9a641b2", |
||||
|
"version": "7", |
||||
|
"dialect": "postgresql", |
||||
|
"tables": { |
||||
|
"public.auth_challenges": { |
||||
|
"name": "auth_challenges", |
||||
|
"schema": "", |
||||
|
"columns": { |
||||
|
"id": { |
||||
|
"name": "id", |
||||
|
"type": "integer", |
||||
|
"primaryKey": true, |
||||
|
"notNull": true, |
||||
|
"identity": { |
||||
|
"type": "always", |
||||
|
"name": "auth_challenges_id_seq", |
||||
|
"schema": "public", |
||||
|
"increment": "1", |
||||
|
"startWith": "1", |
||||
|
"minValue": "1", |
||||
|
"maxValue": "2147483647", |
||||
|
"cache": "1", |
||||
|
"cycle": false |
||||
|
} |
||||
|
}, |
||||
|
"user_id": { |
||||
|
"name": "user_id", |
||||
|
"type": "integer", |
||||
|
"primaryKey": false, |
||||
|
"notNull": true |
||||
|
}, |
||||
|
"type": { |
||||
|
"name": "type", |
||||
|
"type": "auth_challenge_type", |
||||
|
"typeSchema": "public", |
||||
|
"primaryKey": false, |
||||
|
"notNull": true |
||||
|
}, |
||||
|
"token_hash": { |
||||
|
"name": "token_hash", |
||||
|
"type": "varchar(64)", |
||||
|
"primaryKey": false, |
||||
|
"notNull": true |
||||
|
}, |
||||
|
"expires_at": { |
||||
|
"name": "expires_at", |
||||
|
"type": "timestamp with time zone", |
||||
|
"primaryKey": false, |
||||
|
"notNull": true |
||||
|
}, |
||||
|
"consumed_at": { |
||||
|
"name": "consumed_at", |
||||
|
"type": "timestamp with time zone", |
||||
|
"primaryKey": false, |
||||
|
"notNull": false |
||||
|
}, |
||||
|
"created_at": { |
||||
|
"name": "created_at", |
||||
|
"type": "timestamp with time zone", |
||||
|
"primaryKey": false, |
||||
|
"notNull": true, |
||||
|
"default": "now()" |
||||
|
} |
||||
|
}, |
||||
|
"indexes": { |
||||
|
"auth_challenges_token_hash_idx": { |
||||
|
"name": "auth_challenges_token_hash_idx", |
||||
|
"columns": [ |
||||
|
{ |
||||
|
"expression": "token_hash", |
||||
|
"isExpression": false, |
||||
|
"asc": true, |
||||
|
"nulls": "last" |
||||
|
} |
||||
|
], |
||||
|
"isUnique": false, |
||||
|
"concurrently": false, |
||||
|
"method": "btree", |
||||
|
"with": {} |
||||
|
} |
||||
|
}, |
||||
|
"foreignKeys": { |
||||
|
"auth_challenges_user_id_users_table_id_fk": { |
||||
|
"name": "auth_challenges_user_id_users_table_id_fk", |
||||
|
"tableFrom": "auth_challenges", |
||||
|
"tableTo": "users_table", |
||||
|
"columnsFrom": [ |
||||
|
"user_id" |
||||
|
], |
||||
|
"columnsTo": [ |
||||
|
"id" |
||||
|
], |
||||
|
"onDelete": "cascade", |
||||
|
"onUpdate": "no action" |
||||
|
} |
||||
|
}, |
||||
|
"compositePrimaryKeys": {}, |
||||
|
"uniqueConstraints": {}, |
||||
|
"policies": {}, |
||||
|
"checkConstraints": {}, |
||||
|
"isRLSEnabled": false |
||||
|
}, |
||||
|
"public.linked_accounts": { |
||||
|
"name": "linked_accounts", |
||||
|
"schema": "", |
||||
|
"columns": { |
||||
|
"id": { |
||||
|
"name": "id", |
||||
|
"type": "integer", |
||||
|
"primaryKey": true, |
||||
|
"notNull": true, |
||||
|
"identity": { |
||||
|
"type": "always", |
||||
|
"name": "linked_accounts_id_seq", |
||||
|
"schema": "public", |
||||
|
"increment": "1", |
||||
|
"startWith": "1", |
||||
|
"minValue": "1", |
||||
|
"maxValue": "2147483647", |
||||
|
"cache": "1", |
||||
|
"cycle": false |
||||
|
} |
||||
|
}, |
||||
|
"user_id": { |
||||
|
"name": "user_id", |
||||
|
"type": "integer", |
||||
|
"primaryKey": false, |
||||
|
"notNull": true |
||||
|
}, |
||||
|
"provider": { |
||||
|
"name": "provider", |
||||
|
"type": "varchar(64)", |
||||
|
"primaryKey": false, |
||||
|
"notNull": true |
||||
|
}, |
||||
|
"provider_user_id": { |
||||
|
"name": "provider_user_id", |
||||
|
"type": "varchar(255)", |
||||
|
"primaryKey": false, |
||||
|
"notNull": true |
||||
|
}, |
||||
|
"created_at": { |
||||
|
"name": "created_at", |
||||
|
"type": "timestamp with time zone", |
||||
|
"primaryKey": false, |
||||
|
"notNull": true, |
||||
|
"default": "now()" |
||||
|
} |
||||
|
}, |
||||
|
"indexes": { |
||||
|
"linked_accounts_provider_uid": { |
||||
|
"name": "linked_accounts_provider_uid", |
||||
|
"columns": [ |
||||
|
{ |
||||
|
"expression": "provider", |
||||
|
"isExpression": false, |
||||
|
"asc": true, |
||||
|
"nulls": "last" |
||||
|
}, |
||||
|
{ |
||||
|
"expression": "provider_user_id", |
||||
|
"isExpression": false, |
||||
|
"asc": true, |
||||
|
"nulls": "last" |
||||
|
} |
||||
|
], |
||||
|
"isUnique": true, |
||||
|
"concurrently": false, |
||||
|
"method": "btree", |
||||
|
"with": {} |
||||
|
} |
||||
|
}, |
||||
|
"foreignKeys": { |
||||
|
"linked_accounts_user_id_users_table_id_fk": { |
||||
|
"name": "linked_accounts_user_id_users_table_id_fk", |
||||
|
"tableFrom": "linked_accounts", |
||||
|
"tableTo": "users_table", |
||||
|
"columnsFrom": [ |
||||
|
"user_id" |
||||
|
], |
||||
|
"columnsTo": [ |
||||
|
"id" |
||||
|
], |
||||
|
"onDelete": "cascade", |
||||
|
"onUpdate": "no action" |
||||
|
} |
||||
|
}, |
||||
|
"compositePrimaryKeys": {}, |
||||
|
"uniqueConstraints": {}, |
||||
|
"policies": {}, |
||||
|
"checkConstraints": {}, |
||||
|
"isRLSEnabled": false |
||||
|
}, |
||||
|
"public.users_table": { |
||||
|
"name": "users_table", |
||||
|
"schema": "", |
||||
|
"columns": { |
||||
|
"id": { |
||||
|
"name": "id", |
||||
|
"type": "integer", |
||||
|
"primaryKey": true, |
||||
|
"notNull": true, |
||||
|
"identity": { |
||||
|
"type": "always", |
||||
|
"name": "users_table_id_seq", |
||||
|
"schema": "public", |
||||
|
"increment": "1", |
||||
|
"startWith": "1", |
||||
|
"minValue": "1", |
||||
|
"maxValue": "2147483647", |
||||
|
"cache": "1", |
||||
|
"cycle": false |
||||
|
} |
||||
|
}, |
||||
|
"name": { |
||||
|
"name": "name", |
||||
|
"type": "varchar(255)", |
||||
|
"primaryKey": false, |
||||
|
"notNull": true |
||||
|
}, |
||||
|
"age": { |
||||
|
"name": "age", |
||||
|
"type": "integer", |
||||
|
"primaryKey": false, |
||||
|
"notNull": true |
||||
|
}, |
||||
|
"email": { |
||||
|
"name": "email", |
||||
|
"type": "varchar(320)", |
||||
|
"primaryKey": false, |
||||
|
"notNull": true |
||||
|
}, |
||||
|
"password_hash": { |
||||
|
"name": "password_hash", |
||||
|
"type": "text", |
||||
|
"primaryKey": false, |
||||
|
"notNull": true |
||||
|
}, |
||||
|
"email_verified_at": { |
||||
|
"name": "email_verified_at", |
||||
|
"type": "timestamp with time zone", |
||||
|
"primaryKey": false, |
||||
|
"notNull": false |
||||
|
}, |
||||
|
"session_version": { |
||||
|
"name": "session_version", |
||||
|
"type": "integer", |
||||
|
"primaryKey": false, |
||||
|
"notNull": true, |
||||
|
"default": 0 |
||||
|
}, |
||||
|
"created_at": { |
||||
|
"name": "created_at", |
||||
|
"type": "timestamp with time zone", |
||||
|
"primaryKey": false, |
||||
|
"notNull": true, |
||||
|
"default": "now()" |
||||
|
}, |
||||
|
"updated_at": { |
||||
|
"name": "updated_at", |
||||
|
"type": "timestamp with time zone", |
||||
|
"primaryKey": false, |
||||
|
"notNull": true, |
||||
|
"default": "now()" |
||||
|
} |
||||
|
}, |
||||
|
"indexes": {}, |
||||
|
"foreignKeys": {}, |
||||
|
"compositePrimaryKeys": {}, |
||||
|
"uniqueConstraints": { |
||||
|
"users_table_email_unique": { |
||||
|
"name": "users_table_email_unique", |
||||
|
"nullsNotDistinct": false, |
||||
|
"columns": [ |
||||
|
"email" |
||||
|
] |
||||
|
} |
||||
|
}, |
||||
|
"policies": {}, |
||||
|
"checkConstraints": {}, |
||||
|
"isRLSEnabled": false |
||||
|
} |
||||
|
}, |
||||
|
"enums": { |
||||
|
"public.auth_challenge_type": { |
||||
|
"name": "auth_challenge_type", |
||||
|
"schema": "public", |
||||
|
"values": [ |
||||
|
"email_verify", |
||||
|
"password_reset" |
||||
|
] |
||||
|
} |
||||
|
}, |
||||
|
"schemas": {}, |
||||
|
"sequences": {}, |
||||
|
"roles": {}, |
||||
|
"policies": {}, |
||||
|
"views": {}, |
||||
|
"_meta": { |
||||
|
"columns": {}, |
||||
|
"schemas": {}, |
||||
|
"tables": {} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue