Changes between Version 3 and Version 4 of expertCreateCourse


Ignore:
Timestamp:
08/05/26 22:18:20 (11 hours ago)
Author:
231175
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • expertCreateCourse

    v3 v4  
    11== Креирање на курс
     2
    23=== Актери
    34- Експерт
    4 === Чекор 1
     5
     6=== Предуслов: табела `expert_course`
     7
     8Шемата нема врска помеѓу `expert` и `course`, па нема каде да се запише кој експерт го креирал курсот. Оваа табела мора да се додаде во DDL пред овој случај на употреба да работи.
     9
     10{{{
     11CREATE TABLE expert_course (
     12    expert_id  bigint NOT NULL,
     13    course_id  bigint NOT NULL,
     14    CONSTRAINT pk_expert_course PRIMARY KEY (expert_id, course_id),
     15    CONSTRAINT fk_ec_expert FOREIGN KEY (expert_id)
     16        REFERENCES expert (expert_id) ON DELETE CASCADE,
     17    CONSTRAINT fk_ec_course FOREIGN KEY (course_id)
     18        REFERENCES course (course_id) ON DELETE CASCADE
     19);
     20}}}
     21
     22=== Чекор 1
     23
    524При клик на копчето за креирање на курс на навбарот на корисникот му се прикажува форма со полиња. При пополнување на овие полиња и клик на копчето "Create" се креира курс во базата.
    625
    726{{{
     27BEGIN;
     28
    829DROP TABLE IF EXISTS temp_course_id;
    930DROP TABLE IF EXISTS temp_course_version_id;
    10 DROP TABLE IF EXISTS temp_course_translate_id;
    1131DROP TABLE IF EXISTS temp_course_content_id;
    1232DROP TABLE IF EXISTS temp_course_lecture_id;
    1333DROP TABLE IF EXISTS temp_tag_id;
    1434
    15 CREATE TEMP TABLE temp_course_id (id BIGINT);
    16 CREATE TEMP TABLE temp_course_version_id (id BIGINT);
    17 CREATE TEMP TABLE temp_course_translate_id (id BIGINT, language VARCHAR(2));
    18 CREATE TEMP TABLE temp_course_content_id (id BIGINT);
    19 CREATE TEMP TABLE temp_course_lecture_id (id BIGINT);
    20 CREATE TEMP TABLE temp_tag_id (id BIGINT, type VARCHAR(50));
     35CREATE TEMP TABLE temp_course_id         (course_id BIGINT);
     36CREATE TEMP TABLE temp_course_version_id (course_version_id BIGINT);
     37CREATE TEMP TABLE temp_course_content_id (course_content_id BIGINT);
     38CREATE TEMP TABLE temp_course_lecture_id (course_lecture_id BIGINT);
     39CREATE TEMP TABLE temp_tag_id            (tag_id BIGINT, tag_type tag_type);
    2140
     41-- 1. Курс
    2242WITH new_course AS (
    2343    INSERT INTO course (image_url, difficulty, duration_minutes, price, color)
    24     VALUES ('https://example.com/image.png', 'INTERMEDIATE', 120, 50, '#008CC2')
    25     RETURNING id
     44    VALUES ('https://example.com/image.png', 'intermediate', 120, 50.00, '#008CC2')
     45    RETURNING course_id
    2646)
    27 INSERT INTO temp_course_id (id)
    28 SELECT id FROM new_course;
     47INSERT INTO temp_course_id (course_id)
     48SELECT course_id FROM new_course;
    2949
     50-- 2. Верзија на курс
    3051WITH new_course_version AS (
    31     INSERT INTO course_version (version_number, creation_date, active, course_id)
    32     SELECT 1, CURRENT_DATE, true, id FROM temp_course_id
    33     RETURNING id
     52    INSERT INTO course_version (version_number, created_at, is_active, course_id)
     53    SELECT 1, CURRENT_DATE, true, course_id FROM temp_course_id
     54    RETURNING course_version_id
    3455)
    35 INSERT INTO temp_course_version_id (id)
    36 SELECT id FROM new_course_version;
     56INSERT INTO temp_course_version_id (course_version_id)
     57SELECT course_version_id FROM new_course_version;
    3758
    38 WITH new_course_translate_en AS (
    39     INSERT INTO course_translate (language, title_short, title, description_short, description, description_long, course_id)
    40     SELECT 'en', 'Advanced Sales', 'Advanced Sales For Senior Salesman', 'Short desc', 'Normal desc', 'Long desc', id FROM temp_course_id
    41     RETURNING id, language
    42 )
    43 INSERT INTO temp_course_translate_id (id, language)
    44 SELECT id, language FROM new_course_translate_en;
     59-- 3. Преводи на курсот
     60--    what_will_be_learned е text[] колона, па се внесува заедно со преводот.
     61INSERT INTO course_translate (language_id, title_short, title,
     62                              description_short, description, description_long,
     63                              what_will_be_learned, course_id)
     64SELECT (SELECT id FROM language WHERE value = 'en'),
     65       'Advanced Sales',
     66       'Advanced Sales For Senior Salesman',
     67       'Short desc',
     68       'Normal desc',
     69       'Long desc',
     70       ARRAY['Advanced sales techniques',
     71             'How to successfully close deals'],
     72       course_id
     73FROM temp_course_id;
    4574
    46 WITH new_course_translate_mk AS (
    47     INSERT INTO course_translate (language, title_short, title, description_short, description, description_long, course_id)
    48     SELECT 'mk', 'Напредна Продажба', 'Напредна Продажба за Сениор Продавачи', 'Кратка дескрипција', 'Нормална дескрипција', 'Долга дескрипција', id FROM temp_course_id
    49     RETURNING id, language
    50 )
    51 INSERT INTO temp_course_translate_id (id, language)
    52 SELECT id, language FROM new_course_translate_mk;
     75INSERT INTO course_translate (language_id, title_short, title,
     76                              description_short, description, description_long,
     77                              what_will_be_learned, course_id)
     78SELECT (SELECT id FROM language WHERE value = 'mk'),
     79       'Напредна Продажба',
     80       'Напредна Продажба за Сениор Продавачи',
     81       'Кратка дескрипција',
     82       'Нормална дескрипција',
     83       'Долга дескрипција',
     84       ARRAY['Напредни техники на продажба',
     85             'Како до успешно затворање на продажби'],
     86       course_id
     87FROM temp_course_id;
    5388
     89-- 4. Модул
    5490WITH new_course_content AS (
    5591    INSERT INTO course_content (position, course_version_id)
    56     SELECT 1, id FROM temp_course_version_id
    57     RETURNING id
     92    SELECT 1, course_version_id FROM temp_course_version_id
     93    RETURNING course_content_id
    5894)
    59 INSERT INTO temp_course_content_id (id)
    60 SELECT id FROM new_course_content;
     95INSERT INTO temp_course_content_id (course_content_id)
     96SELECT course_content_id FROM new_course_content;
    6197
    62 INSERT INTO course_content_translate (title, language, course_content_id)
    63 SELECT 'Module 1: Sales Strategies', 'en', id FROM temp_course_content_id;
     98INSERT INTO course_content_translate (title, language_id, course_content_id)
     99SELECT 'Module 1: Sales Strategies',
     100       (SELECT id FROM language WHERE value = 'en'),
     101       course_content_id
     102FROM temp_course_content_id;
    64103
    65 INSERT INTO course_content_translate (title, language, course_content_id)
    66 SELECT 'Модул 1: Продажни Стратегии', 'mk', id FROM temp_course_content_id;
     104INSERT INTO course_content_translate (title, language_id, course_content_id)
     105SELECT 'Модул 1: Продажни Стратегии',
     106       (SELECT id FROM language WHERE value = 'mk'),
     107       course_content_id
     108FROM temp_course_content_id;
    67109
     110-- 5. Лекција
    68111WITH new_course_lecture AS (
    69112    INSERT INTO course_lecture (duration_minutes, position, content_type, course_content_id)
    70     SELECT 30, 1, 'video', id FROM temp_course_content_id
    71     RETURNING id
     113    SELECT 30, 1, 'video', course_content_id FROM temp_course_content_id
     114    RETURNING course_lecture_id
    72115)
    73 INSERT INTO temp_course_lecture_id (id)
    74 SELECT id FROM new_course_lecture;
     116INSERT INTO temp_course_lecture_id (course_lecture_id)
     117SELECT course_lecture_id FROM new_course_lecture;
    75118
    76 INSERT INTO course_lecture_translate (title, language, content_file_name, description, content_text, course_lecture_id)
    77 SELECT 'Lecture 1: Intro', 'en', 'lecture1.mp4', 'Introduction to advanced sales', 'Video text content', id
     119INSERT INTO course_lecture_translate (title, language_id, content_file_name,
     120                                      description, content_text, course_lecture_id)
     121SELECT 'Lecture 1: Intro',
     122       (SELECT id FROM language WHERE value = 'en'),
     123       'lecture1.mp4',
     124       'Introduction to advanced sales',
     125       NULL,                       -- content_type = 'video' -> нема текстуална содржина
     126       course_lecture_id
    78127FROM temp_course_lecture_id;
    79128
    80 INSERT INTO course_lecture_translate (title, language, content_file_name, description, content_text, course_lecture_id)
    81 SELECT 'Предавање 1: Вовед', 'mk', 'lecture1.mp4', 'Вовед во напредна продажба', 'Тмп', id
     129INSERT INTO course_lecture_translate (title, language_id, content_file_name,
     130                                      description, content_text, course_lecture_id)
     131SELECT 'Предавање 1: Вовед',
     132       (SELECT id FROM language WHERE value = 'mk'),
     133       'lecture1.mp4',
     134       'Вовед во напредна продажба',
     135       NULL,
     136       course_lecture_id
    82137FROM temp_course_lecture_id;
    83138
     139-- 6. Тагови
     140--    ВНИМАНИЕ: ова креира НОВИ тагови при секое креирање на курс.
     141--    Во продукција формата треба да нуди постоечки тагови, па овој блок
     142--    се заменува со SELECT врз tag/tag_translate по избраните вредности.
    84143WITH new_tags AS (
    85     INSERT INTO tag (type)
    86     VALUES ('skill'), ('interest')
    87     RETURNING id, type
     144    INSERT INTO tag (tag_type)
     145    VALUES ('skill'), ('topic')
     146    RETURNING tag_id, tag_type
    88147)
    89 INSERT INTO temp_tag_id (id, type)
    90 SELECT id, type FROM new_tags;
     148INSERT INTO temp_tag_id (tag_id, tag_type)
     149SELECT tag_id, tag_type FROM new_tags;
    91150
    92 INSERT INTO tag_translate (language, value, tag_id)
    93 SELECT 'en', CASE type WHEN 'skill' THEN 'Skill' WHEN 'interest' THEN 'Interest' END, id FROM temp_tag_id;
     151INSERT INTO tag_translate (language_id, value, tag_id)
     152SELECT (SELECT id FROM language WHERE value = 'en'),
     153       CASE tag_type WHEN 'skill' THEN 'Skill' WHEN 'topic' THEN 'Topic' END,
     154       tag_id
     155FROM temp_tag_id;
    94156
    95 INSERT INTO tag_translate (language, value, tag_id)
    96 SELECT 'mk', CASE type WHEN 'skill' THEN 'Вештина' WHEN 'interest' THEN 'Интерес' END, id FROM temp_tag_id;
     157INSERT INTO tag_translate (language_id, value, tag_id)
     158SELECT (SELECT id FROM language WHERE value = 'mk'),
     159       CASE tag_type WHEN 'skill' THEN 'Вештина' WHEN 'topic' THEN 'Тема' END,
     160       tag_id
     161FROM temp_tag_id;
    97162
    98163INSERT INTO course_tag (tag_id, course_id)
    99 SELECT t.id, c.id
     164SELECT t.tag_id, c.course_id
    100165FROM temp_tag_id t
    101166CROSS JOIN temp_course_id c;
    102167
     168-- 7. Врска експерт <-> курс
    103169INSERT INTO expert_course (course_id, expert_id)
    104 SELECT id, 1
     170SELECT course_id, 1
    105171FROM temp_course_id;
    106172
    107 INSERT INTO course_translate_what_will_be_learned (course_translate_id, what_will_be_learned)
    108 SELECT id, 'Advanced sales techniques'
    109 FROM temp_course_translate_id
    110 WHERE language = 'en';
     173COMMIT;
     174}}}
    111175
    112 INSERT INTO course_translate_what_will_be_learned (course_translate_id, what_will_be_learned)
    113 SELECT id, 'How to successfully close deals'
    114 FROM temp_course_translate_id
    115 WHERE language = 'en';
     176==== Забелешки
    116177
    117 INSERT INTO course_translate_what_will_be_learned (course_translate_id, what_will_be_learned)
    118 SELECT id, 'Напредни техники на продажба'
    119 FROM temp_course_translate_id
    120 WHERE language = 'mk';
    121 
    122 INSERT INTO course_translate_what_will_be_learned (course_translate_id, what_will_be_learned)
    123 SELECT id, 'Како до успешно затворање на продажби'
    124 FROM temp_course_translate_id
    125 WHERE language = 'mk';
    126 }}}
     178- Сите вредности за `difficulty`, `content_type` и `tag_type` мора да се со мали букви — тоа се лабели на PostgreSQL enum типови и се осетливи на голема/мала буква.
     179- `tag_type` има само две вредности: `skill` и `topic`. Вредноста `interest` не постои и предизвикува грешка, а не празен резултат.
     180- Целиот блок мора да биде во една трансакција. Ако некој од чекорите падне, курсот не смее да остане делумно креиран.
     181- `uq_course_version_one_active` дозволува само една активна верзија по курс. При креирање на нова верзија, старата мора прво да се постави на `is_active = false`.