Browse Source

chore: Improve schema (#2676)

* improve

* fix drizzle kit
pull/2683/head
Bernd Storath 2 weeks ago
committed by GitHub
parent
commit
ec301d17d7
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 2
      src/server/database/migrations/0006_clear_leech.sql
  2. 1024
      src/server/database/migrations/meta/0006_snapshot.json
  3. 7
      src/server/database/migrations/meta/_journal.json
  4. 123
      src/server/database/repositories/client/schema.ts
  5. 2
      src/server/database/repositories/hooks/schema.ts
  6. 4
      src/server/database/repositories/interface/schema.ts
  7. 2
      src/server/database/repositories/oneTimeLink/schema.ts
  8. 5
      src/server/database/repositories/user/schema.ts
  9. 2
      src/server/database/repositories/userConfig/schema.ts
  10. 15
      src/server/database/schema.ts
  11. 1
      src/server/database/sqlite.ts
  12. 13
      src/server/utils/Database.ts

2
src/server/database/migrations/0006_clear_leech.sql

@ -0,0 +1,2 @@
CREATE UNIQUE INDEX `public_key_interface_unique` ON `clients_table` (`public_key`,`interface_id`);--> statement-breakpoint
CREATE UNIQUE INDEX `users_table_email_unique` ON `users_table` (`email`);

1024
src/server/database/migrations/meta/0006_snapshot.json

File diff suppressed because it is too large

7
src/server/database/migrations/meta/_journal.json

@ -43,6 +43,13 @@
"when": 1780035570366, "when": 1780035570366,
"tag": "0005_clumsy_korg", "tag": "0005_clumsy_korg",
"breakpoints": true "breakpoints": true
},
{
"idx": 6,
"version": "6",
"when": 1782122902196,
"tag": "0006_clear_leech",
"breakpoints": true
} }
] ]
} }

123
src/server/database/repositories/client/schema.ts

@ -1,64 +1,75 @@
import { sql, relations } from 'drizzle-orm'; import { sql, relations } from 'drizzle-orm';
import { int, sqliteTable, text } from 'drizzle-orm/sqlite-core'; import { int, sqliteTable, text, uniqueIndex } from 'drizzle-orm/sqlite-core';
import { wgInterface } from '#db/repositories/interface/schema'; import { wgInterface } from '../interface/schema';
import { oneTimeLink } from '#db/repositories/oneTimeLink/schema'; import { oneTimeLink } from '../oneTimeLink/schema';
import { user } from '#db/repositories/user/schema'; import { user } from '../user/schema';
/** null means use value from userConfig */ /** null means use value from userConfig */
export const client = sqliteTable('clients_table', { export const client = sqliteTable(
id: int().primaryKey({ autoIncrement: true }), 'clients_table',
userId: int('user_id') {
.notNull() id: int().primaryKey({ autoIncrement: true }),
.references(() => user.id, { userId: int('user_id')
onDelete: 'restrict', .notNull()
onUpdate: 'cascade', .references(() => user.id, {
}), onDelete: 'restrict',
interfaceId: text('interface_id') onUpdate: 'cascade',
.notNull() }),
.references(() => wgInterface.name, { interfaceId: text('interface_id')
onDelete: 'cascade', .notNull()
onUpdate: 'cascade', .references(() => wgInterface.name, {
}), onDelete: 'cascade',
name: text().notNull(), onUpdate: 'cascade',
ipv4Address: text('ipv4_address').notNull().unique(), }),
ipv6Address: text('ipv6_address').notNull().unique(), name: text().notNull(),
preUp: text('pre_up').default('').notNull(), ipv4Address: text('ipv4_address').notNull().unique(),
postUp: text('post_up').default('').notNull(), ipv6Address: text('ipv6_address').notNull().unique(),
preDown: text('pre_down').default('').notNull(), preUp: text('pre_up').default('').notNull(),
postDown: text('post_down').default('').notNull(), postUp: text('post_up').default('').notNull(),
privateKey: text('private_key').notNull(), preDown: text('pre_down').default('').notNull(),
publicKey: text('public_key').notNull(), postDown: text('post_down').default('').notNull(),
preSharedKey: text('pre_shared_key').notNull(), privateKey: text('private_key').notNull(),
expiresAt: text('expires_at'), publicKey: text('public_key').notNull(),
allowedIps: text('allowed_ips', { mode: 'json' }).$type<string[]>(), preSharedKey: text('pre_shared_key').notNull(),
serverAllowedIps: text('server_allowed_ips', { mode: 'json' }) expiresAt: text('expires_at'),
.$type<string[]>() allowedIps: text('allowed_ips', { mode: 'json' }).$type<string[]>(),
.notNull(), serverAllowedIps: text('server_allowed_ips', { mode: 'json' })
// Firewall-enforced allowed IPs (null = use allowedIps) .$type<string[]>()
firewallIps: text('firewall_ips', { mode: 'json' }).$type<string[] | null>(), .notNull(),
persistentKeepalive: int('persistent_keepalive').notNull(), // Firewall-enforced allowed IPs (null = use allowedIps)
mtu: int().notNull(), firewallIps: text('firewall_ips', { mode: 'json' }).$type<
jC: int('j_c'), string[] | null
jMin: int('j_min'), >(),
jMax: int('j_max'), persistentKeepalive: int('persistent_keepalive').notNull(),
i1: text(), mtu: int().notNull(),
i2: text(), jC: int('j_c'),
i3: text(), jMin: int('j_min'),
i4: text(), jMax: int('j_max'),
i5: text(), i1: text(),
dns: text({ mode: 'json' }).$type<string[]>(), i2: text(),
serverEndpoint: text('server_endpoint'), i3: text(),
enabled: int({ mode: 'boolean' }).notNull(), i4: text(),
createdAt: text('created_at') i5: text(),
.notNull() dns: text({ mode: 'json' }).$type<string[]>(),
.default(sql`(CURRENT_TIMESTAMP)`), serverEndpoint: text('server_endpoint'),
updatedAt: text('updated_at') enabled: int({ mode: 'boolean' }).notNull(),
.notNull() createdAt: text('created_at')
.default(sql`(CURRENT_TIMESTAMP)`) .notNull()
.$onUpdate(() => sql`(CURRENT_TIMESTAMP)`), .default(sql`(CURRENT_TIMESTAMP)`),
}); updatedAt: text('updated_at')
.notNull()
.default(sql`(CURRENT_TIMESTAMP)`)
.$onUpdate(() => sql`(CURRENT_TIMESTAMP)`),
},
(table) => [
uniqueIndex('public_key_interface_unique').on(
table.publicKey,
table.interfaceId
),
]
);
export const clientsRelations = relations(client, ({ one }) => ({ export const clientsRelations = relations(client, ({ one }) => ({
oneTimeLink: one(oneTimeLink, { oneTimeLink: one(oneTimeLink, {

2
src/server/database/repositories/hooks/schema.ts

@ -1,7 +1,7 @@
import { sql } from 'drizzle-orm'; import { sql } from 'drizzle-orm';
import { sqliteTable, text } from 'drizzle-orm/sqlite-core'; import { sqliteTable, text } from 'drizzle-orm/sqlite-core';
import { wgInterface } from '#db/repositories/interface/schema'; import { wgInterface } from '../interface/schema';
export const hooks = sqliteTable('hooks_table', { export const hooks = sqliteTable('hooks_table', {
/** same as `wgInterface.name` */ /** same as `wgInterface.name` */

4
src/server/database/repositories/interface/schema.ts

@ -1,8 +1,8 @@
import { sql, relations } from 'drizzle-orm'; import { sql, relations } from 'drizzle-orm';
import { int, sqliteTable, text } from 'drizzle-orm/sqlite-core'; import { int, sqliteTable, text } from 'drizzle-orm/sqlite-core';
import { hooks } from '#db/repositories/hooks/schema'; import { hooks } from '../hooks/schema';
import { userConfig } from '#db/repositories/userConfig/schema'; import { userConfig } from '../userConfig/schema';
// maybe support multiple interfaces in the future // maybe support multiple interfaces in the future
export const wgInterface = sqliteTable('interfaces_table', { export const wgInterface = sqliteTable('interfaces_table', {

2
src/server/database/repositories/oneTimeLink/schema.ts

@ -1,7 +1,7 @@
import { sql, relations } from 'drizzle-orm'; import { sql, relations } from 'drizzle-orm';
import { int, sqliteTable, text } from 'drizzle-orm/sqlite-core'; import { int, sqliteTable, text } from 'drizzle-orm/sqlite-core';
import { client } from '#db/repositories/client/schema'; import { client } from '../client/schema';
export const oneTimeLink = sqliteTable('one_time_links_table', { export const oneTimeLink = sqliteTable('one_time_links_table', {
/** same as `client.id` */ /** same as `client.id` */

5
src/server/database/repositories/user/schema.ts

@ -1,7 +1,8 @@
import { sql, relations } from 'drizzle-orm'; import { sql, relations } from 'drizzle-orm';
import { int, sqliteTable, text, uniqueIndex } from 'drizzle-orm/sqlite-core'; import { int, sqliteTable, text, uniqueIndex } from 'drizzle-orm/sqlite-core';
import { client } from '#db/repositories/client/schema'; import { client } from '../client/schema';
import type { Role } from '#shared/utils/permissions'; import type { Role } from '#shared/utils/permissions';
import type { OAUTH_PROVIDER } from '#server/utils/oauth'; import type { OAUTH_PROVIDER } from '#server/utils/oauth';
@ -12,7 +13,7 @@ export const user = sqliteTable(
username: text().notNull().unique(), username: text().notNull().unique(),
/** `password == null` means password login disabled */ /** `password == null` means password login disabled */
password: text(), password: text(),
email: text(), email: text().unique(),
name: text().notNull(), name: text().notNull(),
role: int().$type<Role>().notNull(), role: int().$type<Role>().notNull(),
totpKey: text('totp_key'), totpKey: text('totp_key'),

2
src/server/database/repositories/userConfig/schema.ts

@ -1,7 +1,7 @@
import { sql } from 'drizzle-orm'; import { sql } from 'drizzle-orm';
import { int, sqliteTable, text } from 'drizzle-orm/sqlite-core'; import { int, sqliteTable, text } from 'drizzle-orm/sqlite-core';
import { wgInterface } from '#db/repositories/interface/schema'; import { wgInterface } from '../interface/schema';
// default* means clients store it themselves // default* means clients store it themselves
export const userConfig = sqliteTable('user_configs_table', { export const userConfig = sqliteTable('user_configs_table', {

15
src/server/database/schema.ts

@ -1,7 +1,8 @@
export * from '#db/repositories/client/schema'; // ! Do not use Path Aliases in this or any of these files
export * from '#db/repositories/general/schema'; export * from './repositories/client/schema';
export * from '#db/repositories/hooks/schema'; export * from './repositories/general/schema';
export * from '#db/repositories/interface/schema'; export * from './repositories/hooks/schema';
export * from '#db/repositories/oneTimeLink/schema'; export * from './repositories/interface/schema';
export * from '#db/repositories/user/schema'; export * from './repositories/oneTimeLink/schema';
export * from '#db/repositories/userConfig/schema'; export * from './repositories/user/schema';
export * from './repositories/userConfig/schema';

1
src/server/database/sqlite.ts

@ -69,6 +69,7 @@ async function migrate() {
if (e instanceof Error) { if (e instanceof Error) {
DB_DEBUG('Failed to migrate database:', e.message); DB_DEBUG('Failed to migrate database:', e.message);
} }
throw e;
} }
} }

13
src/server/utils/Database.ts

@ -17,9 +17,14 @@ const nullObject = new Proxy(
// eslint-disable-next-line import/no-mutable-exports // eslint-disable-next-line import/no-mutable-exports
let provider = nullObject as never as DBServiceType; let provider = nullObject as never as DBServiceType;
connect().then((db) => { connect()
provider = db; .then((db) => {
WireGuard.Startup(); provider = db;
}); WireGuard.Startup();
})
.catch((err) => {
console.log('Failed to connect to Database:', err);
process.exit(1);
});
export default provider; export default provider;

Loading…
Cancel
Save