| | 81 | Додава нов продукт во системот заедно со неговите атрибути, статистики и слики. |
| | 82 | |
| | 83 | {{{ |
| | 84 | CREATE OR REPLACE PROCEDURE add_product( |
| | 85 | p_title VARCHAR, |
| | 86 | p_description VARCHAR, |
| | 87 | p_price NUMERIC, |
| | 88 | p_location VARCHAR, |
| | 89 | p_currency VARCHAR, |
| | 90 | p_category_id INT, |
| | 91 | p_seller_id INT, |
| | 92 | p_quantity INT, |
| | 93 | p_attributes JSONB, -- ex. '[{"category_attribute_id": 11, "attribute_value": "M"}, ...]' |
| | 94 | p_images TEXT[] -- ex. ARRAY['url1.jpg', 'url2.jpg'] |
| | 95 | ) |
| | 96 | LANGUAGE plpgsql |
| | 97 | AS $$ |
| | 98 | DECLARE |
| | 99 | v_product_id INT; |
| | 100 | v_attr JSONB; |
| | 101 | v_image TEXT; |
| | 102 | begin |
| | 103 | -- Validacii |
| | 104 | IF p_price <= 0 THEN |
| | 105 | RAISE EXCEPTION 'Cenata mora da e pogolema od 0'; |
| | 106 | END IF; |
| | 107 | |
| | 108 | IF p_quantity < 0 THEN |
| | 109 | RAISE EXCEPTION 'Kolichinata ne moze da e negativna'; |
| | 110 | END IF; |
| | 111 | |
| | 112 | |
| | 113 | IF EXISTS ( |
| | 114 | SELECT 1 FROM category WHERE parent_category = p_category_id |
| | 115 | ) THEN |
| | 116 | RAISE EXCEPTION 'Kategorijata mora da e leaf kategorija'; |
| | 117 | END IF; |
| | 118 | |
| | 119 | |
| | 120 | --FUNKCIJA KORISNIK |
| | 121 | perform fn_validate_seller_package(p_seller_id); |
| | 122 | |
| | 123 | |
| | 124 | -- Insert produkt |
| | 125 | INSERT INTO product (title, description, price, "location" , category_id, seller_id, created_at, is_active, currency, quantity) |
| | 126 | VALUES ( |
| | 127 | p_title, |
| | 128 | p_description, |
| | 129 | p_price, |
| | 130 | p_location, |
| | 131 | p_category_id, |
| | 132 | p_seller_id, |
| | 133 | CURRENT_TIMESTAMP, |
| | 134 | CASE WHEN p_quantity > 0 THEN TRUE ELSE FALSE END, |
| | 135 | p_currency, |
| | 136 | p_quantity |
| | 137 | ) |
| | 138 | RETURNING product_id INTO v_product_id; |
| | 139 | |
| | 140 | -- Insert productstats (pochetni vrednosti) |
| | 141 | INSERT INTO productstats (product_id, views_count, favorites_count, sells_count) |
| | 142 | VALUES (v_product_id, 0, 0, 0); |
| | 143 | |
| | 144 | -- Insert atributi funkcija |
| | 145 | IF p_attributes IS NOT NULL then |
| | 146 | FOR v_attr IN SELECT value FROM jsonb_array_elements(p_attributes) LOOP |
| | 147 | PERFORM fn_validate_product_attribute( |
| | 148 | p_category_id, |
| | 149 | (v_attr->>'category_attribute_id')::INT, |
| | 150 | v_attr->>'attribute_value' |
| | 151 | ); |
| | 152 | INSERT INTO productattributes (product_id, category_attribute_id, attribute_value) |
| | 153 | VALUES (v_product_id, (v_attr->>'category_attribute_id')::INT, v_attr->>'attribute_value'); |
| | 154 | END LOOP; |
| | 155 | END IF; |
| | 156 | |
| | 157 | -- Insert sliki |
| | 158 | IF p_images IS NOT NULL THEN |
| | 159 | FOREACH v_image IN ARRAY p_images |
| | 160 | LOOP |
| | 161 | INSERT INTO productimages (product_id, image_url) |
| | 162 | VALUES (v_product_id, v_image); |
| | 163 | END LOOP; |
| | 164 | END IF; |
| | 165 | |
| | 166 | RAISE NOTICE 'Produktot e dodaden so ID: %', v_product_id; |
| | 167 | end; |
| | 168 | $$; |
| | 169 | }}} |