68 lines
2.3 KiB
TypeScript
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);
|
|
}
|
|
}
|