From 3e15c3509b59152892d692cf0c8b5b37068460ad Mon Sep 17 00:00:00 2001 From: Ali Mihandoost Date: Sat, 13 May 2023 20:43:38 +0330 Subject: [PATCH] feat(com-api): make root user in first time --- uniquely/com-api/src/index.ts | 1 + uniquely/com-api/src/lib/patch-user.ts | 27 +++++++++++++++++ uniquely/com-api/src/root-user.ts | 31 ++++++++++++++++++++ uniquely/com-api/src/route/patch-user.ts | 37 ++++++++---------------- 4 files changed, 71 insertions(+), 25 deletions(-) create mode 100644 uniquely/com-api/src/lib/patch-user.ts create mode 100644 uniquely/com-api/src/root-user.ts diff --git a/uniquely/com-api/src/index.ts b/uniquely/com-api/src/index.ts index ddb343c57..d52fe15ff 100644 --- a/uniquely/com-api/src/index.ts +++ b/uniquely/com-api/src/index.ts @@ -1,4 +1,5 @@ import {logger} from './lib/config.js'; +import './root-user.js'; import './route/home.js'; import './route/patch-price-list.js'; import './route/patch-product-list.js'; diff --git a/uniquely/com-api/src/lib/patch-user.ts b/uniquely/com-api/src/lib/patch-user.ts new file mode 100644 index 000000000..883657320 --- /dev/null +++ b/uniquely/com-api/src/lib/patch-user.ts @@ -0,0 +1,27 @@ +import {config} from './config.js'; +import {userFactory} from './crypto.js'; +import {storageClient, userStorage} from './storage.js'; + +import type {ComUser} from '@alwatr/type/src/customer-order-management.js'; + +export const patchUser = async (user: ComUser): Promise => { + if (user.id === 'new') { + user.id = userFactory.generateId(); + } + + user = await userStorage.set(user); + + const privateUserOrderListStorageName = config.privateStorage.userOrderList.replace('${userId}', user.id); + await storageClient.touch(privateUserOrderListStorageName); + + const userToken = userFactory.generateToken([user.id, user.lpe]); + + await storageClient.cacheApiResponse(config.publicStorage.userProfile.replace('${token}', userToken), user); + + await storageClient.link( + privateUserOrderListStorageName, + config.publicStorage.userOrderList.replace('${token}', userToken), + ); + + return user; +}; diff --git a/uniquely/com-api/src/root-user.ts b/uniquely/com-api/src/root-user.ts new file mode 100644 index 000000000..bb1f0c175 --- /dev/null +++ b/uniquely/com-api/src/root-user.ts @@ -0,0 +1,31 @@ +/** + * Create first root user when user storage is empty at the first time. + */ + +import {logger} from './lib/config.js'; +import {userFactory} from './lib/crypto.js'; +import {patchUser} from './lib/patch-user.js'; +import {userStorage} from './lib/storage.js'; + +const initRootUser = async (): Promise => { + if ((await userStorage.keys()).length === 0) { + logger.logMethod?.('init-root-user'); + + const rootUser = await patchUser({ + id: 'new', + lpe: 1, + fullName: 'Alwatr Admin', + country: 'ir', + phoneNumber: 989123456789, + gender: 'male', + permissions: 'root', + }); + + logger.logProperty?.('rootUserAuth', { + id: rootUser.id, + token: userFactory.generateToken([rootUser.id, rootUser.lpe]), + }); + } +}; + +initRootUser(); diff --git a/uniquely/com-api/src/route/patch-user.ts b/uniquely/com-api/src/route/patch-user.ts index d1820e93c..317946862 100644 --- a/uniquely/com-api/src/route/patch-user.ts +++ b/uniquely/com-api/src/route/patch-user.ts @@ -1,7 +1,7 @@ -import {config, logger} from '../lib/config.js'; +import {logger} from '../lib/config.js'; import {userFactory} from '../lib/crypto.js'; +import {patchUser} from '../lib/patch-user.js'; import {nanoServer} from '../lib/server.js'; -import {storageClient, userStorage} from '../lib/storage.js'; import {validateUserAuth} from '../lib/validate-user-auth.js'; import type {ComUser} from '@alwatr/type/customer-order-management.js'; @@ -13,31 +13,18 @@ nanoServer.route('PATCH', '/user', async (connection) => { const userData = await connection.requireJsonBody(); - if (userData.id === 'new') { - userData.id = userFactory.generateId(); + if (userData.id != 'new') { + if (!userData.id || !userFactory.verifyId(userData.id)) { + // TODO: better validate user data. + return { + ok: false, + statusCode: 400, + errorCode: 'invalid_user_id', + }; + } } - else if (!userData.id || !userFactory.verifyId(userData.id)) { - // TODO: better validate user data. - return { - ok: false, - statusCode: 400, - errorCode: 'invalid_user_id', - }; - } - - const user = await userStorage.set(userData); - - const privateUserOrderListStorageName = config.privateStorage.userOrderList.replace('${userId}', user.id); - await storageClient.touch(privateUserOrderListStorageName); - - const userToken = userFactory.generateToken([user.id, user.lpe]); - - await storageClient.cacheApiResponse(config.publicStorage.userProfile.replace('${token}', userToken), user); - await storageClient.link( - privateUserOrderListStorageName, - config.publicStorage.userOrderList.replace('${token}', userToken), - ); + const user = await patchUser(userData); return { ok: true,