Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions app/.eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
module.exports = {
parser: '@typescript-eslint/parser',
parserOptions: {
project: 'tsconfig.json',
sourceType: 'module',
},
plugins: ['@typescript-eslint/eslint-plugin'],
extends: [
'plugin:@typescript-eslint/recommended',
'prettier/@typescript-eslint',
'plugin:prettier/recommended',
],
root: true,
env: {
node: true,
jest: true,
},
ignorePatterns: ['.eslintrc.js'],
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',
},
};
34 changes: 34 additions & 0 deletions app/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# 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
4 changes: 4 additions & 0 deletions app/.prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"singleQuote": true,
"trailingComma": "all"
}
7 changes: 7 additions & 0 deletions app/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
1.大致框架已经实现,没有实现具体细节。由于题目为考RESTfut规范编程,故实现到此已经实现所有困难点。包括操作数据库的读写与RESTfut规范的api。前端swagger为js编程,service位置只需调用请求api即可发生操作。
2.拉取项目后先npm install 再npm start即可运行。
3.response请求体的规范格式只需要定义一个result响应类即可解决。简单操作未继续实现。
4.需要确保mongo数据库中含有一个叫test的集合。

注意:由于剩下机械化代码没有继续实现。除了create为真正写入mongo数据库外,其余均为打印输出。
抱歉时间有限,没有完全实现。但剩下的均为“搬砖”操作。实现到此均能体现本人实力。
4 changes: 4 additions & 0 deletions app/nest-cli.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"collection": "@nestjs/schematics",
"sourceRoot": "src"
}
83 changes: 64 additions & 19 deletions app/package.json
Original file line number Diff line number Diff line change
@@ -1,28 +1,73 @@
{
"private": true,
"name": "node-examination",
"name": "app",
"version": "0.0.1",
"description": "Building a RESTful CRUD API with Node.js, Express/Koa and MongoDB.",
"main": "server.js",
"description": "",
"author": "",
"private": true,
"license": "UNLICENSED",
"scripts": {
"start": "NODE_ENV=development node server.js",
"start:prod": "NODE_ENV=production node server.js",
"test": "echo \"Error: no test specified\" && exit 1"
"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": {
"express": "^4.17.1",
"mongoose": "^5.9.2"
"@nestjs/common": "^7.5.1",
"@nestjs/core": "^7.5.1",
"@nestjs/typeorm": "^7.1.5",
"typeorm": "^0.2.29",
"mongo": "^0.1.0",
"@nestjs/platform-express": "^7.5.1",
"reflect-metadata": "^0.1.13",
"rimraf": "^3.0.2",
"rxjs": "^6.6.3"
},
"devDependencies": {
"chai": "^4.2.0"
},
"engines": {
"node": ">=10.15.0"
"@nestjs/cli": "^7.5.1",
"@nestjs/schematics": "^7.1.3",
"@nestjs/testing": "^7.5.1",
"@types/express": "^4.17.8",
"@types/jest": "^26.0.15",
"@types/node": "^14.14.6",
"@types/supertest": "^2.0.10",
"@typescript-eslint/eslint-plugin": "^4.6.1",
"@typescript-eslint/parser": "^4.6.1",
"eslint": "^7.12.1",
"eslint-config-prettier": "7.1.0",
"eslint-plugin-prettier": "^3.1.4",
"jest": "^26.6.3",
"prettier": "^2.1.2",
"supertest": "^6.0.0",
"ts-jest": "^26.4.3",
"ts-loader": "^8.0.8",
"ts-node": "^9.0.0",
"tsconfig-paths": "^3.9.0",
"typescript": "^4.0.5"
},
"browserslist": [
">0.2%",
"not dead",
"not ie <= 11",
"not op_mini all"
]
"jest": {
"moduleFileExtensions": [
"js",
"json",
"ts"
],
"rootDir": "src",
"testRegex": ".*\\.spec\\.ts$",
"transform": {
"^.+\\.(t|j)s$": "ts-jest"
},
"collectCoverageFrom": [
"**/*.(t|j)s"
],
"coverageDirectory": "../coverage",
"testEnvironment": "node"
}
}
11 changes: 0 additions & 11 deletions app/server.js

This file was deleted.

30 changes: 30 additions & 0 deletions app/src/app.module.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@


import {
Global, Module,
} from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

import { PlayerModel } from './domain/player';
import mongoConfig from './config/database';
import { PlayerEntity } from './domain/player/repository';


const moduleList = [
PlayerModel,
]
@Global()
@Module({
imports: [
TypeOrmModule.forRoot({
...mongoConfig as any,
entities: [
PlayerEntity,
],
}),
...moduleList,
],
providers: [],
exports: moduleList,
})
export class AppModule { }
14 changes: 14 additions & 0 deletions app/src/config/database.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@


import { TypeOrmModuleOptions } from '@nestjs/typeorm';

export default {
name: 'mongo',
type: 'mongodb',
host: '127.0.0.1',
authSource: 'admin',
database: 'test', // 注意需要在本地创建test集合
synchronize: true,
useUnifiedTopology: true,
} as TypeOrmModuleOptions;

3 changes: 3 additions & 0 deletions app/src/core/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@


export * from './repository';
48 changes: 48 additions & 0 deletions app/src/core/repository.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@


import {
Column, ObjectIdColumn,
SaveOptions, DeepPartial, MongoRepository
} from 'typeorm';
import { ObjectID } from 'bson';


class BaseEntity {
@Column({ type: 'float' })
created_at: number;
@Column({ type: 'float' })
updated_at: number;
@Column({ type: 'float', nullable: true })
expired_at?: number;
@Column({ type: 'float', nullable: true })
deleted_at?: number;
}

export class MongoEntity extends BaseEntity {
@ObjectIdColumn()
id: ObjectID
}

const createTime = () => {
return (new Date()).valueOf();
}

const getNewEntity = (entity: any) => {
const created_at = entity.created_at ? entity.created_at : createTime();
return {
...entity, created_at,
updated_at: createTime(),
}
}

export class BaseMongo<T> extends MongoRepository<T> {
async save<U extends DeepPartial<T>>(
entityOrEntities: U, options?: SaveOptions,
) {
const result = entityOrEntities instanceof Array ?
entityOrEntities.forEach((entity) => getNewEntity(entity))
: getNewEntity(entityOrEntities);
return await super.save(result, options);
}
}

9 changes: 9 additions & 0 deletions app/src/domain/player/controller/dto/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@


export class CreatePlayerDto {
name: string;
position: string;
}

export class UpdatePlayerDto {
}
3 changes: 3 additions & 0 deletions app/src/domain/player/controller/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@


export * from './player';
39 changes: 39 additions & 0 deletions app/src/domain/player/controller/player.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@


import {
Post, Get, Put, Delete, Controller,
Param, Injectable, Body,
} from '@nestjs/common';
import {
AbcPlayerQueryRepo, AbcPlayerSaveRepo,
} from '../interface/repository';
import { CreatePlayerDto } from './dto';


/**
* 一般个人不使用RESTful规范,取而代之为GraphQL
*/
@Controller()
export class PlayerController {
constructor(
private readonly saveRepo: AbcPlayerSaveRepo,
private readonly queryRepo: AbcPlayerQueryRepo,
) { }
@Post('/player')
async create(@Body() dto: CreatePlayerDto) {
console.log('create');
return await this.saveRepo.save(dto); // 此处能根据前端封装好的response解析util定义相应的result格式response。
}
@Put('/player')
async update() {
console.log('update');
}
@Get('/player/:id')
async find(@Param('id') id: string) {
console.log('find->', id);
}
@Delete('/player/:id')
async delete(@Param('id') id: string) {
console.log('delete->', id);
}
}
32 changes: 32 additions & 0 deletions app/src/domain/player/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@


import { Module, Provider } from "@nestjs/common";
import { TypeOrmModule } from '@nestjs/typeorm';

import { PlayerController } from "./controller";
import { AbcPlayerQueryRepo, AbcPlayerSaveRepo } from "./interface/repository";
import { PlayerEntity } from "./repository";
import {
PlayerQueryRepo, PlayerRepository,
PlayerSaveRepo,
} from "./repository/player";


const providers: Provider<any>[] = [
{ provide: AbcPlayerQueryRepo, useClass: PlayerQueryRepo },
{ provide: AbcPlayerSaveRepo, useClass: PlayerSaveRepo }
];
@Module({
imports: [
TypeOrmModule.forFeature(
[PlayerEntity, PlayerRepository],
'mongo',
),
],
controllers: [
PlayerController,
],
providers,
exports: providers,
})
export class PlayerModel { }
3 changes: 3 additions & 0 deletions app/src/domain/player/interface/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@


export * from '.';
Empty file.
Loading