Skip to content

Commit

Permalink
fix: use settings table to query bigquery
Browse files Browse the repository at this point in the history
- fix: bearer auth to access setting
  • Loading branch information
yxuo committed Feb 16, 2024
1 parent 54b7418 commit 8641e05
Show file tree
Hide file tree
Showing 9 changed files with 82 additions and 20 deletions.
9 changes: 9 additions & 0 deletions src/bank-statements/bank-statements.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { TimeIntervalEnum } from 'src/utils/enums/time-interval.enum';
import { BankStatementsRepositoryService } from './bank-statements-repository.service';
import { BankStatementsService } from './bank-statements.service';
import { IBankStatement } from './interfaces/bank-statement.interface';
import { SettingsService } from 'src/settings/settings.service';

const allBankStatements = [
{ id: 1, date: '2023-01-27', amount: 1 },
Expand Down Expand Up @@ -58,6 +59,13 @@ describe('BankStatementsService', () => {
getMe: jest.fn(),
},
} as Provider;
const settingsServiceMock = {
provide: SettingsService,
useValue: {
getOneBySettingData: jest.fn(),
findOneBySettingData: jest.fn(),
},
} as Provider;

const module: TestingModule = await Test.createTestingModule({
providers: [
Expand All @@ -67,6 +75,7 @@ describe('BankStatementsService', () => {
bigqueryServiceMock,
usersServiceMock,
ticketRevenuesServiceMock,
settingsServiceMock,
],
}).compile();

Expand Down
10 changes: 10 additions & 0 deletions src/database/seeds/setting/setting-seed.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import { ISettingData } from 'src/settings/interfaces/setting-data.interface';
import { Enum } from 'src/utils/enum';
import { IsNull, Repository } from 'typeorm';
import { settingSeedData } from './setting-seed-data';
import { Environment } from 'src/config/app.config';
import { BigqueryEnvironment } from 'src/settings/enums/bigquery-env.enum';

@Injectable()
export class SettingSeedService {
Expand All @@ -20,6 +22,14 @@ export class SettingSeedService {

async run() {
let id = 1;
console.log('SEED', process.env.NODE_ENV);
console.log(
'VALUE',
process.env.NODE_ENV === Environment.Local ||
process.env.NODE_ENV === Environment.Test
? BigqueryEnvironment.Development
: BigqueryEnvironment.Production,
);
for (const item of settingSeedData) {
const settings: ISettingData[] = (item as any)?.data || [item];
for (const setting of settings) {
Expand Down
9 changes: 9 additions & 0 deletions src/settings/app.settings.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { CronExpression } from '@nestjs/schedule';
import { SettingTypeEnum } from 'src/setting-types/setting-type.enum';
import { BigqueryEnvironment } from './enums/bigquery-env.enum';
import { ISettingDataGroup } from './interfaces/setting-data-group.interface';
import { ISettingData } from './interfaces/setting-data.interface';

Expand Down Expand Up @@ -88,6 +89,14 @@ export const appSettings = {
],
} as ISettingDataGroup,

any__bigquery_env: {
name: 'bigquery_env',
value: BigqueryEnvironment.Development,
version: null,
editable: false,
settingType: SettingTypeEnum.string,
} as ISettingData,

// v1

v1__ab_test_enabled: {
Expand Down
4 changes: 4 additions & 0 deletions src/settings/enums/bigquery-env.enum.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export enum BigqueryEnvironment {
Production = 'production',
Development = 'development',
}
26 changes: 17 additions & 9 deletions src/settings/settings.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,32 @@ import {
HttpStatus,
Param,
Patch,
SerializeOptions,
UseGuards,
} from '@nestjs/common';
import { SettingsService } from './settings.service';
import { ApiParam, ApiTags } from '@nestjs/swagger';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiParam, ApiTags } from '@nestjs/swagger';
import { Roles } from 'src/roles/roles.decorator';
import { RoleEnum } from 'src/roles/roles.enum';
import { RolesGuard } from 'src/roles/roles.guard';
import { NullableType } from 'src/utils/types/nullable.type';
import { SettingEntity } from './entities/setting.entity';
import { UpdateSettingsDto } from './dto/update-settings.dto';
import { SettingEntity } from './entities/setting.entity';
import { SettingsService } from './settings.service';

@ApiTags('Settings')
@Controller('settings')
@ApiTags('Settings')
export class SettingsController {
constructor(private readonly settingsService: SettingsService) {}

@Get()
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'))
async getAll(): Promise<NullableType<SettingEntity[]>> {
return this.settingsService.find();
}

@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'))
@Get('v:version')
@ApiParam({ name: 'version', example: '1' })
getByVersion(
Expand All @@ -32,11 +40,11 @@ export class SettingsController {
return this.settingsService.findByVersion(version);
}

@SerializeOptions({
groups: ['admin'],
})
@Patch()
@ApiBearerAuth()
@Roles(RoleEnum.admin)
@UseGuards(AuthGuard('jwt'), RolesGuard)
@HttpCode(HttpStatus.OK)
@Patch()
update(@Body() updateSettingDto: UpdateSettingsDto): Promise<SettingEntity> {
return this.settingsService.update(updateSettingDto);
}
Expand Down
2 changes: 1 addition & 1 deletion src/settings/settings.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ export class SettingsService {
if (defaultValueIfNotFound && !dbSetting) {
this.logger.warn(
formatLog(
`Configuração 'setting.${setting.name}' não encontrada. Usando valor padrão.`,
`Configuração 'setting.${setting.name}' não encontrada. Usando valor padrão: '${setting.value}'.`,
`${this.getOneBySettingData.name}()`,
logContext,
),
Expand Down
30 changes: 21 additions & 9 deletions src/ticket-revenues/ticket-revenues-repository.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,20 @@ import {
TRPaymentTypeMap,
TRTransactionTypeMap,
} from './maps/ticket-revenues.map';
import { SettingsService } from 'src/settings/settings.service';
import { appSettings } from 'src/settings/app.settings';
import { BigqueryEnvironment } from 'src/settings/enums/bigquery-env.enum';

@Injectable()
export class TicketRevenuesRepositoryService {
private logger: Logger = new Logger('TicketRevenuesService', {
timestamp: true,
});

constructor(private readonly bigqueryService: BigqueryService) {}
constructor(
private readonly bigqueryService: BigqueryService,
private readonly settingsService: SettingsService,
) {}

/**
* TODO: use it only for repository services
Expand Down Expand Up @@ -58,7 +64,7 @@ export class TicketRevenuesRepositoryService {
async fetchTicketRevenues(
args?: IFetchTicketRevenues,
): Promise<{ data: ITicketRevenue[]; countAll: number }> {
const qArgs = this.getQueryArgs(args);
const qArgs = await this.getQueryArgs(args);
const query =
`
SELECT
Expand Down Expand Up @@ -119,7 +125,7 @@ export class TicketRevenuesRepositoryService {
};
}

private getQueryArgs(args?: IFetchTicketRevenues): {
private async getQueryArgs(args?: IFetchTicketRevenues): Promise<{
qWhere: string;
bucket: string;
transacao: string;
Expand All @@ -130,17 +136,23 @@ export class TicketRevenuesRepositoryService {
countQuery: string;
offset?: number;
limit?: number;
} {
const IS_PROD = process.env.NODE_ENV === 'production';
}> {
const IS_BQ_PROD =
(
await this.settingsService.getOneBySettingData(
appSettings.any__bigquery_env,
true,
)
).getValueAsString() === BigqueryEnvironment.Production;
const Q_CONSTS = {
bucket: IS_PROD ? 'rj-smtr' : 'rj-smtr-dev',
transacao: IS_PROD
bucket: IS_BQ_PROD ? 'rj-smtr' : 'rj-smtr-dev',
transacao: IS_BQ_PROD
? 'rj-smtr.br_rj_riodejaneiro_bilhetagem.transacao'
: 'rj-smtr-dev.br_rj_riodejaneiro_bilhetagem_cct.transacao',
integracao: IS_PROD
integracao: IS_BQ_PROD
? 'rj-smtr.br_rj_riodejaneiro_bilhetagem.integracao'
: 'rj-smtr-dev.br_rj_riodejaneiro_bilhetagem_cct.integracao',
tTipoPgto: IS_PROD ? 'tipo_pagamento' : 'id_tipo_pagamento',
tTipoPgto: IS_BQ_PROD ? 'tipo_pagamento' : 'id_tipo_pagamento',
};
// Args
let offset = args?.offset;
Expand Down
3 changes: 2 additions & 1 deletion src/ticket-revenues/ticket-revenues.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@ import { UsersModule } from 'src/users/users.module';
import { TicketRevenuesRepositoryService } from './ticket-revenues-repository.service';
import { TicketRevenuesController } from './ticket-revenues.controller';
import { TicketRevenuesService } from './ticket-revenues.service';
import { SettingsModule } from 'src/settings/settings.module';

@Module({
imports: [UsersModule, BigqueryModule, UsersModule],
imports: [UsersModule, BigqueryModule, UsersModule, SettingsModule],
providers: [TicketRevenuesService, TicketRevenuesRepositoryService],
controllers: [TicketRevenuesController],
exports: [TicketRevenuesService, TicketRevenuesRepositoryService],
Expand Down
9 changes: 9 additions & 0 deletions src/ticket-revenues/ticket-revenues.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { UsersService } from 'src/users/users.service';
import { ITicketRevenue } from './interfaces/ticket-revenue.interface';
import { TicketRevenuesRepositoryService } from './ticket-revenues-repository.service';
import { TicketRevenuesService } from './ticket-revenues.service';
import { SettingsService } from 'src/settings/settings.service';

describe('TicketRevenuesService', () => {
let ticketRevenuesService: TicketRevenuesService;
Expand All @@ -25,12 +26,20 @@ describe('TicketRevenuesService', () => {
runQuery: jest.fn(),
},
} as Provider;
const settingsServiceMock = {
provide: SettingsService,
useValue: {
getOneBySettingData: jest.fn(),
findOneBySettingData: jest.fn(),
},
} as Provider;
const module: TestingModule = await Test.createTestingModule({
providers: [
TicketRevenuesService,
TicketRevenuesRepositoryService,
usersServiceMock,
bigqueryServiceMock,
settingsServiceMock,
],
}).compile();
jest
Expand Down

0 comments on commit 8641e05

Please sign in to comment.