Skip to content

Commit

Permalink
Merge pull request #72 from infinitybase/staging
Browse files Browse the repository at this point in the history
Staging
  • Loading branch information
guimroque authored Feb 23, 2024
2 parents 907f68e + 066befa commit bbdd56b
Show file tree
Hide file tree
Showing 34 changed files with 154 additions and 169 deletions.
5 changes: 3 additions & 2 deletions .env
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,14 @@ API_PORT=3333
API_NAME=bsafe-api
API_DOCKERFILE=
API_ENVIRONMENT=development
UI_URL=http://localhost:5175
#UI_URL=http://localhost:5175
UI_URL=https://app.bsafe.pro
API_URL=http://localhost:3333

# Admin user
APP_ADMIN_EMAIL=admin_user_email
APP_ADMIN_PASSWORD=admin_user_password

TOKEN_EXPIRATION_TIME=15

# ADMIN USER
APP_ADMIN_EMAIL=admin_user_email
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ yarn.lock
package-lock.json
.editorconfig
bsafe/
pnpm-lock.yaml

#env
.env.staging
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile.stg
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM node:18.14.2
FROM node:18.18.2


# Create app directory
Expand Down
6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,24 +18,24 @@
"database:dev": "make -C ./docker/database start env_file=.env.dev",
"database:stop": "make -C ./docker/database start",
"database:start": "make -C ./docker/database start",
"postinstall": "patch-package --use-yarn",
"run:prod": "make -C ./ prod env_file=.env.prod",
"run:stg": "make -C ./ stg env_file=.env.staging"
},
"dependencies": {
"axios": "1.5.1",
"bcrypt": "5.1.0",
"body-parser": "1.20.2",
"bsafe": "0.0.35",
"bsafe": "0.0.43",
"cheerio": "1.0.0-rc.12",
"class-validator": "0.14.0",
"cookie-parser": "1.4.6",
"copyfiles": "2.4.1",
"cors": "2.8.5",
"date-fns": "2.30.0",
"dotenv": "8.2.0",
"dotenv": "16.4.5",
"express": "4.17.1",
"express-joi-validation": "5.0.0",
"fuels": "0.73.0",
"joi": "17.4.0",
"jsonwebtoken": "9.0.1",
"morgan": "1.10.0",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
import { MigrationInterface, QueryRunner, Table, TableColumn } from 'typeorm';
import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm';

const cProvider = new TableColumn({
name: 'provider',
type: 'varchar',
});

const cUsers = new TableColumn({
name: 'address',
type: 'varchar',
});

export class addParoviderAndConnectedToUsers1695162520664
implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.addColumns('users', [
new TableColumn({
name: 'address',
type: 'varchar',
}),
new TableColumn({
name: 'provider',
type: 'varchar',
}),
]);
await queryRunner.addColumns('users', [cProvider, cUsers]);
}

public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropColumns('users', ['connected_users', 'provider']);
await queryRunner.dropColumns('users', [cProvider, cUsers]);
}
}
38 changes: 18 additions & 20 deletions src/database/migrations/1695163991051-add-collumns-to-usertoken.ts
Original file line number Diff line number Diff line change
@@ -1,29 +1,27 @@
import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm';

const cExpired = new TableColumn({
name: 'expired_at',
type: 'timestamp',
isNullable: true,
});

const cEncoder = new TableColumn({
name: 'encoder',
type: 'varchar',
});

const cProvider = new TableColumn({
name: 'provider',
type: 'varchar',
});

export class addCollumnsToUsertoken1695163991051 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.addColumns('user_tokens', [
new TableColumn({
name: 'expired_at',
type: 'timestamp',
isNullable: true,
}),
new TableColumn({
name: 'encoder',
type: 'varchar',
}),
new TableColumn({
name: 'provider',
type: 'varchar',
}),
]);
await queryRunner.addColumns('user_tokens', [cExpired, cEncoder, cProvider]);
}

public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropColumns('user_tokens', [
'expired_at',
'encoder',
'provider',
]);
await queryRunner.dropColumns('user_tokens', [cExpired, cEncoder, cProvider]);
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm';

const cpayload = new TableColumn({
name: 'payload',
type: 'text',
});
export class addCollumnToUserToken1695646779754 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.addColumns('user_tokens', [
new TableColumn({
name: 'payload',
type: 'text',
}),
]);
await queryRunner.addColumns('user_tokens', [cpayload]);
}

public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropColumns('user_tokens', ['payload']);
await queryRunner.dropColumns('user_tokens', [cpayload]);
}
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,24 @@
import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm';

const cnotify = new TableColumn({
name: 'notify',
type: 'boolean',
default: false,
});

const cFirstLogin = new TableColumn({
name: 'first_login',
type: 'boolean',
default: true,
});

export class addNotificationsColumnsToUsersTable1702391257625
implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.addColumns('users', [
new TableColumn({
name: 'first_login',
type: 'boolean',
default: true,
}),
new TableColumn({
name: 'notify',
type: 'boolean',
default: false,
}),
]);
await queryRunner.addColumns('users', [cFirstLogin, cnotify]);
}

public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropColumns('users', ['first_login', 'notify']);
await queryRunner.dropColumns('users', [cnotify, cFirstLogin]);
}
}
6 changes: 6 additions & 0 deletions src/middlewares/auth/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,10 @@ export interface AuthValidatedRequest<T extends ValidatedRequestSchema>
workspace?: Workspace;
}

export interface UnloggedRequest<T extends ValidatedRequestSchema> extends Request {
body: T[ContainerTypes.Body];
headers: T[ContainerTypes.Headers];
}

export type IAuthRequest = AuthValidatedRequest<ValidatedRequestSchema>;
export type IChangeWorkspaceRequest = AuthValidatedRequest<ValidatedRequestSchema>;
44 changes: 35 additions & 9 deletions src/modules/addressBook/controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -149,20 +149,46 @@ export class AddressBookController {

try {
const owner = [workspace.id];
if (includePersonal) {
await new WorkspaceService()
.filter({
user: user.id,
single: true,
})
.list()
.then((response: Workspace[]) => owner.push(response[0].id));
const singleWk = await new WorkspaceService()
.filter({
user: user.id,
single: true,
})
.list()
.then((response: Workspace[]) => response[0].id);

if (includePersonal === 'true') {
owner.push(singleWk);
}

const response = await this.addressBookService
.filter({ owner, q })
.ordination({ orderBy, sort })
.paginate({ page, perPage })
.list();
.list()
.then((res: AddressBook[]) => {
return res.reduce((acc, currentItem) => {
const existingItem = acc.find(
item => item.user.id === currentItem.user.id,
);

if (!existingItem) {
acc.push(currentItem);
return acc;
}
// Se já existe, retornar de preferencia o que tem o wk igual ao single
if (
currentItem.owner.id === (includePersonal ? singleWk : workspace.id)
) {
const existingIndex = acc.findIndex(
item => item.user.id === currentItem.user.id,
);
acc[existingIndex] = currentItem;
}

return acc;
}, []);
});

return successful(response, Responses.Ok);
} catch (e) {
Expand Down
8 changes: 7 additions & 1 deletion src/modules/addressBook/services.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,13 @@ export class AddressBookService implements IAddressBookService {
.select(['ab.id', 'ab.nickname'])
.innerJoin('ab.user', 'user')
.innerJoin('ab.owner', 'owner')
.addSelect(['user.id', 'user.address', 'user.avatar', 'owner.id']);
.addSelect([
'user.id',
'user.address',
'user.avatar',
'user.address',
'owner.id',
]);

const handleInternalError = e => {
if (e instanceof GeneralError) throw e;
Expand Down
2 changes: 1 addition & 1 deletion src/modules/addressBook/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ interface IListAddressBookRequestSchema extends ValidatedRequestSchema {
sort: Sort;
page: string;
perPage: string;
includePersonal: boolean;
includePersonal: string;
};
}

Expand Down
13 changes: 0 additions & 13 deletions src/modules/auth/controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,6 @@ import { add, addMinutes } from 'date-fns';
import { Encoder } from '@src/models';
import { Workspace } from '@src/models/Workspace';
import GeneralError, { ErrorTypes } from '@src/utils/error/GeneralError';
import {
Unauthorized,
UnauthorizedErrorTitles,
} from '@src/utils/error/Unauthorized';

import { IAuthRequest } from '@middlewares/auth/types';

Expand Down Expand Up @@ -89,7 +85,6 @@ export class AuthController {
async updateWorkspace(req: IChangeWorkspaceRequest) {
try {
const { workspace: workspaceId, user } = req.body;

const workspace = await new WorkspaceService()
.filter({ id: workspaceId })
.list()
Expand All @@ -104,14 +99,6 @@ export class AuthController {

const isUserMember = workspace.members.find(m => m.id === user);

// if (!isUserMember) {
// throw new Unauthorized({
// type: ErrorTypes.NotFound,
// title: UnauthorizedErrorTitles.INVALID_PERMISSION,
// detail: `User not found`,
// });
// }

const token = await this.authService.findToken({
userId: user,
});
Expand Down
5 changes: 3 additions & 2 deletions src/modules/auth/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { IPermissions, Workspace } from '@src/models/Workspace';
import UserToken, { Encoder } from '@models/UserToken';
import { User } from '@models/index';

import { AuthValidatedRequest } from '@middlewares/auth/types';
import { AuthValidatedRequest, UnloggedRequest } from '@middlewares/auth/types';

export interface ICreateUserTokenPayload {
token: string;
Expand Down Expand Up @@ -93,7 +93,8 @@ export interface IUpgradeWorkspace extends ValidatedRequestSchema {
}

export type IListRequest = AuthValidatedRequest<IListRequestSchema>;
export type ISignInRequest = AuthValidatedRequest<ISignInRequestSchema>;
export type ISignInRequest = UnloggedRequest<ISignInRequestSchema>;
export type IGoToSingleWorkspaceRequest = AuthValidatedRequest<ValidatedRequestSchema>;
export type IFindDappRequest = AuthValidatedRequest<IFindDappRequestSchema>;
export type IActiveSession = AuthValidatedRequest<IActiveSessionRequestSchema>;
export type IChangeWorkspaceRequest = AuthValidatedRequest<IUpgradeWorkspace>;
Expand Down
3 changes: 2 additions & 1 deletion src/modules/notification/routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,11 @@ import { NotificationService } from './services';
const router = Router();
const notificationService = new NotificationService();
const { readAll, list } = new NotificationController(notificationService);
const { MAIL_TESTING_NOTIFICATIONS } = process.env;

// ENDPOINT TO VALIDATE EMAIL SENDING
router.get('/mail', async (_, res) => {
const to = '[email protected]';
const to = MAIL_TESTING_NOTIFICATIONS;
const data = {
summary: {
vaultName: 'Vault Name',
Expand Down
17 changes: 2 additions & 15 deletions src/modules/predicate/controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,24 +120,11 @@ export class PredicateController {
}
}

async findById({ params: { id }, user, workspace }: IFindByIdRequest) {
async findById({ params: { id }, user }: IFindByIdRequest) {
try {
const predicate = await this.predicateService.findById(id, user.address);
const membersIds = predicate.members.map(member => member.id);
const favorites = (await this.addressBookService
.filter({ owner: [workspace.id], userIds: membersIds })
.list()) as AddressBook[];
const response = {
...predicate,
members: predicate.members.map(member => ({
...member,
nickname:
favorites?.find(({ user }) => user.id === member.id)?.nickname ??
undefined,
})),
};

return successful(response, Responses.Ok);
return successful(predicate, Responses.Ok);
} catch (e) {
return error(e.error, e.statusCode);
}
Expand Down
2 changes: 2 additions & 0 deletions src/modules/predicate/services.ts
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,8 @@ export class PredicateService implements IPredicateService {
if (this._filter.signer) {
qb.orWhere(subQb => {
const subQuery = subQb
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
//@ts-ignore
.subQuery()
.select('1')
.from('predicate_members', 'pm')
Expand Down
Loading

0 comments on commit bbdd56b

Please sign in to comment.