diff --git a/elysia/src/index.ts b/elysia/src/index.ts index b87f71a..ea3943d 100644 --- a/elysia/src/index.ts +++ b/elysia/src/index.ts @@ -35,20 +35,37 @@ app.post('/link', async ({ body }) => { return { message: 'Success' } }) -app.get('/:shortenerCode', async ({ params: { shortenerCode }, set }) => { - const shortener = await db - .selectFrom('shortener') - .selectAll() - .where('code', '=', shortenerCode) - .execute() +app.get( + '/:shortenerCode', + async ({ params: { shortenerCode }, set, request }) => { + const ip = request.headers.get('x-forwarded-for') - if (!shortener.length) { - set.redirect = '/invalid' - return - } + const geolocation = await ( + await fetch(`https://api.ipbase.com/v2/info?ip=${ip}`) + ).json() - set.redirect = shortener[0].link -}) + const shortener = await db + .selectFrom('shortener') + .selectAll() + .where('code', '=', shortenerCode) + .orderBy('created_at', 'desc') + .execute() + + const visitor_data = { + shortener_id: shortener[0].id, + country: geolocation.data.location.country.name as string, + } + + await db.insertInto('visitor').values(visitor_data).execute() + + if (!shortener.length) { + set.redirect = '/invalid' + return + } + + set.redirect = shortener[0].link + } +) app.listen(3000) diff --git a/elysia/src/types.ts b/elysia/src/types.ts index f511492..85691cc 100644 --- a/elysia/src/types.ts +++ b/elysia/src/types.ts @@ -1,15 +1,33 @@ -import { Generated, Insertable, Selectable, Updateable } from 'kysely' +import { + ColumnType, + Generated, + Insertable, + Selectable, + Updateable, +} from 'kysely' export interface Database { shortener: ShortenerTable + visitor: VisitorTable } export interface ShortenerTable { id: Generated link: string code: string + created_at: ColumnType } export type Shortener = Selectable export type NewShortener = Insertable export type ShortenerUpdate = Updateable + +export interface VisitorTable { + id: Generated + shortener_id: number + country: string + created_at: ColumnType +} + +export type Visitor = Selectable +export type NewVisitor = Insertable