intended-server/src/controllers/rest/LinkController.ts

68 lines
2.3 KiB
TypeScript

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<Link> {
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<Link[]> {
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<Link | null> {
return executeWithRetry(async (queryRunner) => {
const linkRepository = queryRunner.manager.getRepository(Link);
return linkRepository.findOne({ where: { id }, relations: ["user"] });
}, this.sqliteDataSource);
}
}