You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
417 lines
15 KiB
417 lines
15 KiB
import axios from 'axios';
|
|
import moment from 'moment';
|
|
import {showNotification} from "../../js/modules/notification";
|
|
|
|
axios.defaults.headers.post['Content-Type'] = 'application/json';
|
|
axios.defaults.headers.post['Accept'] = 'application/json';
|
|
|
|
export const api = {
|
|
get: (url, params) => {
|
|
let request = axios.get(url, params);
|
|
request.catch(api.errorHandler);
|
|
return request;
|
|
},
|
|
post: (url, data, params) => {
|
|
let request = axios.post(url, data, params);
|
|
request.catch(api.errorHandler);
|
|
return request;
|
|
},
|
|
put: (url, data, params) => {
|
|
let request = axios.put(url, data, params);
|
|
request.catch(api.errorHandler);
|
|
return request;
|
|
},
|
|
patch: (url, data, params) => {
|
|
let request = axios.patch(url, data, params);
|
|
request.catch(api.errorHandler);
|
|
return request;
|
|
},
|
|
delete: (url, params) => {
|
|
let request = axios.delete(url, params);
|
|
request.catch(api.errorHandler);
|
|
return request;
|
|
},
|
|
errorHandler: (error) => {
|
|
console.log('всё очень плохо', error, error.response);
|
|
if(error.response.status >= 500) {
|
|
showNotification("error", "Ошибка сервера "+error.toString());
|
|
}
|
|
},
|
|
getCurrentUser: (accessToken) => {
|
|
return api.get('/api/v1/users/me/', {
|
|
headers: {
|
|
'Authorization': `Token ${accessToken}`,
|
|
}
|
|
});
|
|
},
|
|
getUsers: (params, accessToken) => {
|
|
return api.get('/api/v1/users/', {
|
|
params: params,
|
|
headers: {
|
|
'Authorization': `Token ${accessToken}`,
|
|
}
|
|
});
|
|
},
|
|
getCategories: (accessToken) => {
|
|
return api.get('/api/v1/categories/', {
|
|
headers: {
|
|
'Authorization': `Token ${accessToken}`,
|
|
}
|
|
});
|
|
},
|
|
uploadImage: (imageData, accessToken) => {
|
|
return api.post('/api/v1/image-objects/', {
|
|
image: imageData,
|
|
}, {
|
|
headers: {
|
|
'Authorization': `Token ${accessToken}`,
|
|
}
|
|
});
|
|
},
|
|
removeImage: (imageId, accessToken) => {
|
|
return api.delete(`/api/v1/image-objects/${imageId}/`, {
|
|
headers: {
|
|
'Authorization': `Token ${accessToken}`,
|
|
}
|
|
});
|
|
},
|
|
loadCourse: (courseId, accessToken) => {
|
|
return api.get(`/api/v1/courses/${courseId}/`, {
|
|
headers: {
|
|
'Authorization': `Token ${accessToken}`,
|
|
}
|
|
});
|
|
},
|
|
loadLive: (courseId, accessToken) => {
|
|
return api.get(`/api/v1/live-lesson/${courseId}/`, {
|
|
headers: {
|
|
'Authorization': `Token ${accessToken}`,
|
|
}
|
|
});
|
|
},
|
|
saveCourse: (courseObject, accessToken) => {
|
|
const isAdding = (!courseObject.hasOwnProperty('id') || !courseObject.hasOwnProperty('id'));
|
|
|
|
let deferredStart = null;
|
|
if (courseObject.is_deferred) {
|
|
if (courseObject.date && courseObject.time && courseObject.time.value) {
|
|
let deferredStartTime = moment(courseObject.time.value, "HH:mm");
|
|
let deferredStartDate = moment(courseObject.date).hour(deferredStartTime.hour()).minute(deferredStartTime.minute());
|
|
deferredStart = deferredStartDate.format();
|
|
}
|
|
}
|
|
|
|
const courseJson = {
|
|
title: courseObject.title,
|
|
status: courseObject.status,
|
|
author: courseObject.author ? courseObject.author : null,
|
|
short_description: courseObject.short_description,
|
|
category: courseObject.category,
|
|
price: courseObject.is_paid && courseObject.price || 0,
|
|
deferred_start_at: deferredStart,
|
|
duration: courseObject.duration || 0,
|
|
is_featured: courseObject.is_featured,
|
|
slug: courseObject.url,
|
|
date: (courseObject.date) ? courseObject.date.value:null,
|
|
stream: courseObject.stream,
|
|
cover: courseObject.coverImageId ? courseObject.coverImageId : null,
|
|
gallery: {
|
|
gallery_images: courseObject.gallery && courseObject.gallery.images || []
|
|
},
|
|
content: api.convertContentJson(courseObject.content, true),
|
|
};
|
|
|
|
if(courseObject.live) {
|
|
if (isAdding) {
|
|
return api.addLive(courseJson, accessToken);
|
|
} else {
|
|
return api.updateLive(courseObject.id, courseJson, accessToken);
|
|
}
|
|
} else {
|
|
if (isAdding) {
|
|
return api.addCourse(courseJson, accessToken);
|
|
} else {
|
|
return api.updateCourse(courseObject.id, courseJson, accessToken);
|
|
}
|
|
}
|
|
|
|
|
|
},
|
|
saveLesson: (lessonObject, accessToken) => {
|
|
const isAdding = (!lessonObject.hasOwnProperty('id') || !lessonObject.hasOwnProperty('id'));
|
|
|
|
const lessonJson = {
|
|
cover: lessonObject.coverImageId ? lessonObject.coverImageId : null,
|
|
title: lessonObject.title,
|
|
short_description: lessonObject.short_description,
|
|
course: lessonObject.course_id,
|
|
position: lessonObject.position,
|
|
content: api.convertContentJson(lessonObject.content, true),
|
|
};
|
|
|
|
if (isAdding) {
|
|
return api.addLesson(lessonJson, accessToken);
|
|
} else {
|
|
return api.updateLesson(lessonObject.id, lessonJson, accessToken);
|
|
}
|
|
},
|
|
convertLessonJson: (lessonJSON) => {
|
|
return {
|
|
id: lessonJSON.id,
|
|
title: lessonJSON.title,
|
|
short_description: lessonJSON.short_description,
|
|
coverImageId: lessonJSON.cover && lessonJSON.cover.id ? lessonJSON.cover.id : null,
|
|
coverImage: lessonJSON.cover && lessonJSON.cover.image ? lessonJSON.cover.image : null,
|
|
content: api.convertContentJson(lessonJSON.content),
|
|
position: lessonJSON.position,
|
|
}
|
|
},
|
|
convertCourseJson: (courseJSON) => {
|
|
let isDeferred = false;
|
|
let deferredDate = false;
|
|
let deferredTime = '';
|
|
if (courseJSON.deferred_start_at) {
|
|
let deferredDateTime = moment(courseJSON.deferred_start_at);
|
|
isDeferred = true;
|
|
deferredDate = deferredDateTime.format('MM-DD-YYYY');
|
|
deferredTime = deferredDateTime.format('HH:mm');
|
|
}
|
|
return {
|
|
id: courseJSON.id,
|
|
title: courseJSON.title,
|
|
status: courseJSON.status,
|
|
short_description: courseJSON.short_description,
|
|
category: courseJSON.category && courseJSON.category.id ? courseJSON.category.id : courseJSON.category,
|
|
author: courseJSON.author && courseJSON.author.id ? courseJSON.author.id : courseJSON.author,
|
|
price: parseFloat(courseJSON.price),
|
|
is_paid: parseFloat(courseJSON.price) > 0,
|
|
is_deferred: isDeferred,
|
|
date: deferredDate || courseJSON.date,
|
|
time: deferredTime ? {title: deferredTime, value: deferredTime} : null,
|
|
duration: courseJSON.duration,
|
|
is_featured: courseJSON.is_featured,
|
|
url: courseJSON.slug,
|
|
stream: courseJSON.stream,
|
|
coverImageId: courseJSON.cover && courseJSON.cover.id ? courseJSON.cover.id : null,
|
|
coverImage: courseJSON.cover && courseJSON.cover.image ? courseJSON.cover.image : null,
|
|
content: api.convertContentJson(courseJSON.content),
|
|
gallery: {images: (courseJSON.gallery) ? courseJSON.gallery.gallery_images:[]},
|
|
}
|
|
},
|
|
convertContentJson: (contentJson, forSaving) => {
|
|
if(forSaving){
|
|
return contentJson.map((block, index) => {
|
|
const position = ++index;
|
|
const data = Object.assign({position}, block);
|
|
if (['image', 'image-text'].indexOf(data.type) > -1) {
|
|
data.img = data.img && data.img.id;
|
|
}
|
|
else if (data.type === 'images') {
|
|
data.gallery_images = data.gallery_images.map(image => {
|
|
return {
|
|
id: image.id,
|
|
img: image.img && image.img.id,
|
|
};
|
|
});
|
|
}
|
|
else if (data.type === 'video') {
|
|
data.url = data.video_url;
|
|
}
|
|
return {
|
|
type: block.type,
|
|
data: data,
|
|
};
|
|
});
|
|
}
|
|
return contentJson.sort((a, b) => {
|
|
if (a.position < b.position) {
|
|
return -1;
|
|
}
|
|
if (a.position > b.position) {
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}).map(block => {
|
|
/*const templates = {
|
|
image: {
|
|
img: {},
|
|
},
|
|
'image-text': {
|
|
txt: '',
|
|
img: {},
|
|
},
|
|
images: {
|
|
gallery_images: [],
|
|
},
|
|
video: {
|
|
video_url: '',
|
|
},
|
|
text: {
|
|
txt: '',
|
|
}
|
|
}
|
|
return Object.assign({
|
|
type: '', id: null, uuid: '', title: '',
|
|
}, templates[block.type], block);*/
|
|
let data = Object.assign({}, block);
|
|
if(data.type == 'image' || data.type == 'image-text'){
|
|
data.img_id = data.img.id;
|
|
data.img_thumbnail = data.img.image_thumbnail;
|
|
delete data.img;
|
|
}
|
|
else if(data.type === 'images'){
|
|
data.gallery_images = data.gallery_images.map(galleryImage => {
|
|
return {
|
|
'id': galleryImage.id ? galleryImage.id : null,
|
|
'img_id': galleryImage.img.id,
|
|
img_thumbnail: galleryImage.img.img_thumbnail,
|
|
}
|
|
});
|
|
}
|
|
return data;
|
|
});
|
|
},
|
|
addCourse: (courseJson, accessToken) => {
|
|
return api.post('/api/v1/courses/', courseJson, {
|
|
headers: {
|
|
'Authorization': `Token ${accessToken}`,
|
|
}
|
|
});
|
|
},
|
|
updateCourse: (courseId, courseJson, accessToken) => {
|
|
return api.put(`/api/v1/courses/${courseId}/`, courseJson, {
|
|
headers: {
|
|
'Authorization': `Token ${accessToken}`,
|
|
}
|
|
});
|
|
},
|
|
addLive: (courseJson, accessToken) => {
|
|
return api.post('/api/v1/live-lesson/', courseJson, {
|
|
headers: {
|
|
'Authorization': `Token ${accessToken}`,
|
|
}
|
|
});
|
|
},
|
|
updateLive: (courseId, courseJson, accessToken) => {
|
|
return api.put(`/api/v1/live-lesson/${courseId}/`, courseJson, {
|
|
headers: {
|
|
'Authorization': `Token ${accessToken}`,
|
|
}
|
|
});
|
|
},
|
|
getCourseLessons: (courseId, accessToken) => {
|
|
return api.get(`/api/v1/lessons/?course=${courseId}`, {
|
|
headers: {
|
|
'Authorization': `Token ${accessToken}`,
|
|
}
|
|
});
|
|
},
|
|
removeCourseLesson: (lessonId, accessToken) => {
|
|
return api.delete(`/api/v1/lessons/${lessonId}/`, {
|
|
headers: {
|
|
'Authorization': `Token ${accessToken}`,
|
|
}
|
|
});
|
|
},
|
|
addLesson: (lessonJson, accessToken) => {
|
|
return api.post('/api/v1/lessons/', lessonJson, {
|
|
headers: {
|
|
'Authorization': `Token ${accessToken}`,
|
|
}
|
|
});
|
|
},
|
|
updateLesson: (lessonId, lessonJson, accessToken) => {
|
|
return api.put(`/api/v1/lessons/${lessonId}/`, lessonJson, {
|
|
headers: {
|
|
'Authorization': `Token ${accessToken}`,
|
|
}
|
|
});
|
|
},
|
|
removeContentBlock: (blockData, accessToken) => {
|
|
let removeUrl;
|
|
switch(blockData.type) {
|
|
case 'text':
|
|
removeUrl = `/api/v1/texts/${blockData.id}/`;
|
|
break;
|
|
case 'image':
|
|
removeUrl = `/api/v1/images/${blockData.id}/`;
|
|
break;
|
|
case 'image-text':
|
|
removeUrl = `/api/v1/image-texts/${blockData.id}/`;
|
|
break;
|
|
case 'images':
|
|
removeUrl = `/api/v1/galleries/${blockData.id}/`;
|
|
break;
|
|
case 'video':
|
|
removeUrl = `/api/v1/videos/${blockData.id}/`;
|
|
break;
|
|
}
|
|
if (!removeUrl) {
|
|
return;
|
|
}
|
|
return api.delete(removeUrl, {
|
|
headers: {
|
|
'Authorization': `Token ${accessToken}`,
|
|
}
|
|
});
|
|
},
|
|
getCourseDraft: (accessToken) => {
|
|
return api.get('/api/v1/courses/draft/', {
|
|
headers: {
|
|
'Authorization': `Token ${accessToken}`,
|
|
}
|
|
});
|
|
},
|
|
publishCourse: (courseId, accessToken) => {
|
|
return api.patch(`/api/v1/courses/${courseId}/`, {status: 1}, {
|
|
headers: {
|
|
'Authorization': `Token ${accessToken}`,
|
|
}
|
|
});
|
|
},
|
|
getSchedule: (accessToken, params) => {
|
|
return api.get('/api/v1/school-schedules/', {
|
|
params: params,
|
|
headers: {
|
|
'Authorization': `Token ${accessToken}`,
|
|
}
|
|
});
|
|
},
|
|
getPaymentAmount: (params) => {
|
|
return api.get('/api/v1/payments/calc-amount', {
|
|
params: params,
|
|
headers: {
|
|
'Authorization': `Token ${window.LIL_STORE.accessToken}`,
|
|
}
|
|
});
|
|
},
|
|
getObjComments: (objId, objType, ordering) => {
|
|
return api.get('/api/v1/obj-comments/', {
|
|
params: {
|
|
obj_id: objId,
|
|
obj_type: objType,
|
|
ordering: ordering || '',
|
|
},
|
|
headers: {
|
|
'Authorization': `Token ${window.LIL_STORE.accessToken}`,
|
|
}
|
|
});
|
|
},
|
|
addObjComment: (objId, objType, commentJson) => {
|
|
let data = commentJson;
|
|
data.obj_id = objId;
|
|
data.obj_type = objType;
|
|
return api.post('/api/v1/obj-comments/', data, {
|
|
headers: {
|
|
'Authorization': `Token ${window.LIL_STORE.accessToken}`,
|
|
}
|
|
});
|
|
},
|
|
removeObjComment: (commentId) => {
|
|
return api.delete(`/api/v1/obj-comments/${commentId}/`, {
|
|
headers: {
|
|
'Authorization': `Token ${window.LIL_STORE.accessToken}`,
|
|
}
|
|
});
|
|
}
|
|
};
|
|
|