import { Application, Request, Response } from 'express' import UserService from '../services/UserService' import jwt from 'jsonwebtoken' import config from './Config' import { loginAccountSchema, registerAccountSchema } from './ZodTypes' import path from 'path' import { TAsset } from './Types' import tileRepository from '../repositories/TileRepository' import objectRepository from '../repositories/ObjectRepository' import spriteRepository from '../repositories/SpriteRepository' import fs from 'fs' async function addHttpRoutes(app: Application) { app.get('/assets', async (req: Request, res: Response) => { let assets: TAsset[] = [] const tiles = await tileRepository.getAll() tiles.forEach((tile) => { assets.push({ key: tile.id, url: '/assets/tiles/' + tile.id + '.png', group: 'tiles' }) }) const objects = await objectRepository.getAll() objects.forEach((object) => { assets.push({ key: object.id, url: '/assets/objects/' + object.id + '.png', group: 'objects' }) }) const sprites = await spriteRepository.getAll() // sprites all contain spriteActions, loop through these sprites.forEach((sprite) => { sprite.spriteActions.forEach((spriteAction) => { assets.push({ key: sprite.id + '-' + spriteAction.action, url: '/assets/sprites/' + sprite.id + '/' + spriteAction.action + '.png', group: spriteAction.isAnimated ? 'sprite_animations' : 'sprites', frameWidth: spriteAction.frameWidth, frameHeight: spriteAction.frameHeight }) }) }) res.json(assets) }) app.get('/assets/:type/:spriteId?/:file', (req: Request, res: Response) => { const assetType = req.params.type const spriteId = req.params.spriteId const fileName = req.params.file let assetPath if (assetType === 'sprites' && spriteId) { assetPath = path.join(process.cwd(), 'public', assetType, spriteId, fileName) } else { assetPath = path.join(process.cwd(), 'public', assetType, fileName) } console.log(`Attempting to serve: ${assetPath}`) if (!fs.existsSync(assetPath)) { console.error(`File not found: ${assetPath}`) return res.status(404).send('Asset not found') } res.sendFile(assetPath, (err) => { if (err) { console.error('Error sending file:', err) res.status(500).send('Error downloading the asset') } }) }) app.post('/login', async (req: Request, res: Response) => { const { username, password } = req.body try { loginAccountSchema.parse({ username, password }) } catch (error: any) { return res.status(400).json({ message: error.errors[0]?.message }) } const userService = new UserService() const user = await userService.login(username, password) if (user && typeof user !== 'boolean') { const token = jwt.sign({ id: user.id }, config.JWT_SECRET, { expiresIn: '4h' }) return res.status(200).json({ token }) } return res.status(400).json({ message: 'Failed to login' }) }) app.post('/register', async (req: Request, res: Response) => { const { username, password } = req.body try { registerAccountSchema.parse({ username, password }) } catch (error: any) { return res.status(400).json({ message: error.errors[0]?.message }) } const userService = new UserService() const user = await userService.register(username, password) if (user) { return res.status(200).json({ message: 'User registered' }) } return res.status(400).json({ message: 'Failed to register user' }) }) console.log('[✅] Web routes added') } export { addHttpRoutes }