Skip to content

Commit a032b14

Browse files
Johan BookJohan Book
Johan Book
authored and
Johan Book
committed
feat(api): add organization journal
1 parent 01970ca commit a032b14

File tree

6 files changed

+100
-12
lines changed

6 files changed

+100
-12
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { Type } from "class-transformer";
2+
import { IsDate } from "class-validator";
3+
4+
import { BaseQuery } from "src/core/query";
5+
6+
export class GetCurrentOrganizationJournalQuery extends BaseQuery {
7+
@IsDate()
8+
@Type(() => Date)
9+
from!: Date;
10+
11+
@IsDate()
12+
@Type(() => Date)
13+
to!: Date;
14+
}

services/api/src/core/journal/application/contracts/queries/get-journal.query.ts renamed to services/api/src/core/journal/application/contracts/queries/get-profile-journal.query.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { IsDate } from "class-validator";
33

44
import { BaseQuery } from "src/core/query";
55

6-
export class GetJournalQuery extends BaseQuery {
6+
export class GetProfileJournalQuery extends BaseQuery {
77
@IsDate()
88
@Type(() => Date)
99
from!: Date;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { IQueryHandler, QueryHandler } from "@nestjs/cqrs";
2+
import { InjectRepository } from "@nestjs/typeorm";
3+
import { Between, Repository } from "typeorm";
4+
5+
import { UserIdService } from "src/core/authentication";
6+
import { map, mapArray } from "src/core/mapper";
7+
import { QueryService } from "src/core/query";
8+
9+
import { JournalEntry } from "../../../infrastructure/entities/journal-entry.entity";
10+
import { JournalDetails } from "../../contracts/dtos/journal-details.dto";
11+
import { JournalEntryDetails } from "../../contracts/dtos/journal-entry-details.dto";
12+
import { GetCurrentOrganizationJournalQuery } from "../../contracts/queries/get-current-organization-journal.query";
13+
14+
function formatCommandName(commandName: string): string {
15+
return commandName.replace(/Command$/, "");
16+
}
17+
18+
@QueryHandler(GetCurrentOrganizationJournalQuery)
19+
export class GetCurrentOrganizationJournalHandler
20+
implements IQueryHandler<GetCurrentOrganizationJournalQuery, JournalDetails>
21+
{
22+
constructor(
23+
@InjectRepository(JournalEntry)
24+
private readonly journalEntries: Repository<JournalEntry>,
25+
private readonly queryService: QueryService<JournalEntry>,
26+
private readonly userIdService: UserIdService,
27+
) {}
28+
29+
async execute(query: GetCurrentOrganizationJournalQuery) {
30+
const userId = this.userIdService.getUserId();
31+
32+
const foundJournalEntries = await this.queryService.find(
33+
this.journalEntries,
34+
{
35+
default: {
36+
order: { created: "desc" },
37+
},
38+
query,
39+
required: {
40+
where: {
41+
created: Between(query.from, query.to),
42+
userId,
43+
},
44+
},
45+
},
46+
);
47+
48+
return map(JournalDetails, {
49+
entries: mapArray(JournalEntryDetails, foundJournalEntries, (entry) => ({
50+
commandName: formatCommandName(entry.commandName),
51+
created: entry.created,
52+
id: entry.id,
53+
payload: entry.payload,
54+
})),
55+
});
56+
}
57+
}

services/api/src/core/journal/application/handlers/query-handlers/get-journal.handler.ts renamed to services/api/src/core/journal/application/handlers/query-handlers/get-profile-journal.handler.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { IQueryHandler, QueryHandler } from "@nestjs/cqrs";
22
import { InjectRepository } from "@nestjs/typeorm";
3-
import { And, LessThan, MoreThan, Repository } from "typeorm";
3+
import { Between, Repository } from "typeorm";
44

55
import { UserIdService } from "src/core/authentication";
66
import { map, mapArray } from "src/core/mapper";
@@ -9,15 +9,15 @@ import { QueryService } from "src/core/query";
99
import { JournalEntry } from "../../../infrastructure/entities/journal-entry.entity";
1010
import { JournalDetails } from "../../contracts/dtos/journal-details.dto";
1111
import { JournalEntryDetails } from "../../contracts/dtos/journal-entry-details.dto";
12-
import { GetJournalQuery } from "../../contracts/queries/get-journal.query";
12+
import { GetProfileJournalQuery } from "../../contracts/queries/get-profile-journal.query";
1313

1414
function formatCommandName(commandName: string): string {
1515
return commandName.replace(/Command$/, "");
1616
}
1717

18-
@QueryHandler(GetJournalQuery)
19-
export class GetJournalHandler
20-
implements IQueryHandler<GetJournalQuery, JournalDetails>
18+
@QueryHandler(GetProfileJournalQuery)
19+
export class GetProfileJournalHandler
20+
implements IQueryHandler<GetProfileJournalQuery, JournalDetails>
2121
{
2222
constructor(
2323
@InjectRepository(JournalEntry)
@@ -26,7 +26,7 @@ export class GetJournalHandler
2626
private readonly userIdService: UserIdService,
2727
) {}
2828

29-
async execute(query: GetJournalQuery) {
29+
async execute(query: GetProfileJournalQuery) {
3030
const userId = this.userIdService.getUserId();
3131

3232
const foundJournalEntries = await this.queryService.find(
@@ -38,7 +38,7 @@ export class GetJournalHandler
3838
query,
3939
required: {
4040
where: {
41-
created: And(LessThan(query.to), MoreThan(query.from)),
41+
created: Between(query.from, query.to),
4242
userId,
4343
},
4444
},

services/api/src/core/journal/client/controllers/journal.controller.ts

+13-2
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,26 @@ import { QueryBus } from "@nestjs/cqrs";
33
import { ApiTags } from "@nestjs/swagger";
44

55
import { JournalDetails } from "../../application/contracts/dtos/journal-details.dto";
6+
import { GetCurrentOrganizationJournalQuery } from "../../application/contracts/queries/get-current-organization-journal.query";
67
import { GetJournalQuery } from "../../application/contracts/queries/get-journal.query";
8+
import { GetProfileJournalQuery } from "../../application/contracts/queries/get-profile-journal.query";
79

810
@Controller("journal")
911
@ApiTags("journal")
1012
export class JournalController {
1113
constructor(private queryBus: QueryBus) {}
1214

13-
@Get()
14-
async getJournal(@Query() query: GetJournalQuery): Promise<JournalDetails> {
15+
@Get("/current-organization")
16+
async getCurrentOrganizationJournal(
17+
@Query() query: GetCurrentOrganizationJournalQuery,
18+
): Promise<JournalDetails> {
19+
return await this.queryBus.execute(query);
20+
}
21+
22+
@Get("/profile")
23+
async getProfileJournal(
24+
@Query() query: GetProfileJournalQuery,
25+
): Promise<JournalDetails> {
1526
return await this.queryBus.execute(query);
1627
}
1728
}

services/api/src/core/journal/journal.module.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import { QueryModule } from "src/core/query/query.module";
77

88
import { AuthenticationModule } from "../authentication/authentication.module";
99
import { CreateJournalEntryHandler } from "./application/handlers/command-handlers/create-journal-entry.handler";
10-
import { GetJournalHandler } from "./application/handlers/query-handlers/get-journal.handler";
10+
import { GetCurrentOrganizationJournalHandler } from "./application/handlers/query-handlers/get-current-organization-journal.handler";
11+
import { GetProfileJournalHandler } from "./application/handlers/query-handlers/get-profile-journal.handler";
1112
import { JournalController } from "./client/controllers/journal.controller";
1213
import { JournalEntry } from "./infrastructure/entities/journal-entry.entity";
1314
import { JournalLogger } from "./journal.listener";
@@ -21,6 +22,11 @@ import { JournalLogger } from "./journal.listener";
2122
QueryModule,
2223
],
2324
controllers: [JournalController],
24-
providers: [CreateJournalEntryHandler, GetJournalHandler, JournalLogger],
25+
providers: [
26+
CreateJournalEntryHandler,
27+
GetCurrentOrganizationJournalHandler,
28+
GetProfileJournalHandler,
29+
JournalLogger,
30+
],
2531
})
2632
export class JournalModule {}

0 commit comments

Comments
 (0)