Commit efb39fbe authored by Anthony Jacob's avatar Anthony Jacob
Browse files

advance on api and add language

parent 58b4397a
Loading
Loading
Loading
Loading
+115 −0
Original line number Diff line number Diff line
from flask import Blueprint, request, jsonify, current_app
from helpers.security import require_auth
from helpers.limiter import limiter
from model.language.language import (
    insertLanguage,
    getLanguages,
    getLanguagesFull,
    getLanguage,
    deleteLanguage,
)

language_bp = Blueprint("language", __name__)


@language_bp.route("/languages", methods=["GET"])
@require_auth
@limiter.limit("1/second", override_defaults=False)
def get_languages():
    language_ids = getLanguages()

    if language_ids is False:
        return jsonify({"error": "Database error"}), 500

    return jsonify({"languages": language_ids})


@language_bp.route("/languages/full", methods=["GET"])
@require_auth
@limiter.limit("1/second", override_defaults=False)
def get_languages_full():
    languages = getLanguagesFull()

    if languages is False:
        return jsonify({"error": "Database error"}), 500

    return jsonify({"languages": languages})


@language_bp.route("/languages/<int:id>", methods=["GET"])
@require_auth
@limiter.limit("1/second", override_defaults=False)
def get_language(id):
    try:
        if not id:
            return jsonify({"error": "Missing Language id"}), 400
        else:
            result = getLanguage(id)
            if result == -1:
                return jsonify({"message": "language not found", "id": id}), 404
            elif result:
                return jsonify(result)
            else:
                return jsonify({"error": "Failed to get language"}), 500

    except Exception as e:
        return jsonify({"error": str(e)}), 500

    return jsonify({"message": "update", "id": id})


@language_bp.route("/languages", methods=["PUT"])
@require_auth
@limiter.limit("1/second", override_defaults=False)
def create_language():
    try:
        data = request.get_json()
        language_code = data.get("language_code")

        if not language_code:
            return jsonify({"error": "Missing language_code"}), 400

        language_id = insertLanguage(language_code)

        if language_id > 0:
            return (
                jsonify({"message": "Language inserted", "language_id": language_id}),
                201,
            )
        elif language_id == -1:
            return jsonify({"error": "language already exist"}), 409
        else:
            return jsonify({"error": "Failed to insert language"}), 500

    except Exception as e:
        return jsonify({"error": str(e)}), 500


@language_bp.route("/languages/<int:id>", methods=["POST"])
@require_auth
@limiter.limit("1/second", override_defaults=False)
def update_language(id):
    return jsonify({"message": "update", "id": id})


@language_bp.route("/languages/<int:id>", methods=["DELETE"])
@require_auth
@limiter.limit("1/second", override_defaults=False)
def delete_language(id):
    try:
        if not id:
            return jsonify({"error": "Missing Language id"}), 400
        else:
            language = getLanguage(id)
            if language == -1:
                return jsonify({"message": "language not found", "id": id}), 404
            elif language:
                if deleteLanguage(id):
                    return jsonify({"message": "language deleted", "id": id})
                else:
                    return jsonify({"error": "Failed to delete language"}), 500
            else:
                return jsonify({"error": "Failed to retrieve language"}), 500

    except Exception as e:
        return jsonify({"error": str(e)}), 500
+106 −0
Original line number Diff line number Diff line
from flask import current_app
from typing import Any, Literal
from psycopg.rows import dict_row


def getLanguages():

    getLanguagesQuery = """SELECT id from language"""

    try:
        with current_app.db_pool.connection() as conn:
            with conn.cursor(row_factory=dict_row) as cur:
                cur.execute(getLanguagesQuery)
                rows = cur.fetchall()
                print(rows)
                if not rows:
                    return []

                return [row["id"] for row in rows]

    except Exception as e:
        current_app.logger.error(f"Database error while retrieving languages: {e}")
        return False


def getLanguagesFull():

    getLanguagesQuery = """SELECT id, language_code from language"""

    try:
        with current_app.db_pool.connection() as conn:
            with conn.cursor(row_factory=dict_row) as cur:
                cur.execute(getLanguagesQuery)
                rows = cur.fetchall()
                print(rows)
                if not rows:
                    return []

                return rows

    except Exception as e:
        current_app.logger.error(f"Database error while retrieving languages: {e}")
        return False


def getLanguage(languageId: int) -> Any | Literal[-1] | Literal[False]:

    getLanguageQuery = """SELECT id, language_code from language WHERE id = %s"""

    try:
        with current_app.db_pool.connection() as conn:
            with conn.cursor(row_factory=dict_row) as cur:
                cur.execute(getLanguageQuery, (languageId,))
                row = cur.fetchone()
                print(row)
                if not row:
                    return -1
                else:
                    return row

    except Exception as e:
        current_app.logger.error(f"Database error while retrieving languages: {e}")
        return False


def insertLanguage(languageCode: str) -> bool | int:

    getLanguageQuery = (
        """SELECT id from language WHERE UPPER(language_code) = UPPER(%s)"""
    )

    InsertLanguageQuery = """INSERT INTO language (language_code)
               VALUES (%s) RETURNING id;"""

    try:
        with current_app.db_pool.connection() as conn:
            with conn.cursor() as cur:
                cur.execute(getLanguageQuery, (languageCode,))
                row = cur.fetchone()
                if row:
                    return -1
                else:
                    cur.execute(InsertLanguageQuery, (languageCode,))
                    language_id = cur.fetchone()[0]
                    conn.commit()
                    return language_id

    except Exception as e:
        current_app.logger.error(f"Database error while inserting language: {e}")
        return False


def deleteLanguage(languageId: int) -> bool:

    deleteLanguagesQuery = """DELETE FROM language WHERE id = %s"""

    try:
        with current_app.db_pool.connection() as conn:
            with conn.cursor() as cur:
                cur.execute(deleteLanguagesQuery, (languageId,))
                conn.commit()
                return True

    except Exception as e:
        current_app.logger.error(f"Database error while retrieving languages: {e}")
        return False