Browse Source

migrate to sqlite

pull/1619/head
Bernd Storath 3 months ago
parent
commit
255f55cea1
  1. 8
      src/app/stores/modal.ts
  2. 13
      src/app/utils/api.ts
  3. 4
      src/i18n/locales/en.json
  4. 6
      src/server/api/admin/general.get.ts
  5. 6
      src/server/api/admin/general.post.ts
  6. 8
      src/server/api/admin/hostport.post.ts
  7. 7
      src/server/api/admin/interface.get.ts
  8. 2
      src/server/api/client/[clientId]/index.get.ts
  9. 3
      src/server/database/migrations/0001_classy_the_stranger.sql
  10. 3
      src/server/database/repositories/client/types.ts
  11. 11
      src/server/database/repositories/general/service.ts
  12. 9
      src/server/database/repositories/general/types.ts
  13. 2
      src/server/utils/types.ts

8
src/app/stores/modal.ts

@ -9,11 +9,13 @@ export const useModalStore = defineStore('Modal', () => {
function createClient() {
const name = clientCreateName.value;
const expireDate = clientExpireDate.value || null;
const expiresAt = clientExpireDate.value || null;
if (!name) return;
api
.createClient({ name, expireDate })
$fetch('/api/client', {
method: 'post',
body: { name, expiresAt },
})
.catch((err) => alert(err.message || err.toString()))
.finally(() => clientsStore.refresh().catch(console.error));
}

13
src/app/utils/api.ts

@ -5,19 +5,6 @@ class API {
});
}
async createClient({
name,
expireDate,
}: {
name: string;
expireDate: string | null;
}) {
return $fetch('/api/client', {
method: 'post',
body: { name, expireDate },
});
}
async restoreConfiguration(file: string) {
return $fetch('/api/wireguard/restore', {
method: 'put',

4
src/i18n/locales/en.json

@ -52,7 +52,6 @@
"statBool": "enabled must be a valid boolean",
"statNumber": "chartType must be a valid number",
"body": "Body must be a valid object",
"sessionTimeout": "Session Timeout must be a valid number",
"device": "Device must be a valid string",
"deviceMin": "Device must be at least 1 Character",
"hook": "Hook must be a valid string",
@ -98,6 +97,9 @@
"port": "Port must be a valid number",
"portMin": "Port must be at least 1",
"portMax": "Port must be at most 65535"
},
"general": {
"sessionTimeout": "Session Timeout must be a valid number"
}
},
"name": "Name",

6
src/server/api/admin/general.get.ts

@ -1,4 +1,6 @@
export default defineEventHandler(async () => {
const system = await Database.system.get();
return system.general;
const sessionConfig = await Database.general.getSessionConfig();
return {
sessionTimeout: sessionConfig.sessionTimeout,
};
});

6
src/server/api/admin/general.post.ts

@ -1,8 +1,10 @@
import { GeneralUpdateSchema } from '#db/repositories/general/types';
export default defineEventHandler(async (event) => {
const data = await readValidatedBody(
event,
validateZod(generalUpdateType, event)
validateZod(GeneralUpdateSchema, event)
);
await Database.system.updateGeneral(data);
await Database.general.update(data);
return { success: true };
});

8
src/server/api/admin/hostport.post.ts

@ -1,8 +0,0 @@
export default defineEventHandler(async (event) => {
const { host, port } = await readValidatedBody(
event,
validateZod(hostPortType, event)
);
await Database.system.updateClientsHostPort(host, port);
return { success: true };
});

7
src/server/api/admin/interface.get.ts

@ -1,4 +1,7 @@
export default defineEventHandler(async () => {
const system = await Database.system.get();
return system.interface;
const wgInterface = await Database.interfaces.get('wg0');
return {
...wgInterface,
privateKey: undefined,
};
});

2
src/server/api/client/[clientId]/index.get.ts

@ -5,7 +5,7 @@ export default definePermissionEventHandler(
async ({ event }) => {
const { clientId } = await getValidatedRouterParams(
event,
validateZod(ClientGetSchema)
validateZod(ClientGetSchema, event)
);
const result = await Database.clients.get(clientId);
if (!result) {

3
src/server/database/migrations/0001_classy_the_stranger.sql

@ -13,3 +13,6 @@ VALUES (
'',
'iptables -t nat -D POSTROUTING -s {{ipv4Cidr}} -o {{device}} -j MASQUERADE; iptables -D INPUT -p udp -m udp --dport {{port}} -j ACCEPT; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -s {{ipv6Cidr}} -o {{device}} -j MASQUERADE; ip6tables -D INPUT -p udp -m udp --dport {{port}} -j ACCEPT; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -D FORWARD -o wg0 -j ACCEPT;'
);
--> statement-breakpoint
INSERT INTO `user_configs_table` (`id`, `default_mtu`, `default_persistent_keepalive`, `default_dns`, `default_allowed_ips`, `host`, `port`)
VALUES ('wg0', 1420, 0, '["1.1.1.1","2606:4700:4700::1111"]', '["0.0.0.0/0","::/0"]', '', 51820)

3
src/server/database/repositories/client/types.ts

@ -96,7 +96,8 @@ export const ClientUpdateSchema = schemaForType<UpdateClientType>()(
})
);
const clientId = z.number({ message: 'zod.client.id' });
// TODO: investigate if coerce is bad
const clientId = z.number({ message: 'zod.client.id', coerce: true });
export const ClientGetSchema = z.object({
clientId: clientId,

11
src/server/database/repositories/general/service.ts

@ -1,6 +1,7 @@
import type { DBType } from '#db/sqlite';
import { sql } from 'drizzle-orm';
import { general } from './schema';
import type { GeneralUpdateType } from './types';
function createPreparedStatement(db: DBType) {
return {
@ -11,6 +12,12 @@ function createPreparedStatement(db: DBType) {
setupStep: sql.placeholder('setupStep') as never as number,
})
.prepare(),
update: db
.update(general)
.set({
sessionTimeout: sql.placeholder('sessionTimeout') as never as number,
})
.prepare(),
};
}
@ -54,4 +61,8 @@ export class GeneralService {
sessionTimeout: result.sessionTimeout,
};
}
update(data: GeneralUpdateType) {
return this.#statements.update.execute(data);
}
}

9
src/server/database/repositories/general/types.ts

@ -1,4 +1,13 @@
import type { InferSelectModel } from 'drizzle-orm';
import type { general } from './schema';
import z from 'zod';
export type GeneralType = InferSelectModel<typeof general>;
const sessionTimeout = z.number({ message: 'zod.general.sessionTimeout' });
export const GeneralUpdateSchema = z.object({
sessionTimeout: sessionTimeout,
});
export type GeneralUpdateType = z.infer<typeof GeneralUpdateSchema>;

2
src/server/utils/types.ts

@ -11,6 +11,8 @@ export const safeStringRefine = z
{ message: 'zod.stringMalformed' }
);
// TODO: create custom getValidatedRouterParams and readValidatedBody wrapper
export function validateZod<T>(
schema: ZodSchema<T>,
event?: H3Event<EventHandlerRequest>

Loading…
Cancel
Save