| | 299 | === Тригер што испраќа нотификација до создавачот на настан кога нов артист ќе сака да се пријави |
| | 300 | |
| | 301 | Прво ги креираме потребните табели: |
| | 302 | {{{ |
| | 303 | CREATE 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 | |
| | 311 | CREATE 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 | {{{ |
| | 331 | CREATE OR REPLACE FUNCTION notify_event_creator() |
| | 332 | RETURNS TRIGGER |
| | 333 | AS $$ |
| | 334 | BEGIN |
| | 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; |
| | 338 | END; |
| | 339 | $$ |
| | 340 | LANGUAGE plpgsql; |
| | 341 | |
| | 342 | CREATE OR REPLACE TRIGGER update_event_requests_notifications |
| | 343 | AFTER INSERT ON events_requests |
| | 344 | FOR EACH ROW |
| | 345 | EXECUTE FUNCTION notify_event_creator(); |
| | 346 | }}} |
| | 347 | |
| | 348 | Правиме тригер кој доколку барањето е прифатено додава нов запис во `performs_at` табелата. |
| | 349 | {{{ |
| | 350 | CREATE OR REPLACE FUNCTION resolve_notification() |
| | 351 | RETURNS TRIGGER |
| | 352 | AS $$ |
| | 353 | BEGIN |
| | 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; |
| | 365 | END; |
| | 366 | $$ |
| | 367 | LANGUAGE plpgsql; |
| | 368 | |
| | 369 | CREATE OR REPLACE TRIGGER event_requests_notifications_resolve |
| | 370 | AFTER UPDATE ON event_requests_notifications |
| | 371 | FOR EACH ROW |
| | 372 | EXECUTE FUNCTION resolve_notification(); |
| | 373 | }}} |
| | 374 | |
| | 376 | |
| | 377 | |
| | 378 | === Поглед за 10 најслушани песни |
| | 379 | |
| | 380 | {{{ |
| | 381 | create materialized view top_songs_by_listens as |
| | 382 | SELECT s.id, me.title, me.genre, u.full_name, u.username, me.cover, s.album_id |
| | 383 | FROM songs s |
| | 384 | JOIN listens l on l.song_id = s.id |
| | 385 | JOIN musical_entities me on s.id = me.id |
| | 386 | JOIN users u on u.user_id = me.released_by |
| | 387 | GROUP BY |
| | 388 | s.id, me.title, me.genre, u.full_name, u.username, me.cover, s.album_id |
| | 389 | ORDER BY count(*) desc |
| | 390 | LIMIT 10; |
| | 391 | }}} |
| | 392 | |
| | 393 | === Детален поглед за секоја песна |
| | 394 | {{{ |
| | 395 | CREATE OR REPLACE VIEW song_details_view AS |
| | 396 | SELECT |
| | 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 |
| | 407 | FROM 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 | {{{ |
| | 418 | CREATE OR REPLACE VIEW project.playlist_summary_view AS |
| | 419 | SELECT |
| | 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 |
| | 425 | FROM project.playlists p |
| | 426 | LEFT JOIN project.playlist_songs ps ON p.playlist_id = ps.playlist_id |
| | 427 | GROUP BY p.playlist_id, p.name, p.cover, p.created_by; |
| | 428 | }}} |