diff --git a/package-lock.json b/package-lock.json index 143629b..dd1987c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -639,6 +639,11 @@ } } }, + "@nestjs/mapped-types": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-0.4.0.tgz", + "integrity": "sha512-TVtd/aTb7EqPhVczdeuvzF9dY0fyE3ivvCstc2eO+AkNqrfzSG1kXYYiUUznKjd0qDa8g2TmPSmHUQ21AXsV1Q==" + }, "@nestjs/platform-express": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-6.8.0.tgz", @@ -671,6 +676,28 @@ } } }, + "@nestjs/swagger": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-4.8.0.tgz", + "integrity": "sha512-YU+ahCOoOTZwSHrODHBiQDCqi7GWEjmSFg3Tot/lwVuQ321/3fIOz/lf+ehVQ5DFr7nVMhB7BRWFJLtE/+NhqQ==", + "requires": { + "@nestjs/mapped-types": "0.4.0", + "lodash": "4.17.21", + "path-to-regexp": "3.2.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "path-to-regexp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", + "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" + } + } + }, "@nestjs/testing": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-6.8.0.tgz", @@ -8469,6 +8496,19 @@ "has-flag": "^3.0.0" } }, + "swagger-ui-dist": { + "version": "3.47.1", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.47.1.tgz", + "integrity": "sha512-7b9iHDC/GGC9SJLd3HiV/3EnsJ3wu7xN8Q4MpOPfQO8UG7TQFG2TMTDkvvy0SNeqxQY0tGQY0ppZC9a95tW3kg==" + }, + "swagger-ui-express": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.1.6.tgz", + "integrity": "sha512-Xs2BGGudvDBtL7RXcYtNvHsFtP1DBFPMJFRxHe5ez/VG/rzVOEjazJOOSc/kSCyxreCTKfJrII6MJlL9a6t8vw==", + "requires": { + "swagger-ui-dist": "^3.18.1" + } + }, "symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", @@ -8907,9 +8947,9 @@ } }, "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz", + "integrity": "sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg==" }, "tslint": { "version": "5.20.0", diff --git a/package.json b/package.json index 090f9bb..10cf9ce 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "description": "Vinyls Backend MISO", "license": "MIT", "engines": { - "node": "12.x" + "node": "14.x" }, "scripts": { "prebuild": "rimraf dist", @@ -26,6 +26,7 @@ "@nestjs/common": "^6.8.0", "@nestjs/core": "^6.8.0", "@nestjs/platform-express": "^6.8.0", + "@nestjs/swagger": "^4.8.0", "@nestjs/typeorm": "^6.2.0", "joi": "^17.4.0", "pg": "^7.14.0", @@ -35,7 +36,9 @@ "rxjs": "^6.5.3", "sequelize": "^5.21.2", "sequelize-typescript": "^1.1.0", - "typeorm": "^0.2.21" + "swagger-ui-express": "^4.1.6", + "typeorm": "^0.2.21", + "tslib": "1.11.2" }, "devDependencies": { "@nestjs/cli": "^6.9.1", diff --git a/src/album/album.controller.ts b/src/album/album.controller.ts index a74ad07..b226e53 100644 --- a/src/album/album.controller.ts +++ b/src/album/album.controller.ts @@ -3,7 +3,9 @@ import { AlbumService } from './album.service'; import { AlbumDTO } from './album.dto'; import { BusinessErrorsInterceptor } from "../interceptors/interceptor"; +import { ApiTags } from '@nestjs/swagger'; @Controller('albums') +@ApiTags('albums') @UseInterceptors(BusinessErrorsInterceptor) export class AlbumController { constructor(private readonly albumService: AlbumService) { } diff --git a/src/albumband/albumband.controller.ts b/src/albumband/albumband.controller.ts index 82c5072..4766f08 100644 --- a/src/albumband/albumband.controller.ts +++ b/src/albumband/albumband.controller.ts @@ -2,8 +2,10 @@ import { Controller, UseInterceptors, Post, HttpCode, Param, Get, Put, Body, Del import { BusinessErrorsInterceptor } from '../interceptors/interceptor'; import { AlbumBandService } from './albumband.service'; import { BandDTO } from '../band/band.dto'; +import { ApiTags } from '@nestjs/swagger'; @Controller('albums') +@ApiTags('albums-band') @UseInterceptors(BusinessErrorsInterceptor) export class AlbumBandController { diff --git a/src/albummusician/albummusician.controller.ts b/src/albummusician/albummusician.controller.ts index b5fdf7d..ea4cf5f 100644 --- a/src/albummusician/albummusician.controller.ts +++ b/src/albummusician/albummusician.controller.ts @@ -2,8 +2,10 @@ import { Controller, UseInterceptors, Post, HttpCode, Param, Get, Put, Body, Del import { BusinessErrorsInterceptor } from '../interceptors/interceptor'; import { AlbumMusicianService } from './albummusician.service'; import { MusicianDTO } from '../musician/musician.dto'; +import { ApiTags } from '@nestjs/swagger'; @Controller('albums') +@ApiTags('albums-musicians') @UseInterceptors(BusinessErrorsInterceptor) export class AlbumMusicianController { diff --git a/src/app.module.ts b/src/app.module.ts index e58776a..c8e61f7 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -36,11 +36,11 @@ import { AlbumMusicianModule } from './albummusician/albummusician.module'; imports: [ TypeOrmModule.forRoot({ type: 'postgres', - host: process.env.DATABASE_URL && process.env.DATABASE_URL.replace('postgres://','').split(':')[1].split('@')[1] || process.env.DATABASE_URL || process.env.DB_HOST || 'localhost', + host: process.env.DB_HOST || 'localhost', port: 5432, - username: process.env.DATABASE_URL && process.env.DATABASE_URL.replace('postgres://','').split(':')[0] || process.env.DB_USER || 'postgres', - password: process.env.DATABASE_URL && process.env.DATABASE_URL.replace('postgres://','').split(':')[1].split('@')[0] || process.env.DB_PASSWORD || 'postgres', - database: process.env.DATABASE_URL && process.env.DATABASE_URL.split('/')[3] || process.env.DB_NAME || 'vinyls', + username: process.env.DB_USER || 'postgres', + password: process.env.DB_PASSWORD || 'postgres', + database: process.env.DB_NAME || 'vinyls', entities: [Album, CollectorAlbum, Band, Collector, Comment, Musician, Performer, PerformerPrize, Prize, Track,], dropSchema: true, synchronize: true, diff --git a/src/band/band.controller.ts b/src/band/band.controller.ts index 163bc02..f6a7e0a 100644 --- a/src/band/band.controller.ts +++ b/src/band/band.controller.ts @@ -2,8 +2,10 @@ import { Controller, UseInterceptors, Get, Param, Post, HttpCode, Body, Put, Del import { BusinessErrorsInterceptor } from '../interceptors/interceptor'; import { BandService } from './band.service'; import { BandDTO } from './band.dto'; +import { ApiTags } from '@nestjs/swagger'; @Controller('bands') +@ApiTags('bands') @UseInterceptors(BusinessErrorsInterceptor) export class BandController { constructor(private readonly bandService: BandService) { } diff --git a/src/bandalbum/bandalbum.controller.ts b/src/bandalbum/bandalbum.controller.ts index 2c878a7..810adf6 100644 --- a/src/bandalbum/bandalbum.controller.ts +++ b/src/bandalbum/bandalbum.controller.ts @@ -2,8 +2,10 @@ import { Controller, UseInterceptors, Post, HttpCode, Param, Get, Put, Body, Del import { BusinessErrorsInterceptor } from '../interceptors/interceptor'; import { BandAlbumService } from './bandalbum.service'; import { AlbumDTO } from '../album/album.dto'; +import { ApiTags } from '@nestjs/swagger'; @Controller('bands') +@ApiTags('bands-album') @UseInterceptors(BusinessErrorsInterceptor) export class BandAlbumController { diff --git a/src/bandmusician/bandmusician.controller.ts b/src/bandmusician/bandmusician.controller.ts index d490a5c..2e3b32d 100644 --- a/src/bandmusician/bandmusician.controller.ts +++ b/src/bandmusician/bandmusician.controller.ts @@ -1,8 +1,10 @@ import { Controller, Post, HttpCode, Param, UseInterceptors, Get, Delete } from '@nestjs/common'; import { BandMusicianService } from './bandmusician.service'; import { BusinessErrorsInterceptor } from '../interceptors/interceptor'; +import { ApiTags } from '@nestjs/swagger'; @Controller('bands') +@ApiTags('bands-musician') @UseInterceptors(BusinessErrorsInterceptor) export class BandMusicianController { diff --git a/src/collector/collector.controller.ts b/src/collector/collector.controller.ts index 2a0a359..17577f1 100644 --- a/src/collector/collector.controller.ts +++ b/src/collector/collector.controller.ts @@ -2,8 +2,10 @@ import { Controller, UseInterceptors, Get, Param, Post, HttpCode, Body, Put, Del import { BusinessErrorsInterceptor } from '../interceptors/interceptor'; import { CollectorService } from './collector.service'; import { CollectorDTO } from './collector.dto'; +import { ApiTags } from '@nestjs/swagger'; @Controller('collectors') +@ApiTags('collectors') @UseInterceptors(BusinessErrorsInterceptor) export class CollectorController { constructor(private readonly collectorService: CollectorService) { } diff --git a/src/collectoralbum/collectoralbum.controller.ts b/src/collectoralbum/collectoralbum.controller.ts index 431176d..bd1f2e5 100644 --- a/src/collectoralbum/collectoralbum.controller.ts +++ b/src/collectoralbum/collectoralbum.controller.ts @@ -2,8 +2,10 @@ import { Controller, Post, HttpCode, Param, Body, UseInterceptors, Get, Put, Del import { CollectorAlbumDTO } from './collectoralbum.dto'; import { BusinessErrorsInterceptor } from '../interceptors/interceptor'; import { CollectorAlbumService } from './collectoralbum.service'; +import { ApiTags } from '@nestjs/swagger'; @Controller('collectors') +@ApiTags('collectors') @UseInterceptors(BusinessErrorsInterceptor) export class CollectorAlbumController { diff --git a/src/collectorperformer/collectorperformer.controller.ts b/src/collectorperformer/collectorperformer.controller.ts index 111cf42..543b7f9 100644 --- a/src/collectorperformer/collectorperformer.controller.ts +++ b/src/collectorperformer/collectorperformer.controller.ts @@ -1,8 +1,10 @@ import { Controller, Post, HttpCode, Param, UseInterceptors, Get, Delete } from '@nestjs/common'; import { CollectorPerformerService } from './collectorperformer.service'; import { BusinessErrorsInterceptor } from '../interceptors/interceptor'; +import { ApiTags } from '@nestjs/swagger'; @Controller('collectors') +@ApiTags('collectors-performer') @UseInterceptors(BusinessErrorsInterceptor) export class CollectorPerformerController { constructor(private readonly collectorPerformerService: CollectorPerformerService) { } diff --git a/src/comment/comment.controller.ts b/src/comment/comment.controller.ts index a6cd67b..56f7de8 100644 --- a/src/comment/comment.controller.ts +++ b/src/comment/comment.controller.ts @@ -2,8 +2,10 @@ import { Controller, UseInterceptors, Post, HttpCode, Param, Body, Get, Put, Del import { BusinessErrorsInterceptor } from '../interceptors/interceptor'; import { CommentService } from './comment.service'; import { CommentDTO } from './comment.dto'; +import { ApiTags } from '@nestjs/swagger'; @Controller('albums') +@ApiTags('album-comments') @UseInterceptors(BusinessErrorsInterceptor) export class CommentController { constructor(private readonly commentService: CommentService) { } diff --git a/src/main.ts b/src/main.ts index 6432358..f26502f 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,8 +1,16 @@ import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; +import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger'; async function bootstrap() { const app = await NestFactory.create(AppModule); + const options = new DocumentBuilder() + .setTitle('BackVynils APP') + .setDescription('BackVynils API Docs') + .setVersion('1.0') + .build(); + const document = SwaggerModule.createDocument(app, options); + SwaggerModule.setup('api-docs', app, document); app.enableCors(); await app.listen(process.env.PORT || 3000); } diff --git a/src/musician/musician.controller.ts b/src/musician/musician.controller.ts index 28cb466..3890119 100644 --- a/src/musician/musician.controller.ts +++ b/src/musician/musician.controller.ts @@ -2,8 +2,10 @@ import { Controller, UseInterceptors, Get, Param, Post, HttpCode, Body, Put, Del import { BusinessErrorsInterceptor } from '../interceptors/interceptor'; import { MusicianService } from './musician.service'; import { MusicianDTO } from './musician.dto'; +import { ApiTags } from '@nestjs/swagger'; @Controller('musicians') +@ApiTags('musicians') @UseInterceptors(BusinessErrorsInterceptor) export class MusicianController { constructor(private readonly musicianService: MusicianService) { } diff --git a/src/musicianalbum/musicianalbum.controller.ts b/src/musicianalbum/musicianalbum.controller.ts index 44f7c9c..99bfb70 100644 --- a/src/musicianalbum/musicianalbum.controller.ts +++ b/src/musicianalbum/musicianalbum.controller.ts @@ -2,8 +2,9 @@ import { Controller, UseInterceptors, Post, HttpCode, Param, Get, Put, Body, Del import { BusinessErrorsInterceptor } from '../interceptors/interceptor'; import { MusicianAlbumService } from './musicianalbum.service'; import { AlbumDTO } from '../album/album.dto'; - +import { ApiTags } from '@nestjs/swagger'; @Controller('musicians') +@ApiTags('musicians-album') @UseInterceptors(BusinessErrorsInterceptor) export class MusicianAlbumController { diff --git a/src/performerprize/performerprize.controller.ts b/src/performerprize/performerprize.controller.ts index fffd9ee..a701981 100644 --- a/src/performerprize/performerprize.controller.ts +++ b/src/performerprize/performerprize.controller.ts @@ -2,8 +2,10 @@ import { Controller, Param, Body, UseInterceptors, Post, HttpCode, Get, Delete } import { PerformerPrizeService } from './performerprize.service'; import { PerformerPrizeDTO } from './performerprize.dto'; import { BusinessErrorsInterceptor } from '../interceptors/interceptor'; +import { ApiTags } from '@nestjs/swagger'; @Controller('prizes') +@ApiTags('prizes-performer') @UseInterceptors(BusinessErrorsInterceptor) export class PerformerPrizeController { diff --git a/src/prize/prize.controller.ts b/src/prize/prize.controller.ts index fff764e..6f117e8 100644 --- a/src/prize/prize.controller.ts +++ b/src/prize/prize.controller.ts @@ -3,8 +3,10 @@ import { BusinessErrorsInterceptor } from "../interceptors/interceptor"; import { PrizeService } from "./prize.service"; import { PrizeDTO } from "./prize.dto" +import { ApiTags } from '@nestjs/swagger'; @Controller('prizes') +@ApiTags('prizes') @UseInterceptors(BusinessErrorsInterceptor) export class PrizeController { constructor(private readonly prizeService: PrizeService) { } diff --git a/src/track/track.controller.ts b/src/track/track.controller.ts index 96fde8c..ad432e5 100644 --- a/src/track/track.controller.ts +++ b/src/track/track.controller.ts @@ -3,8 +3,10 @@ import { BusinessErrorsInterceptor } from "../interceptors/interceptor"; import { TrackDTO } from "./track.dto"; import { TrackService } from "./track.service"; +import { ApiTags } from '@nestjs/swagger'; @Controller('albums') +@ApiTags('tracks') @UseInterceptors(BusinessErrorsInterceptor) export class TrackController { constructor(private readonly trackService: TrackService) { }