feat: course status

This commit is contained in:
Sergey Yarkov 2021-08-12 23:48:27 +03:00
parent ce22ac9f92
commit 2811b9974d
7 changed files with 44 additions and 7 deletions

View File

@ -0,0 +1,6 @@
enum CourseStatusEnum {
PUBLISHED = 'PUBLISHED',
DRAFT = 'DRAFT',
}
export default CourseStatusEnum;

View File

@ -16,6 +16,7 @@ import {
import Category from 'App/Models/Category'; import Category from 'App/Models/Category';
import Lesson from 'App/Models/Lesson'; import Lesson from 'App/Models/Lesson';
import User from 'App/Models/User'; import User from 'App/Models/User';
import CourseStatusEnum from 'App/Datatypes/Enums/CourseStatusEnum';
export default class Course extends BaseModel { export default class Course extends BaseModel {
@column({ isPrimary: true }) @column({ isPrimary: true })
@ -33,6 +34,9 @@ export default class Course extends BaseModel {
@column() @column()
public category_id: string; public category_id: string;
@column()
public status: CourseStatusEnum;
@belongsTo(() => Category, { @belongsTo(() => Category, {
foreignKey: 'category_id', foreignKey: 'category_id',
}) })

View File

@ -260,7 +260,7 @@ export default class CourseService {
return { return {
success: false, success: false,
status: StatusCodeEnum.BAD_REQUEST, status: StatusCodeEnum.BAD_REQUEST,
message: `User with id "${teacher.id}" not teacher.`, message: `User with id "${teacher.id}" not a teacher.`,
data: {}, data: {},
error: { error: {
code: 'E_BAD_REQUEST', code: 'E_BAD_REQUEST',

View File

@ -1,8 +1,18 @@
import Factory from '@ioc:Adonis/Lucid/Factory'; import Factory from '@ioc:Adonis/Lucid/Factory';
/**
* Datatypes
*/
import CourseStatusEnum from 'App/Datatypes/Enums/CourseStatusEnum';
/**
* Models
*/
import Category from 'App/Models/Category'; import Category from 'App/Models/Category';
import Contact from 'App/Models/Contact'; import Contact from 'App/Models/Contact';
import Course from 'App/Models/Course'; import Course from 'App/Models/Course';
import Lesson from 'App/Models/Lesson'; import Lesson from 'App/Models/Lesson';
import LessonContent from 'App/Models/LessonContent';
import User from 'App/Models/User'; import User from 'App/Models/User';
export const ContactFactory = Factory.define(Contact, ({ faker }) => { export const ContactFactory = Factory.define(Contact, ({ faker }) => {
@ -23,13 +33,21 @@ export const UserFactory = Factory.define(User, ({ faker }) => {
.relation('contacts', () => ContactFactory) .relation('contacts', () => ContactFactory)
.build(); .build();
export const LessonFactory = Factory.define(Lesson, ({ faker }) => { export const LessonContentFactory = Factory.define(LessonContent, ({ faker }) => {
return { return {
title: faker.lorem.sentence(2), video_url: `https://www.youtube.com/embed/${faker.datatype.string(10)}`,
description: faker.lorem.sentence(5),
}; };
}).build(); }).build();
export const LessonFactory = Factory.define(Lesson, ({ faker }) => {
return {
title: `Lesson #${faker.datatype.number(200)}`,
description: faker.lorem.sentence(5),
};
})
.relation('content', () => LessonContentFactory)
.build();
export const CategoryFactory = Factory.define(Category, ({ faker }) => { export const CategoryFactory = Factory.define(Category, ({ faker }) => {
const title = faker.lorem.word(6); const title = faker.lorem.word(6);
return { return {
@ -40,8 +58,9 @@ export const CategoryFactory = Factory.define(Category, ({ faker }) => {
export const CourseFactory = Factory.define(Course, ({ faker }) => { export const CourseFactory = Factory.define(Course, ({ faker }) => {
return { return {
title: faker.lorem.sentence(3), title: `Course #${faker.datatype.number(200)}`,
description: faker.lorem.sentence(5), description: faker.lorem.sentence(5),
status: CourseStatusEnum.PUBLISHED,
}; };
}) })
.relation('category', () => CategoryFactory) .relation('category', () => CategoryFactory)

View File

@ -10,12 +10,21 @@ export default class Courses extends BaseSchema {
table.string('description').notNullable(); table.string('description').notNullable();
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
.enu('status', ['DRAFT', 'PUBLISHED'], {
useNative: true,
enumName: 'course_status',
existingType: false,
schemaName: 'public',
})
.notNullable();
table.timestamp('created_at', { useTz: true }); table.timestamp('created_at', { useTz: true });
table.timestamp('updated_at', { useTz: true }); table.timestamp('updated_at', { useTz: true });
}); });
} }
public async down() { public async down() {
await this.schema.raw('DROP TYPE IF EXISTS "course_status" CASCADE');
this.schema.dropTable(this.tableName); this.schema.dropTable(this.tableName);
} }
} }

View File

@ -15,7 +15,7 @@ export default class CourseSeeder extends BaseSeeder {
.firstOrFail(); .firstOrFail();
await CourseFactory.with('category') await CourseFactory.with('category')
.with('lessons', 2) .with('lessons', 2, lessonFactory => lessonFactory.with('content'))
.createMany(3, (course: Course) => course.related('teacher').associate(teacher)); .createMany(3, (course: Course) => course.related('teacher').associate(teacher));
} }
} }

View File

@ -11,7 +11,6 @@
"db:migrate:force": "node ace migration:run --force", "db:migrate:force": "node ace migration:run --force",
"db:rollback": "node ace migration:rollback", "db:rollback": "node ace migration:rollback",
"db:status": "node ace migration:status", "db:status": "node ace migration:status",
"db:refresh": "node ace migration:refresh && npm run db:seed",
"db:seed": "node ace db:seed", "db:seed": "node ace db:seed",
"db:seed:force": "node ace seed --force" "db:seed:force": "node ace seed --force"
}, },