diff --git a/app/Datatypes/Enums/CourseStatusEnum.ts b/app/Datatypes/Enums/CourseStatusEnum.ts new file mode 100644 index 0000000..131bdc9 --- /dev/null +++ b/app/Datatypes/Enums/CourseStatusEnum.ts @@ -0,0 +1,6 @@ +enum CourseStatusEnum { + PUBLISHED = 'PUBLISHED', + DRAFT = 'DRAFT', +} + +export default CourseStatusEnum; diff --git a/app/Models/Course.ts b/app/Models/Course.ts index 29a1a14..caccd12 100644 --- a/app/Models/Course.ts +++ b/app/Models/Course.ts @@ -16,6 +16,7 @@ import { import Category from 'App/Models/Category'; import Lesson from 'App/Models/Lesson'; import User from 'App/Models/User'; +import CourseStatusEnum from 'App/Datatypes/Enums/CourseStatusEnum'; export default class Course extends BaseModel { @column({ isPrimary: true }) @@ -33,6 +34,9 @@ export default class Course extends BaseModel { @column() public category_id: string; + @column() + public status: CourseStatusEnum; + @belongsTo(() => Category, { foreignKey: 'category_id', }) diff --git a/app/Services/CourseService.ts b/app/Services/CourseService.ts index 2de1409..e617157 100644 --- a/app/Services/CourseService.ts +++ b/app/Services/CourseService.ts @@ -260,7 +260,7 @@ export default class CourseService { return { success: false, status: StatusCodeEnum.BAD_REQUEST, - message: `User with id "${teacher.id}" not teacher.`, + message: `User with id "${teacher.id}" not a teacher.`, data: {}, error: { code: 'E_BAD_REQUEST', diff --git a/database/factories/index.ts b/database/factories/index.ts index 7c443fc..63faac0 100644 --- a/database/factories/index.ts +++ b/database/factories/index.ts @@ -1,8 +1,18 @@ import Factory from '@ioc:Adonis/Lucid/Factory'; + +/** + * Datatypes + */ +import CourseStatusEnum from 'App/Datatypes/Enums/CourseStatusEnum'; + +/** + * Models + */ import Category from 'App/Models/Category'; import Contact from 'App/Models/Contact'; import Course from 'App/Models/Course'; import Lesson from 'App/Models/Lesson'; +import LessonContent from 'App/Models/LessonContent'; import User from 'App/Models/User'; export const ContactFactory = Factory.define(Contact, ({ faker }) => { @@ -23,13 +33,21 @@ export const UserFactory = Factory.define(User, ({ faker }) => { .relation('contacts', () => ContactFactory) .build(); -export const LessonFactory = Factory.define(Lesson, ({ faker }) => { +export const LessonContentFactory = Factory.define(LessonContent, ({ faker }) => { return { - title: faker.lorem.sentence(2), - description: faker.lorem.sentence(5), + video_url: `https://www.youtube.com/embed/${faker.datatype.string(10)}`, }; }).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 }) => { const title = faker.lorem.word(6); return { @@ -40,8 +58,9 @@ export const CategoryFactory = Factory.define(Category, ({ faker }) => { export const CourseFactory = Factory.define(Course, ({ faker }) => { return { - title: faker.lorem.sentence(3), + title: `Course #${faker.datatype.number(200)}`, description: faker.lorem.sentence(5), + status: CourseStatusEnum.PUBLISHED, }; }) .relation('category', () => CategoryFactory) diff --git a/database/migrations/1627300211260_courses.ts b/database/migrations/1627300211260_courses.ts index 7044d45..58046ea 100644 --- a/database/migrations/1627300211260_courses.ts +++ b/database/migrations/1627300211260_courses.ts @@ -10,12 +10,21 @@ export default class Courses extends BaseSchema { table.string('description').notNullable(); table.string('teacher_id', 21).unsigned().references('users.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('updated_at', { useTz: true }); }); } public async down() { + await this.schema.raw('DROP TYPE IF EXISTS "course_status" CASCADE'); this.schema.dropTable(this.tableName); } } diff --git a/database/seeders/Course.ts b/database/seeders/Course.ts index 4912289..bab8f71 100644 --- a/database/seeders/Course.ts +++ b/database/seeders/Course.ts @@ -15,7 +15,7 @@ export default class CourseSeeder extends BaseSeeder { .firstOrFail(); await CourseFactory.with('category') - .with('lessons', 2) + .with('lessons', 2, lessonFactory => lessonFactory.with('content')) .createMany(3, (course: Course) => course.related('teacher').associate(teacher)); } } diff --git a/package.json b/package.json index acb4585..7ae0673 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,6 @@ "db:migrate:force": "node ace migration:run --force", "db:rollback": "node ace migration:rollback", "db:status": "node ace migration:status", - "db:refresh": "node ace migration:refresh && npm run db:seed", "db:seed": "node ace db:seed", "db:seed:force": "node ace seed --force" },