import { BodyParams, PathParams } from "@tsed/platform-params"; import { Description, Get, Post, Returns, Summary } from "@tsed/schema"; import { Controller, Inject } from "@tsed/di"; import { Link } from "../../entities/link/Link"; import { SqliteDatasource } from "../../datasources/SqliteDatasource"; import { DataSource } from "typeorm"; import { User } from "../../entities/User"; import { CreateLinkDto } from "../../entities/link/CreateLinkDTO"; import { executeWithRetry } from "../../datasources/SqliteDatasource"; @Controller("/links") export class LinkController { constructor(@Inject(SqliteDatasource) private sqliteDataSource: DataSource) {} @Post("/") @Summary("Create a new link") @Description("Creates a new link and associates it with a user") @Returns(201, Link) async create(@BodyParams() linkData: CreateLinkDto): Promise { return executeWithRetry(async (queryRunner) => { const userRepository = queryRunner.manager.getRepository(User); const linkRepository = queryRunner.manager.getRepository(Link); let user = await userRepository.findOne({ where: { service: linkData.service, serviceUsername: linkData.serviceUsername } }); if (!user) { user = userRepository.create({ service: linkData.service, serviceUsername: linkData.serviceUsername }); user = await queryRunner.manager.save(User, user); } const link = linkRepository.create({ ...linkData, user }); return queryRunner.manager.save(Link, link); }, this.sqliteDataSource); } @Get("/") @Summary("Get all links") @(Returns(200, Array).Of(Link)) async getList(): Promise { return executeWithRetry(async (queryRunner) => { const linkRepository = queryRunner.manager.getRepository(Link); return linkRepository.find({ relations: ["user"] }); }, this.sqliteDataSource); } @Get("/:id") @Summary("Get a link by ID") @Returns(200, Link) async getOne(@PathParams("id") id: string): Promise { return executeWithRetry(async (queryRunner) => { const linkRepository = queryRunner.manager.getRepository(Link); return linkRepository.findOne({ where: { id }, relations: ["user"] }); }, this.sqliteDataSource); } }