Changes between Version 2 and Version 3 of dbdevelopment


Ignore:
Timestamp:
01/31/26 12:26:22 (30 hours ago)
Author:
231175
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • dbdevelopment

    v2 v3  
    1414==== Тригери ====
    1515
     16BEFORE INSERT тригер на enrollment за автоматско доделување на активната верзија на curse (course version).
    1617{{{
    1718CREATE OR REPLACE FUNCTION set_active_course_version_on_enrollment()
     
    4849==== Функции / Stored Procedures ====
    4950
     51Функција за креирање на нов enrollment. При креирање се зема најновата активна верзија на курсот.
    5052{{{
    5153CREATE OR REPLACE FUNCTION create_enrollment_for_active_version(p_user_id INTEGER, p_course_id INTEGER)
     
    8082==== Погледи (Views) ====
    8183
     84Поглед за генерирање на основни информации за кои enrollments имаат застарена верзија од курсот, а кои најнова.
    8285{{{
    8386CREATE OR REPLACE VIEW enrollments_with_active_version AS
     
    8992    ct.title_short AS course_title,
    9093    cv.id AS course_version_id,
    91     cv.version_number,
    92     cv.active,
    93     e.enrollment_purchase_date,
    94     e.status
     94    cv.version_number AS course_version_number,
     95    cv.active AS is_version_active,
     96    e.enrollment_purchase_date AS purchase_date,
     97    e.status AS enrollment_status
    9598FROM enrollment e
    96 JOIN "user" u ON e.user_id = u.id
     99JOIN user u ON e.user_id = u.id
    97100JOIN course c ON e.course_id = c.id
    98101JOIN course_version cv ON e.course_version_id = cv.id
     
    115118==== Тригери ====
    116119
     120BEFORE UPDATE тригер за атрибутот active во course_version, со цел осигурување дека постои само една активна верзија од курсот.
    117121{{{
    118122CREATE OR REPLACE FUNCTION ensure_single_active_version()
    119 RETURNS TRIGGER AS $$
     123RETURNS TRIGGER
     124AS $$
    120125BEGIN
    121126    IF NEW.active = TRUE THEN
     
    129134    RETURN NEW;
    130135END;
    131 $$ LANGUAGE plpgsql;
     136$$
     137LANGUAGE plpgsql;
    132138
    133139CREATE TRIGGER trg_ensure_single_active_version
     
    138144}}}
    139145
     146BEFORE DELETE тригер за course version, со цел осигурување дека course version не може да биде избришано доколку веќе постојат enrollments за него.
    140147{{{
    141148CREATE OR REPLACE FUNCTION prevent_version_deletion_with_active_enrollments()
    142 RETURNS TRIGGER AS $$
     149RETURNS TRIGGER
     150AS $$
    143151DECLARE
    144152    v_active_enrollments INTEGER;
     
    154162    RETURN OLD;
    155163END;
    156 $$ LANGUAGE plpgsql;
     164$$
     165LANGUAGE plpgsql;
    157166
    158167CREATE TRIGGER trg_prevent_version_deletion
     
    164173==== Погледи (Views) ====
    165174
     175Поглед за преглед на курсевите со нивните најнови верзии и enrollments.
    166176{{{
    167177CREATE OR REPLACE VIEW course_latest_versions AS
     
    203213==== Прилагодени домени (Custom Domains) ====
    204214
     215Ограничување дека рејтинг мора да биде во доменот [1, 5]
    205216{{{
    206217CREATE DOMAIN rating_scale AS INTEGER
     
    212223==== Тригери ====
    213224
     225BEFORE INSERT тригер за review, каде се прекинува внесувањето на review доколку курсот (enrollment) не е завршен.
    214226{{{
    215227CREATE OR REPLACE FUNCTION validate_review_before_insert()
     
    247259==== Погледи (Views) ====
    248260
     261Поглед за преглед на секој курс со неговата просечна оценка и дистрибуција на оценки.
    249262{{{
    250263CREATE OR REPLACE VIEW course_average_ratings AS
     
    276289* Корисникот може да користи само една бесплатна консултација
    277290* Може да се креира meeting_reminder за бесплатна консултација само ако корисникот сè уште не ја искористил
    278 * После креирање на meeting_reminder за бесплатна консултација, флагот user_used_free_consultation автоматски се поставува на TRUE
     291* После креирање на meeting_reminder за бесплатна консултација, флагот used_free_consultation автоматски се поставува на TRUE
    279292
    280293=== Имплементација ===
     
    282295==== Тригери ====
    283296
     297BEFORE INSERT тригер на meeting reminder, каде не смее да се креира нов митинг и потсетување по емаил доколку корисникот веќе имал бесплатна консултација.
    284298{{{
    285299CREATE OR REPLACE FUNCTION check_free_consultation_eligibility()
     
    288302    v_used_free_consultation BOOLEAN;
    289303BEGIN
    290     SELECT user_used_free_consultation INTO v_used_free_consultation
    291     FROM "user"
     304    SELECT used_free_consultation INTO v_used_free_consultation
     305    FROM _user
    292306    WHERE id = NEW.user_id;
    293307   
     
    306320}}}
    307321
     322AFTER INSERT тригер на meeting reminder, каде одкако ќе се закаже состанокот да се маркира дека тој корисник го има искористено своето право за бесплатна консултативна сесија со експерт.
    308323{{{
    309324CREATE OR REPLACE FUNCTION mark_free_consultation_as_used()
    310325RETURNS TRIGGER AS $$
    311326BEGIN
    312     UPDATE "user"
    313     SET user_used_free_consultation = TRUE
     327    UPDATE _user
     328    SET used_free_consultation = TRUE
    314329    WHERE id = NEW.user_id
    315       AND user_used_free_consultation = FALSE;
     330      AND used_free_consultation = FALSE;
    316331   
    317332    RETURN NEW;
     
    327342==== Функции / Stored Procedures ====
    328343
     344Функција која кажува дали корисникот може да закаже бесплатна консултативна сесија со експерт.
    329345{{{
    330346CREATE OR REPLACE FUNCTION can_user_schedule_free_consultation(p_user_id INTEGER)
     
    332348    can_schedule BOOLEAN,
    333349    reason TEXT
    334 ) AS $$
     350)
     351AS $$
    335352DECLARE
    336353    v_used_free_consultation BOOLEAN;
    337     v_pending_meetings INTEGER;
    338 BEGIN
    339     SELECT user_used_free_consultation INTO v_used_free_consultation
    340     FROM "user"
     354BEGIN
     355    SELECT used_free_consultation INTO v_used_free_consultation
     356    FROM _user
    341357    WHERE id = p_user_id;
    342358   
     
    346362    END IF;
    347363   
    348     SELECT COUNT(*) INTO v_pending_meetings
    349     FROM meeting_reminder
    350     WHERE user_id = p_user_id
    351       AND meeting_at > NOW();
    352    
    353     IF v_pending_meetings > 0 THEN
    354         RETURN QUERY SELECT FALSE, 'Already has pending meeting scheduled';
    355         RETURN;
    356     END IF;
    357    
    358364    RETURN QUERY SELECT TRUE, 'Eligible for free consultation';
    359365END;
    360 $$ LANGUAGE plpgsql;
    361 }}}
    362 
     366$$
     367LANGUAGE plpgsql;
     368}}}
     369