Skip to content
Snippets Groups Projects

Crud internship

Merged GUVEN Kemal requested to merge crud-internship into master
8 files
+ 95
33
Compare changes
  • Side-by-side
  • Inline
Files
8
import {
import { Injectable, NotFoundException } from '@nestjs/common';
Injectable,
NotFoundException,
InternalServerErrorException,
} from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { Model } from 'mongoose';
 
import { CONFLICT } from 'src/shared/HttpError';
 
import { STATE_1 } from 'src/shared/InternshipState';
 
import { STATUS_NOK } from 'src/shared/InternshipStatus';
import { CreateInternshipDto } from '../dto/create-internship.dto';
import { CreateInternshipDto } from '../dto/create-internship.dto';
import { InternshipDto } from '../dto/internship.dto';
import { InternshipDto } from '../dto/internship.dto';
import { TrackingDto } from '../dto/nested-create/tracking.dto';
import { Internship } from '../schemas/internship.schema';
import { Internship } from '../schemas/internship.schema';
@Injectable()
@Injectable()
export class InternshipDao {
export class InternshipDao {
constructor(
constructor(
@InjectModel(Internship.name)
@InjectModel(Internship.name)
private readonly _groupModel: Model<Internship>,
private readonly _internshipModel: Model<Internship>,
) {}
) {}
find = (): Promise<Internship[]> =>
find = (): Promise<Internship[]> =>
new Promise((resolve, reject) => {
new Promise((resolve, reject) => {
this._groupModel.find({}, {}, {}, (err, value) => {
this._internshipModel.find({}, {}, {}, (err, value) => {
if (err) reject(err.message);
if (err) reject(err.message);
if (!value) reject('No values');
if (!value) reject('No values');
resolve(value);
resolve(value);
@@ -28,7 +26,7 @@ export class InternshipDao {
@@ -28,7 +26,7 @@ export class InternshipDao {
findByStudentId = (studentId: string): Promise<Internship | void> =>
findByStudentId = (studentId: string): Promise<Internship | void> =>
new Promise((resolve, reject) => {
new Promise((resolve, reject) => {
this._groupModel.findOne({ studentId }, {}, {}, (err, value) => {
this._internshipModel.findOne({ studentId }, {}, {}, (err, value) => {
if (err) reject(err.message);
if (err) reject(err.message);
if (!value) reject(new NotFoundException());
if (!value) reject(new NotFoundException());
resolve(value);
resolve(value);
@@ -37,29 +35,34 @@ export class InternshipDao {
@@ -37,29 +35,34 @@ export class InternshipDao {
save = (internship: CreateInternshipDto): Promise<Internship> =>
save = (internship: CreateInternshipDto): Promise<Internship> =>
new Promise((resolve, reject) => {
new Promise((resolve, reject) => {
// do smth
// Use updateOne with `upsert: true` to only insert when no other document has the same studentId to prevent duplicata
const _internship: InternshipDto = {
const decoratedInternship = this.toInternshipDtoWithTracking(internship);
...internship,
this._internshipModel.updateOne(
tracking: {
{ studentId: internship.studentId },
state: 'state-1',
{ $setOnInsert: decoratedInternship },
status: 'pending',
{
 
upsert: true,
 
runValidators: true,
},
},
};
(err, value) => {
new this._groupModel(_internship).save((err, value) => {
const { upsertedCount } = value;
if (err) reject(err.message);
if (err) reject(err.message);
if (!value) reject(new InternalServerErrorException());
if (upsertedCount === 0) reject(CONFLICT);
resolve(value);
resolve(decoratedInternship as Internship);
});
},
 
);
});
});
findByStudentIdAndUpdate = (
findByStudentIdAndUpdate = (
studentId: string,
studentId: string,
internship: InternshipDto,
internship: CreateInternshipDto,
): Promise<Internship | void> =>
): Promise<Internship | void> =>
new Promise((resolve, reject) => {
new Promise((resolve, reject) => {
this._groupModel.findOneAndReplace(
// Check if information modification is allowed -> current state is information input by student and updating is allowed
{ studentId },
const decoratedInternship = this.toInternshipDtoWithTracking(internship);
internship,
this._internshipModel.findOneAndReplace(
 
{ studentId, 'tracking.state': STATE_1, 'tracking.status': STATUS_NOK },
 
decoratedInternship,
{
{
new: true,
new: true,
runValidators: true,
runValidators: true,
@@ -73,9 +76,21 @@ export class InternshipDao {
@@ -73,9 +76,21 @@ export class InternshipDao {
findByStudentIdAndRemove = (studentId: string): Promise<Internship | void> =>
findByStudentIdAndRemove = (studentId: string): Promise<Internship | void> =>
new Promise((resolve, reject) => {
new Promise((resolve, reject) => {
this._groupModel.findOneAndDelete({ studentId }, {}, (err) => {
this._internshipModel.findOneAndDelete({ studentId }, {}, (err) => {
if (err) reject(err.message);
if (err) reject(err.message);
resolve();
resolve();
});
});
});
});
 
 
toInternshipDtoWithTracking = (
 
createInternshipDto: CreateInternshipDto,
 
): InternshipDto => {
 
return {
 
...createInternshipDto,
 
tracking: {
 
state: 'state-1',
 
status: 'nok',
 
},
 
};
 
};
}
}
Loading