Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
FindAllEventsUseCase,
CopyEventUseCase,
FindMyEventsUseCase,
FindEventsUntilUseCase,
} from '@devmx/event-domain/client';

export class EventFacade extends EntityFacade<Event> {
Expand All @@ -26,6 +27,7 @@ export class EventFacade extends EntityFacade<Event> {
private findEventsUseCase: FindEventsUseCase,
private findMyEventsUseCase: FindMyEventsUseCase,
private findAllEventsUseCase: FindAllEventsUseCase,
private findEventsUntilUseCase: FindEventsUntilUseCase,
private findEventByIDUseCase: FindEventByIDUseCase,
private updateEventUseCase: UpdateEventUseCase,
private copyEventUseCase: CopyEventUseCase,
Expand All @@ -51,6 +53,10 @@ export class EventFacade extends EntityFacade<Event> {
this.onLoad(this.findAllEventsUseCase.execute(this.state.params));
}

loadUntil() {
this.onLoad(this.findEventsUntilUseCase.execute(this.state.params));
}

loadMyEvents() {
this.onLoad(this.findMyEventsUseCase.execute(this.state.params));
}
Expand Down Expand Up @@ -94,6 +100,7 @@ export function provideEventFacade() {
FindEventsUseCase,
FindMyEventsUseCase,
FindAllEventsUseCase,
FindEventsUntilUseCase,
FindEventByIDUseCase,
UpdateEventUseCase,
CopyEventUseCase,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ export class EventHttpServiceImpl
return this.http.get<Page<Event>>(url.join('?'));
}

findUntil(params: QueryParams<Event>) {
const url = [`${this.url}/until`, createQueryParams(params)];
return this.http.get<Page<Event>>(url.join('?'));
}

findMyEvents(params: QueryParams<Event>) {
const url = [`${this.url}/my`, createQueryParams(params)];
return this.http.get<Page<Event>>(url.join('?'));
Expand Down
2 changes: 2 additions & 0 deletions packages/event/data-access/src/lib/providers/event.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
provideDeleteEventUseCase,
provideFindAllEventsUseCase,
provideFindEventByIDUseCase,
provideFindEventsUntilUseCase,
provideFindEventsUseCase,
provideFindMyEventsUseCase,
provideUpdateEventUseCase,
Expand All @@ -19,6 +20,7 @@ export function provideEvent() {
provideFindEventsUseCase(),
provideFindMyEventsUseCase(),
provideFindAllEventsUseCase(),
provideFindEventsUntilUseCase(),
provideFindEventByIDUseCase(),
provideUpdateEventUseCase(),
provideDeleteEventUseCase(),
Expand Down
12 changes: 12 additions & 0 deletions packages/event/data-source/src/lib/application/events.facade.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {
DeleteEventUseCase,
FindEventByIDUseCase,
FindEventsFromUseCase,
FindEventsUntilUseCase,
FindEventsUseCase,
FindMyEventsUseCase,
UpdateEventUseCase,
Expand All @@ -28,6 +29,7 @@ export class EventsFacade {
private findEventsUseCase: FindEventsUseCase,
private findMyEventsUseCase: FindMyEventsUseCase,
private findEventsFromUseCase: FindEventsFromUseCase,
private findEventsUntilUseCase: FindEventsUntilUseCase,
private findEventByIDUseCase: FindEventByIDUseCase,
private updateEventUseCase: UpdateEventUseCase,
private copyEventUseCase: CopyEventUseCase,
Expand Down Expand Up @@ -67,6 +69,15 @@ export class EventsFacade {
return new PageDto(events, items, pages);
}

async findUntil(date: Date, params: QueryParamsDto<Event>) {
const { data, items, pages } = await this.findEventsUntilUseCase.execute([
date,
params,
]);
const events = plainToInstance(EventDto, data);
return new PageDto(events, items, pages);
}

async findOne(id: string) {
const event = await this.findEventByIDUseCase.execute(id);
return plainToInstance(EventDto, event);
Expand All @@ -89,6 +100,7 @@ export function provideEventsFacade() {
FindEventsUseCase,
FindMyEventsUseCase,
FindEventsFromUseCase,
FindEventsUntilUseCase,
FindEventByIDUseCase,
UpdateEventUseCase,
CopyEventUseCase,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { QueryParams, EditableEntity } from '@devmx/shared-api-interfaces';
import { Query, RootFilterQuery, SortOrder } from 'mongoose';
import { EventsService } from '@devmx/event-domain/server';
import { getModelToken } from '@nestjs/mongoose';
import { EventCollection } from '../schemas';
import { Query } from 'mongoose';
import {
objectId,
MongoService,
createServiceProvider,
objectId,
} from '@devmx/shared-data-source';

export class EventsMongoServiceImpl
Expand Down Expand Up @@ -38,15 +38,38 @@ export class EventsMongoServiceImpl
}

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

const skip = page * size;
const where = this.applyFilter(filter ?? {});
const order = this.applySort(sort ?? {});
const filter = this.applyFilter(params.filter ?? {});
const sort = this.applySort(params.sort ?? {});

const where = { ...filter, date: { $gte: date } };

return this.findByWhere(where, sort, skip, size);
}

async findUntil(date: Date, params: QueryParams<EventCollection>) {
const { page = 0, size = 10 } = params;

const skip = page * size;
const filter = this.applyFilter(params.filter ?? {});
const sort = this.applySort(params.sort ?? {});

const where = { ...filter, date: { $lte: date } };

return this.findByWhere(where, sort, skip, size);
}

async findByWhere(
where: RootFilterQuery<EventCollection>,
sort: Record<string, SortOrder>,
skip: number,
size: number
) {
const query = this.entityModel
.find({ ...where, date: { $gte: date } })
.sort(order)
.find(where)
.sort(sort)
.skip(skip)
.limit(size);

Expand Down
2 changes: 2 additions & 0 deletions packages/event/data-source/src/lib/providers/event.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
provideFindEventsFromUseCase,
provideCopyEventUseCase,
provideFindMyEventsUseCase,
provideFindEventsUntilUseCase,
} from '@devmx/event-domain/server';

export function provideEvent() {
Expand All @@ -19,6 +20,7 @@ export function provideEvent() {
provideFindEventsUseCase(),
provideFindMyEventsUseCase(),
provideFindEventsFromUseCase(),
provideFindEventsUntilUseCase(),
provideFindEventByIDUseCase(),
provideUpdateEventUseCase(),
provideDeleteEventUseCase(),
Expand Down
2 changes: 2 additions & 0 deletions packages/event/domain/src/client/services/event.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ export abstract class EventService extends EntityService<Event> {

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

abstract findUntil(params: QueryParams<Event>): Observable<Page<Event>>;

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

abstract createRSVP(event: string, status: RSVPStatus): Observable<RSVP>;
Expand Down
22 changes: 22 additions & 0 deletions packages/event/domain/src/client/use-cases/find-events-until.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { createUseCaseProvider } from '@devmx/shared-util-data/client';
import { EventService } from '../services';
import {
Page,
Event,
UseCase,
QueryParams,
} from '@devmx/shared-api-interfaces';

export class FindEventsUntilUseCase
implements UseCase<QueryParams<Event>, Page<Event>>
{
constructor(private eventService: EventService) {}

execute(params: QueryParams<Event>) {
return this.eventService.findUntil(params);
}
}

export function provideFindEventsUntilUseCase() {
return createUseCaseProvider(FindEventsUntilUseCase, [EventService]);
}
1 change: 1 addition & 0 deletions packages/event/domain/src/client/use-cases/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ export * from './create-rsvp';
export * from './delete-event';
export * from './find-all-events';
export * from './find-event-by-id';
export * from './find-events-until';
export * from './find-events';
export * from './find-my-events';
export * from './find-rsvp-by-event';
Expand Down
5 changes: 5 additions & 0 deletions packages/event/domain/src/server/services/events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,10 @@ export abstract class EventsService extends EntityService<Event> {
params: QueryParams<Event>
): Promise<Page<Event>>;

abstract findUntil(
date: Date,
params: QueryParams<Event>
): Promise<Page<Event>>;

abstract findMyEvents(params: QueryParams<Event>): Promise<Page<Event>>;
}
48 changes: 48 additions & 0 deletions packages/event/domain/src/server/use-cases/find-events-until.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import { createUseCaseProvider } from '@devmx/shared-util-data/server';
import { EventsService } from '../services';
import {
Event,
Page,
UseCase,
QueryParams,
} from '@devmx/shared-api-interfaces';

export class FindEventsUntilUseCase
implements UseCase<[Date, QueryParams<Event>], Page<Event>>
{
constructor(private eventsService: EventsService) {}

async execute([date, params]: [Date, QueryParams<Event>]) {
if (params.filter) {
if (params.filter.format) {
params.filter.format = new RegExp(params.filter.format, 'i');
} else {
delete params.filter.format;
}

if (params.filter.title) {
params.filter.title = new RegExp(params.filter.title, 'i');
} else {
delete params.filter.title;
}

if (params.filter.city) {
params.filter.city = params.filter.city.toString();
} else {
delete params.filter.city;
}

if (params.filter.description) {
params.filter.description = new RegExp(params.filter.description, 'i');
} else {
delete params.filter.description;
}
}

return await this.eventsService.findUntil(date, params);
}
}

export function provideFindEventsUntilUseCase() {
return createUseCaseProvider(FindEventsUntilUseCase, [EventsService]);
}
1 change: 1 addition & 0 deletions packages/event/domain/src/server/use-cases/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ export * from './create-rsvp';
export * from './delete-event';
export * from './find-event-by-id';
export * from './find-events-from';
export * from './find-events-until';
export * from './find-events';
export * from './find-my-events';
export * from './find-past-events';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
<header>
<devmx-event-filter (filterChange)="onFilterChange($event)" />
<div>
<devmx-event-filter (filterChange)="onFilterChange($event)" />

<devmx-event-time (timeChange)="onTimeChange($event)" />
</div>

<devmx-sort-direction (sortChange)="onSortChange($event)" />
</header>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { AsyncPipe } from '@angular/common';
import {
EventCardComponent,
EventFilterComponent,
EventTimeComponent,
} from '@devmx/event-ui-shared';

@Component({
Expand All @@ -18,6 +19,7 @@ import {
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [
PaginatorComponent,
EventTimeComponent,
EventFilterComponent,
SortDirectionComponent,
EventCardComponent,
Expand All @@ -40,7 +42,7 @@ export class EventsContainer {
}

onQueryParams = (params: Params) => {
const { title = '', format = '', date = 'asc' } = params;
const { title = '', format = '', date = 'asc', time = '' } = params;

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

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

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

this.eventFacade.load();
if (time === 'until') {
this.eventFacade.loadUntil();
} else {
this.eventFacade.load();
}
};

onFilterChange(format: string) {
const queryParams = { format };
this.router.navigate([], { queryParams });
}

onTimeChange(time: string) {
const queryParams = { time };
this.router.navigate([], { queryParams });
}

onSortChange(date: string) {
const queryParams = { date };
this.router.navigate([], { queryParams });
Expand Down
14 changes: 14 additions & 0 deletions packages/event/resource/src/lib/controllers/events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,20 @@ export class EventsController {
}
}

@Get('until')
@Allowed()
@ApiPage(EventDto)
async findUntil(@Query() params: QueryParamsDto<Event>) {
let date = new Date();
date = subDays(date, 1);

try {
return await this.eventsFacade.findUntil(date, params);
} catch (err) {
throw exceptionByError(err);
}
}

@Get('my')
@Allowed()
@ApiPage(EventDto)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<mat-chip-listbox (change)="timeChange.emit($event.value)">
@for (time of times; track time.value) {
<mat-chip-option [value]="time.value">
{{ time.viewValue }}
</mat-chip-option>
}
</mat-chip-listbox>
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { ChangeDetectionStrategy, Component, output } from '@angular/core';
import { MatChipsModule } from '@angular/material/chips';
import { FormOption } from '@devmx/shared-ui-global/forms';
import { EventFormat } from '@devmx/shared-api-interfaces';

@Component({
selector: 'devmx-event-time',
templateUrl: './event-time.component.html',
styleUrl: './event-time.component.scss',
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [MatChipsModule],
})
export class EventTimeComponent {
timeChange = output<EventFormat>();

times: FormOption<'' | 'until'>[] = [
{ value: '', viewValue: 'Chegando' },
{ value: 'until', viewValue: 'Passados' },
];
}
Loading
Loading