Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
225b096
education UI
Munkhorgilb Apr 21, 2025
c10ab04
education backend initial
Munkhorgilb Apr 22, 2025
1f13f73
fixes
Munkhorgilb Apr 23, 2025
e61e0e8
merge
Munkhorgilb Apr 23, 2025
d827a16
Education UI & Backend fix improvements
Munkhorgilb Apr 23, 2025
7a65009
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb Apr 23, 2025
7d665a1
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb Apr 24, 2025
14ebb16
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb Apr 24, 2025
6469534
course list cursor
Munkhorgilb Apr 24, 2025
fd285bf
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb Apr 24, 2025
0ea2612
fixes
Munkhorgilb Apr 24, 2025
9591942
merge
Munkhorgilb Apr 24, 2025
2661111
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb Apr 28, 2025
caca12c
feat: class schema, apollo
Munkhorgilb Apr 29, 2025
ea47a6b
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb May 7, 2025
4425b47
fixes
Munkhorgilb May 7, 2025
823eac9
Adding class UI
Munkhorgilb May 7, 2025
b818de7
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb May 7, 2025
1a47cb2
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb May 12, 2025
4d9d46d
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb May 13, 2025
6ab9682
feat:education fixes
Munkhorgilb May 13, 2025
2ae3dd4
feat: add course category management to education module
Munkhorgilb May 13, 2025
1ac9b22
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb May 13, 2025
c9e9f2e
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb May 14, 2025
23f58a5
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb May 15, 2025
d608c36
Refactor CourseDetail module
Munkhorgilb May 15, 2025
18b5b60
Enhance course module:
Munkhorgilb May 15, 2025
6848457
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb May 16, 2025
cf6bb52
course, class UI improvement
Munkhorgilb May 16, 2025
e1aa931
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb May 20, 2025
48b74f2
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb May 20, 2025
280bc3c
course tab
Munkhorgilb May 21, 2025
28331a0
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb May 21, 2025
26d1684
Refactor education plugin: restructure GraphQL schema, resolvers, and…
Munkhorgilb May 21, 2025
d855f1b
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb May 21, 2025
6de3ba8
upd
Munkhorgilb May 22, 2025
dbf9567
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb May 22, 2025
a8e9deb
feat(teachers): add teachers module with GraphQL API and UI integration
Munkhorgilb May 22, 2025
3644115
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb May 22, 2025
1cac5d8
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb May 23, 2025
f582e87
Refactor and enhance course and class components
Munkhorgilb May 26, 2025
a0126d2
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb May 26, 2025
c2ae10d
Refactor and enhance education module: updated class, course, comment…
Munkhorgilb May 29, 2025
ce494af
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb May 29, 2025
37bdd83
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb May 30, 2025
7c4d981
feat(students): implement student module in education plugin
Munkhorgilb May 30, 2025
709a548
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb Jun 4, 2025
2b7eb6e
Merge branch 'main' of github.com:erxes/erxes-next into education
Munkhorgilb Jun 4, 2025
0971d28
merge
Munkhorgilb Jun 10, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions backend/plugins/education_api/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"name": "education",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"dev": "tsx watch src/main.ts",
"build": "tsc --project tsconfig.build.json && tsc-alias -p tsconfig.build.json",
"start": "node -r tsconfig-paths/register dist/src/main.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"erxes-api-shared": "workspace:^"
},
"devDependencies": {}
}
53 changes: 53 additions & 0 deletions backend/plugins/education_api/project.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
{
"name": "education_api",
"$schema": "../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "backend/plugins/education_api/src",
"projectType": "application",
"tags": [],
"targets": {
"build": {
"executor": "nx:run-commands",
"cache": true,
"options": {
"cwd": "backend/plugins/education_api",
"commands": ["pnpm build"]
},
"dependsOn": ["^build", "build:packageJson"]
},

"build:packageJson": {
"executor": "@nx/js:tsc",
"options": {
"main": "backend/plugins/education_api/dist/src/main.js",
"tsConfig": "backend/plugins/education_api/tsconfig.build.json",
"outputPath": "backend/plugins/education_api/dist",
"updateBuildableProjectDepsInPackageJson": true,

"buildableProjectDepsInPackageJsonType": "dependencies"
}
},

"start": {
"executor": "nx:run-commands",
"dependsOn": ["typecheck", "build"],
"options": {
"cwd": "backend/plugins/education_api",
"command": "NODE_ENV=development && node dist/src/main.js"
}
},

"serve": {
"executor": "nx:run-commands",

"options": {
"cwd": "backend/plugins/education_api",
"command": "NODE_ENV=development && pnpm dev"
}
},

"docker-build": {
"dependsOn": ["build"],
"command": "docker build -f backend/plugins/education_api/Dockerfile . -t education_api"
}
}
}
17 changes: 17 additions & 0 deletions backend/plugins/education_api/src/apollo/resolvers/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { apolloCustomScalars } from 'erxes-api-shared/utils';
import { customResolvers } from './resolvers';
import { mutations } from './mutations';
import { queries } from './queries';

const resolvers: any = {
Mutation: {
...mutations,
},
Query: {
...queries,
},
...apolloCustomScalars,
...customResolvers,
};

export default resolvers;
13 changes: 13 additions & 0 deletions backend/plugins/education_api/src/apollo/resolvers/mutations.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { courseMutations } from '@/courses/graphql/resolvers/mutations';
import { classMutations } from '@/class/graphql/resolvers/mutations';
import { commentMutations } from '@/comments/graphql/resolvers/mutations';
import { teacherMutations } from '@/teachers/graphql/resolvers/mutations';
import { studentMutations } from '@/students/graphql/resolvers/mutations';

export const mutations = {
...courseMutations,
...classMutations,
...commentMutations,
...teacherMutations,
...studentMutations,
};
13 changes: 13 additions & 0 deletions backend/plugins/education_api/src/apollo/resolvers/queries.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { courseQueries } from '@/courses/graphql/resolvers/queries';
import { classQueries } from '@/class/graphql/resolvers/queries';
import { commentQueries } from '@/comments/graphql/resolvers/queries';
import { teacherQueries } from '@/teachers/graphql/resolvers/queries';
import { studentQueries } from '@/students/graphql/resolvers/queries';

export const queries = {
...courseQueries,
...classQueries,
...commentQueries,
...teacherQueries,
...studentQueries,
};
11 changes: 11 additions & 0 deletions backend/plugins/education_api/src/apollo/resolvers/resolvers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import courseResolvers from '@/courses/graphql/resolvers/customResolvers';
import commentResolvers from '@/comments/graphql/resolvers/customResolvers';
import teacherResolvers from '@/teachers/graphql/resolvers/customResolvers';
import studentResolvers from '@/students/graphql/resolvers/customResolvers';

export const customResolvers = {
...teacherResolvers,
...courseResolvers,
...commentResolvers,
...studentResolvers,
};
61 changes: 61 additions & 0 deletions backend/plugins/education_api/src/apollo/schema/schema.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import {
mutations as CoursesMutations,
queries as CoursesQueries,
types as CoursesTypes,
} from '@/courses/graphql/schemas/courses';
import {
mutations as ClassMutations,
queries as ClassQueries,
types as ClassTypes,
} from '@/class/graphql/schemas/class';
import {
mutations as CommentMutations,
queries as CommentQueries,
types as CommentTypes,
} from '@/comments/graphql/schemas/comments';
import {
mutations as TeacherMutations,
queries as TeacherQueries,
types as TeacherTypes,
} from '@/teachers/graphql/schemas/teachers';
import {
mutations as StudentMutations,
queries as StudentQueries,
types as StudentTypes,
} from '@/students/graphql/schemas/students';

export const types = `
enum CacheControlScope {
PUBLIC
PRIVATE
}

directive @cacheControl(
maxAge: Int
scope: CacheControlScope
inheritMaxAge: Boolean
) on FIELD_DEFINITION | OBJECT | INTERFACE | UNION
${CoursesTypes}
${ClassTypes}
${CommentTypes}
${TeacherTypes}
${StudentTypes}
`;

export const queries = `
${CoursesQueries}
${ClassQueries}
${CommentQueries}
${TeacherQueries}
${StudentQueries}
`;

export const mutations = `
${CoursesMutations}
${ClassMutations}
${CommentMutations}
${TeacherMutations}
${StudentMutations}
`;

export default { types, queries, mutations };
17 changes: 17 additions & 0 deletions backend/plugins/education_api/src/apollo/typeDefs.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { apolloCommonTypes } from 'erxes-api-shared/utils';
import { DocumentNode } from 'graphql';
import { gql } from 'graphql-tag';
import { mutations, queries, types } from '~/apollo/schema/schema';

export const typeDefs = async (): Promise<DocumentNode> => {
return gql(`
${apolloCommonTypes}
${types}
extend type Query {
${queries}
}
extend type Mutation {
${mutations}
}
`);
};
71 changes: 71 additions & 0 deletions backend/plugins/education_api/src/connectionResolvers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import mongoose from 'mongoose';
import { createGenerateModels } from 'erxes-api-shared/utils';
import { IMainContext } from 'erxes-api-shared/core-types';
import { loadCourseClass, ICourseModel } from '@/courses/db/models/Course';
import {
loadCourseCategoryClass,
ICourseCategoryModel,
} from '@/courses/db/models/Categories';
import { IClassModel, loadClassesClass } from '@/class/db/models/Classes';
import { ICommentModel, loadCommentClass } from '@/comments/db/models/Comments';
import { ITeacherModel, loadTeacherClass } from '@/teachers/db/models/Teachers';
import { IStudentModel, loadStudentClass } from '@/students/db/models/Students';
//
import { ICourseDocument } from '@/courses/@types/course';
import { IClassDocument } from '@/class/@types/classes';
import { ICourseCategoryDocument } from '@/courses/@types/category';
import { ICommentDocument } from '@/comments/@types/comments';
import { ITeacherDocument } from '@/teachers/@types/teachers';
import { IStudentDocument } from '@/students/@types/students';

export interface IModels {
Courses: ICourseModel;
CourseCategories: ICourseCategoryModel;
Classes: IClassModel;
Comments: ICommentModel;
Teachers: ITeacherModel;
Students: IStudentModel;
}

export interface IContext extends IMainContext {
commonQuerySelector: any;
models: IModels;
}

export const loadClasses = (db: mongoose.Connection): IModels => {
const models = {} as IModels;

models.Courses = db.model<ICourseDocument, ICourseModel>(
'courses',
loadCourseClass(models),
);

models.CourseCategories = db.model<
ICourseCategoryDocument,
ICourseCategoryModel
>('course_categories', loadCourseCategoryClass(models));

models.Classes = db.model<IClassDocument, IClassModel>(
'course_classes',
loadClassesClass(models),
);

models.Comments = db.model<ICommentDocument, ICommentModel>(
'course_comments',
loadCommentClass(models),
);

models.Teachers = db.model<ITeacherDocument, ITeacherModel>(
'course_teachers',
loadTeacherClass(models),
);

models.Students = db.model<IStudentDocument, IStudentModel>(
'course_students',
loadStudentClass(models),
);

return models;
};

export const generateModels = createGenerateModels<IModels>(loadClasses);
32 changes: 32 additions & 0 deletions backend/plugins/education_api/src/main.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { startPlugin } from 'erxes-api-shared/utils';
import resolvers from './apollo/resolvers';
import { generateModels } from './connectionResolvers';
import { typeDefs } from '~/apollo/typeDefs';
import { appRouter } from './trpc/init-trpc';

startPlugin({
name: 'education',
port: 3322,
graphql: async () => ({
typeDefs: await typeDefs(),
resolvers,
}),
apolloServerContext: async (subdomain, context) => {
const models = await generateModels(subdomain);

context.models = models;

return context;
},

trpcAppRouter: {
router: appRouter,
createContext: async (subdomain, context) => {
const models = await generateModels(subdomain);

context.models = models;

return context;
},
},
});
25 changes: 25 additions & 0 deletions backend/plugins/education_api/src/modules/class/@types/classes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import {
ICursorPaginateParams,
IListParams,
} from 'erxes-api-shared/core-types';
import { Document } from 'mongoose';

export interface IClass {
name: string;
description: string;
location: string;
level: string;
}

export interface IClassParams extends IListParams, ICursorPaginateParams {
name: string;
description: string;
location: string;
level: string;
}

export interface IClassDocument extends IClass, Document {
_id: string;
createdAt?: Date;
updatedAt: Date;
}
6 changes: 6 additions & 0 deletions backend/plugins/education_api/src/modules/class/constants.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export const CLASS_LEVEL_TYPES = {
Beginner: 'Beginner',
Intermediate: 'Intermediate',
Advanced: 'Advanced',
ALL: ['Beginner', 'Intermediate', 'Advanced'],
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { Schema } from 'mongoose';

import { mongooseStringRandomId } from 'erxes-api-shared/utils';
import { CLASS_LEVEL_TYPES } from '../../constants';

export const classSchema = new Schema(
{
_id: mongooseStringRandomId,
name: { type: String, required: true, label: 'Name' },
description: { type: String, required: true, label: 'Description' },
location: { type: String, required: true, label: 'Location' },
level: {
type: String,
enum: CLASS_LEVEL_TYPES.ALL,
default: CLASS_LEVEL_TYPES.Beginner,
label: 'Level',
},
createdAt: { type: Date, default: new Date(), label: 'Created at' },
updatedAt: { type: Date, default: new Date(), label: 'Updated at' },
},
{
timestamps: true,
},
);
Loading
Loading