@ -0,0 +1,24 @@ | |||
module.exports = { | |||
parser: '@typescript-eslint/parser', | |||
parserOptions: { | |||
project: 'tsconfig.json', | |||
sourceType: 'module', | |||
}, | |||
plugins: ['@typescript-eslint/eslint-plugin'], | |||
extends: [ | |||
'plugin:@typescript-eslint/recommended', | |||
'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', | |||
}, | |||
}; |
@ -0,0 +1,35 @@ | |||
# compiled output | |||
/dist | |||
/node_modules | |||
# Logs | |||
logs | |||
*.log | |||
npm-debug.log* | |||
pnpm-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 |
@ -0,0 +1,4 @@ | |||
{ | |||
"singleQuote": true, | |||
"trailingComma": "all" | |||
} |
@ -0,0 +1,73 @@ | |||
<p align="center"> | |||
<a href="http://nestjs.com/" target="blank"><img src="https://nestjs.com/img/logo_text.svg" width="320" alt="Nest Logo" /></a> | |||
</p> | |||
[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456 | |||
[circleci-url]: https://circleci.com/gh/nestjs/nest | |||
<p align="center">A progressive <a href="http://nodejs.org" target="_blank">Node.js</a> framework for building efficient and scalable server-side applications.</p> | |||
<p align="center"> | |||
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/v/@nestjs/core.svg" alt="NPM Version" /></a> | |||
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/l/@nestjs/core.svg" alt="Package License" /></a> | |||
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/dm/@nestjs/common.svg" alt="NPM Downloads" /></a> | |||
<a href="https://circleci.com/gh/nestjs/nest" target="_blank"><img src="https://img.shields.io/circleci/build/github/nestjs/nest/master" alt="CircleCI" /></a> | |||
<a href="https://coveralls.io/github/nestjs/nest?branch=master" target="_blank"><img src="https://coveralls.io/repos/github/nestjs/nest/badge.svg?branch=master#9" alt="Coverage" /></a> | |||
<a href="https://discord.gg/G7Qnnhy" target="_blank"><img src="https://img.shields.io/badge/discord-online-brightgreen.svg" alt="Discord"/></a> | |||
<a href="https://opencollective.com/nest#backer" target="_blank"><img src="https://opencollective.com/nest/backers/badge.svg" alt="Backers on Open Collective" /></a> | |||
<a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://opencollective.com/nest/sponsors/badge.svg" alt="Sponsors on Open Collective" /></a> | |||
<a href="https://paypal.me/kamilmysliwiec" target="_blank"><img src="https://img.shields.io/badge/Donate-PayPal-ff3f59.svg"/></a> | |||
<a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://img.shields.io/badge/Support%20us-Open%20Collective-41B883.svg" alt="Support us"></a> | |||
<a href="https://twitter.com/nestframework" target="_blank"><img src="https://img.shields.io/twitter/follow/nestframework.svg?style=social&label=Follow"></a> | |||
</p> | |||
<!--[![Backers on Open Collective](https://opencollective.com/nest/backers/badge.svg)](https://opencollective.com/nest#backer) | |||
[![Sponsors on Open Collective](https://opencollective.com/nest/sponsors/badge.svg)](https://opencollective.com/nest#sponsor)--> | |||
## Description | |||
[Nest](https://github.com/nestjs/nest) framework TypeScript starter repository. | |||
## Installation | |||
```bash | |||
$ npm install | |||
``` | |||
## Running the app | |||
```bash | |||
# development | |||
$ npm run start | |||
# watch mode | |||
$ npm run start:dev | |||
# production mode | |||
$ npm run start:prod | |||
``` | |||
## Test | |||
```bash | |||
# unit tests | |||
$ npm run test | |||
# e2e tests | |||
$ npm run test:e2e | |||
# test coverage | |||
$ npm run test:cov | |||
``` | |||
## Support | |||
Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support). | |||
## Stay in touch | |||
- Author - [Kamil Myśliwiec](https://kamilmysliwiec.com) | |||
- Website - [https://nestjs.com](https://nestjs.com/) | |||
- Twitter - [@nestframework](https://twitter.com/nestframework) | |||
## License | |||
Nest is [MIT licensed](LICENSE). |
@ -0,0 +1,4 @@ | |||
{ | |||
"collection": "@nestjs/schematics", | |||
"sourceRoot": "src" | |||
} |
@ -0,0 +1,73 @@ | |||
{ | |||
"name": "cp-node-backend", | |||
"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": "^8.0.0", | |||
"@nestjs/core": "^8.0.0", | |||
"@nestjs/mongoose": "^9.0.1", | |||
"@nestjs/platform-express": "^8.0.0", | |||
"mongoose": "^6.0.12", | |||
"reflect-metadata": "^0.1.13", | |||
"rimraf": "^3.0.2", | |||
"rxjs": "^7.2.0" | |||
}, | |||
"devDependencies": { | |||
"@nestjs/cli": "^8.0.0", | |||
"@nestjs/schematics": "^8.0.0", | |||
"@nestjs/testing": "^8.0.0", | |||
"@types/express": "^4.17.13", | |||
"@types/jest": "^27.0.1", | |||
"@types/node": "^16.0.0", | |||
"@types/supertest": "^2.0.11", | |||
"@typescript-eslint/eslint-plugin": "^5.0.0", | |||
"@typescript-eslint/parser": "^5.0.0", | |||
"eslint": "^8.0.1", | |||
"eslint-config-prettier": "^8.3.0", | |||
"eslint-plugin-prettier": "^4.0.0", | |||
"jest": "^27.2.5", | |||
"prettier": "^2.3.2", | |||
"source-map-support": "^0.5.20", | |||
"supertest": "^6.1.3", | |||
"ts-jest": "^27.0.3", | |||
"ts-loader": "^9.2.3", | |||
"ts-node": "^10.0.0", | |||
"tsconfig-paths": "^3.10.1", | |||
"typescript": "^4.3.5" | |||
}, | |||
"jest": { | |||
"moduleFileExtensions": [ | |||
"js", | |||
"json", | |||
"ts" | |||
], | |||
"rootDir": "src", | |||
"testRegex": ".*\\.spec\\.ts$", | |||
"transform": { | |||
"^.+\\.(t|j)s$": "ts-jest" | |||
}, | |||
"collectCoverageFrom": [ | |||
"**/*.(t|j)s" | |||
], | |||
"coverageDirectory": "../coverage", | |||
"testEnvironment": "node" | |||
} | |||
} |
@ -0,0 +1,22 @@ | |||
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!'); | |||
}); | |||
}); | |||
}); |
@ -0,0 +1,12 @@ | |||
import { Controller, Get } from '@nestjs/common'; | |||
import { AppService } from './app.service'; | |||
@Controller() | |||
export class AppController { | |||
constructor(private readonly appService: AppService) {} | |||
@Get() | |||
getHello(): string { | |||
return this.appService.getHello(); | |||
} | |||
} |
@ -0,0 +1,13 @@ | |||
import { Module } from '@nestjs/common'; | |||
import { AppController } from './app.controller'; | |||
import { AppService } from './app.service'; | |||
import { UserModule } from './user/user.module'; | |||
import { SchoolModule } from './school/school.module'; | |||
import { MongooseModule } from '@nestjs/mongoose'; | |||
@Module({ | |||
imports: [UserModule, SchoolModule,MongooseModule.forRoot('mongodb://localhost/classpoint')], | |||
controllers: [AppController], | |||
providers: [AppService], | |||
}) | |||
export class AppModule {} |
@ -0,0 +1,8 @@ | |||
import { Injectable } from '@nestjs/common'; | |||
@Injectable() | |||
export class AppService { | |||
getHello(): string { | |||
return 'Hello World!'; | |||
} | |||
} |
@ -0,0 +1,9 @@ | |||
import { NestFactory } from '@nestjs/core'; | |||
import { AppModule } from './app.module'; | |||
async function bootstrap() { | |||
const app = await NestFactory.create(AppModule); | |||
app.enableCors(); // Unable cors | |||
await app.listen(3000); | |||
} | |||
bootstrap(); |
@ -0,0 +1,9 @@ | |||
export class SchoolDto { | |||
readonly region: string; | |||
readonly schoolId: string; | |||
readonly schoolName: string; | |||
readonly municipalityName: string; | |||
readonly isUserAddedSchool: string; | |||
readonly addedByEmail: string; | |||
readonly addedOn: string; | |||
} |
@ -0,0 +1,11 @@ | |||
import { Document } from 'mongoose'; | |||
export interface DepEdPhSchool extends Document { | |||
readonly region: string; | |||
readonly schoolId: string; | |||
readonly schoolName: string; | |||
readonly municipalityName: string; | |||
readonly isUserAddedSchool: string; | |||
readonly addedByEmail: string; | |||
readonly addedOn: string; | |||
} |
@ -0,0 +1,31 @@ | |||
import * as mongoose from 'mongoose'; | |||
export const DepEdPhSchoolSchema = new mongoose.Schema({ | |||
region: { | |||
type: String, | |||
required: true, | |||
}, | |||
schoolId: { | |||
type:Number, | |||
required:true | |||
}, | |||
schoolName:{ | |||
type: String, | |||
required: true, | |||
}, | |||
municipalityName:{ | |||
type: String, | |||
required: true, | |||
}, | |||
isUserAddedSchool:{ | |||
type:Boolean, | |||
required:true | |||
}, | |||
addedByEmail:{ | |||
type:String, | |||
required:true | |||
}, | |||
addedOn: | |||
{ type: Date, default: Date.now } | |||
}) |
@ -0,0 +1,18 @@ | |||
import { Test, TestingModule } from '@nestjs/testing'; | |||
import { SchoolController } from './school.controller'; | |||
describe('SchoolController', () => { | |||
let controller: SchoolController; | |||
beforeEach(async () => { | |||
const module: TestingModule = await Test.createTestingModule({ | |||
controllers: [SchoolController], | |||
}).compile(); | |||
controller = module.get<SchoolController>(SchoolController); | |||
}); | |||
it('should be defined', () => { | |||
expect(controller).toBeDefined(); | |||
}); | |||
}); |
@ -0,0 +1,4 @@ | |||
import { Controller } from '@nestjs/common'; | |||
@Controller('school') | |||
export class SchoolController {} |
@ -0,0 +1,14 @@ | |||
import { Module } from '@nestjs/common'; | |||
import { SchoolService } from './school.service'; | |||
import { SchoolController } from './school.controller'; | |||
import { MongooseModule } from '@nestjs/mongoose'; | |||
import { DepEdPhSchoolSchema } from './schemas/depedphschool.schema'; | |||
@Module({ | |||
imports: [ | |||
MongooseModule.forFeature([{ name: 'DepEdSchool', schema: DepEdPhSchoolSchema }]) | |||
], | |||
providers: [SchoolService], | |||
controllers: [SchoolController] | |||
}) | |||
export class SchoolModule {} |
@ -0,0 +1,18 @@ | |||
import { Test, TestingModule } from '@nestjs/testing'; | |||
import { SchoolService } from './school.service'; | |||
describe('SchoolService', () => { | |||
let service: SchoolService; | |||
beforeEach(async () => { | |||
const module: TestingModule = await Test.createTestingModule({ | |||
providers: [SchoolService], | |||
}).compile(); | |||
service = module.get<SchoolService>(SchoolService); | |||
}); | |||
it('should be defined', () => { | |||
expect(service).toBeDefined(); | |||
}); | |||
}); |
@ -0,0 +1,4 @@ | |||
import { Injectable } from '@nestjs/common'; | |||
@Injectable() | |||
export class SchoolService {} |
@ -0,0 +1,8 @@ | |||
export class CreateUserDTO { | |||
readonly region: string; | |||
readonly schoolId: string; | |||
readonly schoolName: string; | |||
readonly municipalityName: string; | |||
readonly email: string; | |||
readonly activatedOn: string; | |||
} |
@ -0,0 +1,10 @@ | |||
import { Document } from 'mongoose'; | |||
export interface DepEdPhUser extends Document { | |||
readonly region: string; | |||
readonly schoolId: string; | |||
readonly schoolName: string; | |||
readonly municipalityName: string; | |||
readonly email: string; | |||
readonly activatedOn: string; | |||
} |
@ -0,0 +1,27 @@ | |||
import * as mongoose from 'mongoose'; | |||
export const DepEdPhUserSchema = new mongoose.Schema({ | |||
region: { | |||
type: String, | |||
required: true, | |||
}, | |||
schoolId: { | |||
type:Number, | |||
required:true | |||
}, | |||
schoolName:{ | |||
type: String, | |||
required: true, | |||
}, | |||
municipalityName:{ | |||
type: String, | |||
required: true, | |||
}, | |||
email:{ | |||
type: String, | |||
required: true, | |||
}, | |||
activatedOn: | |||
{ type: Date, default: Date.now } | |||
}) |
@ -0,0 +1,18 @@ | |||
import { Test, TestingModule } from '@nestjs/testing'; | |||
import { UserController } from './user.controller'; | |||
describe('UserController', () => { | |||
let controller: UserController; | |||
beforeEach(async () => { | |||
const module: TestingModule = await Test.createTestingModule({ | |||
controllers: [UserController], | |||
}).compile(); | |||
controller = module.get<UserController>(UserController); | |||
}); | |||
it('should be defined', () => { | |||
expect(controller).toBeDefined(); | |||
}); | |||
}); |
@ -0,0 +1,33 @@ | |||
import { Controller, Get, Res, HttpStatus, Post, Body, Put, Query, NotFoundException, Delete, Param } from '@nestjs/common'; | |||
import { UserService } from './user.service'; | |||
import { CreateUserDTO } from './dto/create-user.dto'; | |||
@Controller('user') | |||
export class UserController { | |||
constructor(private userService: UserService) { } | |||
// add a user | |||
@Post('/create') | |||
async addUser(@Res() res, @Body() createUserDTO: CreateUserDTO) { | |||
const customer = await this.userService.addDepEdPhUser(createUserDTO); | |||
return res.status(HttpStatus.OK).json({ | |||
message: "Customer has been created successfully", | |||
customer | |||
}) | |||
} | |||
// Retrieve customers list | |||
@Get('customers') | |||
async getAllUser(@Res() res) { | |||
const customers = await this.userService.getAllDepEdPhUser(); | |||
return res.status(HttpStatus.OK).json(customers); | |||
} | |||
// Fetch a particular customer using ID | |||
@Get('customer/:customerID') | |||
async getCustomer(@Res() res, @Param('customerID') customerID) { | |||
const customer = await this.userService.getDepEdPhUser(customerID); | |||
if (!customer) throw new NotFoundException('Customer does not exist!'); | |||
return res.status(HttpStatus.OK).json(customer); | |||
} | |||
} |
@ -0,0 +1,15 @@ | |||
import { Module } from '@nestjs/common'; | |||
import { UserService } from './user.service'; | |||
import { UserController } from './user.controller'; | |||
import { MongooseModule } from '@nestjs/mongoose'; | |||
import { DepEdPhUserSchema } from './schemas/depedphuser.schema'; | |||
@Module({ | |||
providers: [UserService], | |||
controllers: [UserController], | |||
imports: [ | |||
MongooseModule.forFeature([{ name: 'DepEdPhUser', schema: DepEdPhUserSchema }]), | |||
] | |||
}) | |||
export class UserModule {} |
@ -0,0 +1,18 @@ | |||
import { Test, TestingModule } from '@nestjs/testing'; | |||
import { UserService } from './user.service'; | |||
describe('UserService', () => { | |||
let service: UserService; | |||
beforeEach(async () => { | |||
const module: TestingModule = await Test.createTestingModule({ | |||
providers: [UserService], | |||
}).compile(); | |||
service = module.get<UserService>(UserService); | |||
}); | |||
it('should be defined', () => { | |||
expect(service).toBeDefined(); | |||
}); | |||
}); |
@ -0,0 +1,36 @@ | |||
import { Injectable } from '@nestjs/common'; | |||
import { Model } from 'mongoose'; | |||
import { InjectModel } from '@nestjs/mongoose'; | |||
import { DepEdPhUser } from './interfaces/depedphuser.interface'; | |||
import { CreateUserDTO } from './dto/create-user.dto'; | |||
@Injectable() | |||
export class UserService { | |||
constructor(@InjectModel('DepEdPhUser') private readonly DepEdPhUserModel: Model<DepEdPhUser>) { } | |||
// fetch all DepEdPhUsers | |||
async getAllDepEdPhUser(): Promise<DepEdPhUser[]> { | |||
const DepEdPhUsers = await this.DepEdPhUserModel.find().exec(); | |||
return DepEdPhUsers; | |||
} | |||
// Get a single DepEdPhUser | |||
async getDepEdPhUser(DepEdPhUserID): Promise<DepEdPhUser> { | |||
const DepEdPhUser = await this.DepEdPhUserModel.findById(DepEdPhUserID).exec(); | |||
return DepEdPhUser; | |||
} | |||
// post a single DepEdPhUser | |||
async addDepEdPhUser(createUserDTO: CreateUserDTO): Promise<DepEdPhUser> { | |||
const newDepEdPhUser = await new this.DepEdPhUserModel(createUserDTO); | |||
return newDepEdPhUser.save(); | |||
} | |||
// Edit DepEdPhUser details | |||
async updateDepEdPhUser(DepEdPhUserID, createUserDTO: CreateUserDTO): Promise<DepEdPhUser> { | |||
const updatedDepEdPhUser = await this.DepEdPhUserModel | |||
.findByIdAndUpdate(DepEdPhUserID, createUserDTO, { new: true }); | |||
return updatedDepEdPhUser; | |||
} | |||
// Delete a DepEdPhUser | |||
async deleteDepEdPhUser(DepEdPhUserID): Promise<any> { | |||
const deletedDepEdPhUser = await this.DepEdPhUserModel.findByIdAndRemove(DepEdPhUserID); | |||
return deletedDepEdPhUser; | |||
} | |||
} |
@ -0,0 +1,24 @@ | |||
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!'); | |||
}); | |||
}); |
@ -0,0 +1,9 @@ | |||
{ | |||
"moduleFileExtensions": ["js", "json", "ts"], | |||
"rootDir": ".", | |||
"testEnvironment": "node", | |||
"testRegex": ".e2e-spec.ts$", | |||
"transform": { | |||
"^.+\\.(t|j)s$": "ts-jest" | |||
} | |||
} |
@ -0,0 +1,4 @@ | |||
{ | |||
"extends": "./tsconfig.json", | |||
"exclude": ["node_modules", "test", "dist", "**/*spec.ts"] | |||
} |
@ -0,0 +1,21 @@ | |||
{ | |||
"compilerOptions": { | |||
"module": "commonjs", | |||
"declaration": true, | |||
"removeComments": true, | |||
"emitDecoratorMetadata": true, | |||
"experimentalDecorators": true, | |||
"allowSyntheticDefaultImports": true, | |||
"target": "es2017", | |||
"sourceMap": true, | |||
"outDir": "./dist", | |||
"baseUrl": "./", | |||
"incremental": true, | |||
"skipLibCheck": true, | |||
"strictNullChecks": false, | |||
"noImplicitAny": false, | |||
"strictBindCallApply": false, | |||
"forceConsistentCasingInFileNames": false, | |||
"noFallthroughCasesInSwitch": false | |||
} | |||
} |