first commit

This commit is contained in:
sajjadtalkhabi
2026-05-13 01:43:05 +03:30
commit d2a577f254
297 changed files with 36274 additions and 0 deletions
+23
View File
@@ -0,0 +1,23 @@
import { http } from '@/services/api/http'
import { buildUrl, endpoints } from '@/services/api/endpoints'
export const apiGetAdminAssignments = (params) => http.get(endpoints.getAssignmentsList, { params })
export const apiShowAdminAssignment = (id) => http.get(buildUrl(endpoints.showAssignment, { id }))
export const apiAddAdminAssignment = (payload) => http.post(endpoints.addNewAssignment, payload)
export const apiUpdateAdminAssignment = (id, payload) =>
http.put(buildUrl(endpoints.updateAssignment, { id }), payload)
export const apiDeleteAdminAssignment = (id) =>
http.delete(buildUrl(endpoints.deleteAssignment, { id }))
export const apiGetAdminAssignmentSubmissions = (assignmentId, params) =>
http.get(buildUrl(endpoints.getAssignmentSubmissions, { assignmentId }), { params })
export const apiShowAdminAssignmentSubmission = (assignmentId, submissionId) =>
http.get(buildUrl(endpoints.showAssignmentSubmission, { assignmentId, submissionId }))
export const apiReviewAdminAssignmentSubmission = (assignmentId, submissionId, payload) =>
http.post(buildUrl(endpoints.reviewAssignmentSubmission, { assignmentId, submissionId }), payload)
+14
View File
@@ -0,0 +1,14 @@
import { http } from '@/services/api/http'
import { buildUrl, endpoints } from '@/services/api/endpoints'
export const apiGetAdminConsultations = (params) =>
http.get(endpoints.getConsultationsList, { params })
export const apiShowAdminConsultation = (id) =>
http.get(buildUrl(endpoints.showConsultation, { id }))
export const apiSendAdminConsultationMessage = (id, payload) =>
http.post(buildUrl(endpoints.sendConsultationMessage, { id }), payload)
export const apiChangeAdminConsultationStatus = (id, payload) =>
http.post(buildUrl(endpoints.changeConsultationStatus, { id }), payload)
@@ -0,0 +1,38 @@
import { http } from '@/services/api/http'
import { buildUrl, endpoints } from '@/services/api/endpoints'
export const apiGetAdminCourseTemplates = (params) =>
http.get(endpoints.getCourseTemplatesList, { params })
export const apiShowAdminCourseTemplate = (id) =>
http.get(buildUrl(endpoints.showCourseTemplate, { id }))
export const apiAddAdminCourseTemplate = (payload) =>
http.post(endpoints.addNewCourseTemplate, payload)
export const apiUpdateAdminCourseTemplate = (id, payload) =>
http.put(buildUrl(endpoints.updateCourseTemplate, { id }), payload)
export const apiDeleteAdminCourseTemplate = (id) =>
http.delete(buildUrl(endpoints.deleteCourseTemplate, { id }))
export const apiChangeAdminCourseTemplateStatus = (id, payload) =>
http.post(buildUrl(endpoints.changeStatusCourseTemplate, { id }), payload)
export const apiGetAdminTemplateStudents = (templateId, params) =>
http.get(buildUrl(endpoints.listTemplateStudents, { templateId }), { params })
export const apiAddAdminTemplateStudent = (templateId, payload) =>
http.post(buildUrl(endpoints.addTemplateStudent, { templateId }), payload)
export const apiRemoveAdminTemplateStudent = (templateId, userId) =>
http.delete(buildUrl(endpoints.removeTemplateStudent, { templateId, userId }))
export const apiGetAdminTemplateSessions = (templateId, params) =>
http.get(buildUrl(endpoints.listTemplateSessions, { templateId }), { params })
export const apiAttachAdminTemplateSession = (templateId, payload) =>
http.post(buildUrl(endpoints.attachTemplateSession, { templateId }), payload)
export const apiDetachAdminTemplateSession = (templateId, sessionId) =>
http.delete(buildUrl(endpoints.detachTemplateSession, { templateId, sessionId }))
+16
View File
@@ -0,0 +1,16 @@
import { http } from '@/services/api/http'
import { buildUrl, endpoints } from '@/services/api/endpoints'
export const apiGetAdminCourses = (params) => http.get(endpoints.getCoursesList, { params })
export const apiShowAdminCourse = (id) => http.get(buildUrl(endpoints.showCourse, { id }))
export const apiAddAdminCourse = (payload) => http.post(endpoints.addNewCourse, payload)
export const apiUpdateAdminCourse = (id, payload) =>
http.put(buildUrl(endpoints.updateCourse, { id }), payload)
export const apiDeleteAdminCourse = (id) => http.delete(buildUrl(endpoints.deleteCourse, { id }))
export const apiChangeAdminCourseStatus = (id, payload) =>
http.post(buildUrl(endpoints.changeStatusCourse, { id }), payload)
+19
View File
@@ -0,0 +1,19 @@
import { http } from '@/services/api/http'
import { buildUrl, endpoints } from '@/services/api/endpoints'
export const apiGetAdminExams = (params) => http.get(endpoints.getExamsList, { params })
export const apiShowAdminExam = (id) => http.get(buildUrl(endpoints.showExam, { id }))
export const apiAddAdminExam = (payload) => http.post(endpoints.addNewExam, payload)
export const apiUpdateAdminExam = (id, payload) =>
http.put(buildUrl(endpoints.updateExam, { id }), payload)
export const apiDeleteAdminExam = (id) => http.delete(buildUrl(endpoints.deleteExam, { id }))
export const apiGetAdminExamParticipants = (examId, params) =>
http.get(buildUrl(endpoints.getExamParticipants, { examId }), { params })
export const apiShowAdminExamParticipant = (examId, participantId) =>
http.get(buildUrl(endpoints.showExamParticipant, { examId, participantId }))
@@ -0,0 +1,13 @@
import { http } from '@/services/api/http'
import { buildUrl, endpoints } from '@/services/api/endpoints'
export const apiGetPendingStudents = (params) => http.get(endpoints.getPendingStudents, { params })
export const apiShowPendingStudent = (id) =>
http.get(buildUrl(endpoints.showPendingStudent, { id }))
export const apiChangePendingStudentStatus = (id, payload) =>
http.post(buildUrl(endpoints.changeStatusPendingStudent, { id }), payload)
export const apiDownloadPendingStudentPdf = (id) =>
http.get(buildUrl(endpoints.downloadPdfPendingStudentInfo, { id }))
+19
View File
@@ -0,0 +1,19 @@
import { http } from '@/services/api/http'
import { buildUrl, endpoints } from '@/services/api/endpoints'
export const apiGetAdminSessions = (params) => http.get(endpoints.getSessionsList, { params })
export const apiShowAdminSession = (id) => http.get(buildUrl(endpoints.showSession, { id }))
export const apiAddAdminSession = (payload) => http.post(endpoints.addNewSession, payload)
export const apiUpdateAdminSession = (id, payload) =>
http.put(buildUrl(endpoints.updateSession, { id }), payload)
export const apiDeleteAdminSession = (id) => http.delete(buildUrl(endpoints.deleteSession, { id }))
export const apiChangeAdminSessionStatus = (id, payload) =>
http.post(buildUrl(endpoints.changeStatusSession, { id }), payload)
export const apiGetSessionAttendance = (sessionId, params) =>
http.get(buildUrl(endpoints.getSessionsAttendance, { sessionId }), { params })
+39
View File
@@ -0,0 +1,39 @@
import { http } from '@/services/api/http'
import { buildUrl, endpoints } from '@/services/api/endpoints'
export const apiGetAdminTerms = (params) => http.get(endpoints.getTermsList, { params })
export const apiShowAdminTerm = (id) => http.get(buildUrl(endpoints.showTerm, { id }))
export const apiAddAdminTerm = (payload) => http.post(endpoints.addNewTerm, payload)
export const apiUpdateAdminTerm = (id, payload) =>
http.put(buildUrl(endpoints.updateTerm, { id }), payload)
export const apiDeleteAdminTerm = (id) => http.delete(buildUrl(endpoints.deleteTerm, { id }))
export const apiCloneAdminTerm = (id) => http.post(buildUrl(endpoints.cloneTerm, { id }))
export const apiChangeAdminTermStatus = (id, payload) =>
http.post(buildUrl(endpoints.changeStatusTerm, { id }), payload)
export const apiGetAdminTermStudents = (termId, params) =>
http.get(buildUrl(endpoints.listUserTerm, { termId }), { params })
export const apiAddAdminTermStudents = (termId, payload) =>
http.post(buildUrl(endpoints.addUserTerm, { termId }), payload)
export const apiRemoveAdminTermStudent = (termId, userId) =>
http.delete(buildUrl(endpoints.removeUserTerm, { termId, userId }))
export const apiToggleAdminTermStudentLeave = (termId, userId, payload) =>
http.post(buildUrl(endpoints.changeLeaveStatus, { termId, userId }), payload)
export const apiGetAdminTermCourses = (termId, params) =>
http.get(buildUrl(endpoints.listCourseTerm, { termId }), { params })
export const apiAddAdminTermCourses = (termId, payload) =>
http.post(buildUrl(endpoints.addCourseTerm, { termId }), payload)
export const apiRemoveAdminTermCourse = (termId, courseId) =>
http.delete(buildUrl(endpoints.removeCourseTerm, { termId, courseId }))
+12
View File
@@ -0,0 +1,12 @@
import { http } from '@/services/api/http'
import { buildUrl, endpoints } from '@/services/api/endpoints'
export const apiGetAdminTickets = (params) => http.get(endpoints.getTicketsList, { params })
export const apiShowAdminTicket = (id) => http.get(buildUrl(endpoints.showTicket, { id }))
export const apiSendAdminTicketMessage = (id, payload) =>
http.post(buildUrl(endpoints.sendTicketMessage, { id }), payload)
export const apiChangeAdminTicketStatus = (id, payload) =>
http.post(buildUrl(endpoints.changeTicketStatus, { id }), payload)
+21
View File
@@ -0,0 +1,21 @@
import { http } from '@/services/api/http'
import { buildUrl, endpoints } from '@/services/api/endpoints'
export const apiGetAdminUsers = (params) => http.get(endpoints.getApprovedUsers, { params })
export const apiShowAdminUser = (id) => http.get(buildUrl(endpoints.showUserDetails, { id }))
export const apiAddAdminUser = (payload) => http.post(endpoints.addNewUser, payload)
export const apiUpdateAdminUser = (id, payload) =>
http.put(buildUrl(endpoints.updateUser, { id }), payload)
export const apiUpdateAdminUserRole = (id, payload) =>
http.post(buildUrl(endpoints.updateUserRole, { id }), payload)
export const apiChangeAdminUserStatus = (id, payload) =>
http.post(buildUrl(endpoints.changeUserStatus, { id }), payload)
export const apiDeleteAdminUser = (id) => http.delete(buildUrl(endpoints.deleteUser, { id }))
export const apiGetAdminRoles = () => http.get(endpoints.getRolesList)
+33
View File
@@ -0,0 +1,33 @@
import { http } from '@/services/api/http'
import { endpoints } from '@/services/api/endpoints'
export const apiLogin = (payload) => http.post(endpoints.login, payload)
export const apiLoginWithCode = (payload) => http.post(endpoints.loginWithCode2Step, payload)
export const apiRegister = (payload) => http.post(endpoints.register, payload)
export const apiVerifyCode = (payload) => http.post(endpoints.verifyCode, payload)
export const apiResendVerificationCode = (payload) =>
http.post(endpoints.resendVerificationCodeForRegister, payload)
export const apiForgotPassword = (payload) => http.post(endpoints.forgotPassword, payload)
export const apiVerifyForgotPasswordCode = (payload) =>
http.post(endpoints.verifyForgotPasswordCode, payload)
export const apiResetPassword = (payload) => http.post(endpoints.resetPassword, payload)
export const apiLogout = () => http.post(endpoints.logout)
export const apiGetProfile = () => http.get(endpoints.getProfile)
export const apiCompleteProfile = (payload) => http.post(endpoints.completeProfile, payload)
export const apiUpdateProfile = (payload) => http.put(endpoints.updateProfile, payload)
export const apiGetRegistrationQuestionVideo = () =>
http.get(endpoints.getRegistrationQuestionVideo)
export const apiUploadTemporary = (formData) => http.post(endpoints.uploadMediaTemporary, formData)
+7
View File
@@ -0,0 +1,7 @@
import { http } from '@/services/api/http'
import { buildUrl, endpoints } from '@/services/api/endpoints'
export const apiGetProvinces = () => http.get(endpoints.provinceList)
export const apiGetCitiesOfProvince = (provinceId) =>
http.get(buildUrl(endpoints.citiesList, { provinceId }))
+117
View File
@@ -0,0 +1,117 @@
export const endpoints = {
register: '/register',
resendVerificationCodeForRegister: '/resend-verification-code',
verifyCode: '/verify-code',
completeProfile: '/complete-profile',
getRegistrationQuestionVideo: '/verification-registration-media',
login: '/login',
loginWithCode2Step: '/login-with-code',
forgotPassword: '/forgot-password',
verifyForgotPasswordCode: '/verify-forgot-password-code',
resetPassword: '/reset-password',
logout: '/logout',
uploadMediaTemporary: '/upload-temp',
provinceList: '/provinces',
citiesList: '/provinces/:provinceId/cities',
getProfile: '/profile',
updateProfile: '/profile',
getStudentCourses: '/student/courses',
showStudentCourse: '/student/courses/:id',
getPendingStudents: '/admin/pending-students',
showPendingStudent: '/admin/pending-students/:id',
changeStatusPendingStudent: '/admin/pending-students/:id/status',
downloadPdfPendingStudentInfo: '/admin/pending-students/:id/pdf',
getApprovedUsers: '/admin/users',
showUserDetails: '/admin/users/:id',
addNewUser: '/admin/users',
updateUser: '/admin/users/:id',
updateUserRole: '/admin/users/:id/role',
getRolesList: '/admin/roles',
changeUserStatus: '/admin/users/:id/status',
deleteUser: '/admin/users/:id',
getTermsList: '/admin/terms',
addNewTerm: '/admin/terms',
showTerm: '/admin/terms/:id',
updateTerm: '/admin/terms/:id',
deleteTerm: '/admin/terms/:id',
cloneTerm: '/admin/terms/:id/clone',
changeStatusTerm: '/admin/terms/:id/status',
listUserTerm: '/admin/terms/:termId/students',
addUserTerm: '/admin/terms/:termId/students',
removeUserTerm: '/admin/terms/:termId/students/:userId',
changeLeaveStatus: '/admin/terms/:termId/students/:userId/toggle-leave',
listCourseTerm: '/admin/terms/:termId/courses',
addCourseTerm: '/admin/terms/:termId/courses',
removeCourseTerm: '/admin/terms/:termId/courses/:courseId',
getCoursesList: '/admin/courses',
addNewCourse: '/admin/courses',
showCourse: '/admin/courses/:id',
updateCourse: '/admin/courses/:id',
deleteCourse: '/admin/courses/:id',
changeStatusCourse: '/admin/courses/:id/toggle-status',
getCourseTemplatesList: '/admin/course-templates',
addNewCourseTemplate: '/admin/course-templates',
showCourseTemplate: '/admin/course-templates/:id',
updateCourseTemplate: '/admin/course-templates/:id',
deleteCourseTemplate: '/admin/course-templates/:id',
changeStatusCourseTemplate: '/admin/course-templates/:id/status',
listTemplateStudents: '/admin/course-templates/:templateId/students',
addTemplateStudent: '/admin/course-templates/:templateId/students',
removeTemplateStudent: '/admin/course-templates/:templateId/students/:userId',
listTemplateSessions: '/admin/course-templates/:templateId/sessions',
attachTemplateSession: '/admin/course-templates/:templateId/sessions',
detachTemplateSession: '/admin/course-templates/:templateId/sessions/:sessionId',
getSessionsList: '/admin/sessions',
addNewSession: '/admin/sessions',
showSession: '/admin/sessions/:id',
updateSession: '/admin/sessions/:id',
deleteSession: '/admin/sessions/:id',
changeStatusSession: '/admin/sessions/:id/toggle-status',
getSessionsAttendance: '/admin/sessions/:sessionId/attendances',
getAssignmentsList: '/admin/assignments',
addNewAssignment: '/admin/assignments',
showAssignment: '/admin/assignments/:id',
updateAssignment: '/admin/assignments/:id',
deleteAssignment: '/admin/assignments/:id',
getAssignmentSubmissions: '/admin/assignments/:assignmentId/submissions',
showAssignmentSubmission: '/admin/assignments/:assignmentId/submissions/:submissionId',
reviewAssignmentSubmission: '/admin/assignments/:assignmentId/submissions/:submissionId/review',
getTicketsList: '/admin/tickets',
showTicket: '/admin/tickets/:id',
sendTicketMessage: '/admin/tickets/:id/messages',
changeTicketStatus: '/admin/tickets/:id/status',
getConsultationsList: '/admin/consultations',
showConsultation: '/admin/consultations/:id',
sendConsultationMessage: '/admin/consultations/:id/messages',
changeConsultationStatus: '/admin/consultations/:id/status',
getExamsList: '/admin/exams',
addNewExam: '/admin/exams',
showExam: '/admin/exams/:id',
updateExam: '/admin/exams/:id',
deleteExam: '/admin/exams/:id',
getExamParticipants: '/admin/exams/:examId/participants',
showExamParticipant: '/admin/exams/:examId/participants/:participantId',
}
export const buildUrl = (template, params = {}) =>
Object.entries(params).reduce(
(url, [key, value]) => url.replace(`:${key}`, encodeURIComponent(value)),
template
)
+99
View File
@@ -0,0 +1,99 @@
import axios from 'axios'
import { toast } from 'vue3-toastify'
import { camelize, snakize } from '@/utils/convert-to-camel-snake'
import { tokenService } from '@/services/api/token-service'
const defaultHeaders = {
'Content-Type': 'application/json',
Accept: 'application/json',
}
const addAuthTokenInterceptor = (instance) => {
instance.interceptors.request.use(
(config) => {
const token = tokenService.getToken()
const headers = {
...config.headers,
Authorization: token ? `Bearer ${token}` : '',
}
if (config.data instanceof FormData) {
delete headers['Content-Type']
}
return { ...config, headers }
},
null,
{ synchronous: true }
)
}
const addSnakizeInterceptor = (instance) => {
instance.interceptors.request.use(
(config) => {
if (config.data instanceof FormData || config.noSnakize) {
return config
}
return {
...config,
params: config.params ? snakize(config.params) : {},
data: config.data ? snakize(config.data) : undefined,
}
},
(e) => Promise.reject(e)
)
}
const addResponseUnwrapInterceptor = (instance) => {
instance.interceptors.response.use(
(res) => {
if (typeof res?.data === 'number' || typeof res?.data === 'boolean') {
return { data: res.data }
}
return res?.data || res
},
(e) => Promise.reject(e)
)
}
const addCamelizeInterceptor = (instance) => {
instance.interceptors.response.use(
(res) => camelize(res),
(e) => Promise.reject(e)
)
}
const addUnauthorizeInterceptor = (instance) => {
instance.interceptors.response.use(
(res) => res,
async (e) => {
if (e?.response?.status === 401) {
tokenService.clearAll()
toast('نشست شما تایید نشد، لطفا مجدد وارد شوید')
try {
const { default: router } = await import('@/router')
router.push('/login').catch(() => {})
} catch {}
}
throw e
}
)
}
const createInstance = (baseUrl, { headers = {}, ...configs } = {}) => {
const instance = axios.create({
timeout: 15_000,
baseURL: baseUrl,
headers: { ...defaultHeaders, ...headers },
...configs,
})
addAuthTokenInterceptor(instance)
addResponseUnwrapInterceptor(instance)
addCamelizeInterceptor(instance)
addSnakizeInterceptor(instance)
addUnauthorizeInterceptor(instance)
return instance
}
export const http = createInstance(import.meta.env.VITE_API_BASE_URL || '')
export { createInstance }
+3
View File
@@ -0,0 +1,3 @@
export { http, createInstance } from '@/services/api/http'
export { endpoints, buildUrl } from '@/services/api/endpoints'
export { tokenService } from '@/services/api/token-service'
+6
View File
@@ -0,0 +1,6 @@
import { http } from '@/services/api/http'
import { buildUrl, endpoints } from '@/services/api/endpoints'
export const apiGetStudentCourses = (params) => http.get(endpoints.getStudentCourses, { params })
export const apiShowStudentCourse = (id) => http.get(buildUrl(endpoints.showStudentCourse, { id }))
+48
View File
@@ -0,0 +1,48 @@
const TOKEN = 'user_token'
const REFRESH_TOKEN = 'refresh_user_token'
const USER_INFO = 'user_info'
const STUDENT_REGISTRATION_INFO = 'StudentRegistration'
export const tokenService = {
getToken() {
return localStorage.getItem(TOKEN)
},
saveToken(token) {
if (token) localStorage.setItem(TOKEN, token)
},
removeToken() {
localStorage.removeItem(TOKEN)
},
getRefreshToken() {
return localStorage.getItem(REFRESH_TOKEN)
},
saveRefreshToken(newToken) {
if (newToken) localStorage.setItem(REFRESH_TOKEN, newToken)
},
removeRefreshToken() {
localStorage.removeItem(REFRESH_TOKEN)
},
getUserInfo() {
const info = localStorage.getItem(USER_INFO)
return info ? JSON.parse(info) : null
},
saveUserInfo(info) {
if (info) localStorage.setItem(USER_INFO, JSON.stringify(info))
},
removeUserInfo() {
localStorage.removeItem(USER_INFO)
localStorage.removeItem(STUDENT_REGISTRATION_INFO)
},
hasToken() {
return !!this.getToken()
},
clearAll() {
this.removeToken()
this.removeRefreshToken()
this.removeUserInfo()
},
}