mirror of
https://github.com/sergeyyarkov/educt-server.git
synced 2026-10-11 18:29:15 +03:00
feat: change status for course
This commit is contained in:
parent
2811b9974d
commit
8233d136f3
@ -12,6 +12,7 @@ import CourseService from 'App/Services/CourseService';
|
|||||||
import AddCourseToUserValidator from 'App/Validators/Course/AddCourseToUserValidator';
|
import AddCourseToUserValidator from 'App/Validators/Course/AddCourseToUserValidator';
|
||||||
import CreateCourseValidator from 'App/Validators/Course/CreateCourseValidator';
|
import CreateCourseValidator from 'App/Validators/Course/CreateCourseValidator';
|
||||||
import DelCourseFromUserValidator from 'App/Validators/Course/DelCourseFromUserValidator';
|
import DelCourseFromUserValidator from 'App/Validators/Course/DelCourseFromUserValidator';
|
||||||
|
import SetCourseStatusValidator from 'App/Validators/Course/SetCourseStatusValidator';
|
||||||
import UpdateCourseValidator from 'App/Validators/Course/UpdateCourseValidator';
|
import UpdateCourseValidator from 'App/Validators/Course/UpdateCourseValidator';
|
||||||
|
|
||||||
import BaseController from '../../BaseController';
|
import BaseController from '../../BaseController';
|
||||||
@ -224,6 +225,21 @@ export default class CoursesController extends BaseController {
|
|||||||
|
|
||||||
return this.sendResponse(ctx, result.data, result.message, result.status);
|
return this.sendResponse(ctx, result.data, result.message, result.status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set course status
|
||||||
|
* POST /courses/:id/set-status
|
||||||
|
*/
|
||||||
|
public async setStatus(ctx: HttpContextContract) {
|
||||||
|
const payload = await ctx.request.validate(SetCourseStatusValidator);
|
||||||
|
const result = await this.courseService.setCourseStatus(ctx.params.id, payload.status);
|
||||||
|
|
||||||
|
if (!result.success && result.error) {
|
||||||
|
throw new Exception(result.message, result.status, result.error.code);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.sendResponse(ctx, result.data, result.message, result.status);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
new Ioc().make(CoursesController);
|
new Ioc().make(CoursesController);
|
||||||
|
|||||||
@ -34,7 +34,7 @@ export default class Course extends BaseModel {
|
|||||||
@column()
|
@column()
|
||||||
public category_id: string;
|
public category_id: string;
|
||||||
|
|
||||||
@column()
|
@column({ serializeAs: null })
|
||||||
public status: CourseStatusEnum;
|
public status: CourseStatusEnum;
|
||||||
|
|
||||||
@belongsTo(() => Category, {
|
@belongsTo(() => Category, {
|
||||||
|
|||||||
@ -1,3 +1,8 @@
|
|||||||
|
/**
|
||||||
|
* Datatypes
|
||||||
|
*/
|
||||||
|
import CourseStatusEnum from 'App/Datatypes/Enums/CourseStatusEnum';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Models
|
* Models
|
||||||
*/
|
*/
|
||||||
@ -19,13 +24,28 @@ export default class CourseRepository {
|
|||||||
this.Course = Course;
|
this.Course = Course;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set status on course
|
||||||
|
*
|
||||||
|
* @param id Course id
|
||||||
|
* @returns Data result
|
||||||
|
*/
|
||||||
|
public async setStatus(id: string | number, status: CourseStatusEnum): Promise<any> {
|
||||||
|
const data = await this.Course.query().where('id', id).update({ status }).first();
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get all courses
|
* Get all courses
|
||||||
*
|
*
|
||||||
* @returns List of courses
|
* @returns List of courses
|
||||||
*/
|
*/
|
||||||
public async getAll(): Promise<Course[]> {
|
public async getAll(): Promise<Course[]> {
|
||||||
const courses = await this.Course.query().preload('teacher').preload('category').preload('lessons');
|
const courses = await this.Course.query()
|
||||||
|
.preload('teacher')
|
||||||
|
.preload('category')
|
||||||
|
.preload('lessons')
|
||||||
|
.where('status', CourseStatusEnum.PUBLISHED);
|
||||||
return courses;
|
return courses;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,6 +62,7 @@ export default class CourseRepository {
|
|||||||
.preload('lessons')
|
.preload('lessons')
|
||||||
.preload('students')
|
.preload('students')
|
||||||
.where('id', id)
|
.where('id', id)
|
||||||
|
.where('status', CourseStatusEnum.PUBLISHED)
|
||||||
.first();
|
.first();
|
||||||
|
|
||||||
return course;
|
return course;
|
||||||
@ -115,7 +136,13 @@ export default class CourseRepository {
|
|||||||
* @returns Created course
|
* @returns Created course
|
||||||
*/
|
*/
|
||||||
public async create(data: CreateCourseValidator['schema']['props']): Promise<Course> {
|
public async create(data: CreateCourseValidator['schema']['props']): Promise<Course> {
|
||||||
const createdCourse = await this.Course.create(data);
|
const createdCourse = await this.Course.create({
|
||||||
|
title: data.title,
|
||||||
|
description: data.description,
|
||||||
|
status: CourseStatusEnum.DRAFT, // make course DRAFT before adding lessons
|
||||||
|
teacher_id: data.teacher_id,
|
||||||
|
category_id: data.category_id,
|
||||||
|
});
|
||||||
return createdCourse;
|
return createdCourse;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,10 +1,11 @@
|
|||||||
import { inject, Ioc } from '@adonisjs/core/build/standalone';
|
import { inject, Ioc } from '@adonisjs/core/build/standalone';
|
||||||
import { AuthContract } from '@ioc:Adonis/Addons/Auth';
|
import { AuthContract } from '@ioc:Adonis/Addons/Auth';
|
||||||
import RoleEnum from 'App/Datatypes/Enums/RoleEnum';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Datatypes
|
* Datatypes
|
||||||
*/
|
*/
|
||||||
|
import RoleEnum from 'App/Datatypes/Enums/RoleEnum';
|
||||||
|
import CourseStatusEnum from 'App/Datatypes/Enums/CourseStatusEnum';
|
||||||
import StatusCodeEnum from 'App/Datatypes/Enums/StatusCodeEnum';
|
import StatusCodeEnum from 'App/Datatypes/Enums/StatusCodeEnum';
|
||||||
import IResponse from 'App/Datatypes/Interfaces/IResponse';
|
import IResponse from 'App/Datatypes/Interfaces/IResponse';
|
||||||
import RoleHelper from 'App/Helpers/RoleHelper';
|
import RoleHelper from 'App/Helpers/RoleHelper';
|
||||||
@ -555,6 +556,30 @@ export default class CourseService {
|
|||||||
data: {},
|
data: {},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async setCourseStatus(id: string | number, status: CourseStatusEnum): Promise<IResponse> {
|
||||||
|
const data = await this.courseRepository.setStatus(id, status);
|
||||||
|
console.log(data);
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
return {
|
||||||
|
success: false,
|
||||||
|
status: StatusCodeEnum.BAD_REQUEST,
|
||||||
|
message: `Cannot set status for course with id "${id}"`,
|
||||||
|
data: {},
|
||||||
|
error: {
|
||||||
|
code: 'E_BAD_REQUEST',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
success: true,
|
||||||
|
status: StatusCodeEnum.OK,
|
||||||
|
message: 'Status changed.',
|
||||||
|
data: {},
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
new Ioc().make(CourseService);
|
new Ioc().make(CourseService);
|
||||||
|
|||||||
17
app/Validators/Course/SetCourseStatusValidator.ts
Normal file
17
app/Validators/Course/SetCourseStatusValidator.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import { schema } from '@ioc:Adonis/Core/Validator';
|
||||||
|
import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Datatypes
|
||||||
|
*/
|
||||||
|
import CourseStatusEnum from 'App/Datatypes/Enums/CourseStatusEnum';
|
||||||
|
|
||||||
|
export default class SetCourseStatusValidator {
|
||||||
|
constructor(protected ctx: HttpContextContract) {}
|
||||||
|
|
||||||
|
public schema = schema.create({
|
||||||
|
status: schema.enum(Object.values(CourseStatusEnum)),
|
||||||
|
});
|
||||||
|
|
||||||
|
public messages = {};
|
||||||
|
}
|
||||||
@ -1,5 +1,10 @@
|
|||||||
import BaseSchema from '@ioc:Adonis/Lucid/Schema';
|
import BaseSchema from '@ioc:Adonis/Lucid/Schema';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Datatypes
|
||||||
|
*/
|
||||||
|
import CourseStatusEnum from 'App/Datatypes/Enums/CourseStatusEnum';
|
||||||
|
|
||||||
export default class Courses extends BaseSchema {
|
export default class Courses extends BaseSchema {
|
||||||
protected tableName = 'courses';
|
protected tableName = 'courses';
|
||||||
|
|
||||||
@ -11,7 +16,7 @@ export default class Courses extends BaseSchema {
|
|||||||
table.string('teacher_id', 21).unsigned().references('users.id').onDelete('CASCADE');
|
table.string('teacher_id', 21).unsigned().references('users.id').onDelete('CASCADE');
|
||||||
table.string('category_id', 21).unsigned().references('categories.id').onDelete('CASCADE');
|
table.string('category_id', 21).unsigned().references('categories.id').onDelete('CASCADE');
|
||||||
table
|
table
|
||||||
.enu('status', ['DRAFT', 'PUBLISHED'], {
|
.enu('status', Object.values(CourseStatusEnum), {
|
||||||
useNative: true,
|
useNative: true,
|
||||||
enumName: 'course_status',
|
enumName: 'course_status',
|
||||||
existingType: false,
|
existingType: false,
|
||||||
|
|||||||
@ -41,4 +41,8 @@ Route.group(() => {
|
|||||||
Route.delete('/:id/likes', 'Api/v1/CoursesController.unsetLike')
|
Route.delete('/:id/likes', 'Api/v1/CoursesController.unsetLike')
|
||||||
.middleware('role:admin,teacher,student')
|
.middleware('role:admin,teacher,student')
|
||||||
.as('courses.unset-like');
|
.as('courses.unset-like');
|
||||||
|
|
||||||
|
Route.post('/:id/set-status', 'Api/v1/CoursesController.setStatus')
|
||||||
|
.middleware('role:admin,teacher')
|
||||||
|
.as('courses.set-status');
|
||||||
}).prefix('courses');
|
}).prefix('courses');
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user