aboutsummaryrefslogtreecommitdiff
"""Module that contains functions for editing case-attribute data"""
from typing import Any, Optional, Tuple

import json
import MySQLdb


def get_case_attributes(conn) -> Optional[Tuple]:
    """Get all the case attributes from the database."""
    with conn.cursor() as cursor:
        cursor.execute("SELECT Id, Name, Description FROM CaseAttribute")
        return cursor.fetchall()


def get_unreviewed_diffs(conn: Any) -> Optional[tuple]:
    """Fetch all case attributes in GN"""
    with conn.cursor() as cursor:
        cursor.execute(
            "SELECT id, editor, json_diff_data FROM "
            "caseattributes_audit WHERE status = 'review'"
        )
        return cursor.fetchall()


def insert_case_attribute_audit(
    conn: Any, status: str, author: str, data: str
) -> int:
    """Update the case_attribute_audit table"""
    rowcount = 0
    try:
        with conn.cursor() as cursor:
            cursor.execute(
                "INSERT INTO caseattributes_audit "
                "(status, editor, json_diff_data) "
                "VALUES (%s, %s, %s)",
                (status, author, data,),
            )
            rowcount = cursor.rowcount
    except Exception as _e:
        raise MySQLdb.Error(_e) from _e
    return rowcount


def reject_case_attribute(conn: Any, case_attr_audit_id: int) -> int:
    """Given the id of the json_diff in the case_attribute_audit table, reject
    it"""
    rowcount = 0
    try:
        with conn.cursor() as cursor:
            cursor.execute(
                "UPDATE caseattributes_audit SET "
                "status = 'rejected' WHERE id = %s",
                (case_attr_audit_id,),
            )
            rowcount = cursor.rowcount
    except Exception as _e:
        raise MySQLdb.Error(_e) from _e
    return rowcount


def approve_case_attribute(conn: Any, case_attr_audit_id: int) -> int:
    """Given the id of the json_diff in the case_attribute_audit table,
    approve it

    """
    rowcount = 0
    try:
        with conn.cursor() as cursor:
            cursor.execute(
                "SELECT json_diff_data FROM caseattributes_audit "
                "WHERE id = %s",
                (case_attr_audit_id,),
            )
            diff_data = cursor.fetchone()
            if diff_data:
                diff_data = json.loads(diff_data[0])
                # Insert (Most Important)
                if diff_data.get("Insert"):
                    data = diff_data.get("Insert")
                    cursor.execute(
                        "INSERT INTO CaseAttribute "
                        "(Name, Description) VALUES "
                        "(%s, %s)",
                        (
                            data.get("name").strip(),
                            data.get("description").strip(),
                        ),
                    )
                # Delete
                elif diff_data.get("Deletion"):
                    data = diff_data.get("Deletion")
                    cursor.execute(
                        "DELETE FROM CaseAttribute "
                        "WHERE Id = %s",
                        (data.get("id"),),
                    )
                # Modification
                elif diff_data.get("Modification"):
                    data = diff_data.get("Modification")
                    if desc_ := data.get("description"):
                        cursor.execute(
                            "UPDATE CaseAttribute SET "
                            "Description = %s WHERE Id = %s",
                            (
                                desc_.get("Current"),
                                diff_data.get("id"),
                            ),
                        )
                    if name_ := data.get("name"):
                        cursor.execute(
                            "UPDATE CaseAttribute SET "
                            "Name = %s WHERE Id = %s",
                            (
                                name_.get("Current"),
                                diff_data.get("id"),
                            ),
                        )
                if cursor.rowcount:
                    cursor.execute(
                        "UPDATE caseattributes_audit SET "
                        "status = 'approved' WHERE id = %s",
                        (case_attr_audit_id,),
                    )
            rowcount = cursor.rowcount
    except Exception as _e:
        raise MySQLdb.Error(_e) from _e
    return rowcount