Browse Source

udpate: with repositories

pull/1330/head
tetuaoro 8 months ago
parent
commit
755be2d4e1
  1. 9
      src/server/api/lang.get.ts
  2. 12
      src/server/databases/entities/system.ts
  3. 29
      src/server/databases/entities/user.ts
  4. 15
      src/server/databases/providers/inmemory.ts
  5. 14
      src/server/databases/repositories/system.ts
  6. 24
      src/server/databases/repositories/user.ts
  7. 13
      src/server/utils/databases/InMemory.ts
  8. 14
      src/server/utils/repositories/SystemRepository.ts
  9. 11
      src/server/utils/repositories/UserRepository.ts

9
src/server/api/lang.get.ts

@ -1,10 +1,7 @@
export default defineEventHandler(async (event) => {
setHeader(event, 'Content-Type', 'application/json');
const system = await InMemory.getSystem();
if (system) {
const { lang } = system;
return lang;
}
return 'en';
const provider = InMemory; // TODO multiple provider
const lang = await SystemRepository.getLang(provider);
return lang;
});

12
src/server/databases/entities/system.ts

@ -72,3 +72,15 @@ type System = {
};
export default System;
/**
* Abstract class for system-related database operations.
* This class provides a method for retrieving system configuration data from the database.
*/
export abstract class SystemProvider {
/**
* Retrieves system data from the database.
* @returns {Promise<System | Undefined>} The system data or null if not found.
*/
abstract getSystem(): Promise<System | Undefined>;
}

29
src/server/databases/entities/user.ts

@ -1,3 +1,4 @@
import type { Identity, Undefined } from '../database';
import type { Address, Key, PassordHash } from './system';
export type ROLE = 'ADMIN';
@ -21,3 +22,31 @@ type User = {
};
export default User;
/**
* Abstract class for user-related database operations.
* This class provides methods for retrieving and saving user data.
*/
export abstract class UserProvider {
/**
* Retrieves all users from the database.
* @returns {Promise<Array<User>>} The array of users data.
*/
abstract getUsers(): Promise<Array<User>>;
/**
* Retrieves a user by their ID or by User structure from the database.
* @param {Identity<User>} id - The ID of the user or a user.
* @returns {Promise<User | Undefined>} The user data or null if not found.
*/
abstract getUser(id: Identity<User>): Promise<User | Undefined>;
/**
* Creates or Updates a user in the database.
* @param {User} user - The user to be saved.
*
* **Note:** If the user already exists, this method will update their details.
* If the user does not exist, it will create a new user entry.
*/
abstract saveUser(user: User): Promise<void>;
}

15
src/server/databases/providers/inmemory.ts

@ -1,11 +1,11 @@
import type { SessionConfig } from 'h3';
import type { Identity } from '../database';
import type UserRepository from '../repositories/user';
import type SystemRepository from '../repositories/system';
import type System from '../entities/system';
import type User from '../entities/user';
import type { UserProvider } from '../entities/user';
import type { SystemProvider } from '../entities/system';
import type DatabaseProvider from '../database';
import DatabaseProvider from '../database';
import { ChartType } from '../entities/system';
import debug from 'debug';
@ -21,8 +21,7 @@ type InMemoryData = {
// In-Memory Database Provider
export default class InMemoryDP
extends DatabaseProvider
implements UserRepository, SystemRepository
implements DatabaseProvider, UserProvider, SystemProvider
{
private data: InMemoryData = { users: [] };
@ -78,7 +77,7 @@ export default class InMemoryDP
}
async disconnect() {
// TODO
this.data = { users: [] };
}
async getSystem() {
@ -91,6 +90,10 @@ export default class InMemoryDP
this.data.system = system;
}
async getUsers() {
return this.data.users;
}
async getUser(id: Identity<User>) {
INMDP_DEBUG('Get User');
if (typeof id === 'string') {

14
src/server/databases/repositories/system.ts

@ -1,14 +0,0 @@
import type { Undefined } from '../database';
import type System from '../entities/system';
/**
* Abstract class for system-related database operations.
* This class provides a method for retrieving system configuration data from the database.
*/
export default abstract class SystemRepository {
/**
* Retrieves system data from the database.
* @returns {Promise<System | Undefined>} The system data or null if not found.
*/
abstract getSystem(): Promise<System | Undefined>;
}

24
src/server/databases/repositories/user.ts

@ -1,24 +0,0 @@
import type User from '../entities/user';
import type { Identity, Undefined } from '../database';
/**
* Abstract class for user-related database operations.
* This class provides methods for retrieving and saving user data.
*/
export default abstract class UserRepository {
/**
* Retrieves a user by their ID or by User structure from the database.
* @param {Identity<User>} id - The ID of the user or a user.
* @returns {Promise<User | Undefined>} The user data or null if not found.
*/
abstract getUser(id: Identity<User>): Promise<User | Undefined>;
/**
* Creates or Updates a user in the database.
* @param {User} user - The user to be saved.
*
* **Note:** If the user already exists, this method will update their details.
* If the user does not exist, it will create a new user entry.
*/
abstract saveUser(user: User): Promise<void>;
}

13
src/server/utils/databases/InMemory.ts

@ -1,17 +1,12 @@
import InMemoryDP from '@/server/databases/providers/inmemory';
const provider = new InMemoryDP(); // TODO manage multiple providers
const provider = new InMemoryDP(); // TODO multiple providers
provider.connect().catch((err) => {
console.error(err);
provider
.disconnect()
.catch((err) => {
console.error(err);
})
.finally(() => {
process.exit(1);
});
provider.disconnect().catch((err) => {
console.error(err);
});
});
export default provider;

14
src/server/utils/repositories/SystemRepository.ts

@ -0,0 +1,14 @@
import type { Lang, SystemProvider } from '@/server/databases/entities/system';
class SystemRepository {
async getLang(provider: SystemProvider): Promise<Lang> {
const _system = await provider.getSystem();
if (_system) {
const { lang } = _system;
return lang;
}
return 'en';
}
}
export default new SystemRepository();

11
src/server/utils/repositories/UserRepository.ts

@ -0,0 +1,11 @@
import type User from '@/server/databases/entities/user';
import type { UserProvider } from '@/server/databases/entities/user';
import type { Undefined } from '@/server/databases/database';
class UserRepository {
newUser(db: UserProvider): Promise<User | Undefined> {
return db.getUser('');
}
}
export default new UserRepository();
Loading…
Cancel
Save