Changes between Version 3 and Version 4 of AdvancedDatabaseDevelopment


Ignore:
Timestamp:
02/11/26 21:39:17 (2 weeks ago)
Author:
231136
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedDatabaseDevelopment

    v3 v4  
    297297}}}
    298298
     299=== Тригер што испраќа нотификација до создавачот на настан кога нов артист ќе сака да се пријави
     300
     301Прво ги креираме потребните табели:
     302{{{
     303CREATE TABLE events_requests(
     304    artist_id BIGINT REFERENCES artists(user_id),
     305    event_id BIGINT REFERENCES events(event_id),
     306    creator_id BIGINT REFERENCES users(user_id),
     307    message TEXT,
     308    CONSTRAINT pk_request_for_events PRIMARY KEY (artist_id, event_id, creator_id)
     309);
     310
     311CREATE TABLE event_requests_notifications(
     312    notification_id BIGSERIAL PRIMARY KEY,
     313
     314    artist_id BIGINT,
     315    event_id BIGINT,
     316    creator_id BIGINT,
     317
     318    message TEXT,
     319    status TEXT DEFAULT 'UNRESOLVED',
     320    creator_has_read BOOLEAN DEFAULT FALSE,
     321    created_at TIMESTAMP DEFAULT now(),
     322
     323    FOREIGN KEY (artist_id, event_id, creator_id)
     324        REFERENCES events_requests(artist_id, event_id, creator_id)
     325        ON DELETE CASCADE
     326);
     327}}}
     328
     329Правиме тригер кој при секое ново барање ќе испрати нотификација до создавачот на настанот:
     330{{{
     331CREATE OR REPLACE FUNCTION notify_event_creator()
     332    RETURNS TRIGGER
     333AS $$
     334BEGIN
     335    INSERT INTO event_requests_notifications (artist_id, event_id, creator_id, message)
     336    VALUES (NEW.artist_id, NEW.event_id, NEW.creator_id, NEW.message);
     337    RETURN NEW;
     338END;
     339$$
     340LANGUAGE plpgsql;
     341
     342CREATE OR REPLACE TRIGGER update_event_requests_notifications
     343    AFTER INSERT ON events_requests
     344    FOR EACH ROW
     345EXECUTE FUNCTION notify_event_creator();
     346}}}
     347
     348Правиме тригер кој доколку барањето е прифатено додава нов запис во `performs_at` табелата.
     349{{{
     350CREATE OR REPLACE FUNCTION resolve_notification()
     351    RETURNS TRIGGER
     352AS $$
     353BEGIN
     354    IF NEW.status = 'ACCEPTED'
     355        THEN
     356        INSERT INTO performs_at (event_id, artist_id) VALUES (OLD.event_id, OLD.artist_id);
     357    ELSIF NEW.status != 'REJECTED' THEN RAISE EXCEPTION 'Invalid status: %, Status must be "ACCEPTED" or "REJECTED"',
     358        NEW.status;
     359    END IF;
     360    DELETE FROM events_requests WHERE
     361        artist_id = OLD.artist_id AND
     362        event_id = OLD.event_id AND
     363        creator_id = OLD.creator_id;
     364    RETURN NEW;
     365END;
     366$$
     367LANGUAGE plpgsql;
     368
     369CREATE OR REPLACE TRIGGER event_requests_notifications_resolve
     370    AFTER UPDATE ON event_requests_notifications
     371    FOR EACH ROW
     372EXECUTE FUNCTION resolve_notification();
     373}}}
     374
    299375== Погледи (Views)
     376
     377
     378=== Поглед за 10 најслушани песни
     379
     380{{{
     381create materialized view top_songs_by_listens as
     382SELECT s.id, me.title, me.genre, u.full_name, u.username, me.cover, s.album_id
     383FROM songs s
     384JOIN listens l on l.song_id = s.id
     385JOIN musical_entities me on s.id = me.id
     386JOIN users u on u.user_id = me.released_by
     387GROUP BY
     388    s.id, me.title, me.genre, u.full_name, u.username, me.cover, s.album_id
     389ORDER BY count(*) desc
     390LIMIT 10;
     391}}}
     392
     393=== Детален поглед за секоја песна
     394{{{
     395CREATE OR REPLACE VIEW song_details_view AS
     396SELECT
     397    s.id AS song_id,
     398    me.title AS song_title,
     399    me.genre AS song_genre,
     400    me.cover AS song_cover,
     401    s.link AS song_link,
     402    alb_me.id AS album_id,
     403    alb_me.title AS album_title,
     404    u.user_id AS artist_user_id,
     405    u.full_name AS artist_name,
     406    u.username AS artist_username
     407FROM project.songs s
     408         JOIN project.musical_entities me ON s.id = me.id
     409         JOIN project.albums alb ON s.album_id = alb.id
     410         JOIN project.musical_entities alb_me ON alb.id = alb_me.id
     411         JOIN project.artists art ON me.released_by = art.user_id
     412         JOIN project.non_admin_users nau ON art.user_id = nau.user_id
     413         JOIN users u ON nau.user_id = u.user_id;
     414}}}
     415
     416=== Детален поглед за секоја плејлиста
     417{{{
     418CREATE OR REPLACE VIEW project.playlist_summary_view AS
     419SELECT
     420    p.playlist_id AS playlist_id,
     421    p.name AS playlist_name,
     422    p.cover AS playlist_cover,
     423    p.created_by AS creator_id,
     424    COUNT(ps.song_id) AS song_count
     425FROM project.playlists p
     426LEFT JOIN project.playlist_songs ps ON p.playlist_id = ps.playlist_id
     427GROUP BY p.playlist_id, p.name, p.cover, p.created_by;
     428}}}