Skip to content

Commit 22a848b

Browse files
committed
fix: badges
1 parent 0cf9ab9 commit 22a848b

File tree

3 files changed

+35
-12
lines changed

3 files changed

+35
-12
lines changed

src/pages/api/badge/[id].ts

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,15 @@
11
import { createContext } from 'app/graphql/context';
22
import { RequestHandler } from 'app/utils/types';
33

4-
import { TraceStatus } from '.prisma/client';
5-
64
export default (async (req, res) => {
75
const context = await createContext({ req, res });
86
context.exemptAuth = true;
97

108
const { id, rangeTime = '24h' } = req.query as { id: string; rangeTime?: string };
119

12-
const result = await context.traceService.findTraces({ websiteId: parseInt(id), rangeTime });
13-
14-
const oks = result.results.filter((r) => r.status === TraceStatus.OK);
10+
const { allTraces, oks } = await context.traceService.getBadgeStatistics(rangeTime, parseInt(id));
1511

16-
const percent =
17-
result.results.length === 0
18-
? 'unknown'
19-
: (Math.floor((oks.length / result.results.length) * 1000) / 1000) * 100;
12+
const percent = allTraces === 0 ? 'unknown' : (Math.floor((oks / allTraces) * 1000) / 1000) * 100;
2013

2114
const color =
2215
percent === 'unknown'
@@ -27,5 +20,7 @@ export default (async (req, res) => {
2720
? 'important'
2821
: 'critical';
2922

30-
res.redirect(`https://img.shields.io/badge/uptime-${encodeURIComponent(percent + '%')}-${color}`);
23+
res.redirect(
24+
`https://img.shields.io/badge/${rangeTime}-${encodeURIComponent(percent + '%')}-${color}`,
25+
);
3126
}) as RequestHandler;

src/pages/monitoring/websiteStatus/[id].tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ export default function Page() {
9090
};
9191

9292
const renderWebsiteInfo = () => {
93+
const badgeUrl = `${location.origin}/api/badge/${website.data?.website?.id}?rangeTime=${rangeTime}`;
94+
9395
return (
9496
<div className={classNames(gStyles.paper, descriptionsStyles.descriptions, 'mb-8')}>
9597
<Descriptions title="Website">
@@ -120,12 +122,12 @@ export default function Page() {
120122

121123
<Descriptions.Item label="Badge">
122124
<img
123-
src={`/api/badge/${website.data?.website?.id}`}
125+
src={badgeUrl}
124126
alt="The shield"
125127
className="cursor-pointer"
126128
onClick={async () => {
127129
await navigator.clipboard.writeText(
128-
`[![uptime-monitor](${location.origin}/api/badge/${website.data?.website?.id})](${location.origin}/monitoring/websiteStatus/${website.data?.website?.id})`,
130+
`[![uptime-monitor](${badgeUrl})](${location.origin}/monitoring/websiteStatus/${website.data?.website?.id})`,
129131
);
130132
alert('Markdown copied!');
131133
}}

src/services/TraceService.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,32 @@ export class TraceService extends BaseService {
199199
return result;
200200
}
201201

202+
async getBadgeStatistics(rangeTime: string, websiteId: number) {
203+
const oks = await this.ctx.prisma.trace.count({
204+
where: {
205+
websiteId,
206+
createdAt: {
207+
gt: getStartFromRangeTime(rangeTime),
208+
},
209+
status: TraceStatus.OK,
210+
},
211+
});
212+
213+
const allTraces = await this.ctx.prisma.trace.count({
214+
where: {
215+
websiteId,
216+
createdAt: {
217+
gt: getStartFromRangeTime(rangeTime),
218+
},
219+
},
220+
});
221+
222+
return {
223+
oks,
224+
allTraces,
225+
};
226+
}
227+
202228
async findTraces(query: TraceQuery) {
203229
const { isError, websiteId, websiteIds, rangeTime, timeAfter, timeBefore, status } = query;
204230

0 commit comments

Comments
 (0)