| | 429 | |
| | 430 | == Custom Domains |
| | 431 | |
| | 432 | Целта тука е да направиме наша логика за проверки која понатаму би можела да се користи и на други места: на пример email поле денес проверуваме само на едно место, но во иднина може да има повеќе места каде што би сакале да го провериме и подобро, а и попрегледно, е доколку таа логика е на едно место. |
| | 433 | |
| | 434 | === Проверка за email |
| | 435 | |
| | 436 | {{{ |
| | 437 | CREATE DOMAIN email_address AS TEXT |
| | 438 | CHECK ( VALUE ~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$' ); |
| | 439 | |
| | 440 | -- афектирани DDL изрази: |
| | 441 | |
| | 442 | CREATE TABLE USERS ( |
| | 443 | user_id BIGINT PRIMARY KEY, |
| | 444 | full_name TEXT NOT NULL, |
| | 445 | email email_address NOT NULL, -- <--- custom domain |
| | 446 | password TEXT NOT NULL, |
| | 447 | username TEXT NOT NULL, |
| | 448 | profile_photo TEXT |
| | 449 | ); |
| | 450 | |
| | 451 | |
| | 452 | }}} |
| | 453 | |
| | 454 | === Проверка за валиден rating |
| | 455 | |
| | 456 | {{{ |
| | 457 | CREATE DOMAIN rating AS INT |
| | 458 | CHECK ( VALUE BETWEEN 1 AND 5 ); |
| | 459 | |
| | 460 | -- афектирани DDL изрази: |
| | 461 | |
| | 462 | CREATE TABLE REVIEWS ( |
| | 463 | listener_id BIGINT REFERENCES LISTENERS(user_id) ON DELETE CASCADE, |
| | 464 | musical_entity_id BIGINT REFERENCES MUSICAL_ENTITIES(id) ON DELETE CASCADE, |
| | 465 | grade rating NOT NULL, -- <--- custom domain |
| | 466 | comment TEXT, |
| | 467 | |
| | 468 | CONSTRAINT reviews_pk |
| | 469 | PRIMARY KEY (listener_id, musical_entity_id) |
| | 470 | ); |
| | 471 | |
| | 472 | }}} |
| | 473 | |
| | 474 | === Проверка за валиден url |
| | 475 | |
| | 476 | {{{ |
| | 477 | -- забелешка: доколку чуваме податоци на filesystem оваа проверка би паднала, но ние одиме со претпоставка |
| | 478 | -- дека во вистински систем сите media податоци би ги чувале некаде на cloud (пр. Amazon S3) што е секако и добра практика, |
| | 479 | -- па во тој случај дадената проверка би била валидна |
| | 480 | |
| | 481 | CREATE DOMAIN media_url AS TEXT |
| | 482 | CHECK ( VALUE ~ '^https?://' ); |
| | 483 | |
| | 484 | -- афектирани DDL изрази: |
| | 485 | |
| | 486 | CREATE TABLE USERS ( |
| | 487 | user_id BIGINT PRIMARY KEY, |
| | 488 | full_name TEXT NOT NULL, |
| | 489 | email email_address NOT NULL, |
| | 490 | password TEXT NOT NULL, |
| | 491 | username TEXT NOT NULL, |
| | 492 | profile_photo media_url -- <--- custom domain |
| | 493 | ); |
| | 494 | |
| | 495 | |
| | 496 | CREATE TABLE SONGS ( |
| | 497 | id BIGINT PRIMARY KEY REFERENCES MUSICAL_ENTITIES(id) ON DELETE CASCADE, |
| | 498 | album_id BIGINT REFERENCES ALBUMS(id) ON DELETE SET NULL, |
| | 499 | link media_url NOT NULL -- <--- custom domain |
| | 500 | ); |
| | 501 | |
| | 502 | CREATE TABLE PLAYLISTS ( |
| | 503 | playlist_id BIGINT PRIMARY KEY, |
| | 504 | cover media_url, -- <--- custom domain |
| | 505 | name TEXT NOT NULL, |
| | 506 | created_by BIGINT REFERENCES LISTENERS(user_id) ON DELETE CASCADE NOT NULL |
| | 507 | ); |
| | 508 | |
| | 509 | }}} |
| | 510 | |
| | 511 | |
| | 512 | === Проверка за дали даден датум е поминат |
| | 513 | |
| | 514 | {{{ |
| | 515 | CREATE DOMAIN past_or_present_date AS DATE |
| | 516 | CHECK ( VALUE <= CURRENT_DATE ); |
| | 517 | |
| | 518 | -- афектирани DDL изрази: |
| | 519 | |
| | 520 | CREATE TABLE MUSICAL_ENTITIES ( |
| | 521 | id BIGINT PRIMARY KEY, |
| | 522 | title TEXT NOT NULL, |
| | 523 | genre TEXT NOT NULL, |
| | 524 | release_date past_or_present_date NOT NULL, -- <--- custom domain |
| | 525 | released_by BIGINT REFERENCES ARTISTS(user_id) ON DELETE CASCADE NOT NULL |
| | 526 | ); |
| | 527 | |
| | 528 | }}} |