implement calendar event display with day indicators and overlay
- Add ExpandedEvent type to shared package for recurring event instances - Implement EventController and EventService with full CRUD operations - Server-side recurring event expansion via recurrenceExpander - Calendar grid shows orange dot indicator for days with events - Tap on day opens modal overlay with EventCards - EventCard component with Feather icons (calendar, clock, repeat, edit, trash) - EventsStore with Zustand for client-side event state management - Load events for visible grid range including adjacent month days - Add textPrimary, borderPrimary, eventIndicator to theme - Update test responses for multiple events on Saturdays
This commit is contained in:
@@ -6,29 +6,106 @@ export class EventController {
|
||||
constructor(private eventService: EventService) {}
|
||||
|
||||
async create(req: AuthenticatedRequest, res: Response): Promise<void> {
|
||||
throw new Error("Not implemented");
|
||||
try {
|
||||
const event = await this.eventService.create(req.user!.userId, req.body);
|
||||
res.status(201).json(event);
|
||||
} catch (error) {
|
||||
console.error("Error creating event:", error);
|
||||
res.status(500).json({ error: "Failed to create event" });
|
||||
}
|
||||
}
|
||||
|
||||
async getById(req: AuthenticatedRequest, res: Response): Promise<void> {
|
||||
throw new Error("Not implemented");
|
||||
try {
|
||||
const event = await this.eventService.getById(
|
||||
req.params.id,
|
||||
req.user!.userId,
|
||||
);
|
||||
if (!event) {
|
||||
res.status(404).json({ error: "Event not found" });
|
||||
return;
|
||||
}
|
||||
res.json(event);
|
||||
} catch (error) {
|
||||
console.error("Error getting event:", error);
|
||||
res.status(500).json({ error: "Failed to get event" });
|
||||
}
|
||||
}
|
||||
|
||||
async getAll(req: AuthenticatedRequest, res: Response): Promise<void> {
|
||||
throw new Error("Not implemented");
|
||||
try {
|
||||
const events = await this.eventService.getAll(req.user!.userId);
|
||||
res.json(events);
|
||||
} catch (error) {
|
||||
console.error("Error getting events:", error);
|
||||
res.status(500).json({ error: "Failed to get events" });
|
||||
}
|
||||
}
|
||||
|
||||
async getByDateRange(
|
||||
req: AuthenticatedRequest,
|
||||
res: Response,
|
||||
): Promise<void> {
|
||||
throw new Error("Not implemented");
|
||||
try {
|
||||
const { start, end } = req.query;
|
||||
|
||||
if (!start || !end) {
|
||||
res.status(400).json({ error: "start and end query params required" });
|
||||
return;
|
||||
}
|
||||
|
||||
const startDate = new Date(start as string);
|
||||
const endDate = new Date(end as string);
|
||||
|
||||
if (isNaN(startDate.getTime()) || isNaN(endDate.getTime())) {
|
||||
res.status(400).json({ error: "Invalid date format" });
|
||||
return;
|
||||
}
|
||||
|
||||
const events = await this.eventService.getByDateRange(
|
||||
req.user!.userId,
|
||||
startDate,
|
||||
endDate,
|
||||
);
|
||||
res.json(events);
|
||||
} catch (error) {
|
||||
console.error("Error getting events by range:", error);
|
||||
res.status(500).json({ error: "Failed to get events" });
|
||||
}
|
||||
}
|
||||
|
||||
async update(req: AuthenticatedRequest, res: Response): Promise<void> {
|
||||
throw new Error("Not implemented");
|
||||
try {
|
||||
const event = await this.eventService.update(
|
||||
req.params.id,
|
||||
req.user!.userId,
|
||||
req.body,
|
||||
);
|
||||
if (!event) {
|
||||
res.status(404).json({ error: "Event not found" });
|
||||
return;
|
||||
}
|
||||
res.json(event);
|
||||
} catch (error) {
|
||||
console.error("Error updating event:", error);
|
||||
res.status(500).json({ error: "Failed to update event" });
|
||||
}
|
||||
}
|
||||
|
||||
async delete(req: AuthenticatedRequest, res: Response): Promise<void> {
|
||||
throw new Error("Not implemented");
|
||||
try {
|
||||
const deleted = await this.eventService.delete(
|
||||
req.params.id,
|
||||
req.user!.userId,
|
||||
);
|
||||
if (!deleted) {
|
||||
res.status(404).json({ error: "Event not found" });
|
||||
return;
|
||||
}
|
||||
res.status(204).send();
|
||||
} catch (error) {
|
||||
console.error("Error deleting event:", error);
|
||||
res.status(500).json({ error: "Failed to delete event" });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user