Skip to content

Commit aa1ab50

Browse files
committed
feat(event): adiciona filtro de eventos passados
closed #62, #57
1 parent ae6acfe commit aa1ab50

File tree

19 files changed

+197
-10
lines changed

19 files changed

+197
-10
lines changed

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

+7
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
FindAllEventsUseCase,
1212
CopyEventUseCase,
1313
FindMyEventsUseCase,
14+
FindEventsUntilUseCase,
1415
} from '@devmx/event-domain/client';
1516

1617
export class EventFacade extends EntityFacade<Event> {
@@ -26,6 +27,7 @@ export class EventFacade extends EntityFacade<Event> {
2627
private findEventsUseCase: FindEventsUseCase,
2728
private findMyEventsUseCase: FindMyEventsUseCase,
2829
private findAllEventsUseCase: FindAllEventsUseCase,
30+
private findEventsUntilUseCase: FindEventsUntilUseCase,
2931
private findEventByIDUseCase: FindEventByIDUseCase,
3032
private updateEventUseCase: UpdateEventUseCase,
3133
private copyEventUseCase: CopyEventUseCase,
@@ -51,6 +53,10 @@ export class EventFacade extends EntityFacade<Event> {
5153
this.onLoad(this.findAllEventsUseCase.execute(this.state.params));
5254
}
5355

56+
loadUntil() {
57+
this.onLoad(this.findEventsUntilUseCase.execute(this.state.params));
58+
}
59+
5460
loadMyEvents() {
5561
this.onLoad(this.findMyEventsUseCase.execute(this.state.params));
5662
}
@@ -94,6 +100,7 @@ export function provideEventFacade() {
94100
FindEventsUseCase,
95101
FindMyEventsUseCase,
96102
FindAllEventsUseCase,
103+
FindEventsUntilUseCase,
97104
FindEventByIDUseCase,
98105
UpdateEventUseCase,
99106
CopyEventUseCase,

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

+5
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ export class EventHttpServiceImpl
2020
return this.http.get<Page<Event>>(url.join('?'));
2121
}
2222

23+
findUntil(params: QueryParams<Event>) {
24+
const url = [`${this.url}/until`, createQueryParams(params)];
25+
return this.http.get<Page<Event>>(url.join('?'));
26+
}
27+
2328
findMyEvents(params: QueryParams<Event>) {
2429
const url = [`${this.url}/my`, createQueryParams(params)];
2530
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+
provideFindEventsUntilUseCase,
910
provideFindEventsUseCase,
1011
provideFindMyEventsUseCase,
1112
provideUpdateEventUseCase,
@@ -19,6 +20,7 @@ export function provideEvent() {
1920
provideFindEventsUseCase(),
2021
provideFindMyEventsUseCase(),
2122
provideFindAllEventsUseCase(),
23+
provideFindEventsUntilUseCase(),
2224
provideFindEventByIDUseCase(),
2325
provideUpdateEventUseCase(),
2426
provideDeleteEventUseCase(),

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

+12
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
DeleteEventUseCase,
1313
FindEventByIDUseCase,
1414
FindEventsFromUseCase,
15+
FindEventsUntilUseCase,
1516
FindEventsUseCase,
1617
FindMyEventsUseCase,
1718
UpdateEventUseCase,
@@ -28,6 +29,7 @@ export class EventsFacade {
2829
private findEventsUseCase: FindEventsUseCase,
2930
private findMyEventsUseCase: FindMyEventsUseCase,
3031
private findEventsFromUseCase: FindEventsFromUseCase,
32+
private findEventsUntilUseCase: FindEventsUntilUseCase,
3133
private findEventByIDUseCase: FindEventByIDUseCase,
3234
private updateEventUseCase: UpdateEventUseCase,
3335
private copyEventUseCase: CopyEventUseCase,
@@ -67,6 +69,15 @@ export class EventsFacade {
6769
return new PageDto(events, items, pages);
6870
}
6971

72+
async findUntil(date: Date, params: QueryParamsDto<Event>) {
73+
const { data, items, pages } = await this.findEventsUntilUseCase.execute([
74+
date,
75+
params,
76+
]);
77+
const events = plainToInstance(EventDto, data);
78+
return new PageDto(events, items, pages);
79+
}
80+
7081
async findOne(id: string) {
7182
const event = await this.findEventByIDUseCase.execute(id);
7283
return plainToInstance(EventDto, event);
@@ -89,6 +100,7 @@ export function provideEventsFacade() {
89100
FindEventsUseCase,
90101
FindMyEventsUseCase,
91102
FindEventsFromUseCase,
103+
FindEventsUntilUseCase,
92104
FindEventByIDUseCase,
93105
UpdateEventUseCase,
94106
CopyEventUseCase,

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

+30-7
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { QueryParams, EditableEntity } from '@devmx/shared-api-interfaces';
2+
import { Query, RootFilterQuery, SortOrder } from 'mongoose';
23
import { EventsService } from '@devmx/event-domain/server';
34
import { getModelToken } from '@nestjs/mongoose';
45
import { EventCollection } from '../schemas';
5-
import { Query } from 'mongoose';
66
import {
7+
objectId,
78
MongoService,
89
createServiceProvider,
9-
objectId,
1010
} from '@devmx/shared-data-source';
1111

1212
export class EventsMongoServiceImpl
@@ -38,15 +38,38 @@ export class EventsMongoServiceImpl
3838
}
3939

4040
async findFrom(date: Date, params: QueryParams<EventCollection>) {
41-
const { page = 0, size = 10, filter, sort } = params;
41+
const { page = 0, size = 10 } = params;
4242

4343
const skip = page * size;
44-
const where = this.applyFilter(filter ?? {});
45-
const order = this.applySort(sort ?? {});
44+
const filter = this.applyFilter(params.filter ?? {});
45+
const sort = this.applySort(params.sort ?? {});
46+
47+
const where = { ...filter, date: { $gte: date } };
48+
49+
return this.findByWhere(where, sort, skip, size);
50+
}
4651

52+
async findUntil(date: Date, params: QueryParams<EventCollection>) {
53+
const { page = 0, size = 10 } = params;
54+
55+
const skip = page * size;
56+
const filter = this.applyFilter(params.filter ?? {});
57+
const sort = this.applySort(params.sort ?? {});
58+
59+
const where = { ...filter, date: { $lte: date } };
60+
61+
return this.findByWhere(where, sort, skip, size);
62+
}
63+
64+
async findByWhere(
65+
where: RootFilterQuery<EventCollection>,
66+
sort: Record<string, SortOrder>,
67+
skip: number,
68+
size: number
69+
) {
4770
const query = this.entityModel
48-
.find({ ...where, date: { $gte: date } })
49-
.sort(order)
71+
.find(where)
72+
.sort(sort)
5073
.skip(skip)
5174
.limit(size);
5275

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

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
provideFindEventsFromUseCase,
1010
provideCopyEventUseCase,
1111
provideFindMyEventsUseCase,
12+
provideFindEventsUntilUseCase,
1213
} from '@devmx/event-domain/server';
1314

1415
export function provideEvent() {
@@ -19,6 +20,7 @@ export function provideEvent() {
1920
provideFindEventsUseCase(),
2021
provideFindMyEventsUseCase(),
2122
provideFindEventsFromUseCase(),
23+
provideFindEventsUntilUseCase(),
2224
provideFindEventByIDUseCase(),
2325
provideUpdateEventUseCase(),
2426
provideDeleteEventUseCase(),

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

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ export abstract class EventService extends EntityService<Event> {
1414

1515
abstract findAll(params: QueryParams<Event>): Observable<Page<Event>>;
1616

17+
abstract findUntil(params: QueryParams<Event>): Observable<Page<Event>>;
18+
1719
abstract findMyEvents(params: QueryParams<Event>): Observable<Page<Event>>;
1820

1921
abstract createRSVP(event: string, status: RSVPStatus): Observable<RSVP>;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
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+
} from '@devmx/shared-api-interfaces';
9+
10+
export class FindEventsUntilUseCase
11+
implements UseCase<QueryParams<Event>, Page<Event>>
12+
{
13+
constructor(private eventService: EventService) {}
14+
15+
execute(params: QueryParams<Event>) {
16+
return this.eventService.findUntil(params);
17+
}
18+
}
19+
20+
export function provideFindEventsUntilUseCase() {
21+
return createUseCaseProvider(FindEventsUntilUseCase, [EventService]);
22+
}

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-until';
78
export * from './find-events';
89
export * from './find-my-events';
910
export * from './find-rsvp-by-event';

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

+5
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,10 @@ export abstract class EventsService extends EntityService<Event> {
77
params: QueryParams<Event>
88
): Promise<Page<Event>>;
99

10+
abstract findUntil(
11+
date: Date,
12+
params: QueryParams<Event>
13+
): Promise<Page<Event>>;
14+
1015
abstract findMyEvents(params: QueryParams<Event>): Promise<Page<Event>>;
1116
}
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+
Event,
5+
Page,
6+
UseCase,
7+
QueryParams,
8+
} from '@devmx/shared-api-interfaces';
9+
10+
export class FindEventsUntilUseCase
11+
implements UseCase<[Date, QueryParams<Event>], Page<Event>>
12+
{
13+
constructor(private eventsService: EventsService) {}
14+
15+
async execute([date, params]: [Date, QueryParams<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.findUntil(date, params);
43+
}
44+
}
45+
46+
export function provideFindEventsUntilUseCase() {
47+
return createUseCaseProvider(FindEventsUntilUseCase, [EventsService]);
48+
}

packages/event/domain/src/server/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-event-by-id';
66
export * from './find-events-from';
7+
export * from './find-events-until';
78
export * from './find-events';
89
export * from './find-my-events';
910
export * from './find-past-events';

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

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
<header>
2-
<devmx-event-filter (filterChange)="onFilterChange($event)" />
2+
<div>
3+
<devmx-event-filter (filterChange)="onFilterChange($event)" />
4+
5+
<devmx-event-time (timeChange)="onTimeChange($event)" />
6+
</div>
37

48
<devmx-sort-direction (sortChange)="onSortChange($event)" />
59
</header>

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

+13-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { AsyncPipe } from '@angular/common';
99
import {
1010
EventCardComponent,
1111
EventFilterComponent,
12+
EventTimeComponent,
1213
} from '@devmx/event-ui-shared';
1314

1415
@Component({
@@ -18,6 +19,7 @@ import {
1819
changeDetection: ChangeDetectionStrategy.OnPush,
1920
imports: [
2021
PaginatorComponent,
22+
EventTimeComponent,
2123
EventFilterComponent,
2224
SortDirectionComponent,
2325
EventCardComponent,
@@ -40,7 +42,7 @@ export class EventsContainer {
4042
}
4143

4244
onQueryParams = (params: Params) => {
43-
const { title = '', format = '', date = 'asc' } = params;
45+
const { title = '', format = '', date = 'asc', time = '' } = params;
4446

4547
const { page = 0, size = 10 } = params;
4648

@@ -50,14 +52,23 @@ export class EventsContainer {
5052

5153
this.eventFacade.setParams({ page, size, filter, sort });
5254

53-
this.eventFacade.load();
55+
if (time === 'until') {
56+
this.eventFacade.loadUntil();
57+
} else {
58+
this.eventFacade.load();
59+
}
5460
};
5561

5662
onFilterChange(format: string) {
5763
const queryParams = { format };
5864
this.router.navigate([], { queryParams });
5965
}
6066

67+
onTimeChange(time: string) {
68+
const queryParams = { time };
69+
this.router.navigate([], { queryParams });
70+
}
71+
6172
onSortChange(date: string) {
6273
const queryParams = { date };
6374
this.router.navigate([], { queryParams });

packages/event/resource/src/lib/controllers/events.ts

+14
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,20 @@ export class EventsController {
9393
}
9494
}
9595

96+
@Get('until')
97+
@Allowed()
98+
@ApiPage(EventDto)
99+
async findUntil(@Query() params: QueryParamsDto<Event>) {
100+
let date = new Date();
101+
date = subDays(date, 1);
102+
103+
try {
104+
return await this.eventsFacade.findUntil(date, params);
105+
} catch (err) {
106+
throw exceptionByError(err);
107+
}
108+
}
109+
96110
@Get('my')
97111
@Allowed()
98112
@ApiPage(EventDto)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<mat-chip-listbox (change)="timeChange.emit($event.value)">
2+
@for (time of times; track time.value) {
3+
<mat-chip-option [value]="time.value">
4+
{{ time.viewValue }}
5+
</mat-chip-option>
6+
}
7+
</mat-chip-listbox>

packages/event/ui-shared/src/lib/components/event-time/event-time.component.scss

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { ChangeDetectionStrategy, Component, output } from '@angular/core';
2+
import { MatChipsModule } from '@angular/material/chips';
3+
import { FormOption } from '@devmx/shared-ui-global/forms';
4+
import { EventFormat } from '@devmx/shared-api-interfaces';
5+
6+
@Component({
7+
selector: 'devmx-event-time',
8+
templateUrl: './event-time.component.html',
9+
styleUrl: './event-time.component.scss',
10+
changeDetection: ChangeDetectionStrategy.OnPush,
11+
imports: [MatChipsModule],
12+
})
13+
export class EventTimeComponent {
14+
timeChange = output<EventFormat>();
15+
16+
times: FormOption<'' | 'until'>[] = [
17+
{ value: '', viewValue: 'Chegando' },
18+
{ value: 'until', viewValue: 'Passados' },
19+
];
20+
}

0 commit comments

Comments
 (0)