Browse Source

separate route for onboarding

pull/1355/head
Bernd Storath 10 months ago
parent
commit
08dce4393f
  1. 2
      src/app/stores/auth.ts
  2. 4
      src/app/utils/api.ts
  3. 8
      src/server/api/account/create.post.ts
  4. 24
      src/server/api/account/new.post.ts
  5. 15
      src/server/api/account/setup.post.ts
  6. 3
      src/server/middleware/session.ts
  7. 11
      src/server/middleware/setup.ts
  8. 4
      src/services/database/lowdb.ts
  9. 5
      src/services/database/repositories/database.ts
  10. 2
      src/services/database/repositories/user.ts

2
src/app/stores/auth.ts

@ -5,7 +5,7 @@ export const useAuthStore = defineStore('Auth', () => {
* @throws if unsuccessful
*/
async function signup(username: string, password: string) {
const response = await api.createAccount({ username, password });
const response = await api.setupAccount({ username, password });
return response.success;
}

4
src/app/utils/api.ts

@ -128,14 +128,14 @@ class API {
});
}
async createAccount({
async setupAccount({
username,
password,
}: {
username: string;
password: string;
}) {
return $fetch('/api/account/new', {
return $fetch('/api/account/setup', {
method: 'post',
body: { username, password },
});

8
src/server/api/account/create.post.ts

@ -0,0 +1,8 @@
export default defineEventHandler(async (event) => {
const { username, password } = await readValidatedBody(
event,
validateZod(passwordType)
);
await Database.createUser(username, password);
return { success: true };
});

24
src/server/api/account/new.post.ts

@ -1,24 +0,0 @@
import { DatabaseError } from '~~/services/database/repositories/database';
export default defineEventHandler(async (event) => {
setHeader(event, 'Content-Type', 'application/json');
try {
const { username, password } = await readValidatedBody(
event,
validateZod(passwordType)
);
await Database.newUserWithPassword(username, password);
return { success: true };
} catch (error) {
if (error instanceof DatabaseError) {
const t = await useTranslation(event);
throw createError({
statusCode: 400,
statusMessage: t(error.message),
message: error.message,
});
} else {
throw createError('Something happened !');
}
}
});

15
src/server/api/account/setup.post.ts

@ -0,0 +1,15 @@
export default defineEventHandler(async (event) => {
const { username, password } = await readValidatedBody(
event,
validateZod(passwordType)
);
const users = await Database.getUsers();
if (users.length !== 0) {
throw createError({
statusCode: 400,
statusMessage: 'Invalid state',
});
}
await Database.createUser(username, password);
return { success: true };
});

3
src/server/middleware/session.ts

@ -2,8 +2,7 @@ export default defineEventHandler(async (event) => {
const url = getRequestURL(event);
if (
!url.pathname.startsWith('/api/') ||
// TODO: only allowed on onboarding!
url.pathname === '/api/account/new' ||
url.pathname === '/api/account/setup' ||
url.pathname === '/api/session' ||
url.pathname === '/api/lang' ||
url.pathname === '/api/release' ||

11
src/server/middleware/setup.ts

@ -3,16 +3,21 @@ export default defineEventHandler(async (event) => {
const url = getRequestURL(event);
if (
url.pathname.startsWith('/setup') ||
url.pathname === '/api/account/new' ||
url.pathname === '/setup' ||
url.pathname === '/api/account/setup' ||
url.pathname === '/api/features'
) {
return;
}
const users = await Database.getUsers();
// TODO: better error messages for api requests
if (users.length === 0) {
if (url.pathname.startsWith('/api/')) {
throw createError({
statusCode: 400,
statusMessage: 'Invalid State',
});
}
return sendRedirect(event, '/setup', 302);
}
});

4
src/services/database/lowdb.ts

@ -75,8 +75,8 @@ export default class LowDB extends DatabaseProvider {
return this.#db.data.users.find((user) => user.id === id);
}
async newUserWithPassword(username: string, password: string) {
DEBUG('New User');
async createUser(username: string, password: string) {
DEBUG('Create User');
// TODO: should be handled by zod. completely remove database error
if (username.length < 8) {

5
src/services/database/repositories/database.ts

@ -46,10 +46,7 @@ export abstract class DatabaseProvider
abstract getUsers(): Promise<User[]>;
abstract getUser(id: string): Promise<User | undefined>;
abstract newUserWithPassword(
username: string,
password: string
): Promise<void>;
abstract createUser(username: string, password: string): Promise<void>;
abstract updateUser(user: User): Promise<void>;
abstract deleteUser(id: string): Promise<void>;

2
src/services/database/repositories/user.ts

@ -39,7 +39,7 @@ export interface UserRepository {
*/
getUser(id: string): Promise<User | undefined>;
newUserWithPassword(username: string, password: string): Promise<void>;
createUser(username: string, password: string): Promise<void>;
/**
* Updates a user in the database.

Loading…
Cancel
Save