This commit is contained in:
2024-04-19 01:54:54 +07:00
commit a90529f258
10 changed files with 2136 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
node_modules
sqlite.db

10
Taskfile.yml Normal file
View File

@@ -0,0 +1,10 @@
version: "3"
tasks:
generate:
cmds:
- pnpm drizzle-kit generate:sqlite
studio:
cmds:
- pnpm drizzle-kit studio

11
drizzle.config.ts Normal file
View File

@@ -0,0 +1,11 @@
import { defineConfig } from "drizzle-kit";
export default defineConfig({
schema: "./src/schema.ts",
out: "./drizzle",
driver: "better-sqlite",
dbCredentials: {
url: "sqlite.db",
},
verbose: true,
strict: true,
});

View File

@@ -0,0 +1,45 @@
CREATE TABLE `groups` (
`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
`name` text
);
--> statement-breakpoint
CREATE TABLE `opinions` (
`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
`name` text,
`type` text
);
--> statement-breakpoint
CREATE TABLE `provinces` (
`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
`name` text NOT NULL
);
--> statement-breakpoint
CREATE TABLE `users` (
`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
`name` text,
`phone` text NOT NULL,
`email` text,
`job` text,
`education` text,
`vision` text,
`reason` text,
`group_id` integer,
FOREIGN KEY (`group_id`) REFERENCES `groups`(`id`) ON UPDATE no action ON DELETE no action
);
--> statement-breakpoint
CREATE TABLE `user_opinions` (
`user_id` integer,
`opinion_id` integer,
`choice` text DEFAULT 'ignore',
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action,
FOREIGN KEY (`opinion_id`) REFERENCES `opinions`(`id`) ON UPDATE no action ON DELETE no action
);
--> statement-breakpoint
CREATE TABLE `zones` (
`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
`name` text NOT NULL,
`province_id` integer NOT NULL,
FOREIGN KEY (`province_id`) REFERENCES `provinces`(`id`) ON UPDATE no action ON DELETE no action
);
--> statement-breakpoint
CREATE UNIQUE INDEX `users_phone_unique` ON `users` (`phone`);

View File

@@ -0,0 +1,286 @@
{
"version": "5",
"dialect": "sqlite",
"id": "71187b23-6b9a-4f78-9f3c-0af6fb035f1b",
"prevId": "00000000-0000-0000-0000-000000000000",
"tables": {
"groups": {
"name": "groups",
"columns": {
"id": {
"name": "id",
"type": "integer",
"primaryKey": true,
"notNull": true,
"autoincrement": true
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {}
},
"opinions": {
"name": "opinions",
"columns": {
"id": {
"name": "id",
"type": "integer",
"primaryKey": true,
"notNull": true,
"autoincrement": true
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"type": {
"name": "type",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {}
},
"provinces": {
"name": "provinces",
"columns": {
"id": {
"name": "id",
"type": "integer",
"primaryKey": true,
"notNull": true,
"autoincrement": true
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {}
},
"users": {
"name": "users",
"columns": {
"id": {
"name": "id",
"type": "integer",
"primaryKey": true,
"notNull": true,
"autoincrement": true
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"phone": {
"name": "phone",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"email": {
"name": "email",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"job": {
"name": "job",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"education": {
"name": "education",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"vision": {
"name": "vision",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"reason": {
"name": "reason",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"group_id": {
"name": "group_id",
"type": "integer",
"primaryKey": false,
"notNull": false,
"autoincrement": false
}
},
"indexes": {
"users_phone_unique": {
"name": "users_phone_unique",
"columns": [
"phone"
],
"isUnique": true
}
},
"foreignKeys": {
"users_group_id_groups_id_fk": {
"name": "users_group_id_groups_id_fk",
"tableFrom": "users",
"tableTo": "groups",
"columnsFrom": [
"group_id"
],
"columnsTo": [
"id"
],
"onDelete": "no action",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {}
},
"user_opinions": {
"name": "user_opinions",
"columns": {
"user_id": {
"name": "user_id",
"type": "integer",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"opinion_id": {
"name": "opinion_id",
"type": "integer",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"choice": {
"name": "choice",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false,
"default": "'ignore'"
}
},
"indexes": {},
"foreignKeys": {
"user_opinions_user_id_users_id_fk": {
"name": "user_opinions_user_id_users_id_fk",
"tableFrom": "user_opinions",
"tableTo": "users",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "no action",
"onUpdate": "no action"
},
"user_opinions_opinion_id_opinions_id_fk": {
"name": "user_opinions_opinion_id_opinions_id_fk",
"tableFrom": "user_opinions",
"tableTo": "opinions",
"columnsFrom": [
"opinion_id"
],
"columnsTo": [
"id"
],
"onDelete": "no action",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {}
},
"zones": {
"name": "zones",
"columns": {
"id": {
"name": "id",
"type": "integer",
"primaryKey": true,
"notNull": true,
"autoincrement": true
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"province_id": {
"name": "province_id",
"type": "integer",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {},
"foreignKeys": {
"zones_province_id_provinces_id_fk": {
"name": "zones_province_id_provinces_id_fk",
"tableFrom": "zones",
"tableTo": "provinces",
"columnsFrom": [
"province_id"
],
"columnsTo": [
"id"
],
"onDelete": "no action",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {}
}
},
"enums": {},
"_meta": {
"schemas": {},
"tables": {},
"columns": {}
}
}

View File

@@ -0,0 +1,13 @@
{
"version": "5",
"dialect": "sqlite",
"entries": [
{
"idx": 0,
"version": "5",
"when": 1713465576653,
"tag": "0000_aspiring_paibok",
"breakpoints": true
}
]
}

27
package.json Normal file
View File

@@ -0,0 +1,27 @@
{
"name": "sorvor",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "nodemon --exec ts-node --swc src/app.ts"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"@trpc/client": "11.0.0-rc.340",
"@trpc/server": "11.0.0-rc.340",
"better-sqlite3": "^9.5.0",
"drizzle-orm": "^0.30.8"
},
"devDependencies": {
"@swc/core": "^1.4.16",
"@types/better-sqlite3": "^7.6.9",
"drizzle-kit": "^0.20.14",
"nodemon": "^3.1.0",
"ts-node": "^10.9.2",
"typescript": "^5.4.5"
}
}

1627
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

27
src/app.ts Normal file
View File

@@ -0,0 +1,27 @@
import { drizzle } from "drizzle-orm/better-sqlite3";
import { migrate } from "drizzle-orm/better-sqlite3/migrator";
import Database from "better-sqlite3";
import { user } from "./schema.ts";
const sqlite = new Database("sqlite.db");
const db = drizzle(sqlite);
migrate(db, { migrationsFolder: "drizzle" });
async function main() {
await db.insert(user).values({
job: "Software Engineer",
phone: "1234567890",
group: 1,
name: "John Doe",
education: "Bachelor",
});
console.log("User inserted");
}
(async () => {
try {
await main();
} catch (e) {
console.error(e);
}
})();

88
src/schema.ts Normal file
View File

@@ -0,0 +1,88 @@
import {
sqliteTable,
text,
integer,
uniqueIndex,
} from "drizzle-orm/sqlite-core";
import { relations } from "drizzle-orm";
//----------------User
export const user = sqliteTable("users", {
id: integer("id", { mode: "number" }).primaryKey({ autoIncrement: true }),
name: text("name").notNull(),
phone: text("phone").unique().notNull(),
email: text("email"),
job: text("job").notNull(),
education: text("education").notNull(),
vision: text("vision"),
reason: text("reason"),
group: integer("group_id")
.references(() => group.id)
.notNull(),
});
export const userRelation = relations(user, ({ many, one }) => ({
opinions: many(userOpinion),
group: one(group, {
fields: [user.group],
references: [group.id],
}),
}));
//----------------Group
export const group = sqliteTable("groups", {
id: integer("id", { mode: "number" }).primaryKey({ autoIncrement: true }),
name: text("name"),
});
export const groupRelation = relations(group, ({ many }) => ({
users: many(user),
}));
//----------------Opinion
export const opinion = sqliteTable("opinions", {
id: integer("id", { mode: "number" }).primaryKey({ autoIncrement: true }),
name: text("name"),
type: text("type", { enum: ["3Choice", "4Choice"] }),
});
//----------------UserOpinion
export const userOpinion = sqliteTable("user_opinions", {
userId: integer("user_id").references(() => user.id),
opinionId: integer("opinion_id").references(() => opinion.id),
choice: text("choice", {
enum: ["agree", "disagree", "deciding", "ignore"],
}).default("ignore"),
});
export const userOpinionRelation = relations(userOpinion, ({ one }) => ({
user: one(user, {
fields: [userOpinion.userId],
references: [user.id],
}),
}));
//----------------Zone
export const zone = sqliteTable("zones", {
id: integer("id", { mode: "number" }).primaryKey({ autoIncrement: true }),
name: text("name").notNull(),
province: integer("province_id")
.notNull()
.references(() => province.id),
});
export const zoneRelation = relations(zone, ({ one }) => ({
province: one(province, {
fields: [zone.province],
references: [province.id],
}),
}));
//----------------Province
export const province = sqliteTable("provinces", {
id: integer("id", { mode: "number" }).primaryKey({ autoIncrement: true }),
name: text("name").notNull(),
});
export const provinceRelation = relations(province, ({ many }) => ({
province: many(zone),
}));