feat: add Drone CI pipelines, Jest unit tests, and Prettier check
Some checks failed
continuous-integration/drone/push Build encountered an error

Add Drone CI with server build/test and format check pipelines.
Add unit tests for password utils and recurrenceExpander.
Add check_format script, fix Jest config to ignore dist/,
remove dead CaldavService.test.ts, apply Prettier formatting.
This commit is contained in:
2026-02-24 12:43:31 +01:00
parent 16848bfdf0
commit bf8bb3cfb8
13 changed files with 367 additions and 29 deletions

View File

@@ -21,5 +21,4 @@ export class AuthController {
res.status(400).json({ error: (error as Error).message });
}
}
}

View File

@@ -15,7 +15,10 @@ export class CaldavController {
const response = await this.caldavService.saveConfig(config);
res.json(response);
} catch (error) {
log.error({ err: error, userId: req.user?.userId }, "Error saving config");
log.error(
{ err: error, userId: req.user?.userId },
"Error saving config",
);
res.status(500).json({ error: "Failed to save config" });
}
}
@@ -30,7 +33,10 @@ export class CaldavController {
// Don't expose the password to the client
res.json(config);
} catch (error) {
log.error({ err: error, userId: req.user?.userId }, "Error loading config");
log.error(
{ err: error, userId: req.user?.userId },
"Error loading config",
);
res.status(500).json({ error: "Failed to load config" });
}
}
@@ -40,7 +46,10 @@ export class CaldavController {
await this.caldavService.deleteConfig(req.user!.userId);
res.status(204).send();
} catch (error) {
log.error({ err: error, userId: req.user?.userId }, "Error deleting config");
log.error(
{ err: error, userId: req.user?.userId },
"Error deleting config",
);
res.status(500).json({ error: "Failed to delete config" });
}
}
@@ -50,7 +59,10 @@ export class CaldavController {
const events = await this.caldavService.pullEvents(req.user!.userId);
res.json(events);
} catch (error) {
log.error({ err: error, userId: req.user?.userId }, "Error pulling events");
log.error(
{ err: error, userId: req.user?.userId },
"Error pulling events",
);
res.status(500).json({ error: "Failed to pull events" });
}
}
@@ -60,7 +72,10 @@ export class CaldavController {
await this.caldavService.pushAll(req.user!.userId);
res.status(204).send();
} catch (error) {
log.error({ err: error, userId: req.user?.userId }, "Error pushing events");
log.error(
{ err: error, userId: req.user?.userId },
"Error pushing events",
);
res.status(500).json({ error: "Failed to push events" });
}
}
@@ -78,7 +93,10 @@ export class CaldavController {
await this.caldavService.pushEvent(req.user!.userId, event);
res.status(204).send();
} catch (error) {
log.error({ err: error, userId: req.user?.userId }, "Error pushing event");
log.error(
{ err: error, userId: req.user?.userId },
"Error pushing event",
);
res.status(500).json({ error: "Failed to push event" });
}
}

View File

@@ -40,7 +40,10 @@ export class EventController {
await this.pushToCaldav(userId, event);
res.status(201).json(event);
} catch (error) {
log.error({ err: error, userId: req.user?.userId }, "Error creating event");
log.error(
{ err: error, userId: req.user?.userId },
"Error creating event",
);
res.status(500).json({ error: "Failed to create event" });
}
}
@@ -67,7 +70,10 @@ export class EventController {
const events = await this.eventService.getAll(req.user!.userId);
res.json(events);
} catch (error) {
log.error({ err: error, userId: req.user?.userId }, "Error getting events");
log.error(
{ err: error, userId: req.user?.userId },
"Error getting events",
);
res.status(500).json({ error: "Failed to get events" });
}
}