merge: Add fail safe for sponsors endpoint in case of not being able to connect (!436)

View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/436

Closes #428

Approved-by: Amelia Yukii <amelia.yukii@shourai.de>
Approved-by: dakkar <dakkar@thenautilus.net>
This commit is contained in:
Amelia Yukii 2024-02-21 18:59:31 +00:00
commit 8197148209
2 changed files with 30 additions and 23 deletions

View file

@ -1,20 +1,20 @@
import { Inject, Injectable } from '@nestjs/common'; import { Inject, Injectable } from '@nestjs/common';
import * as Redis from 'ioredis';
import { Endpoint } from '@/server/api/endpoint-base.js'; import { Endpoint } from '@/server/api/endpoint-base.js';
import { DI } from '@/di-symbols.js'; import { DI } from '@/di-symbols.js';
import * as Redis from 'ioredis';
export const meta = { export const meta = {
tags: ["meta"], tags: ['meta'],
description: "Get Sharkey GH Sponsors", description: 'Get Sharkey GH Sponsors',
requireCredential: false, requireCredential: false,
requireCredentialPrivateMode: false, requireCredentialPrivateMode: false,
} as const; } as const;
export const paramDef = { export const paramDef = {
type: "object", type: 'object',
properties: { properties: {
forceUpdate: { type: "boolean", default: false }, forceUpdate: { type: 'boolean', default: false },
}, },
required: [], required: [],
} as const; } as const;
@ -25,22 +25,29 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
@Inject(DI.redis) private redisClient: Redis.Redis, @Inject(DI.redis) private redisClient: Redis.Redis,
) { ) {
super(meta, paramDef, async (ps, me) => { super(meta, paramDef, async (ps, me) => {
let sponsors; let sponsors;
const cachedSponsors = await this.redisClient.get("sponsors"); const cachedSponsors = await this.redisClient.get('sponsors');
if (!ps.forceUpdate && cachedSponsors) { if (!ps.forceUpdate && cachedSponsors) {
sponsors = JSON.parse(cachedSponsors); sponsors = JSON.parse(cachedSponsors);
} else { } else {
AbortSignal.timeout ??= function timeout(ms) { AbortSignal.timeout ??= function timeout(ms) {
const ctrl = new AbortController(); const ctrl = new AbortController();
setTimeout(() => ctrl.abort(), ms); setTimeout(() => ctrl.abort(), ms);
return ctrl.signal; return ctrl.signal;
}; };
sponsors = await fetch("https://kaifa.ch/transfem-sponsors.json", { signal: AbortSignal.timeout(2000) }) try {
.then((response) => response.json()); sponsors = await fetch('https://kaifa.ch/transfem-sponsors.json', { signal: AbortSignal.timeout(2000) })
await this.redisClient.set("sponsors", JSON.stringify(sponsors), "EX", 3600); .then((response) => response.json());
}
return { sponsor_data: sponsors['sponsors'] }; await this.redisClient.set('sponsors', JSON.stringify(sponsors), 'EX', 3600);
}); } catch (error) {
} sponsors = {
sponsors: [],
};
}
}
return { sponsor_data: sponsors['sponsors'] };
});
}
} }

View file

@ -121,7 +121,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</a> </a>
</div> </div>
</FormSection> </FormSection>
<FormSection> <FormSection v-if="sponsors[0].length > 0">
<template #label>Our lovely Sponsors</template> <template #label>Our lovely Sponsors</template>
<div :class="$style.contributors"> <div :class="$style.contributors">
<span <span