module.exports = { | |||||
parser: '@typescript-eslint/parser', | |||||
parserOptions: { | |||||
project: 'tsconfig.json', | |||||
sourceType: 'module', | |||||
}, | |||||
plugins: ['@typescript-eslint/eslint-plugin'], | |||||
extends: [ | |||||
'plugin:@typescript-eslint/eslint-recommended', | |||||
'plugin:@typescript-eslint/recommended', | |||||
'prettier', | |||||
'prettier/@typescript-eslint', | |||||
], | |||||
root: true, | |||||
env: { | |||||
node: true, | |||||
jest: true, | |||||
}, | |||||
rules: { | |||||
'@typescript-eslint/interface-name-prefix': 'off', | |||||
'@typescript-eslint/explicit-function-return-type': 'off', | |||||
'@typescript-eslint/explicit-module-boundary-types': 'off', | |||||
'@typescript-eslint/no-explicit-any': 'off', | |||||
}, | |||||
}; |
# compiled output | |||||
/dist | |||||
/node_modules | |||||
# Logs | |||||
logs | |||||
*.log | |||||
npm-debug.log* | |||||
yarn-debug.log* | |||||
yarn-error.log* | |||||
lerna-debug.log* | |||||
# OS | |||||
.DS_Store | |||||
# Tests | |||||
/coverage | |||||
/.nyc_output | |||||
# IDEs and editors | |||||
/.idea | |||||
.project | |||||
.classpath | |||||
.c9/ | |||||
*.launch | |||||
.settings/ | |||||
*.sublime-workspace | |||||
# IDE - VSCode | |||||
.vscode/* | |||||
!.vscode/settings.json | |||||
!.vscode/tasks.json | |||||
!.vscode/launch.json | |||||
!.vscode/extensions.json |
{ | |||||
"singleQuote": true, | |||||
"trailingComma": "all" | |||||
} |
start db `docker run --name geekfights-db -e MONGO_INITDB_DATABASE=geekfights -d -p 27017:27017 -v ~/data:/data/db mongo` |
{ | |||||
"collection": "@nestjs/schematics", | |||||
"sourceRoot": "src" | |||||
} |
{ | |||||
"name": "geekfights-service", | |||||
"version": "0.0.1", | |||||
"description": "", | |||||
"author": "", | |||||
"private": true, | |||||
"license": "UNLICENSED", | |||||
"scripts": { | |||||
"prebuild": "rimraf dist", | |||||
"build": "nest build", | |||||
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", | |||||
"start": "nest start", | |||||
"start:dev": "nest start --watch", | |||||
"start:debug": "nest start --debug --watch", | |||||
"start:prod": "node dist/main", | |||||
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", | |||||
"test": "jest", | |||||
"test:watch": "jest --watch", | |||||
"test:cov": "jest --coverage", | |||||
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", | |||||
"test:e2e": "jest --config ./test/jest-e2e.json" | |||||
}, | |||||
"dependencies": { | |||||
"@nestjs/common": "^7.0.0", | |||||
"@nestjs/core": "^7.0.0", | |||||
"@nestjs/mongoose": "^7.0.2", | |||||
"@nestjs/platform-express": "^7.0.0", | |||||
"@types/podcast": "^1.3.0", | |||||
"mongoose": "^5.10.9", | |||||
"podcast": "^1.3.0", | |||||
"reflect-metadata": "^0.1.13", | |||||
"rimraf": "^3.0.2", | |||||
"rxjs": "^6.5.4" | |||||
}, | |||||
"devDependencies": { | |||||
"@nestjs/cli": "^7.0.0", | |||||
"@nestjs/schematics": "^7.0.0", | |||||
"@nestjs/testing": "^7.0.0", | |||||
"@types/express": "^4.17.3", | |||||
"@types/jest": "26.0.10", | |||||
"@types/mongoose": "^5.7.36", | |||||
"@types/node": "^13.9.1", | |||||
"@types/supertest": "^2.0.8", | |||||
"@typescript-eslint/eslint-plugin": "3.9.1", | |||||
"@typescript-eslint/parser": "3.9.1", | |||||
"eslint": "7.7.0", | |||||
"eslint-config-prettier": "^6.10.0", | |||||
"eslint-plugin-import": "^2.20.1", | |||||
"jest": "26.4.2", | |||||
"prettier": "^1.19.1", | |||||
"supertest": "^4.0.2", | |||||
"ts-jest": "26.2.0", | |||||
"ts-loader": "^6.2.1", | |||||
"ts-node": "9.0.0", | |||||
"tsconfig-paths": "^3.9.0", | |||||
"typescript": "^3.7.4" | |||||
}, | |||||
"jest": { | |||||
"moduleFileExtensions": [ | |||||
"js", | |||||
"json", | |||||
"ts" | |||||
], | |||||
"rootDir": "src", | |||||
"testRegex": ".spec.ts$", | |||||
"transform": { | |||||
"^.+\\.(t|j)s$": "ts-jest" | |||||
}, | |||||
"coverageDirectory": "../coverage", | |||||
"testEnvironment": "node" | |||||
} | |||||
} |
import { Episode } from "schemas/entity/episode.entity"; | |||||
export class CreateEpisodeDto extends Episode { | |||||
} |
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; | |||||
import Podcast from 'podcast'; | |||||
import { Document } from 'mongoose'; | |||||
export type EpisodeEnclosureDocument = EpisodeEnclosure & Document; | |||||
@Schema() | |||||
export class EpisodeEnclosure implements Podcast.ItemEnclosure { | |||||
@Prop() | |||||
url: string; | |||||
@Prop() | |||||
file?: string; | |||||
@Prop() | |||||
size?: number; | |||||
@Prop() | |||||
type?: string; | |||||
} | |||||
export const EpisodeEnclosureSchema = SchemaFactory.createForClass( | |||||
EpisodeEnclosure, | |||||
); |
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; | |||||
import Podcast from 'podcast'; | |||||
import { ItunesEpisodeTypeEnum } from 'schemas/enum/itunes-episode-type.enum'; | |||||
import { EpisodeEnclosure } from './episode-enclosure'; | |||||
import { Document } from 'mongoose'; | |||||
export type EpisodeDocument = Episode & Document; | |||||
@Schema() | |||||
export class Episode implements Podcast.Item { | |||||
@Prop() | |||||
title?: string; | |||||
@Prop() | |||||
description?: string; | |||||
@Prop() | |||||
url: string; | |||||
@Prop() | |||||
guid?: string; | |||||
@Prop([String]) | |||||
categories?: string[]; | |||||
@Prop() | |||||
author?: string; | |||||
@Prop() | |||||
date: Date; | |||||
@Prop() | |||||
lat?: number; | |||||
@Prop() | |||||
long?: number; | |||||
@Prop(EpisodeEnclosure) | |||||
enclosure?: EpisodeEnclosure; | |||||
@Prop() | |||||
content?: string; | |||||
@Prop() | |||||
itunesAuthor?: string; | |||||
@Prop() | |||||
itunesExplicit?: boolean; | |||||
@Prop() | |||||
itunesSubtitle?: string; | |||||
@Prop() | |||||
itunesSummary?: string; | |||||
@Prop() | |||||
itunesDuration?: number; | |||||
@Prop() | |||||
itunesImage?: string; | |||||
@Prop() | |||||
itunesSeason?: number; | |||||
@Prop() | |||||
itunesEpisode?: number; | |||||
@Prop() | |||||
itunesTitle?: string; | |||||
@Prop(ItunesEpisodeTypeEnum) | |||||
itunesEpisodeType?: ItunesEpisodeTypeEnum; | |||||
} | |||||
export const EpisodeSchema = SchemaFactory.createForClass(Episode); |
export enum ItunesEpisodeTypeEnum { | |||||
FULL = "full", | |||||
TRAILER = "trailer", | |||||
BONUS = "bonus", | |||||
} |
import { Test, TestingModule } from '@nestjs/testing'; | |||||
import { AppController } from './app.controller'; | |||||
import { AppService } from './app.service'; | |||||
describe('AppController', () => { | |||||
let appController: AppController; | |||||
beforeEach(async () => { | |||||
const app: TestingModule = await Test.createTestingModule({ | |||||
controllers: [AppController], | |||||
providers: [AppService], | |||||
}).compile(); | |||||
appController = app.get<AppController>(AppController); | |||||
}); | |||||
describe('root', () => { | |||||
it('should return "Hello World!"', () => { | |||||
expect(appController.getHello()).toBe('Hello World!'); | |||||
}); | |||||
}); | |||||
}); |
import { Module } from '@nestjs/common'; | |||||
import { MongooseModule } from '@nestjs/mongoose'; | |||||
import { Episode, EpisodeSchema } from 'schemas/entity/episode.entity'; | |||||
import { AppService } from './app.service'; | |||||
import { EpisodeService } from './episode/episode.service'; | |||||
@Module({ | |||||
imports: [ | |||||
MongooseModule.forFeature([{ name: Episode.name, schema: EpisodeSchema }]), | |||||
MongooseModule.forRoot('mongodb://localhost:27017/test') | |||||
], | |||||
providers: [AppService, EpisodeService], | |||||
}) | |||||
export class AppModule {} |
import { Injectable } from '@nestjs/common'; | |||||
@Injectable() | |||||
export class AppService { | |||||
getHello(): string { | |||||
return 'Hello World!'; | |||||
} | |||||
} |
import { Test, TestingModule } from '@nestjs/testing'; | |||||
import { EpisodeService } from './episode.service'; | |||||
describe('EpisodeService', () => { | |||||
let service: EpisodeService; | |||||
beforeEach(async () => { | |||||
const module: TestingModule = await Test.createTestingModule({ | |||||
providers: [EpisodeService], | |||||
}).compile(); | |||||
service = module.get<EpisodeService>(EpisodeService); | |||||
}); | |||||
it('should be defined', () => { | |||||
expect(service).toBeDefined(); | |||||
}); | |||||
}); |
import { Injectable } from '@nestjs/common'; | |||||
import { InjectModel } from '@nestjs/mongoose'; | |||||
import { Model } from 'mongoose'; | |||||
import { CreateEpisodeDto } from 'schemas/dto/create-episode.dto'; | |||||
import { Episode, EpisodeDocument } from 'schemas/entity/episode.entity'; | |||||
@Injectable() | |||||
export class EpisodeService { | |||||
constructor( | |||||
@InjectModel(Episode.name) private episodeModel: Model<EpisodeDocument>, | |||||
) {} | |||||
async create(createEpisodeDto: CreateEpisodeDto): Promise<Episode> { | |||||
const createdEpisode = new this.episodeModel(createEpisodeDto); | |||||
return createdEpisode.save(); | |||||
} | |||||
async findAll(): Promise<Episode[]> { | |||||
return this.episodeModel.find().exec(); | |||||
} | |||||
} |
import { NestFactory } from '@nestjs/core'; | |||||
import { AppModule } from './app.module'; | |||||
async function bootstrap() { | |||||
const app = await NestFactory.create(AppModule); | |||||
await app.listen(3000); | |||||
} | |||||
bootstrap(); |
import { Test, TestingModule } from '@nestjs/testing'; | |||||
import { INestApplication } from '@nestjs/common'; | |||||
import * as request from 'supertest'; | |||||
import { AppModule } from './../src/app.module'; | |||||
describe('AppController (e2e)', () => { | |||||
let app: INestApplication; | |||||
beforeEach(async () => { | |||||
const moduleFixture: TestingModule = await Test.createTestingModule({ | |||||
imports: [AppModule], | |||||
}).compile(); | |||||
app = moduleFixture.createNestApplication(); | |||||
await app.init(); | |||||
}); | |||||
it('/ (GET)', () => { | |||||
return request(app.getHttpServer()) | |||||
.get('/') | |||||
.expect(200) | |||||
.expect('Hello World!'); | |||||
}); | |||||
}); |
{ | |||||
"moduleFileExtensions": ["js", "json", "ts"], | |||||
"rootDir": ".", | |||||
"testEnvironment": "node", | |||||
"testRegex": ".e2e-spec.ts$", | |||||
"transform": { | |||||
"^.+\\.(t|j)s$": "ts-jest" | |||||
} | |||||
} |
{ | |||||
"extends": "./tsconfig.json", | |||||
"exclude": ["node_modules", "test", "dist", "**/*spec.ts"] | |||||
} |
{ | |||||
"compilerOptions": { | |||||
"module": "commonjs", | |||||
"declaration": true, | |||||
"removeComments": true, | |||||
"emitDecoratorMetadata": true, | |||||
"experimentalDecorators": true, | |||||
"allowSyntheticDefaultImports": true, | |||||
"target": "es2017", | |||||
"sourceMap": true, | |||||
"outDir": "./dist", | |||||
"baseUrl": "./", | |||||
"incremental": true | |||||
} | |||||
} |