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 @@ -12,6 +12,7 @@ import {
CopyEventUseCase,
FindMyEventsUseCase,
FindEventsUntilUseCase,
FindEventsDateRangeUseCase,
} from '@devmx/event-domain/client';

export class EventFacade extends EntityFacade<Event> {
Expand All @@ -28,6 +29,7 @@ export class EventFacade extends EntityFacade<Event> {
private findMyEventsUseCase: FindMyEventsUseCase,
private findAllEventsUseCase: FindAllEventsUseCase,
private findEventsUntilUseCase: FindEventsUntilUseCase,
private findEventsDateRangeUseCase: FindEventsDateRangeUseCase,
private findEventByIDUseCase: FindEventByIDUseCase,
private updateEventUseCase: UpdateEventUseCase,
private copyEventUseCase: CopyEventUseCase,
Expand All @@ -53,6 +55,11 @@ export class EventFacade extends EntityFacade<Event> {
this.onLoad(this.findAllEventsUseCase.execute(this.state.params));
}

loadDateRange(start: Date, end: Date) {
const params = { start, end, ...this.state.params };
this.onLoad(this.findEventsDateRangeUseCase.execute(params));
}

loadUntil() {
this.onLoad(this.findEventsUntilUseCase.execute(this.state.params));
}
Expand Down Expand Up @@ -101,6 +108,7 @@ export function provideEventFacade() {
FindMyEventsUseCase,
FindAllEventsUseCase,
FindEventsUntilUseCase,
FindEventsDateRangeUseCase,
FindEventByIDUseCase,
UpdateEventUseCase,
CopyEventUseCase,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,14 @@ export class EventHttpServiceImpl
return this.http.get<Page<Event>>(url.join('?'));
}

findDateRange(start: Date, end: Date, params: QueryParams<Event>) {
const url = [
`${this.url}/range/${start}/${end}`,
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,
provideFindEventsDateRangeUseCase,
provideFindEventsUntilUseCase,
provideFindEventsUseCase,
provideFindMyEventsUseCase,
Expand All @@ -21,6 +22,7 @@ export function provideEvent() {
provideFindMyEventsUseCase(),
provideFindAllEventsUseCase(),
provideFindEventsUntilUseCase(),
provideFindEventsDateRangeUseCase(),
provideFindEventByIDUseCase(),
provideUpdateEventUseCase(),
provideDeleteEventUseCase(),
Expand Down
12 changes: 11 additions & 1 deletion packages/event/data-source/src/lib/application/events.facade.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,14 @@ import {
UpdateEventDto,
CopyEventDto,
} from '../dtos';
import { Event } from '@devmx/shared-api-interfaces';
import { Event, QueryParamsDateRange } from '@devmx/shared-api-interfaces';
import { plainToInstance } from 'class-transformer';
import {
CopyEventUseCase,
CreateEventUseCase,
DeleteEventUseCase,
FindEventByIDUseCase,
FindEventsDateRangeUseCase,
FindEventsFromUseCase,
FindEventsUntilUseCase,
FindEventsUseCase,
Expand All @@ -30,6 +31,7 @@ export class EventsFacade {
private findMyEventsUseCase: FindMyEventsUseCase,
private findEventsFromUseCase: FindEventsFromUseCase,
private findEventsUntilUseCase: FindEventsUntilUseCase,
private findEventsDateRangeUseCase: FindEventsDateRangeUseCase,
private findEventByIDUseCase: FindEventByIDUseCase,
private updateEventUseCase: UpdateEventUseCase,
private copyEventUseCase: CopyEventUseCase,
Expand Down Expand Up @@ -60,6 +62,13 @@ export class EventsFacade {
return new PageDto(events, items, pages);
}

async findDateRange(params: QueryParamsDateRange<Event>) {
const { data, items, pages } =
await this.findEventsDateRangeUseCase.execute(params);
const events = plainToInstance(EventDto, data);
return new PageDto(events, items, pages);
}

async findFrom(date: Date, params: QueryParamsDto<Event>) {
const { data, items, pages } = await this.findEventsFromUseCase.execute([
date,
Expand Down Expand Up @@ -101,6 +110,7 @@ export function provideEventsFacade() {
FindMyEventsUseCase,
FindEventsFromUseCase,
FindEventsUntilUseCase,
FindEventsDateRangeUseCase,
FindEventByIDUseCase,
UpdateEventUseCase,
CopyEventUseCase,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +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 {
QueryParams,
EditableEntity,
QueryParamsDateRange,
} from '@devmx/shared-api-interfaces';
import {
objectId,
MongoService,
Expand All @@ -13,28 +17,30 @@ export class EventsMongoServiceImpl
extends MongoService<EventCollection>
implements EventsService
{
async findMyEvents(params: QueryParams<EventCollection>) {
const { page = 0, size = 10, filter, sort } = params;
async findDateRange(params: QueryParamsDateRange<EventCollection>) {
const { page = 0, size = 10, start, end } = 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 { owner = '' } = filter ?? {};
const where = { ...filter, date: { $gte: start, $lte: end } };

const query = this.entityModel
.find({ leaders: { $in: [objectId(String(owner))] } })
.sort(order)
.skip(skip)
.limit(size);
return this.findByWhere(where, sort, skip, size);
}

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

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

return { data, items, pages };
const { owner = '' } = params.filter ?? {};

const where = { ...filter, leaders: { $in: [objectId(String(owner))] } };

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

async findFrom(date: Date, params: QueryParams<EventCollection>) {
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 @@ -10,6 +10,7 @@ import {
provideCopyEventUseCase,
provideFindMyEventsUseCase,
provideFindEventsUntilUseCase,
provideFindEventsDateRangeUseCase,
} from '@devmx/event-domain/server';

export function provideEvent() {
Expand All @@ -21,6 +22,7 @@ export function provideEvent() {
provideFindMyEventsUseCase(),
provideFindEventsFromUseCase(),
provideFindEventsUntilUseCase(),
provideFindEventsDateRangeUseCase(),
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 @@ -15,6 +15,8 @@ export abstract class EventService extends EntityService<Event> {
abstract findAll(params: QueryParams<Event>): Observable<Page<Event>>;

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

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

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { createUseCaseProvider } from '@devmx/shared-util-data/client';
import { EventService } from '../services';
import {
Page,
Event,
UseCase,
QueryParams,
QueryParamsDateRange,
} from '@devmx/shared-api-interfaces';

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

execute({ start, end, ...params }: QueryParamsDateRange<Event>) {
return this.eventService.findDateRange(start, end, params);
}
}

export function provideFindEventsDateRangeUseCase() {
return createUseCaseProvider(FindEventsDateRangeUseCase, [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-date-range';
export * from './find-events-until';
export * from './find-events';
export * from './find-my-events';
Expand Down
11 changes: 10 additions & 1 deletion packages/event/domain/src/server/services/events.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import { EntityService } from '@devmx/shared-api-interfaces/server';
import { Event, Page, QueryParams } from '@devmx/shared-api-interfaces';
import {
Event,
Page,
QueryParams,
QueryParamsDateRange,
} from '@devmx/shared-api-interfaces';

export abstract class EventsService extends EntityService<Event> {
abstract findFrom(
Expand All @@ -12,5 +17,9 @@ export abstract class EventsService extends EntityService<Event> {
params: QueryParams<Event>
): Promise<Page<Event>>;

abstract findDateRange(
params: QueryParamsDateRange<Event>
): Promise<Page<Event>>;

abstract findMyEvents(params: QueryParams<Event>): Promise<Page<Event>>;
}
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 {
Page,
Event,
UseCase,
QueryParamsDateRange,
} from '@devmx/shared-api-interfaces';

export class FindEventsDateRangeUseCase
implements UseCase<QueryParamsDateRange<Event>, Page<Event>>
{
constructor(private eventsService: EventsService) {}

async execute(params: QueryParamsDateRange<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.findDateRange(params);
}
}

export function provideFindEventsDateRangeUseCase() {
return createUseCaseProvider(FindEventsDateRangeUseCase, [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 @@ -3,6 +3,7 @@ export * from './create-event';
export * from './create-rsvp';
export * from './delete-event';
export * from './find-event-by-id';
export * from './find-events-date-range';
export * from './find-events-from';
export * from './find-events-until';
export * from './find-events';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
<header>
<div>
<section>
<devmx-event-filter (filterChange)="onFilterChange($event)" />

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

<devmx-sort-direction (sortChange)="onSortChange($event)" />
<div>
<devmx-event-date-range (rangeChange)="onRangeChange($event)" />

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

@defer (on timer(500ms)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@
flex-flow: row wrap;
justify-content: space-between;
padding: 0.4em 0.8em;

div {
gap: 1em;
display: flex;
align-items: baseline;
}
}

.events-container {
Expand Down
Loading
Loading