| | 57 | CREATE TABLE users ( |
| | 58 | user_id BIGSERIAL PRIMARY KEY, |
| | 59 | username VARCHAR(30) NOT NULL, |
| | 60 | email VARCHAR(254) NOT NULL, |
| | 61 | name VARCHAR(60) NOT NULL, |
| | 62 | surname VARCHAR(60) NOT NULL, |
| | 63 | created_at TIMESTAMP NOT NULL DEFAULT NOW(), |
| | 64 | CONSTRAINT uq_users_username UNIQUE (username), |
| | 65 | CONSTRAINT uq_users_email UNIQUE (email) |
| | 66 | ); |
| | 67 | |
| | 68 | CREATE TABLE admins ( |
| | 69 | user_id BIGINT PRIMARY KEY REFERENCES users(user_id) ON DELETE CASCADE |
| | 70 | ); |
| | 71 | |
| | 72 | CREATE TABLE clients ( |
| | 73 | user_id BIGINT PRIMARY KEY REFERENCES users(user_id) ON DELETE CASCADE |
| | 74 | ); |
| | 75 | |
| | 76 | CREATE TABLE owners ( |
| | 77 | user_id BIGINT PRIMARY KEY REFERENCES clients(user_id) ON DELETE CASCADE |
| | 78 | ); |
| | 79 | |
| | 80 | CREATE TABLE notifications ( |
| | 81 | notification_id BIGSERIAL PRIMARY KEY, |
| | 82 | user_id BIGINT NOT NULL REFERENCES users(user_id) ON DELETE CASCADE, |
| | 83 | type VARCHAR(40) NOT NULL, |
| | 84 | message TEXT NOT NULL, |
| | 85 | is_read BOOLEAN NOT NULL DEFAULT FALSE, |
| | 86 | created_at TIMESTAMP NOT NULL DEFAULT NOW() |
| | 87 | ); |
| | 88 | |
| | 89 | CREATE TABLE vet_clinics ( |
| | 90 | clinic_id BIGSERIAL PRIMARY KEY, |
| | 91 | name VARCHAR(120) NOT NULL, |
| | 92 | email VARCHAR(254), |
| | 93 | phone VARCHAR(40), |
| | 94 | city VARCHAR(80) NOT NULL, |
| | 95 | address VARCHAR(200) NOT NULL, |
| | 96 | approved_by BIGINT REFERENCES admins(user_id) ON DELETE SET NULL |
| | 97 | ); |
| | 98 | |
| | 99 | CREATE TABLE animals ( |
| | 100 | animal_id BIGSERIAL PRIMARY KEY, |
| | 101 | owner_id BIGINT NOT NULL REFERENCES owners(user_id) ON DELETE CASCADE, |
| | 102 | name VARCHAR(80) NOT NULL, |
| | 103 | sex VARCHAR(10) NOT NULL CHECK (sex IN ('MALE','FEMALE','UNKNOWN')), |
| | 104 | date_of_birth DATE, |
| | 105 | photo_url TEXT, |
| | 106 | type VARCHAR(40), |
| | 107 | species VARCHAR(60), |
| | 108 | breed VARCHAR(60), |
| | 109 | located_name VARCHAR(120) |
| | 110 | ); |
| | 111 | |
| | 112 | CREATE TABLE listings ( |
| | 113 | listing_id BIGSERIAL PRIMARY KEY, |
| | 114 | owner_id BIGINT NOT NULL REFERENCES owners(user_id) ON DELETE CASCADE, |
| | 115 | animal_id BIGINT NOT NULL REFERENCES animals(animal_id) ON DELETE CASCADE, |
| | 116 | status VARCHAR(20) NOT NULL CHECK (status IN ('DRAFT','ACTIVE','PAUSED','SOLD','ARCHIVED')), |
| | 117 | price NUMERIC(12,2) NOT NULL CHECK (price >= 0), |
| | 118 | description TEXT, |
| | 119 | created_at TIMESTAMP NOT NULL DEFAULT NOW(), |
| | 120 | CONSTRAINT fk_listing_owner_matches_animal_owner |
| | 121 | FOREIGN KEY (owner_id) REFERENCES owners(user_id) ON DELETE CASCADE |
| | 122 | ); |
| | 123 | |
| | 124 | CREATE TABLE appointments ( |
| | 125 | appointment_id BIGSERIAL PRIMARY KEY, |
| | 126 | clinic_id BIGINT NOT NULL REFERENCES vet_clinics(clinic_id) ON DELETE CASCADE, |
| | 127 | animal_id BIGINT NOT NULL REFERENCES animals(animal_id) ON DELETE CASCADE, |
| | 128 | responsible_owner_id BIGINT NOT NULL REFERENCES owners(user_id) ON DELETE CASCADE, |
| | 129 | status VARCHAR(20) NOT NULL CHECK (status IN ('REQUESTED','CONFIRMED','CANCELLED','DONE','NO_SHOW')), |
| | 130 | date_time TIMESTAMP NOT NULL, |
| | 131 | notes TEXT |
| | 132 | ); |
| | 133 | |
| | 134 | CREATE TABLE reviews ( |
| | 135 | review_id BIGSERIAL PRIMARY KEY, |
| | 136 | reviewer_id BIGINT NOT NULL REFERENCES clients(user_id) ON DELETE CASCADE, |
| | 137 | rating INT NOT NULL CHECK (rating BETWEEN 1 AND 5), |
| | 138 | comment TEXT, |
| | 139 | created_at TIMESTAMP NOT NULL DEFAULT NOW() |
| | 140 | ); |
| | 141 | |
| | 142 | CREATE TABLE user_reviews ( |
| | 143 | review_id BIGINT PRIMARY KEY REFERENCES reviews(review_id) ON DELETE CASCADE, |
| | 144 | target_user_id BIGINT NOT NULL REFERENCES users(user_id) ON DELETE CASCADE |
| | 145 | ); |
| | 146 | |
| | 147 | CREATE TABLE clinic_reviews ( |
| | 148 | review_id BIGINT PRIMARY KEY REFERENCES reviews(review_id) ON DELETE CASCADE, |
| | 149 | target_clinic_id BIGINT NOT NULL REFERENCES vet_clinics(clinic_id) ON DELETE CASCADE |
| | 150 | ); |
| | 151 | |
| | 152 | CREATE TABLE health_records ( |
| | 153 | healthrecord_id BIGSERIAL PRIMARY KEY, |
| | 154 | animal_id BIGINT NOT NULL REFERENCES animals(animal_id) ON DELETE CASCADE, |
| | 155 | appointment_id BIGINT NOT NULL REFERENCES appointments(appointment_id) ON DELETE CASCADE, |
| | 156 | type VARCHAR(40) NOT NULL, |
| | 157 | description TEXT, |
| | 158 | date DATE NOT NULL |
| | 159 | ); |