wiki:AdvancedApplicationDevelopment

Version 67 (modified by 184006, 4 weeks ago) ( diff )

--

Обезбедување пристап

Во нашиот проект корисниците може да имаат улога на стандарден корисник, менаџер, админ и доктор. Според улогата корисниците имаат различни дозволи. Секој корисник кој што ќе се регистрира на нашата платформа ја добива улогата на стандарден корисник. Менаџерите и докторите потребно е претходно да бидат додадени (во базата) за успешно да се регистрираат па потоа да се најават.


1. Kорисник кој што не е најавен.

  • Koрисник кој што не е најавен (нема креирано профил) нема пристап до Pets, Pet Cares, Manage Customers, Blog Post.
  • Во Products има можност да ги гледа достапните производи и да пребарува по име на проивод. Останатите функционалности како додавање/бришење и едитирање се оневозможени за овој тип на корисник.


2. Корисник админ/менаџер.

  • Во Manage Cities има можност да додава нови градови.
  • Во полето Vet_Centers има можност да додава (креира) ветеринарни центри. Исто така може да ги брише и едитира. При креирање/едитирање на ветеринарни центри во полето city има можност да го избере градот од листа која што автоматски се променува со секоја промена во Manage Cities.
  • Во полето Маnage Customers пристапува до профилите на сите корисници кои што се регистрирани на платформата.


3. Стандарден корисник.

  • Стандарден корисник нема пристап до полето Manage Cities.
  • Во полето Маnage Customers пристапува само до неговиот профил.
  • Во полето Vet_Centers нема можност да додава, брише и изменува ветеринарни центри.
  • Во полето Pets си ги гледа само сопствените миленици. Има можност да додава/брише/едитира милениици.
  • Во полето Pet Cares ги гледа само сопствените побарани услуги. Има можност да додава/брише/едитира услуги. Кога сака да креира нова услуга во полето pet_name има можност да избере едно од своите миленичиња(му се прикажуваат само миленичињата кои што претходно ги има додадено во Pets).
  • Во полето Blog Post ги гледа сите побарани совети. Можност за бришење/едитирање има само на сопствените побарани совети. Доколку кликне на Answers му се отвараат сите одговори за одредено прашање(совет). Можност за бришење/едитирање има само на сопствените дадени одговори. Во Details може да ги виде сите одговори на даден одговор. Со Create an Answer има можност да дава одговор на дадено прашање како и да дава одговор на даден одговор.
  • Во Products има можност да ги гледа достапните производи и да пребарува по име на проивод. Останатите функционалности како додавање/бришење и едитирање се оневозможени за овој тип на корисник.


4. Корисник - Доктор

  • Во полето Pets ги гледа сите миленици. Има можност да едитира/брише или додава нови миленици.
  • Во полето Products нема можност да создава нови продукти.
  • Во полето Vet Center нема можност да додава нови вет.центри, нема можност да ги едитира или брише постоечките вет.центри.
  • Во полето Pet Cares ги гледа сите закажени услуги. Има можност да ги едитира или брише постоечките услуги.

Интегритет

Во апликацискиот дел при бришење и едитирање во некои табели наидов на проблеми. Затоа што во прототип апликацијата не ни беше обезбеден рефенцијалниот интегритет во сите потребни полиња.
Обезбедување на рефенцијален интегритет.

ALTER TABLE reports
DROP CONSTRAINT fk_pets;

ALTER TABLE reports
ADD CONSTRAINT fk_pets FOREIGN KEY (petsID) REFERENCES pets(ID) ON DELETE CASCADE;
ALTER TABLE pet_cares
DROP CONSTRAINT fk_vetCenters;

ALTER TABLE pet_cares
ADD CONSTRAINT fk_vetCenters
FOREIGN KEY (vetcentersID) REFERENCES vet_centers(ID)
ON DELETE CASCADE;
ALTER TABLE pet_galery
DROP CONSTRAINT fk_pets;

ALTER TABLE pet_galery
ADD CONSTRAINT fk_pets
FOREIGN KEY (petsID) REFERENCES pets(ID)
ON DELETE CASCADE;

Тригери


Со употреба на тригер го форматирам мобилниот телефоснки број. Најпрво ја променив големината на полето бидејќи првично имавме назначено phoneNumber varchar(15), што е мала голема за телефонски број. При внес на телефоснки број во полето Vet Centers телефонскиот број автоматски се формитира со тоа што: доколку не започнува со +389 му се додава, доколку започнува со 0 се брише првата нула, и се бришат сите знаци освен знакот +.

ALTER TABLE vet_centers
ALTER COLUMN phoneNumber TYPE varchar(50);

CREATE OR REPLACE FUNCTION format_phone_number()
RETURNS TRIGGER AS $$
BEGIN
    -- Отстранување на сите не-нумерички знаци освен плусот на почетокот, ако постои
    IF LEFT(NEW.phoneNumber, 1) = '+' THEN
        NEW.phoneNumber := '+' || regexp_replace(SUBSTRING(NEW.phoneNumber FROM 2), '\D', '', 'g');
    ELSE
        NEW.phoneNumber := regexp_replace(NEW.phoneNumber, '\D', '', 'g');
    END IF;

    -- Ако бројот веќе започнува со '+389', не правиме промени
    IF LEFT(NEW.phoneNumber, 4) = '+389' THEN
        RETURN NEW;
    END IF;

    -- Ако бројот започнува со '389' и нема '+', додај само '+'
    IF LEFT(NEW.phoneNumber, 3) = '389' THEN
        NEW.phoneNumber := '+389' || SUBSTRING(NEW.phoneNumber FROM 4);
    ELSE
        -- Ако бројот не започнува со '389', додадете целосен префикс '+389'
        NEW.phoneNumber := '+389' || NEW.phoneNumber;
    END IF;

    -- Осигурување дека нема водечка '0' после '+389'
    IF LEFT(NEW.phoneNumber, 4) = '+389' AND SUBSTRING(NEW.phoneNumber FROM 5 FOR 1) = '0' THEN
        NEW.phoneNumber := '+389' || SUBSTRING(NEW.phoneNumber FROM 6);
    END IF;

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;



CREATE TRIGGER trigger_format_phone_number
BEFORE INSERT OR UPDATE ON vet_centers
FOR EACH ROW
EXECUTE FUNCTION format_phone_number();


Тригер кој што го искористив за да го пополнам полето date_askes во Blog Post Consultation со моменталниот датум.

CREATE OR REPLACE FUNCTION set_default_date_askes()
RETURNS TRIGGER AS $$
BEGIN
    IF NEW.date_askes IS NULL THEN
        NEW.date_askes := CURRENT_DATE;
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER before_insert_blogpost
BEFORE INSERT ON blog_post_for_consultations
FOR EACH ROW
EXECUTE FUNCTION set_default_date_askes();

CREATE TRIGGER before_update_blogpost
BEFORE UPDATE ON blog_post_for_consultations
FOR EACH ROW
EXECUTE FUNCTION set_default_date_askes();


При внес на date_added во Products автоматски се пополнува денешниот датум.

CREATE OR REPLACE FUNCTION set_date_added()
RETURNS TRIGGER AS $$
BEGIN
    -- Поставување на dateAdded на тековниот датум
    NEW.dateAdded := CURRENT_DATE;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER before_insert_set_date_added
BEFORE INSERT ON products
FOR EACH ROW
EXECUTE FUNCTION set_date_added();


При внес на name во полето City секоја прва буква од секој збор се претвара во голема буква.

CREATE OR REPLACE FUNCTION format_city_name()
RETURNS TRIGGER AS $$
BEGIN
    -- Конвертирај го името на градот со првата буква на секој збор голема
    NEW.name := initcap(lower(NEW.name));
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;


CREATE TRIGGER trigger_format_city_name
BEFORE INSERT OR UPDATE ON cities
FOR EACH ROW
EXECUTE FUNCTION format_city_name();

Attachments (4)

Download all attachments as: .zip

Note: See TracWiki for help on using the wiki.