Необходимо разработать WebApi для решения следующих задач:
1. Спроектировать структуру БД для хранения информации о марках, моделях, водителях и самих автомобилях.
Изначально база данных должна содержать следующие значения:
Содержание табицы transport_type
Содержание таблицы transport_tax_rate
Проверка данных проходит в базе данных. Код каждой таблицы:
CREATE TABLE IF NOT EXISTS public.transport_type
(
type text COLLATE pg_catalog."default" NOT NULL,
CONSTRAINT type_transport_pkey PRIMARY KEY (type)
)
CREATE TABLE IF NOT EXISTS public.transport_tax_rate
(
id integer NOT NULL DEFAULT nextval('transport_tax_rate_id_seq'::regclass),
transport_type text COLLATE pg_catalog."default" NOT NULL,
min_horsepower integer NOT NULL,
max_horsepower integer,
tax_rate integer NOT NULL,
CONSTRAINT transport_tax_rate_pkey PRIMARY KEY (id),
CONSTRAINT transport FOREIGN KEY (transport_type)
REFERENCES public.transport_type (type) MATCH FULL
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT transport_tax_rate_check CHECK (max_horsepower = NULL::integer OR min_horsepower < max_horsepower)
)
CREATE TABLE IF NOT EXISTS public.driver
(
passport text COLLATE pg_catalog."default" NOT NULL,
last_name text COLLATE pg_catalog."default" NOT NULL,
name text COLLATE pg_catalog."default" NOT NULL,
patronymic text COLLATE pg_catalog."default",
birthday date NOT NULL,
CONSTRAINT driver_pkey PRIMARY KEY (passport),
CONSTRAINT driver_birthday_check CHECK (EXTRACT(year FROM age(birthday::timestamp with time zone)) >= 18::numeric),
CONSTRAINT driver_passport_check CHECK (passport ~* '\d{4} \d{6}'::text)
)
CREATE TABLE IF NOT EXISTS public.transport_brand
(
brand text COLLATE pg_catalog."default" NOT NULL,
CONSTRAINT transport_brand_pkey PRIMARY KEY (brand)
)
CREATE TABLE IF NOT EXISTS public.transport_model
(
model text COLLATE pg_catalog."default" NOT NULL,
brand text COLLATE pg_catalog."default" NOT NULL,
horsepower integer NOT NULL,
release_year integer NOT NULL,
transport_type text COLLATE pg_catalog."default" NOT NULL,
CONSTRAINT transport_model_pkey PRIMARY KEY (model),
CONSTRAINT transport_model_brand_fkey FOREIGN KEY (brand)
REFERENCES public.transport_brand (brand) MATCH SIMPLE
ON UPDATE CASCADE
ON DELETE CASCADE
NOT VALID,
CONSTRAINT transport_model_transport_type_fkey FOREIGN KEY (transport_type)
REFERENCES public.transport_type (type) MATCH SIMPLE
ON UPDATE CASCADE
ON DELETE CASCADE
NOT VALID,
CONSTRAINT transport_model_release_year_check CHECK (release_year >= 1900 AND release_year::double precision <= date_part('year'::text, now())),
CONSTRAINT transport_model_horsepower_check CHECK (horsepower > 0) NOT VALID
)
CREATE TABLE IF NOT EXISTS public.transport
(
number_transport text COLLATE pg_catalog."default" NOT NULL,
model text COLLATE pg_catalog."default" NOT NULL,
registration_date date NOT NULL,
driver text COLLATE pg_catalog."default" NOT NULL,
CONSTRAINT transport_driver_pkey PRIMARY KEY (number_transport),
CONSTRAINT transport_driver_fkey FOREIGN KEY (driver)
REFERENCES public.driver (passport) MATCH SIMPLE
ON UPDATE CASCADE
ON DELETE CASCADE
NOT VALID,
CONSTRAINT transport_model_transport_fkey FOREIGN KEY (model)
REFERENCES public.transport_model (model) MATCH SIMPLE
ON UPDATE CASCADE
ON DELETE CASCADE
NOT VALID,
CONSTRAINT transport_number_transport_check CHECK (number_transport ~* '^[АВЕКМНОРСТУХ][0-9]{3}[АВЕКМНОРСТУХ]{2}$'::text OR number_transport ~* '^[АВЕКМНОРСТУХ]{2}[0-9]{3,4}$'::text OR number_transport ~* '^[0-9]{4}[АВЕКМНОРСТУХ]{2}$'::text)
)
2. Разработать WebApi для получения/добавления/изменения информации о марках, моделях, водителях, автомобилях.
Все действия, которые выполняет WebApi
Получение информации обо всех водителях
Получение информации о водетеле по паспорту. (%20 - пробел).
Ошибка при добавлении записи с неправльно введенной датой.
Ошибка при добавлении водителя с неправильно введенным паспортом.
Ошибка при добавлении водителя с паспортом, который уже есть в бд.
Ответ на правильное добавление водителя.
Корректное изменение записи.
Не найдена запись с таким паспортом для изменения.
Если будет введена дата неправильно или паспорт (если указан корректный старый паспорт), то ответ будет таким же как и при создании записи с этими атрибутами.
Удаление водителя с полной информацией.
Удаление водителя по паспорту.
Удаление несуществующей записи.