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.
83 lines
3.2 KiB
83 lines
3.2 KiB
from flask import Blueprint, request, jsonify
|
|
from werkzeug.utils import secure_filename
|
|
from sqlalchemy.sql import func
|
|
import os
|
|
import uuid
|
|
from db.model import db, Course, Category, User
|
|
from utils.utils import random_string_generator
|
|
from constants import *
|
|
from config import *
|
|
|
|
course = Blueprint('course', __name__)
|
|
|
|
@course.route('/create/course', methods=['POST'])
|
|
def create_course():
|
|
"""
|
|
Endpoint to create a new course.
|
|
Ensures strict adherence to the Course model, with file handling and default behaviors.
|
|
"""
|
|
try:
|
|
# Retrieve form data
|
|
data = request.form
|
|
name :str= data.get('name', '').strip()
|
|
category_id :str = data.get('category_id', '').strip()
|
|
description :str= data.get('description', '')
|
|
is_active :bool = bool(int(data.get('is_active', 0)))
|
|
published_status :int = data.get('published_status', int(PublishedStatus.DRAFT.value)) # Defaults to DRAFT
|
|
author_id :str = data.get('author_id', '').strip()
|
|
|
|
# Validate required fields
|
|
if not name or not category_id or not author_id:
|
|
return jsonify({"error": "Missing required fields: 'name', 'category_id', or 'author_id'."}), 400
|
|
|
|
# Validate category existence
|
|
category :str= Category.query.get(category_id)
|
|
if not category:
|
|
return jsonify({"error": "Category not found."}), 404
|
|
|
|
# Validate author existence
|
|
author :str = User.query.get(author_id)
|
|
if not author:
|
|
return jsonify({"error": "Author not found."}), 404
|
|
|
|
# File handling
|
|
uploaded_cover_image = request.files.get('cover')
|
|
uploaded_file = request.files.get('pdf')
|
|
|
|
cover_filename_image :str= ''
|
|
pdf_file_filename :str= ''
|
|
if uploaded_cover_image is not None:
|
|
cover_filename_image :str = random_string_generator(10) + os.path.splitext(uploaded_cover_image.filename)[-1]
|
|
uploaded_cover_image.save(os.path.join(USER_UPLOADS_DIR, cover_filename_image))
|
|
|
|
if uploaded_file is not None:
|
|
pdf_file_filename :str= random_string_generator(10) + os.path.splitext(uploaded_file.filename)[-1]
|
|
uploaded_file.save( os.path.join(USER_UPLOADS_DIR, pdf_file_filename))
|
|
|
|
# Default to DRAFT if critical content is missing
|
|
if not uploaded_cover_image or not uploaded_file:
|
|
published_status :int= int(PublishedStatus.DRAFT.value)
|
|
|
|
# Create new course
|
|
new_course = Course(
|
|
name=name,
|
|
categoryID=uuid.UUID(category_id),
|
|
description=description,
|
|
isActive=is_active,
|
|
publishedStatus=int(published_status),
|
|
coverImage=cover_filename_image,
|
|
serverFilename=pdf_file_filename,
|
|
authorID=uuid.UUID(author_id),
|
|
creationDate=func.now(),
|
|
)
|
|
|
|
# Save the course to the database
|
|
db.session.add(new_course)
|
|
db.session.commit()
|
|
|
|
return jsonify({"message": "Course created successfully.", "course_id": str(new_course.id)}), 201
|
|
|
|
except Exception as e:
|
|
# Rollback in case of an error
|
|
db.session.rollback()
|
|
return jsonify({"error": f"An error occurred: {str(e)}"}), 500 |