Skip to content

Commit

Permalink
feat(com-api): make root user in first time
Browse files Browse the repository at this point in the history
  • Loading branch information
AliMD authored and njfamirm committed May 18, 2023
1 parent 244b418 commit 3e15c35
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 25 deletions.
1 change: 1 addition & 0 deletions uniquely/com-api/src/index.ts
Original file line number Diff line number Diff line change
@@ -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';
Expand Down
27 changes: 27 additions & 0 deletions uniquely/com-api/src/lib/patch-user.ts
Original file line number Diff line number Diff line change
@@ -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<ComUser> => {
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;
};
31 changes: 31 additions & 0 deletions uniquely/com-api/src/root-user.ts
Original file line number Diff line number Diff line change
@@ -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<void> => {
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();
37 changes: 12 additions & 25 deletions uniquely/com-api/src/route/patch-user.ts
Original file line number Diff line number Diff line change
@@ -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';
Expand All @@ -13,31 +13,18 @@ nanoServer.route<ComUser>('PATCH', '/user', async (connection) => {

const userData = await connection.requireJsonBody<ComUser>();

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,
Expand Down

0 comments on commit 3e15c35

Please sign in to comment.