Skip to content

Commit d9d8d3b

Browse files
authored
Merge pull request #11 from cuappdev/fanhao/version
Version endpoint
2 parents f7ef0f0 + 09a6c29 commit d9d8d3b

4 files changed

Lines changed: 45 additions & 2 deletions

File tree

src/constants.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ export const EATERY_IMAGES_BASE_URL =
44
export const DEFAULT_IMAGE_URL =
55
'https://images-prod.healthline.com/hlcmsresource/images/AN_images/health-benefits-of-apples-1296x728-feature.jpg';
66

7+
export const ITUNES_LOOKUP_URL =
8+
'https://itunes.apple.com/lookup?bundleId=org.cuappdev.eatery';
9+
710
export enum Weekday {
811
SUNDAY = 'Sunday',
912
MONDAY = 'Monday',

src/server.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ import { requestLogger } from './middleware/logger.js';
1212
import { ipRateLimiter } from './middleware/rateLimit.js';
1313
import { prisma } from './prisma.js';
1414
import userRouter from './users/userRouter.js';
15-
import { cacheRouter } from './utils/cache.js';
16-
import { refreshCacheFromDB } from './utils/cache.js';
15+
import { cacheRouter, refreshCacheFromDB } from './utils/cache.js';
16+
import { versionRouter } from './utils/version.js';
1717

1818
const app = express();
1919

@@ -52,6 +52,7 @@ router.get('/health', async (_: Request, res: Response) => {
5252
// Public routes
5353
router.use('/auth', authRouter);
5454
router.use('/internal/cache', cacheRouter);
55+
router.use('/version', versionRouter);
5556
router.use('/eateries', eateryRouter);
5657

5758
// Protected routes

src/utils/AppError.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export enum ErrorCodes {
66
NOT_FOUND = 'NOT_FOUND', // 404
77
CONFLICT = 'CONFLICT', // 409
88
TOO_MANY_REQUESTS = 'TOO_MANY_REQUESTS', // 429
9+
BAD_GATEWAY = 'BAD_GATEWAY', // 502
910
}
1011

1112
export class AppError extends Error {
@@ -85,3 +86,9 @@ export class TooManyRequestsError extends AppError {
8586
super(message, 429, ErrorCodes.TOO_MANY_REQUESTS, data);
8687
}
8788
}
89+
90+
export class BadGatewayError extends AppError {
91+
constructor(message: string = 'Bad Gateway', data?: Record<string, unknown>) {
92+
super(message, 502, ErrorCodes.BAD_GATEWAY, data);
93+
}
94+
}

src/utils/version.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { type Request, type Response, Router } from 'express';
2+
3+
import { ITUNES_LOOKUP_URL } from '../constants.js';
4+
import { BadGatewayError } from './AppError.js';
5+
6+
interface iTunesLookupResult {
7+
resultCount: number;
8+
results: Array<{ version?: string }>;
9+
}
10+
11+
async function fetchAppVersion(): Promise<string> {
12+
const response = await fetch(ITUNES_LOOKUP_URL);
13+
const data = (await response.json()) as iTunesLookupResult;
14+
15+
if (!response.ok || !data.results?.length) {
16+
throw new BadGatewayError('Failed to fetch app version from App Store');
17+
}
18+
19+
const version = data.results[0]?.version;
20+
if (!version) {
21+
throw new BadGatewayError('Version not found in App Store response');
22+
}
23+
24+
return version;
25+
}
26+
27+
export const versionRouter = Router();
28+
29+
versionRouter.get('/', async (_req: Request, res: Response) => {
30+
const version = await fetchAppVersion();
31+
return res.json({ version });
32+
});

0 commit comments

Comments
 (0)