Skip to content

Commit 15bc684

Browse files
committed
feat(event): adiciona filtro de eventos por range de datas
1 parent aa1ab50 commit 15bc684

File tree

26 files changed

+283
-29
lines changed

26 files changed

+283
-29
lines changed

packages/event/data-access/src/lib/application/event.facade.ts

+8
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
CopyEventUseCase,
1313
FindMyEventsUseCase,
1414
FindEventsUntilUseCase,
15+
FindEventsDateRangeUseCase,
1516
} from '@devmx/event-domain/client';
1617

1718
export class EventFacade extends EntityFacade<Event> {
@@ -28,6 +29,7 @@ export class EventFacade extends EntityFacade<Event> {
2829
private findMyEventsUseCase: FindMyEventsUseCase,
2930
private findAllEventsUseCase: FindAllEventsUseCase,
3031
private findEventsUntilUseCase: FindEventsUntilUseCase,
32+
private findEventsDateRangeUseCase: FindEventsDateRangeUseCase,
3133
private findEventByIDUseCase: FindEventByIDUseCase,
3234
private updateEventUseCase: UpdateEventUseCase,
3335
private copyEventUseCase: CopyEventUseCase,
@@ -53,6 +55,11 @@ export class EventFacade extends EntityFacade<Event> {
5355
this.onLoad(this.findAllEventsUseCase.execute(this.state.params));
5456
}
5557

58+
loadDateRange(start: Date, end: Date) {
59+
const params = { start, end, ...this.state.params };
60+
this.onLoad(this.findEventsDateRangeUseCase.execute(params));
61+
}
62+
5663
loadUntil() {
5764
this.onLoad(this.findEventsUntilUseCase.execute(this.state.params));
5865
}
@@ -101,6 +108,7 @@ export function provideEventFacade() {
101108
FindMyEventsUseCase,
102109
FindAllEventsUseCase,
103110
FindEventsUntilUseCase,
111+
FindEventsDateRangeUseCase,
104112
FindEventByIDUseCase,
105113
UpdateEventUseCase,
106114
CopyEventUseCase,

packages/event/data-access/src/lib/infrastructure/event.http.service.impl.ts

+8
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,14 @@ export class EventHttpServiceImpl
2525
return this.http.get<Page<Event>>(url.join('?'));
2626
}
2727

28+
findDateRange(start: Date, end: Date, params: QueryParams<Event>) {
29+
const url = [
30+
`${this.url}/range/${start}/${end}`,
31+
createQueryParams(params),
32+
];
33+
return this.http.get<Page<Event>>(url.join('?'));
34+
}
35+
2836
findMyEvents(params: QueryParams<Event>) {
2937
const url = [`${this.url}/my`, createQueryParams(params)];
3038
return this.http.get<Page<Event>>(url.join('?'));

packages/event/data-access/src/lib/providers/event.ts

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
provideDeleteEventUseCase,
77
provideFindAllEventsUseCase,
88
provideFindEventByIDUseCase,
9+
provideFindEventsDateRangeUseCase,
910
provideFindEventsUntilUseCase,
1011
provideFindEventsUseCase,
1112
provideFindMyEventsUseCase,
@@ -21,6 +22,7 @@ export function provideEvent() {
2122
provideFindMyEventsUseCase(),
2223
provideFindAllEventsUseCase(),
2324
provideFindEventsUntilUseCase(),
25+
provideFindEventsDateRangeUseCase(),
2426
provideFindEventByIDUseCase(),
2527
provideUpdateEventUseCase(),
2628
provideDeleteEventUseCase(),

packages/event/data-source/src/lib/application/events.facade.ts

+11-1
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ import {
44
UpdateEventDto,
55
CopyEventDto,
66
} from '../dtos';
7-
import { Event } from '@devmx/shared-api-interfaces';
7+
import { Event, QueryParamsDateRange } from '@devmx/shared-api-interfaces';
88
import { plainToInstance } from 'class-transformer';
99
import {
1010
CopyEventUseCase,
1111
CreateEventUseCase,
1212
DeleteEventUseCase,
1313
FindEventByIDUseCase,
14+
FindEventsDateRangeUseCase,
1415
FindEventsFromUseCase,
1516
FindEventsUntilUseCase,
1617
FindEventsUseCase,
@@ -30,6 +31,7 @@ export class EventsFacade {
3031
private findMyEventsUseCase: FindMyEventsUseCase,
3132
private findEventsFromUseCase: FindEventsFromUseCase,
3233
private findEventsUntilUseCase: FindEventsUntilUseCase,
34+
private findEventsDateRangeUseCase: FindEventsDateRangeUseCase,
3335
private findEventByIDUseCase: FindEventByIDUseCase,
3436
private updateEventUseCase: UpdateEventUseCase,
3537
private copyEventUseCase: CopyEventUseCase,
@@ -60,6 +62,13 @@ export class EventsFacade {
6062
return new PageDto(events, items, pages);
6163
}
6264

65+
async findDateRange(params: QueryParamsDateRange<Event>) {
66+
const { data, items, pages } =
67+
await this.findEventsDateRangeUseCase.execute(params);
68+
const events = plainToInstance(EventDto, data);
69+
return new PageDto(events, items, pages);
70+
}
71+
6372
async findFrom(date: Date, params: QueryParamsDto<Event>) {
6473
const { data, items, pages } = await this.findEventsFromUseCase.execute([
6574
date,
@@ -101,6 +110,7 @@ export function provideEventsFacade() {
101110
FindMyEventsUseCase,
102111
FindEventsFromUseCase,
103112
FindEventsUntilUseCase,
113+
FindEventsDateRangeUseCase,
104114
FindEventByIDUseCase,
105115
UpdateEventUseCase,
106116
CopyEventUseCase,

packages/event/data-source/src/lib/infrastructure/events.mongo.service.impl.ts

+22-16
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1-
import { QueryParams, EditableEntity } from '@devmx/shared-api-interfaces';
21
import { Query, RootFilterQuery, SortOrder } from 'mongoose';
32
import { EventsService } from '@devmx/event-domain/server';
43
import { getModelToken } from '@nestjs/mongoose';
54
import { EventCollection } from '../schemas';
5+
import {
6+
QueryParams,
7+
EditableEntity,
8+
QueryParamsDateRange,
9+
} from '@devmx/shared-api-interfaces';
610
import {
711
objectId,
812
MongoService,
@@ -13,28 +17,30 @@ export class EventsMongoServiceImpl
1317
extends MongoService<EventCollection>
1418
implements EventsService
1519
{
16-
async findMyEvents(params: QueryParams<EventCollection>) {
17-
const { page = 0, size = 10, filter, sort } = params;
20+
async findDateRange(params: QueryParamsDateRange<EventCollection>) {
21+
const { page = 0, size = 10, start, end } = params;
1822

1923
const skip = page * size;
20-
const where = this.applyFilter(filter ?? {});
21-
const order = this.applySort(sort ?? {});
24+
const filter = this.applyFilter(params.filter ?? {});
25+
const sort = this.applySort(params.sort ?? {});
2226

23-
const { owner = '' } = filter ?? {};
27+
const where = { ...filter, date: { $gte: start, $lte: end } };
2428

25-
const query = this.entityModel
26-
.find({ leaders: { $in: [objectId(String(owner))] } })
27-
.sort(order)
28-
.skip(skip)
29-
.limit(size);
29+
return this.findByWhere(where, sort, skip, size);
30+
}
3031

31-
const entities = await this.applyPopulate(query).exec();
32+
async findMyEvents(params: QueryParams<EventCollection>) {
33+
const { page = 0, size = 10 } = params;
3234

33-
const data = entities.map((item) => item.toJSON());
34-
const items = await this.entityModel.countDocuments(where).exec();
35-
const pages = Math.ceil(items / size);
35+
const skip = page * size;
36+
const filter = this.applyFilter(params.filter ?? {});
37+
const sort = this.applySort(params.sort ?? {});
3638

37-
return { data, items, pages };
39+
const { owner = '' } = params.filter ?? {};
40+
41+
const where = { ...filter, leaders: { $in: [objectId(String(owner))] } };
42+
43+
return this.findByWhere(where, sort, skip, size);
3844
}
3945

4046
async findFrom(date: Date, params: QueryParams<EventCollection>) {

packages/event/data-source/src/lib/providers/event.ts

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
provideCopyEventUseCase,
1111
provideFindMyEventsUseCase,
1212
provideFindEventsUntilUseCase,
13+
provideFindEventsDateRangeUseCase,
1314
} from '@devmx/event-domain/server';
1415

1516
export function provideEvent() {
@@ -21,6 +22,7 @@ export function provideEvent() {
2122
provideFindMyEventsUseCase(),
2223
provideFindEventsFromUseCase(),
2324
provideFindEventsUntilUseCase(),
25+
provideFindEventsDateRangeUseCase(),
2426
provideFindEventByIDUseCase(),
2527
provideUpdateEventUseCase(),
2628
provideDeleteEventUseCase(),

packages/event/domain/src/client/services/event.ts

+2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ export abstract class EventService extends EntityService<Event> {
1515
abstract findAll(params: QueryParams<Event>): Observable<Page<Event>>;
1616

1717
abstract findUntil(params: QueryParams<Event>): Observable<Page<Event>>;
18+
// prettier-ignore
19+
abstract findDateRange(start: Date, end: Date, params: QueryParams<Event>): Observable<Page<Event>>;
1820

1921
abstract findMyEvents(params: QueryParams<Event>): Observable<Page<Event>>;
2022

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { createUseCaseProvider } from '@devmx/shared-util-data/client';
2+
import { EventService } from '../services';
3+
import {
4+
Page,
5+
Event,
6+
UseCase,
7+
QueryParams,
8+
QueryParamsDateRange,
9+
} from '@devmx/shared-api-interfaces';
10+
11+
export class FindEventsDateRangeUseCase
12+
implements UseCase<QueryParams<Event>, Page<Event>>
13+
{
14+
constructor(private eventService: EventService) {}
15+
16+
execute({ start, end, ...params }: QueryParamsDateRange<Event>) {
17+
return this.eventService.findDateRange(start, end, params);
18+
}
19+
}
20+
21+
export function provideFindEventsDateRangeUseCase() {
22+
return createUseCaseProvider(FindEventsDateRangeUseCase, [EventService]);
23+
}

packages/event/domain/src/client/use-cases/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export * from './create-rsvp';
44
export * from './delete-event';
55
export * from './find-all-events';
66
export * from './find-event-by-id';
7+
export * from './find-events-date-range';
78
export * from './find-events-until';
89
export * from './find-events';
910
export * from './find-my-events';

packages/event/domain/src/server/services/events.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
import { EntityService } from '@devmx/shared-api-interfaces/server';
2-
import { Event, Page, QueryParams } from '@devmx/shared-api-interfaces';
2+
import {
3+
Event,
4+
Page,
5+
QueryParams,
6+
QueryParamsDateRange,
7+
} from '@devmx/shared-api-interfaces';
38

49
export abstract class EventsService extends EntityService<Event> {
510
abstract findFrom(
@@ -12,5 +17,9 @@ export abstract class EventsService extends EntityService<Event> {
1217
params: QueryParams<Event>
1318
): Promise<Page<Event>>;
1419

20+
abstract findDateRange(
21+
params: QueryParamsDateRange<Event>
22+
): Promise<Page<Event>>;
23+
1524
abstract findMyEvents(params: QueryParams<Event>): Promise<Page<Event>>;
1625
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { createUseCaseProvider } from '@devmx/shared-util-data/server';
2+
import { EventsService } from '../services';
3+
import {
4+
Page,
5+
Event,
6+
UseCase,
7+
QueryParamsDateRange,
8+
} from '@devmx/shared-api-interfaces';
9+
10+
export class FindEventsDateRangeUseCase
11+
implements UseCase<QueryParamsDateRange<Event>, Page<Event>>
12+
{
13+
constructor(private eventsService: EventsService) {}
14+
15+
async execute(params: QueryParamsDateRange<Event>) {
16+
if (params.filter) {
17+
if (params.filter.format) {
18+
params.filter.format = new RegExp(params.filter.format, 'i');
19+
} else {
20+
delete params.filter.format;
21+
}
22+
23+
if (params.filter.title) {
24+
params.filter.title = new RegExp(params.filter.title, 'i');
25+
} else {
26+
delete params.filter.title;
27+
}
28+
29+
if (params.filter.city) {
30+
params.filter.city = params.filter.city.toString();
31+
} else {
32+
delete params.filter.city;
33+
}
34+
35+
if (params.filter.description) {
36+
params.filter.description = new RegExp(params.filter.description, 'i');
37+
} else {
38+
delete params.filter.description;
39+
}
40+
}
41+
42+
return await this.eventsService.findDateRange(params);
43+
}
44+
}
45+
46+
export function provideFindEventsDateRangeUseCase() {
47+
return createUseCaseProvider(FindEventsDateRangeUseCase, [EventsService]);
48+
}

packages/event/domain/src/server/use-cases/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ export * from './create-event';
33
export * from './create-rsvp';
44
export * from './delete-event';
55
export * from './find-event-by-id';
6+
export * from './find-events-date-range';
67
export * from './find-events-from';
78
export * from './find-events-until';
89
export * from './find-events';

packages/event/feature-shell/src/lib/containers/events/events.container.html

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
<header>
2-
<div>
2+
<section>
33
<devmx-event-filter (filterChange)="onFilterChange($event)" />
44

55
<devmx-event-time (timeChange)="onTimeChange($event)" />
6-
</div>
6+
</section>
77

8-
<devmx-sort-direction (sortChange)="onSortChange($event)" />
8+
<div>
9+
<devmx-event-date-range (rangeChange)="onRangeChange($event)" />
10+
11+
<devmx-sort-direction (sortChange)="onSortChange($event)" />
12+
</div>
913
</header>
1014

1115
@defer (on timer(500ms)) {

packages/event/feature-shell/src/lib/containers/events/events.container.scss

+6
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@
88
flex-flow: row wrap;
99
justify-content: space-between;
1010
padding: 0.4em 0.8em;
11+
12+
div {
13+
gap: 1em;
14+
display: flex;
15+
align-items: baseline;
16+
}
1117
}
1218

1319
.events-container {

0 commit comments

Comments
 (0)