Skip to content

Commit

Permalink
fix: Improved error handling (#5)
Browse files Browse the repository at this point in the history
* fix: Error must be string in database

* fix: Wrap Soundtrack API calls in try ... catch

* fix: Logging in lib/soundtrack-api/index.ts
  • Loading branch information
pettermachado authored Oct 2, 2024
1 parent 0e47b82 commit 6a702d4
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 18 deletions.
69 changes: 52 additions & 17 deletions api/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -348,23 +348,43 @@ router.get("/events/:eventId/actions", async (req, res) => {
const soundtrackApi = new Api();

router.get("/zones/:zoneId", async (req, res) => {
const zone = await soundtrackApi.getZone(req.params.zoneId);
res.json(zone);
try {
const zone = await soundtrackApi.getZone(req.params.zoneId);
res.json(zone);
} catch (e) {
logger.error("Failed to get zone: " + e);
res.sendStatus(500);
}
});

router.get("/zones", async (req, res) => {
const zones = await soundtrackApi.getZones();
res.json(zones);
try {
const zones = await soundtrackApi.getZones();
res.json(zones);
} catch (e) {
logger.error("Failed to get zones: " + e);
res.sendStatus(500);
}
});

router.get("/accounts/:accountId/library", async (req, res) => {
const library = await soundtrackApi.getLibrary(req.params.accountId);
res.json(library);
try {
const library = await soundtrackApi.getLibrary(req.params.accountId);
res.json(library);
} catch (e) {
logger.error("Failed to get library: " + e);
res.sendStatus(500);
}
});

router.get("/accounts/:accountId/zones", async (req, res) => {
const zones = await soundtrackApi.getAccountZones(req.params.accountId);
res.json(zones);
try {
const zones = await soundtrackApi.getAccountZones(req.params.accountId);
res.json(zones);
} catch (e) {
logger.error("Failed to get zones for account: " + e);
res.sendStatus(500);
}
});

router.get("/accounts/:accountId/events", async (req, res) => {
Expand All @@ -383,21 +403,36 @@ router.get("/accounts/:accountId/events", async (req, res) => {
});

router.get("/accounts/:accountId", async (req, res) => {
const account = await soundtrackApi.getAccount(req.params.accountId);
res.json(account);
try {
const account = await soundtrackApi.getAccount(req.params.accountId);
res.json(account);
} catch (e) {
logger.error("Failed to get account: " + e);
res.sendStatus(500);
}
});

router.get("/accounts", async (req, res) => {
const accounts = await soundtrackApi.getAccounts();
res.json(accounts);
try {
const accounts = await soundtrackApi.getAccounts();
res.json(accounts);
} catch (e) {
logger.error("Failed to get accounts: " + e);
res.sendStatus(500);
}
});

router.get("/assignable/:id", async (req, res) => {
const assignable = await soundtrackApi.getAssignable(req.params.id);
if (assignable) {
res.json(assignable);
} else {
res.status(404);
try {
const assignable = await soundtrackApi.getAssignable(req.params.id);
if (assignable) {
res.json(assignable);
} else {
res.sendStatus(404);
}
} catch (e) {
logger.error("Failed to get assignable: " + e);
res.sendStatus(500);
}
});

Expand Down
9 changes: 9 additions & 0 deletions lib/soundtrack-api/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,26 +12,30 @@ const logger = pino();

export class Api {
async getAccounts(): Promise<Account[]> {
logger.info("Getting accounts");
const res = await runQuery<AccountsQuery, AccountsQueryArgs>(
accountsQuery,
undefined,
);
return res.data.me.accounts.edges.map(({ node }) => node);
}
async getAccount(accountId: string): Promise<Account> {
logger.info(`Getting accounts ${accountId}`);
const res = await runQuery<AccountQuery, AccountQueryArgs>(accountQuery, {
id: accountId,
});
return res.data.account;
}
async getAccountZones(accountId: string): Promise<Zone[]> {
logger.info(`Getting zones for account ${accountId}`);
return await this.getAccountZonesPage(accountId, null, []);
}
private async getAccountZonesPage(
accountId: string,
cursor: string | null,
acc: Zone[],
): Promise<Zone[]> {
logger.info(`Getting zones for account ${accountId} from cursor ${cursor}`);
const res = await runQuery<AccountZonesQuery, AccountZonesQueryArgs>(
accountZonesQuery,
{
Expand All @@ -51,25 +55,29 @@ export class Api {
}
}
async getZone(zoneId: string): Promise<Zone> {
logger.info(`Getting zone ${zoneId}`);
const res = await runQuery<ZoneQuery, ZoneQueryArgs>(zoneQuery, {
id: zoneId,
});
return res.data.soundZone;
}
async getZones(): Promise<Zone[]> {
logger.info(`Getting zones`);
const accounts = await this.getAccounts();
const zones = await Promise.all(
accounts.map((account) => this.getAccountZones(account.id)),
);
return zones.flat();
}
async assignMusic(zoneId: string, playFromId: string): Promise<void> {
logger.info(`Assigning ${playFromId} to ${zoneId}`);
await runMutation<AssignMutation, AssignMutationArgs>(assignMutation, {
zoneId,
playFromId,
});
}
async getAssignable(assignableId: string): Promise<Assignable | null> {
logger.info(`Getting assignable ${assignableId}`);
const res = await runQuery<AssignableQuery, AssignableQueryArgs>(
assignableQuery,
{ assignableId },
Expand All @@ -83,6 +91,7 @@ export class Api {
return item ? toAssignable(item) : null;
}
async getLibrary(accountId: string): Promise<AccountLibrary> {
logger.info(`Getting library ${accountId}`);
const res = await this.getLibraryPage(
accountId,
{ playlists: null, schedules: null },
Expand Down
2 changes: 1 addition & 1 deletion lib/worker/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ async function executeEvent(runId: number, event: Model<any, any>) {
} catch (e) {
logger.info(`Failed to assign music to ${zoneId}: ${e}`);
status = "error";
error = e;
error = "" + e;
}

await Action.create({
Expand Down

0 comments on commit 6a702d4

Please sign in to comment.