refactor(nestjs): auth module

This commit is contained in:
Ahmed Bouhuolia
2025-03-31 13:49:57 +02:00
parent ab717b96ac
commit 88f66f1c1c
62 changed files with 251 additions and 144 deletions

View File

@@ -1,3 +1,6 @@
# App
APP_JWT_SECRET=123123
# Mail
MAIL_HOST=
MAIL_USERNAME=

View File

@@ -1,3 +1,6 @@
# App
APP_JWT_SECRET=123123
# Mail
MAIL_HOST=
MAIL_USERNAME=

View File

@@ -10,6 +10,7 @@ import posthog from './posthog';
import stripePayment from './stripe-payment';
import signupConfirmation from './signup-confirmation';
import signupRestrictions from './signup-restrictions';
import jwt from './jwt';
export const config = [
systemDatabase,
@@ -24,4 +25,5 @@ export const config = [
stripePayment,
signupConfirmation,
signupRestrictions,
jwt,
];

View File

@@ -0,0 +1,5 @@
import { registerAs } from '@nestjs/config';
export default registerAs('jwt', () => ({
secret: process.env.APP_JWT_SECRET || '123123',
}));

View File

@@ -11,7 +11,7 @@ import {
import { AccountsApplication } from './AccountsApplication.service';
import { CreateAccountDTO } from './CreateAccount.dto';
import { EditAccountDTO } from './EditAccount.dto';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import { IAccountsFilter, IAccountsTransactionsFilter } from './Accounts.types';
import { ApiOperation, ApiParam, ApiResponse, ApiTags } from '@nestjs/swagger';

View File

@@ -1,21 +1,37 @@
import { Body, Controller, Param, Post, Request } from '@nestjs/common';
// @ts-nocheck
import {
Body,
Controller,
Param,
Post,
Request,
UseGuards,
} from '@nestjs/common';
import { ApiTags, ApiOperation, ApiBody, ApiParam } from '@nestjs/swagger';
import { PublicRoute } from './Jwt.guard';
import { JwtAuthGuard, PublicRoute } from './guards/Jwt.local';
import { AuthenticationApplication } from './AuthApplication.sevice';
import { AuthSignupDto } from './dtos/AuthSignup.dto';
import { AuthSigninDto } from './dtos/AuthSignin.dto';
import { LocalAuthGuard } from './guards/Local.guard';
import { JwtService } from '@nestjs/jwt';
import { AuthSigninService } from './commands/AuthSignin.service';
@ApiTags('Auth')
@Controller('/auth')
@PublicRoute()
export class AuthController {
constructor(private readonly authApp: AuthenticationApplication) {}
constructor(
private readonly authApp: AuthenticationApplication,
private readonly authSignin: AuthSigninService,
) {}
@Post('/signin')
@UseGuards(LocalAuthGuard)
@ApiOperation({ summary: 'Sign in a user' })
@ApiBody({ type: AuthSigninDto })
signin(@Request() req: Request, @Body() signinDto: AuthSigninDto) {
return this.authApp.signIn(signinDto);
const { user } = req;
return { access_token: this.authSignin.signToken(user) };
}
@Post('/signup')

View File

@@ -3,6 +3,12 @@ import { SystemUser } from '../System/models/SystemUser';
import { TenantModel } from '../System/models/TenantModel';
import { AuthSignupDto } from './dtos/AuthSignup.dto';
export interface JwtPayload {
sub: string;
iat: number;
exp: number;
}
export interface IAuthSignedInEventPayload {}
export interface IAuthSigningInEventPayload {}
export interface IAuthSignInPOJO {}

View File

@@ -1,8 +1,7 @@
import { Module } from '@nestjs/common';
import { AuthService } from './AuthService';
import { AuthController } from './Auth.controller';
import { JwtModule } from '@nestjs/jwt';
import { JwtStrategy } from './Jwt.strategy';
import { JwtStrategy } from './strategies/Jwt.strategy';
import { AuthenticationApplication } from './AuthApplication.sevice';
import { AuthSendResetPasswordService } from './commands/AuthSendResetPassword.service';
import { AuthResetPasswordService } from './commands/AuthResetPassword.service';
@@ -14,22 +13,32 @@ import { RegisterTenancyModel } from '../Tenancy/TenancyModels/Tenancy.module';
import { PasswordReset } from './models/PasswordReset';
import { TenantDBManagerModule } from '../TenantDBManager/TenantDBManager.module';
import { AuthenticationMailMesssages } from './AuthMailMessages.esrvice';
import { LocalStrategy } from './strategies/Local.strategy';
import { PassportModule } from '@nestjs/passport';
import { APP_GUARD } from '@nestjs/core';
import { JwtAuthGuard } from './guards/Jwt.local';
const models = [RegisterTenancyModel(PasswordReset)];
@Module({
controllers: [AuthController],
imports: [
PassportModule.register({ defaultStrategy: 'jwt' }),
JwtModule.register({
secret: 'asdfasdfasdf',
signOptions: { expiresIn: '60s' },
signOptions: {
expiresIn: '1d',
algorithm: 'HS384',
},
verifyOptions: {
algorithms: ['HS384'],
},
}),
TenantDBManagerModule,
...models,
],
exports: [...models],
providers: [
AuthService,
LocalStrategy,
JwtStrategy,
AuthenticationApplication,
AuthSendResetPasswordService,
@@ -39,6 +48,10 @@ const models = [RegisterTenancyModel(PasswordReset)];
AuthSignupService,
AuthSigninService,
AuthenticationMailMesssages,
{
provide: APP_GUARD,
useClass: JwtAuthGuard,
},
],
})
export class AuthModule {}

View File

@@ -26,8 +26,8 @@ export class AuthenticationApplication {
* @param {string} email - Email address.
* @param {string} password - Password.
*/
public async signIn(signinDto: AuthSigninDto) {
return this.authSigninService.signIn(signinDto);
public async signIn(email: string, password: string) {
return this.authSigninService.signin(email, password);
}
/**

View File

@@ -1,22 +0,0 @@
import { Inject, Injectable } from '@nestjs/common';
import { SystemUser } from '@/modules/System/models/SystemUser';
@Injectable()
export class AuthService {
constructor(
@Inject(SystemUser.name)
private readonly systemUserModel: typeof SystemUser,
) {}
async validateUser(username: string, pass: string): Promise<any> {
const user = await this.systemUserModel
.query()
.findOne({ email: username });
if (user && user.password === pass) {
const { password, ...result } = user;
return result;
}
return null;
}
}

View File

@@ -1,19 +0,0 @@
import { ExtractJwt, Strategy } from 'passport-jwt';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable } from '@nestjs/common';
import { jwtConstants } from './Auth.constants';
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor() {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: jwtConstants.secret,
});
}
async validate(payload: any) {
return { userId: payload.sub, username: payload.username };
}
}

View File

@@ -1,22 +1,67 @@
import { SystemUser } from '@/modules/System/models/SystemUser';
import { Inject, Injectable } from '@nestjs/common';
import { Inject, Injectable, UnauthorizedException } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { AuthSigninDto } from '../dtos/AuthSignin.dto';
import { SystemUser } from '@/modules/System/models/SystemUser';
import { ModelObject } from 'objection';
import { JwtPayload } from '../Auth.interfaces';
@Injectable()
export class AuthSigninService {
constructor(
private readonly jwtService: JwtService,
@Inject(SystemUser.name)
private readonly systemUserModel: typeof SystemUser,
private readonly jwtService: JwtService,
) {}
private async validate() {}
/**
* Validates the given email and password.
* @param {string} email - Signin email address.
* @param {string} password - Signin password.
* @returns {Promise<ModelObject<SystemUser>>}
*/
async signin(
email: string,
password: string,
): Promise<ModelObject<SystemUser>> {
let user: SystemUser;
private getUserByEmail(email: string) {
return this.systemUserModel.query().findOne({ email });
try {
user = await this.systemUserModel
.query()
.findOne({ email })
.throwIfNotFound();
} catch (err) {
throw new UnauthorizedException(
`There isn't any user with email: ${email}`,
);
}
if (!(await user.checkPassword(password))) {
throw new UnauthorizedException(
`Wrong password for user with email: ${email}`,
);
}
return user;
}
public async signIn(signinDto: AuthSigninDto) {}
async verifyPayload(payload: JwtPayload): Promise<any> {
let user: SystemUser;
try {
user = await this.systemUserModel
.query()
.findOne({ email: payload.sub })
.throwIfNotFound();
} catch (error) {
throw new UnauthorizedException(
`There isn't any user with email: ${payload.sub}`,
);
}
return payload;
}
signToken(user: SystemUser): string {
const payload = {
sub: user.email,
};
return this.jwtService.sign(payload);
}
}

View File

@@ -19,6 +19,7 @@ export class JwtAuthGuard extends AuthGuard('jwt') {
) {
super();
}
canActivate(context: ExecutionContext) {
const isPublic = this.reflector.getAllAndOverride<boolean>(IS_PUBLIC_KEY, [
context.getHandler(),

View File

@@ -0,0 +1,5 @@
import { Injectable, ExecutionContext } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
@Injectable()
export class LocalAuthGuard extends AuthGuard('local') {}

View File

@@ -0,0 +1,24 @@
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
import { AuthSigninService } from '../commands/AuthSignin.service';
import { JwtPayload } from '../Auth.interfaces';
import { ConfigService } from '@nestjs/config';
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') {
constructor(
private readonly authSigninService: AuthSigninService,
private readonly configService: ConfigService,
) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: configService.get('jwt.secret'),
});
}
validate(payload: JwtPayload) {
return this.authSigninService.verifyPayload(payload);
}
}

View File

@@ -0,0 +1,21 @@
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-local';
import { AuthSigninService } from '../commands/AuthSignin.service';
import { ModelObject } from 'objection';
import { SystemUser } from '../../System/models/SystemUser';
@Injectable()
export class LocalStrategy extends PassportStrategy(Strategy, 'local') {
constructor(private readonly authSigninService: AuthSigninService) {
super({
usernameField: 'email',
passReqToCallback: false,
session: false,
});
}
validate(email: string, password: string): Promise<ModelObject<SystemUser>> {
return this.authSigninService.signin(email, password);
}
}

View File

@@ -10,7 +10,7 @@ import {
} from '@nestjs/common';
import { BankRulesApplication } from './BankRulesApplication';
import { ICreateBankRuleDTO, IEditBankRuleDTO } from './types';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import { BankRule } from './models/BankRule';
import { CreateBankRuleDto } from './dtos/BankRule.dto';
import { EditBankRuleDto } from './dtos/BankRule.dto';

View File

@@ -8,11 +8,8 @@ import {
Query,
} from '@nestjs/common';
import { BankingTransactionsApplication } from './BankingTransactionsApplication.service';
import {
IBankAccountsFilter,
ICashflowNewCommandDTO,
} from './types/BankingTransactions.types';
import { PublicRoute } from '../Auth/Jwt.guard';
import { IBankAccountsFilter } from './types/BankingTransactions.types';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import { ApiTags } from '@nestjs/swagger';
import { CreateBankTransactionDto } from './dtos/CreateBankTransaction.dto';

View File

@@ -11,7 +11,7 @@ import {
} from '@nestjs/common';
import { BillsApplication } from './Bills.application';
import { IBillsFilter } from './Bills.types';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import { CreateBillDto, EditBillDto } from './dtos/Bill.dto';
@Controller('bills')

View File

@@ -1,6 +1,7 @@
import { ItemEntryDto } from '@/modules/TransactionItemEntry/dto/ItemEntry.dto';
import { Type } from 'class-transformer';
import {
ArrayMinSize,
IsArray,
IsBoolean,
IsDate,
@@ -81,7 +82,7 @@ export class CommandBillDto {
@IsArray()
@ValidateNested({ each: true })
@Type(() => BillEntryDto)
@MinLength(1)
@ArrayMinSize(1)
entries: BillEntryDto[];
@IsOptional()

View File

@@ -9,7 +9,7 @@ import {
} from '@nestjs/common';
import { BranchesApplication } from './BranchesApplication.service';
import { CreateBranchDto, EditBranchDto } from './dtos/Branch.dto';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
@Controller('branches')

View File

@@ -10,7 +10,7 @@ import {
} from '@nestjs/common';
import { CreditNoteApplication } from './CreditNoteApplication.service';
import { ICreditNotesQueryDTO } from './types/CreditNotes.types';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import { ApiTags } from '@nestjs/swagger';
import { CreateCreditNoteDto, EditCreditNoteDto } from './dtos/CreditNote.dto';

View File

@@ -9,7 +9,7 @@ import {
} from '@nestjs/common';
import { CustomersApplication } from './CustomersApplication.service';
import { ICustomerOpeningBalanceEditDTO } from './types/Customers.types';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import { ApiOperation, ApiTags } from '@nestjs/swagger';
import { CreateCustomerDto } from './dtos/CreateCustomer.dto';
import { EditCustomerDto } from './dtos/EditCustomer.dto';

View File

@@ -9,7 +9,7 @@ import {
Query,
} from '@nestjs/common';
import { ExpensesApplication } from './ExpensesApplication.service';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import { IExpensesFilter } from './Expenses.types';
import { ApiOperation, ApiTags } from '@nestjs/swagger';
import { CreateExpenseDto, EditExpenseDto } from './dtos/Expense.dto';

View File

@@ -4,7 +4,7 @@ import { IAPAgingSummaryQuery } from './APAgingSummary.types';
import { AcceptType } from '@/constants/accept-type';
import { Response } from 'express';
import { ApiOperation, ApiTags } from '@nestjs/swagger';
import { PublicRoute } from '@/modules/Auth/Jwt.guard';
import { PublicRoute } from '@/modules/Auth/guards/Jwt.local';
@Controller('reports/payable-aging-summary')
@ApiTags('reports')

View File

@@ -4,7 +4,7 @@ import { Query, Res } from '@nestjs/common';
import { ARAgingSummaryApplication } from './ARAgingSummaryApplication';
import { AcceptType } from '@/constants/accept-type';
import { Response } from 'express';
import { PublicRoute } from '@/modules/Auth/Jwt.guard';
import { PublicRoute } from '@/modules/Auth/guards/Jwt.local';
import { ApiOperation, ApiTags } from '@nestjs/swagger';
@Controller('reports/receivable-aging-summary')

View File

@@ -3,7 +3,7 @@ import { Controller, Get, Headers, Query, Res } from '@nestjs/common';
import { ICashFlowStatementQuery } from './Cashflow.types';
import { AcceptType } from '@/constants/accept-type';
import { CashflowSheetApplication } from './CashflowSheetApplication';
import { PublicRoute } from '@/modules/Auth/Jwt.guard';
import { PublicRoute } from '@/modules/Auth/guards/Jwt.local';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
@Controller('reports/cashflow-statement')

View File

@@ -4,7 +4,7 @@ import { Controller, Get, Headers, Query, Res } from '@nestjs/common';
import { ICustomerBalanceSummaryQuery } from './CustomerBalanceSummary.types';
import { CustomerBalanceSummaryApplication } from './CustomerBalanceSummaryApplication';
import { AcceptType } from '@/constants/accept-type';
import { PublicRoute } from '@/modules/Auth/Jwt.guard';
import { PublicRoute } from '@/modules/Auth/guards/Jwt.local';
@Controller('/reports/customer-balance-summary')
@ApiTags('reports')

View File

@@ -4,7 +4,7 @@ import { Controller, Get, Headers, Query, Res } from '@nestjs/common';
import { IGeneralLedgerSheetQuery } from './GeneralLedger.types';
import { GeneralLedgerApplication } from './GeneralLedgerApplication';
import { AcceptType } from '@/constants/accept-type';
import { PublicRoute } from '@/modules/Auth/Jwt.guard';
import { PublicRoute } from '@/modules/Auth/guards/Jwt.local';
@Controller('/reports/general-ledger')
@ApiTags('reports')

View File

@@ -3,7 +3,7 @@ import { InventoryItemDetailsApplication } from './InventoryItemDetailsApplicati
import { IInventoryDetailsQuery } from './InventoryItemDetails.types';
import { AcceptType } from '@/constants/accept-type';
import { Response } from 'express';
import { PublicRoute } from '@/modules/Auth/Jwt.guard';
import { PublicRoute } from '@/modules/Auth/guards/Jwt.local';
import { ApiOperation, ApiTags } from '@nestjs/swagger';
@Controller('reports/inventory-item-details')

View File

@@ -4,7 +4,7 @@ import { Controller, Get, Headers, Query, Res } from '@nestjs/common';
import { InventoryValuationSheetApplication } from './InventoryValuationSheetApplication';
import { IInventoryValuationReportQuery } from './InventoryValuationSheet.types';
import { AcceptType } from '@/constants/accept-type';
import { PublicRoute } from '@/modules/Auth/Jwt.guard';
import { PublicRoute } from '@/modules/Auth/guards/Jwt.local';
@Controller('reports/inventory-valuation')
@PublicRoute()

View File

@@ -4,7 +4,7 @@ import { Response } from 'express';
import { AcceptType } from '@/constants/accept-type';
import { JournalSheetApplication } from './JournalSheetApplication';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import { PublicRoute } from '@/modules/Auth/Jwt.guard';
import { PublicRoute } from '@/modules/Auth/guards/Jwt.local';
@Controller('/reports/journal')
@ApiTags('reports')

View File

@@ -3,7 +3,7 @@ import { Controller, Get, Headers, Query, Res } from '@nestjs/common';
import { IProfitLossSheetQuery } from './ProfitLossSheet.types';
import { ProfitLossSheetApplication } from './ProfitLossSheetApplication';
import { AcceptType } from '@/constants/accept-type';
import { PublicRoute } from '@/modules/Auth/Jwt.guard';
import { PublicRoute } from '@/modules/Auth/guards/Jwt.local';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
@Controller('/reports/profit-loss-sheet')

View File

@@ -3,7 +3,7 @@ import { Controller, Get, Headers, Query, Res } from '@nestjs/common';
import { PurchasesByItemsApplication } from './PurchasesByItemsApplication';
import { IPurchasesByItemsReportQuery } from './types/PurchasesByItems.types';
import { AcceptType } from '@/constants/accept-type';
import { PublicRoute } from '@/modules/Auth/Jwt.guard';
import { PublicRoute } from '@/modules/Auth/guards/Jwt.local';
import {
ApiOperation,
ApiResponse,

View File

@@ -3,7 +3,7 @@ import { SalesTaxLiabilitySummaryQuery } from './SalesTaxLiability.types';
import { AcceptType } from '@/constants/accept-type';
import { SalesTaxLiabilitySummaryApplication } from './SalesTaxLiabilitySummaryApplication';
import { Response } from 'express';
import { PublicRoute } from '@/modules/Auth/Jwt.guard';
import { PublicRoute } from '@/modules/Auth/guards/Jwt.local';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
@Controller('/reports/sales-tax-liability-summary')

View File

@@ -4,7 +4,7 @@ import { ITransactionsByCustomersFilter } from './TransactionsByCustomer.types';
import { TransactionsByCustomerApplication } from './TransactionsByCustomersApplication';
import { AcceptType } from '@/constants/accept-type';
import { Response } from 'express';
import { PublicRoute } from '@/modules/Auth/Jwt.guard';
import { PublicRoute } from '@/modules/Auth/guards/Jwt.local';
@Controller('/reports/transactions-by-customers')
@ApiTags('reports')

View File

@@ -1,7 +1,7 @@
import { Controller, Get, Query } from '@nestjs/common';
import { TransactionsByReferenceApplication } from './TransactionsByReferenceApplication';
import { ITransactionsByReferenceQuery } from './TransactionsByReference.types';
import { PublicRoute } from '@/modules/Auth/Jwt.guard';
import { PublicRoute } from '@/modules/Auth/guards/Jwt.local';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
@Controller('reports/transactions-by-reference')

View File

@@ -4,7 +4,7 @@ import { AcceptType } from '@/constants/accept-type';
import { Response } from 'express';
import { TransactionsByVendorApplication } from './TransactionsByVendorApplication';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import { PublicRoute } from '@/modules/Auth/Jwt.guard';
import { PublicRoute } from '@/modules/Auth/guards/Jwt.local';
@Controller('/reports/transactions-by-vendors')
@ApiTags('reports')

View File

@@ -1,17 +1,11 @@
import {
Controller,
Get,
Headers,
Query,
Res,
} from '@nestjs/common';
import { Controller, Get, Headers, Query, Res } from '@nestjs/common';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import { castArray } from 'lodash';
import { Response } from 'express';
import { ITrialBalanceSheetQuery } from './TrialBalanceSheet.types';
import { AcceptType } from '@/constants/accept-type';
import { TrialBalanceSheetApplication } from './TrialBalanceSheetApplication';
import { PublicRoute } from '@/modules/Auth/Jwt.guard';
import { PublicRoute } from '@/modules/Auth/guards/Jwt.local';
@Controller('reports/trial-balance-sheet')
@ApiTags('reports')
@@ -35,9 +29,8 @@ export class TrialBalanceSheetController {
};
// Retrieves in json table format.
if (acceptHeader.includes(AcceptType.ApplicationJsonTable)) {
const { table, meta, query } = await this.trialBalanceSheetApp.table(
filter,
);
const { table, meta, query } =
await this.trialBalanceSheetApp.table(filter);
return res.status(200).send({ table, meta, query });
// Retrieves in xlsx format
} else if (acceptHeader.includes(AcceptType.ApplicationXlsx)) {
@@ -66,9 +59,8 @@ export class TrialBalanceSheetController {
res.send(pdfContent);
// Retrieves in json format.
} else {
const { data, query, meta } = await this.trialBalanceSheetApp.sheet(
filter,
);
const { data, query, meta } =
await this.trialBalanceSheetApp.sheet(filter);
return res.status(200).send({ data, query, meta });
}
}

View File

@@ -4,7 +4,7 @@ import { VendorBalanceSummaryApplication } from './VendorBalanceSummaryApplicati
import { Response } from 'express';
import { AcceptType } from '@/constants/accept-type';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import { PublicRoute } from '@/modules/Auth/Jwt.guard';
import { PublicRoute } from '@/modules/Auth/guards/Jwt.local';
@Controller('/reports/vendor-balance-summary')
@ApiTags('reports')

View File

@@ -14,7 +14,7 @@ import {
IQuickInventoryAdjustmentDTO,
} from './types/InventoryAdjustments.types';
import { InventoryAdjustment } from './models/InventoryAdjustment';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import { IPaginationMeta } from '@/interfaces/Model';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import { CreateQuickInventoryAdjustmentDto } from './dtos/CreateQuickInventoryAdjustment.dto';

View File

@@ -13,7 +13,7 @@ import {
GetItemCategoriesResponse,
IItemCategoriesFilter,
} from './ItemCategory.interfaces';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import { ApiOperation, ApiTags } from '@nestjs/swagger';
import {
CreateItemCategoryDto,

View File

@@ -12,7 +12,7 @@ import {
} from '@nestjs/common';
import { TenantController } from '../Tenancy/Tenant.controller';
import { SubscriptionGuard } from '../Subscription/interceptors/Subscription.guard';
import { PublicRoute } from '../Auth/Jwt.guard';
import { JwtAuthGuard, PublicRoute } from '../Auth/guards/Jwt.local';
import { ItemsApplicationService } from './ItemsApplication.service';
import {
ApiOperation,
@@ -22,13 +22,11 @@ import {
ApiTags,
} from '@nestjs/swagger';
import { IItemsFilter } from './types/Items.types';
import { IItemDTO } from '@/interfaces/Item';
import { CreateItemDto, EditItemDto } from './dtos/Item.dto';
@Controller('/items')
@UseGuards(SubscriptionGuard)
@ApiTags('items')
@PublicRoute()
export class ItemsController extends TenantController {
constructor(private readonly itemsApplication: ItemsApplicationService) {
super();
@@ -112,6 +110,7 @@ export class ItemsController extends TenantController {
* @returns The updated item id.
*/
@Put(':id')
@UseGuards(JwtAuthGuard)
@ApiOperation({ summary: 'Edit the given item (product or service).' })
@ApiResponse({
status: 200,

View File

@@ -9,9 +9,12 @@ import {
} from '@nestjs/common';
import { ManualJournalsApplication } from './ManualJournalsApplication.service';
import { IManualJournalDTO } from './types/ManualJournals.types';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import { ApiOperation, ApiParam, ApiResponse, ApiTags } from '@nestjs/swagger';
import { CreateManualJournalDto, EditManualJournalDto } from './dtos/ManualJournal.dto';
import {
CreateManualJournalDto,
EditManualJournalDto,
} from './dtos/ManualJournal.dto';
@Controller('manual-journals')
@ApiTags('manual-journals')
@@ -40,7 +43,7 @@ export class ManualJournalsController {
})
public editManualJournal(
@Param('id') manualJournalId: number,
@Body() manualJournalDTO: EditManualJournalDto
@Body() manualJournalDTO: EditManualJournalDto,
) {
return this.manualJournalsApplication.editManualJournal(
manualJournalId,

View File

@@ -17,7 +17,7 @@ import {
import { GetCurrentOrganizationService } from './queries/GetCurrentOrganization.service';
import { UpdateOrganizationService } from './commands/UpdateOrganization.service';
import { ApiTags, ApiOperation, ApiResponse, ApiBody } from '@nestjs/swagger';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
@ApiTags('Organization')
@Controller('organization')

View File

@@ -17,7 +17,7 @@ import {
IPaymentsReceivedFilter,
PaymentReceiveMailOptsDTO,
} from './types/PaymentReceived.types';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
@Controller('payments-received')
@@ -108,7 +108,8 @@ export class PaymentReceivesController {
@ApiOperation({ summary: 'Retrieves the payment received invoices.' })
@ApiResponse({
status: 200,
description: 'The payment received invoices have been successfully retrieved.',
description:
'The payment received invoices have been successfully retrieved.',
})
public getPaymentReceiveInvoices(
@Param('id', ParseIntPipe) paymentReceiveId: number,
@@ -122,7 +123,8 @@ export class PaymentReceivesController {
@ApiOperation({ summary: 'Retrieves the payment received details.' })
@ApiResponse({
status: 200,
description: 'The payment received details have been successfully retrieved.',
description:
'The payment received details have been successfully retrieved.',
})
public getPaymentReceive(
@Param('id', ParseIntPipe) paymentReceiveId: number,

View File

@@ -15,7 +15,7 @@ import {
import { Request, Response, NextFunction } from 'express';
import { ApiTags } from '@nestjs/swagger';
import { PaymentServicesApplication } from './PaymentServicesApplication';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import { EditPaymentMethodDTO } from './types';
@ApiTags('PaymentServices')

View File

@@ -9,7 +9,7 @@ import {
} from '@nestjs/common';
import { PdfTemplateApplication } from './PdfTemplate.application';
import { ICreateInvoicePdfTemplateDTO, IEditPdfTemplateDTO } from './types';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
@Controller('pdf-templates')

View File

@@ -22,7 +22,7 @@ import {
ApiParam,
ApiBody,
} from '@nestjs/swagger';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
@ApiTags('Roles')
@Controller('roles')

View File

@@ -17,7 +17,7 @@ import {
SaleEstimateMailOptionsDTO,
} from './types/SaleEstimates.types';
import { SaleEstimate } from './models/SaleEstimate';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import {
CreateSaleEstimateDto,
EditSaleEstimateDto,

View File

@@ -17,7 +17,7 @@ import {
SendInvoiceMailDTO,
} from './SaleInvoice.types';
import { SaleInvoiceApplication } from './SaleInvoices.application';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import {
ApiHeader,
ApiOperation,

View File

@@ -10,7 +10,7 @@ import {
Put,
} from '@nestjs/common';
import { SaleReceiptApplication } from './SaleReceiptApplication.service';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import { ApiOperation, ApiParam, ApiTags } from '@nestjs/swagger';
import {
CreateSaleReceiptDto,

View File

@@ -1,7 +1,7 @@
import { Body, Controller, Get, Post, Put } from '@nestjs/common';
import { SettingsApplicationService } from './SettingsApplication.service';
import { ISettingsDTO } from './Settings.types';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import { ApiOperation, ApiTags } from '@nestjs/swagger';
@Controller('settings')

View File

@@ -26,21 +26,21 @@ export class SubscriptionGuard implements CanActivate {
context: ExecutionContext,
subscriptionSlug: string = 'main', // Default value
): Promise<boolean> {
const tenant = await this.tenancyContext.getTenant();
const subscription = await this.planSubscriptionModel
.query()
.findOne('slug', subscriptionSlug)
.where('tenant_id', tenant.id);
// const tenant = await this.tenancyContext.getTenant();
// const subscription = await this.planSubscriptionModel
// .query()
// .findOne('slug', subscriptionSlug)
// .where('tenant_id', tenant.id);
if (!subscription) {
throw new UnauthorizedException('Tenant has no subscription.');
}
// if (!subscription) {
// throw new UnauthorizedException('Tenant has no subscription.');
// }
const isSubscriptionInactive = subscription.inactive();
// const isSubscriptionInactive = subscription.inactive();
if (isSubscriptionInactive) {
throw new UnauthorizedException('Organization subscription is inactive.');
}
// if (isSubscriptionInactive) {
// throw new UnauthorizedException('Organization subscription is inactive.');
// }
return true;
}
}

View File

@@ -1,10 +1,11 @@
import * as bcrypt from 'bcrypt';
import { BaseModel } from '@/models/Model';
export class SystemUser extends BaseModel {
public readonly firstName: string;
public readonly lastName: string;
public readonly email: string;
public readonly password: string;
public password: string;
public readonly active: boolean;
public readonly tenantId: number;
@@ -15,4 +16,15 @@ export class SystemUser extends BaseModel {
static get tableName() {
return 'users';
}
async hashPassword(): Promise<void> {
const salt = await bcrypt.genSalt();
if (!/^\$2[abxy]?\$\d+\$/.test(this.password)) {
this.password = await bcrypt.hash(this.password, salt);
}
}
async checkPassword(plainPassword: string): Promise<boolean> {
return await bcrypt.compare(plainPassword, this.password);
}
}

View File

@@ -8,7 +8,7 @@ import {
Put,
} from '@nestjs/common';
import { TaxRatesApplication } from './TaxRate.application';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import { ApiOperation, ApiTags } from '@nestjs/swagger';
import { CreateTaxRateDto, EditTaxRateDto } from './dtos/TaxRate.dto';

View File

@@ -3,7 +3,7 @@ import { TransactionsLockingService } from './commands/CommandTransactionsLockin
import { TransactionsLockingGroup } from './types/TransactionsLocking.types';
import { ITransactionLockingPartiallyDTO } from './types/TransactionsLocking.types';
import { QueryTransactionsLocking } from './queries/QueryTransactionsLocking';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import { ApiOperation } from '@nestjs/swagger';
import { ApiTags } from '@nestjs/swagger';
import {

View File

@@ -10,7 +10,7 @@ import {
} from '@nestjs/common';
import { VendorCreditsApplicationService } from './VendorCreditsApplication.service';
import { IVendorCreditsQueryDTO } from './types/VendorCredit.types';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import { ApiOperation, ApiTags } from '@nestjs/swagger';
import {
CreateVendorCreditDto,

View File

@@ -1,10 +1,8 @@
import { Body, Controller, Delete, Param, Post } from '@nestjs/common';
import { VendorCreditsRefundApplication } from './VendorCreditsRefund.application';
import { IRefundVendorCreditDTO } from './types/VendorCreditRefund.types';
import { RefundVendorCredit } from './models/RefundVendorCredit';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import { ApiOperation, ApiTags } from '@nestjs/swagger';
import { RefundVendorCreditDto } from './dtos/RefundVendorCredit.dto';

View File

@@ -13,7 +13,7 @@ import {
IVendorOpeningBalanceEditDTO,
IVendorsFilter,
} from './types/Vendors.types';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import { ApiOperation, ApiTags } from '@nestjs/swagger';
import { CreateVendorDto } from './dtos/CreateVendor.dto';
import { EditVendorDto } from './dtos/EditVendor.dto';

View File

@@ -9,7 +9,7 @@ import {
} from '@nestjs/common';
import { WarehousesApplication } from './WarehousesApplication.service';
import { ICreateWarehouseDTO, IEditWarehouseDTO } from './Warehouse.types';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import { ApiOperation, ApiTags } from '@nestjs/swagger';
import { CreateWarehouseDto, EditWarehouseDto } from './dtos/Warehouse.dto';

View File

@@ -11,7 +11,7 @@ import {
} from '@nestjs/common';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import { WarehouseTransferApplication } from './WarehouseTransferApplication';
import { PublicRoute } from '../Auth/Jwt.guard';
import { PublicRoute } from '../Auth/guards/Jwt.local';
import {
CreateWarehouseTransferDto,
EditWarehouseTransferDto,