-
Notifications
You must be signed in to change notification settings - Fork 0
Feat: implement link routes #123
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
TeddyRoncin
wants to merge
11
commits into
dev
Choose a base branch
from
feat/links
base: dev
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from 4 commits
Commits
Show all changes
11 commits
Select commit
Hold shift + click to select a range
b3bdbe5
Add link routes
TeddyRoncin c304359
Implement link routes
TeddyRoncin 3ca0bb5
Merge remote-tracking branch 'origin/dev' into feat/links
TeddyRoncin abafbe6
Changed field name "link" to "hyperlink" in Link table in the database
TeddyRoncin dc738c6
Alban's comments + new delete route for links
TeddyRoncin adebb9e
Merge remote-tracking branch 'origin/dev' into feat/links
TeddyRoncin 35b34ba
Lint and fixing build
TeddyRoncin 0ce1af6
Fix tests
TeddyRoncin fe7e7a2
Alban's comment & Lint
TeddyRoncin 67ac538
LinkReqDto.position had wrong validators
TeddyRoncin 9befa59
Lint grrrr
TeddyRoncin File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Some comments aren't visible on the classic Files Changed page.
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,18 @@ | ||
| import { createParamDecorator, ExecutionContext } from '@nestjs/common'; | ||
| import { Language } from '@prisma/client'; | ||
|
|
||
| /** | ||
| * Get the language for which the request was made. | ||
| * @returns The language (fr, en, es, de, zh). | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * public async getLinks(@GetLanguage() language: Language) { | ||
| * ... | ||
| * } | ||
| * ``` | ||
| */ | ||
| export const GetLanguage = createParamDecorator((_, ctx: ExecutionContext) => { | ||
| const request = ctx.switchToHttp().getRequest<Request>(); | ||
| return request.headers['x-language'] as Language; | ||
| }); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| import { IsNotEmpty, IsObject, IsUrl, ValidateNested } from 'class-validator'; | ||
| import { TranslationReqDto } from '../../../app.dto'; | ||
| import { Type } from 'class-transformer'; | ||
|
|
||
| export class LinkReqDto { | ||
| @IsObject() | ||
| @ValidateNested() | ||
| @Type(() => TranslationReqDto) | ||
| name: TranslationReqDto; | ||
|
|
||
| @IsObject() | ||
| @ValidateNested() | ||
| @Type(() => TranslationReqDto) | ||
| tooltip: TranslationReqDto; | ||
|
|
||
| @IsUrl() | ||
| @IsNotEmpty() | ||
| hyperlink: string; | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,11 @@ | ||
| import { ApiProperty } from '@nestjs/swagger'; | ||
| import { Translation } from '../../../prisma/types'; | ||
|
|
||
| export class LinkResDto { | ||
| id: string; | ||
| @ApiProperty({ type: String }) | ||
| name: Translation; | ||
| @ApiProperty({ type: String }) | ||
| tooltip: Translation; | ||
| hyperlink: string; | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,45 @@ | ||
| import { Body, Controller, Get, Patch, Post } from '@nestjs/common'; | ||
| import { LinkService } from './link.service'; | ||
| import { LinkResDto } from './dto/res/link-res.dto'; | ||
| import { getTranslation, pick } from '../utils'; | ||
| import { Link } from './link.interface'; | ||
| import { IsPublic, RequireApiPermission } from '../auth/decorator'; | ||
| import { LinkReqDto } from './dto/req/link-req.dto'; | ||
| import { AppException, ERROR_CODE } from '../exceptions'; | ||
| import { ApiAppErrorResponse } from '../app.dto'; | ||
| import { Language } from '@prisma/client'; | ||
| import { GetLanguage } from '../app.decorator'; | ||
| import { UUIDParam } from '../app.pipe'; | ||
|
|
||
| @Controller('link') | ||
| export class LinkController { | ||
| constructor(private readonly linkService: LinkService) {} | ||
|
|
||
| @Get() | ||
| @IsPublic() | ||
| public async get(@GetLanguage() language: Language) { | ||
| return (await this.linkService.getLinks()).mappedSort((link) => getTranslation(link.name, language)).map(this.formatLink); | ||
|
TeddyRoncin marked this conversation as resolved.
Outdated
|
||
| } | ||
|
|
||
| @Post() | ||
| @RequireApiPermission('API_MODIFY_LINKS') | ||
| @ApiAppErrorResponse(ERROR_CODE.LINK_ALREADY_EXISTS, 'This link already exists') | ||
| public async create(@Body() dto: LinkReqDto) { | ||
| if (await this.linkService.hyperlinkExists(dto.hyperlink)) throw new AppException(ERROR_CODE.LINK_ALREADY_EXISTS); | ||
| const link = await this.linkService.create(dto.name, dto.tooltip, dto.hyperlink); | ||
| return this.formatLink(link); | ||
| } | ||
|
|
||
| @Patch('/:id') | ||
| @RequireApiPermission('API_MODIFY_LINKS') | ||
| @ApiAppErrorResponse(ERROR_CODE.NO_SUCH_LINK) | ||
| public async update(@UUIDParam('id') id, @Body() dto: LinkReqDto) { | ||
| if (!(await this.linkService.idExists(id))) throw new AppException(ERROR_CODE.NO_SUCH_LINK, id); | ||
| const link = await this.linkService.update(id, pick(dto, 'name', 'tooltip', 'hyperlink')); | ||
| return this.formatLink(link); | ||
| } | ||
|
|
||
| formatLink(link: Link): LinkResDto { | ||
| return pick(link, 'id', 'name', 'tooltip', 'hyperlink'); | ||
| } | ||
| } | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,17 @@ | ||
| import { Prisma, PrismaClient } from '@prisma/client'; | ||
| import { translationSelect } from '../utils'; | ||
| import { generateCustomModel } from '../prisma/prisma.service'; | ||
|
|
||
| const LINK_SELECT_FILTER = { | ||
| select: { | ||
| id: true, | ||
| name: translationSelect, | ||
| tooltip: translationSelect, | ||
| hyperlink: true, | ||
| }, | ||
| } as const satisfies Prisma.LinkFindManyArgs; | ||
|
|
||
| export type Link = Prisma.LinkGetPayload<typeof LINK_SELECT_FILTER>; | ||
|
|
||
| export const generateCustomLinkModel = (prisma: PrismaClient) => | ||
| generateCustomModel(prisma, 'link', LINK_SELECT_FILTER, (_, e: Link) => e); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,9 @@ | ||
| import { Module } from '@nestjs/common'; | ||
| import { LinkService } from './link.service'; | ||
| import { LinkController } from './link.controller'; | ||
|
|
||
| @Module({ | ||
| controllers: [LinkController], | ||
| providers: [LinkService], | ||
| }) | ||
| export class LinkModule {} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,55 @@ | ||
| import { Injectable } from '@nestjs/common'; | ||
| import { PrismaService } from '../prisma/prisma.service'; | ||
| import { Translation } from '../prisma/types'; | ||
| import { Link } from './link.interface'; | ||
|
|
||
| @Injectable() | ||
| export class LinkService { | ||
| constructor(private readonly prisma: PrismaService) {} | ||
|
|
||
| /** | ||
| * Returns all links in the database. | ||
| */ | ||
| public getLinks(): Promise<Link[]> { | ||
| return this.prisma.normalize.link.findMany({}); | ||
| } | ||
|
|
||
| /** | ||
| * Checks if there is a link with a given id in the database. | ||
| * @param id Id to search. | ||
| */ | ||
| public async idExists(id: string): Promise<boolean> { | ||
| return (await this.prisma.link.count({ where: { id } })) > 0; | ||
| } | ||
|
|
||
| /** | ||
| * Checks if an hyperlink exists in the database. | ||
| * @param hyperlink Hyperlink to search. | ||
| */ | ||
| public async hyperlinkExists(hyperlink: string): Promise<boolean> { | ||
| return (await this.prisma.link.count({ where: { hyperlink } })) > 0; | ||
| } | ||
|
|
||
| /** | ||
| * Creates a new link in the database. | ||
| * @param name Name of the new link. | ||
| * @param tooltip Small description of the new link. | ||
| * @param hyperlink Hyperlink of the new link. | ||
| * @returns The new link. | ||
| */ | ||
| public create(name: Translation, tooltip: Translation, hyperlink: string): Promise<Link> { | ||
| return this.prisma.normalize.link.create({ data: { name: {create: name}, tooltip: {create: tooltip}, hyperlink } }) | ||
| } | ||
|
|
||
| /** | ||
| * Updates an existing link. | ||
| * @param id Id of the link to modify. | ||
| * @param name Name of the link to modify, or undefined if that shouldn't be modified. | ||
| * @param tooltip New tooltip of the link, or undefined if that shouldn't be modified. | ||
| * @param hyperlink New hyperlink of the link, or undefined if that shouldn't be modified. | ||
| * @returns The updated link. | ||
| */ | ||
| public update(id: string, { name, tooltip, hyperlink }: { name?: Translation, tooltip?: Translation, hyperlink?: string }): Promise<Link> { | ||
| return this.prisma.normalize.link.update({ where: { id }, data: { name: {create: name}, tooltip: {create: tooltip}, hyperlink } }); | ||
| } | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.