Skip to content

Commit

Permalink
fix: use a single query to count and get data
Browse files Browse the repository at this point in the history
- test: remove obsolete test #94, item 15
  • Loading branch information
yxuo committed Feb 1, 2024
1 parent e047786 commit 76c2c32
Show file tree
Hide file tree
Showing 7 changed files with 47 additions and 69 deletions.
42 changes: 3 additions & 39 deletions src/auth/auth.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Provider } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { Test, TestingModule } from '@nestjs/testing';
import { ForgotService } from 'src/forgot/forgot.service';
import { InviteStatus } from 'src/mail-history-statuses/entities/mail-history-status.entity';
import { InviteStatusEnum } from 'src/mail-history-statuses/mail-history-status.enum';
import { MailHistory } from 'src/mail-history/entities/mail-history.entity';
import { MailHistoryService } from 'src/mail-history/mail-history.service';
Expand All @@ -10,9 +11,8 @@ import { MailSentInfo } from 'src/mail/interfaces/mail-sent-info.interface';
import { MailService } from 'src/mail/mail.service';
import { User } from 'src/users/entities/user.entity';
import { UsersService } from 'src/users/users.service';
import { AuthService } from './auth.service';
import { DeepPartial } from 'typeorm';
import { InviteStatus } from 'src/mail-history-statuses/entities/mail-history-status.entity';
import { AuthService } from './auth.service';

process.env.TZ = 'UTC';

Expand Down Expand Up @@ -109,44 +109,8 @@ describe('AuthService', () => {
await expect(response).rejects.toThrowError();
});

xit('[FIXME] should throw exception when mail status is not QUEUED', /**
* Requirement: 2023/11/16 {@link https://github.com/RJ-SMTR/api-cct/issues/94#issuecomment-1815016208 #94, item 15 - GitHub}
*
* FIXME: check if this requirement is still necessary
* error: received undefined instead of throw error
*/ async () => {
// Arrange
const user = new User({
id: 1,
email: 'user1@example.com',
hash: 'hash_1',
});
const mailHistory = new MailHistory({
id: 1,
user: user,
hash: 'hash_1',
});
mailHistory.setInviteStatus(InviteStatusEnum.sent);
jest.spyOn(usersService, 'getOne').mockResolvedValue(user);
jest.spyOn(mailHistoryService, 'findOne').mockResolvedValue(mailHistory);
jest.spyOn(mailHistoryService, 'getRemainingQuota').mockResolvedValue(1);

// Act
const response = authService.resendRegisterMail({ id: 1 });
let error: any;
await response.catch((httpException) => {
error = httpException;
});

// Assert
await expect(response).rejects.toThrowError();
await expect(error?.response?.error).toContain(
"User's mailStatus is not 'queued'",
);
});

it('should return success regardless of quota status', /**
* Requirement: 2023/12/28 {@link https://github.com/RJ-SMTR/api-cct/issues/164 #164 - GitHub}
* Requirement: 2023/12/28 {@link https://github.com/RJ-SMTR/api-cct/issues/164#issuecomment-1871504885 #164 - GitHub}
*/ async () => {
// Arrange
const users = [
Expand Down
54 changes: 34 additions & 20 deletions src/ticket-revenues/ticket-revenues.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
getPaymentDates,
} from 'src/utils/payment-date-utils';
import { QueryBuilder } from 'src/utils/query-builder/query-builder';
import { IPaginationOptions } from 'src/utils/types/pagination-options';
import { PaginationOptions } from 'src/utils/types/pagination-options';
import { Pagination } from 'src/utils/types/pagination.type';
import { IFetchTicketRevenues } from './interfaces/fetch-ticket-revenues.interface';
import { ITicketRevenue } from './interfaces/ticket-revenue.interface';
Expand Down Expand Up @@ -76,7 +76,7 @@ export class TicketRevenuesService {

public async getMe(
args: ITRGetMeGroupedArgs,
pagination: IPaginationOptions,
pagination: PaginationOptions,
endpoint: PaymentEndpointType,
): Promise<ITRGetMeGroupedResponse> {
const user = await this.validateUser(args);
Expand Down Expand Up @@ -293,6 +293,12 @@ export class TicketRevenuesService {
}

// Query

const countQuery =
'SELECT COUNT(*) AS count ' +
'FROM `rj-smtr.br_rj_riodejaneiro_bilhetagem.transacao` t ' +
'LEFT JOIN `rj-smtr.cadastro.operadoras` o ON o.id_operadora = t.id_operadora ' +
(queryBuilderStr.length ? ` WHERE ${queryBuilderStr}` : '');
const query =
`
SELECT
Expand All @@ -317,28 +323,36 @@ export class TicketRevenuesService {
t.stop_lat AS stopLat,
t.stop_lon AS stopLon,
t.valor_transacao AS transactionValue,
t.versao AS bqDataVersion
t.versao AS bqDataVersion,
(${countQuery}) AS count,
'ok' AS status
FROM \`rj-smtr.br_rj_riodejaneiro_bilhetagem.transacao\` t
LEFT JOIN \`rj-smtr.cadastro.operadoras\` o ON o.id_operadora = t.id_operadora` +
' ' +
LEFT JOIN \`rj-smtr.cadastro.operadoras\` o ON o.id_operadora = t.id_operadora ` +
(queryBuilderStr.length ? `\nWHERE ${queryBuilderStr}` : '') +
`\nORDER BY data DESC, hora DESC` +
(args?.limit !== undefined ? `\nLIMIT ${args.limit}` : '') +
` UNION ALL
SELECT ${'null, '.repeat(22)}
(${countQuery}) AS count, 'empty' AS status` +
`\nORDER BY partitionDate DESC, processingHour DESC` +
(args?.limit !== undefined ? `\nLIMIT ${args.limit + 1}` : '') +
(offset !== undefined ? `\nOFFSET ${offset}` : '');
const queryResult = await this.bigqueryService.runQuery(
BQSInstances.smtr,
query,
);

const ticketRevenues: ITicketRevenue[] =
await this.bigqueryService.runQuery(BQSInstances.smtr, query);
const count: number = queryResult[0].count;
// Remove unwanted keys and remove last item (all null if empty)
const ticketRevenues: ITicketRevenue[] = queryResult.map((i) => {
delete i.status;
delete i.count;
return i;
});
ticketRevenues.pop();

const countQuery =
`
SELECT COUNT(*) AS count
FROM \`rj-smtr.br_rj_riodejaneiro_bilhetagem.transacao\` t
LEFT JOIN \`rj-smtr.cadastro.operadoras\` o ON o.id_operadora = t.id_operadora ` +
(queryBuilderStr.length ? `\nWHERE ${queryBuilderStr}` : '');
const countAll: number = (
await this.bigqueryService.runQuery(BQSInstances.smtr, countQuery)
)[0].count;
return { ticketRevenuesResponse: ticketRevenues, countAll };
return {
ticketRevenuesResponse: ticketRevenues,
countAll: count,
};
}

/**
Expand Down Expand Up @@ -366,7 +380,7 @@ export class TicketRevenuesService {

public async getMeIndividual(
args: ITRGetMeIndividualArgs,
paginationArgs: IPaginationOptions,
paginationArgs: PaginationOptions,
): Promise<Pagination<ITRGetMeIndividualResponse>> {
const GET_TODAY = true;
const validArgs = await this.validateGetMeIndividualArgs(args);
Expand Down
4 changes: 2 additions & 2 deletions src/users/users.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ import { InviteStatusNamesEnum } from 'src/mail-history-statuses/mail-history-st
import { FileTypeValidationPipe } from 'src/utils/file-type/pipes/file-type-validation.pipe';
import { infinityPagination } from 'src/utils/infinity-pagination';
import { EnumValidationPipe } from 'src/utils/pipes/enum-validation.pipe';
import { IPaginationOptions } from 'src/utils/types/pagination-options';
import { PaginationOptions } from 'src/utils/types/pagination-options';
import { InfinityPaginationResultType } from '../utils/types/infinity-pagination-result.type';
import { NullableType } from '../utils/types/nullable.type';
import { CreateUserDto } from './dto/create-user.dto';
Expand Down Expand Up @@ -114,7 +114,7 @@ export class UsersController {
if (limit > 500) {
limit = 500;
}
const pagination: IPaginationOptions = { page, limit };
const pagination: PaginationOptions = { page, limit };
const fields: IFindUserPaginated = {
_anyField: {
value: anyField,
Expand Down
4 changes: 2 additions & 2 deletions src/users/users.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import { HttpErrorMessages } from 'src/utils/enums/http-error-messages.enum';
import { formatLog } from 'src/utils/logging';
import { EntityCondition } from 'src/utils/types/entity-condition.type';
import { InvalidRowsType } from 'src/utils/types/invalid-rows.type';
import { IPaginationOptions } from 'src/utils/types/pagination-options';
import { PaginationOptions } from 'src/utils/types/pagination-options';
import {
Brackets,
DeepPartial,
Expand Down Expand Up @@ -84,7 +84,7 @@ export class UsersService {
}

async findManyWithPagination(
paginationOptions: IPaginationOptions,
paginationOptions: PaginationOptions,
fields?: IFindUserPaginated,
): Promise<User[]> {
const isSgtuBlocked = fields?.isSgtuBlocked || fields?._anyField?.value;
Expand Down
4 changes: 2 additions & 2 deletions src/utils/get-pagination.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { IPaginationOptions } from './types/pagination-options';
import { PaginationOptions } from './types/pagination-options';
import { Pagination } from './types/pagination.type';

export const getPagination = <T>(
Expand All @@ -7,7 +7,7 @@ export const getPagination = <T>(
dataLenght: number;
maxCount: number;
},
options: IPaginationOptions,
options: PaginationOptions,
): Pagination<T> => {
const { dataLenght, maxCount } = args;
return {
Expand Down
4 changes: 2 additions & 2 deletions src/utils/infinity-pagination.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { IPaginationOptions } from './types/pagination-options';
import { PaginationOptions } from './types/pagination-options';
import { InfinityPaginationResultType } from './types/infinity-pagination-result.type';

export const infinityPagination = <T>(
data: T[],
options: IPaginationOptions,
options: PaginationOptions,
): InfinityPaginationResultType<T> => {
return {
count: data.length,
Expand Down
4 changes: 2 additions & 2 deletions src/utils/types/pagination-options.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export interface IPaginationOptions {
export type PaginationOptions = {
page: number;
limit: number;
}
};

0 comments on commit 76c2c32

Please sign in to comment.