From 37b8f8f0174bf50754976bcad39b64468372c626 Mon Sep 17 00:00:00 2001 From: Rafael Miranda Date: Mon, 26 Feb 2024 22:28:46 +0000 Subject: [PATCH] feat: add dockerfile and compose Pass validation --- .dockerignore | 6 + Dockerfile | 27 + .../docker-entrypoint-initdb.d/rinha.dump.sql | 928 ++++++++++++++++++ conf/nginx.conf | 20 + docker-compose.yml | 25 +- rinha/apps/core/serializers.py | 2 +- rinha/apps/core/views.py | 12 +- rinha/settings.py | 23 +- 8 files changed, 1037 insertions(+), 6 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 conf/docker-entrypoint-initdb.d/rinha.dump.sql create mode 100644 conf/nginx.conf diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..8ed384d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +** +**/pycache/** +!poetry.lock +!pyproject.toml +!manage.py +!rinha/** \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a76a119 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,27 @@ +FROM python:3.12-slim as builder + +ENV PYTHONUNBUFFERED=1 \ + POETRY_HOME="/usr/local" \ + POETRY_VERSION="1.8.1" + +RUN apt-get update \ + && apt-get install --no-install-recommends -y curl \ + && curl -sSL https://install.python-poetry.org | python3 - + +WORKDIR /app + +COPY pyproject.toml poetry.lock ./ + +RUN poetry config virtualenvs.create false \ + && poetry install --no-interaction --no-ansi + +FROM python:3.12-slim as runner + +WORKDIR /app + +COPY --from=builder /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages +COPY --from=builder /usr/local/bin /usr/local/bin + +COPY . . + +ENTRYPOINT ["python", "manage.py", "runserver", "0:8080"] \ No newline at end of file diff --git a/conf/docker-entrypoint-initdb.d/rinha.dump.sql b/conf/docker-entrypoint-initdb.d/rinha.dump.sql new file mode 100644 index 0000000..8578a97 --- /dev/null +++ b/conf/docker-entrypoint-initdb.d/rinha.dump.sql @@ -0,0 +1,928 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 16.1 (Debian 16.1-1.pgdg120+1) +-- Dumped by pg_dump version 16.1 (Debian 16.1-1.pgdg120+1) + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +SET default_tablespace = ''; + +SET default_table_access_method = heap; + +-- +-- Name: auth_group; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.auth_group ( + id integer NOT NULL, + name character varying(150) NOT NULL +); + + +ALTER TABLE public.auth_group OWNER TO postgres; + +-- +-- Name: auth_group_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +ALTER TABLE public.auth_group ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY ( + SEQUENCE NAME public.auth_group_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1 +); + + +-- +-- Name: auth_group_permissions; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.auth_group_permissions ( + id bigint NOT NULL, + group_id integer NOT NULL, + permission_id integer NOT NULL +); + + +ALTER TABLE public.auth_group_permissions OWNER TO postgres; + +-- +-- Name: auth_group_permissions_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +ALTER TABLE public.auth_group_permissions ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY ( + SEQUENCE NAME public.auth_group_permissions_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1 +); + + +-- +-- Name: auth_permission; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.auth_permission ( + id integer NOT NULL, + name character varying(255) NOT NULL, + content_type_id integer NOT NULL, + codename character varying(100) NOT NULL +); + + +ALTER TABLE public.auth_permission OWNER TO postgres; + +-- +-- Name: auth_permission_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +ALTER TABLE public.auth_permission ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY ( + SEQUENCE NAME public.auth_permission_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1 +); + + +-- +-- Name: auth_user; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.auth_user ( + id integer NOT NULL, + password character varying(128) NOT NULL, + last_login timestamp with time zone, + is_superuser boolean NOT NULL, + username character varying(150) NOT NULL, + first_name character varying(150) NOT NULL, + last_name character varying(150) NOT NULL, + email character varying(254) NOT NULL, + is_staff boolean NOT NULL, + is_active boolean NOT NULL, + date_joined timestamp with time zone NOT NULL +); + + +ALTER TABLE public.auth_user OWNER TO postgres; + +-- +-- Name: auth_user_groups; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.auth_user_groups ( + id bigint NOT NULL, + user_id integer NOT NULL, + group_id integer NOT NULL +); + + +ALTER TABLE public.auth_user_groups OWNER TO postgres; + +-- +-- Name: auth_user_groups_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +ALTER TABLE public.auth_user_groups ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY ( + SEQUENCE NAME public.auth_user_groups_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1 +); + + +-- +-- Name: auth_user_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +ALTER TABLE public.auth_user ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY ( + SEQUENCE NAME public.auth_user_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1 +); + + +-- +-- Name: auth_user_user_permissions; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.auth_user_user_permissions ( + id bigint NOT NULL, + user_id integer NOT NULL, + permission_id integer NOT NULL +); + + +ALTER TABLE public.auth_user_user_permissions OWNER TO postgres; + +-- +-- Name: auth_user_user_permissions_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +ALTER TABLE public.auth_user_user_permissions ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY ( + SEQUENCE NAME public.auth_user_user_permissions_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1 +); + + +-- +-- Name: core_cliente; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.core_cliente ( + id bigint NOT NULL, + limite integer NOT NULL, + saldo integer NOT NULL +); + + +ALTER TABLE public.core_cliente OWNER TO postgres; + +-- +-- Name: core_cliente_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +ALTER TABLE public.core_cliente ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY ( + SEQUENCE NAME public.core_cliente_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1 +); + + +-- +-- Name: core_transacao; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.core_transacao ( + id bigint NOT NULL, + valor integer NOT NULL, + realizada_em timestamp with time zone NOT NULL, + tipo character varying(1) NOT NULL, + descricao character varying(10) NOT NULL, + cliente_id bigint NOT NULL +); + + +ALTER TABLE public.core_transacao OWNER TO postgres; + +-- +-- Name: core_transacao_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +ALTER TABLE public.core_transacao ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY ( + SEQUENCE NAME public.core_transacao_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1 +); + + +-- +-- Name: django_admin_log; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.django_admin_log ( + id integer NOT NULL, + action_time timestamp with time zone NOT NULL, + object_id text, + object_repr character varying(200) NOT NULL, + action_flag smallint NOT NULL, + change_message text NOT NULL, + content_type_id integer, + user_id integer NOT NULL, + CONSTRAINT django_admin_log_action_flag_check CHECK ((action_flag >= 0)) +); + + +ALTER TABLE public.django_admin_log OWNER TO postgres; + +-- +-- Name: django_admin_log_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +ALTER TABLE public.django_admin_log ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY ( + SEQUENCE NAME public.django_admin_log_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1 +); + + +-- +-- Name: django_content_type; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.django_content_type ( + id integer NOT NULL, + app_label character varying(100) NOT NULL, + model character varying(100) NOT NULL +); + + +ALTER TABLE public.django_content_type OWNER TO postgres; + +-- +-- Name: django_content_type_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +ALTER TABLE public.django_content_type ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY ( + SEQUENCE NAME public.django_content_type_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1 +); + + +-- +-- Name: django_migrations; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.django_migrations ( + id bigint NOT NULL, + app character varying(255) NOT NULL, + name character varying(255) NOT NULL, + applied timestamp with time zone NOT NULL +); + + +ALTER TABLE public.django_migrations OWNER TO postgres; + +-- +-- Name: django_migrations_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +ALTER TABLE public.django_migrations ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY ( + SEQUENCE NAME public.django_migrations_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1 +); + + +-- +-- Name: django_session; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.django_session ( + session_key character varying(40) NOT NULL, + session_data text NOT NULL, + expire_date timestamp with time zone NOT NULL +); + + +ALTER TABLE public.django_session OWNER TO postgres; + +-- +-- Data for Name: auth_group; Type: TABLE DATA; Schema: public; Owner: postgres +-- + +COPY public.auth_group (id, name) FROM stdin; +\. + + +-- +-- Data for Name: auth_group_permissions; Type: TABLE DATA; Schema: public; Owner: postgres +-- + +COPY public.auth_group_permissions (id, group_id, permission_id) FROM stdin; +\. + + +-- +-- Data for Name: auth_permission; Type: TABLE DATA; Schema: public; Owner: postgres +-- + +COPY public.auth_permission (id, name, content_type_id, codename) FROM stdin; +1 Can add cliente 1 add_cliente +2 Can change cliente 1 change_cliente +3 Can delete cliente 1 delete_cliente +4 Can view cliente 1 view_cliente +5 Can add transacao 2 add_transacao +6 Can change transacao 2 change_transacao +7 Can delete transacao 2 delete_transacao +8 Can view transacao 2 view_transacao +9 Can add log entry 3 add_logentry +10 Can change log entry 3 change_logentry +11 Can delete log entry 3 delete_logentry +12 Can view log entry 3 view_logentry +13 Can add permission 4 add_permission +14 Can change permission 4 change_permission +15 Can delete permission 4 delete_permission +16 Can view permission 4 view_permission +17 Can add group 5 add_group +18 Can change group 5 change_group +19 Can delete group 5 delete_group +20 Can view group 5 view_group +21 Can add user 6 add_user +22 Can change user 6 change_user +23 Can delete user 6 delete_user +24 Can view user 6 view_user +25 Can add content type 7 add_contenttype +26 Can change content type 7 change_contenttype +27 Can delete content type 7 delete_contenttype +28 Can view content type 7 view_contenttype +29 Can add session 8 add_session +30 Can change session 8 change_session +31 Can delete session 8 delete_session +32 Can view session 8 view_session +\. + + +-- +-- Data for Name: auth_user; Type: TABLE DATA; Schema: public; Owner: postgres +-- + +COPY public.auth_user (id, password, last_login, is_superuser, username, first_name, last_name, email, is_staff, is_active, date_joined) FROM stdin; +1 pbkdf2_sha256$720000$pdTs19oYLarKavA4Y3Gzct$7NlzsF6SbnsHp9sfRH5rdnmHU6JIoQWKr9eBZ7+qV18= 2024-02-26 21:21:48.643041+00 t admin admin@test.com t t 2024-02-26 21:21:39.324029+00 +\. + + +-- +-- Data for Name: auth_user_groups; Type: TABLE DATA; Schema: public; Owner: postgres +-- + +COPY public.auth_user_groups (id, user_id, group_id) FROM stdin; +\. + + +-- +-- Data for Name: auth_user_user_permissions; Type: TABLE DATA; Schema: public; Owner: postgres +-- + +COPY public.auth_user_user_permissions (id, user_id, permission_id) FROM stdin; +\. + + +-- +-- Data for Name: core_cliente; Type: TABLE DATA; Schema: public; Owner: postgres +-- + +COPY public.core_cliente (id, limite, saldo) FROM stdin; +1 100000 0 +2 80000 0 +3 1000000 0 +4 10000000 0 +5 500000 0 +\. + + +-- +-- Data for Name: core_transacao; Type: TABLE DATA; Schema: public; Owner: postgres +-- + +COPY public.core_transacao (id, valor, realizada_em, tipo, descricao, cliente_id) FROM stdin; +\. + + +-- +-- Data for Name: django_admin_log; Type: TABLE DATA; Schema: public; Owner: postgres +-- + +COPY public.django_admin_log (id, action_time, object_id, object_repr, action_flag, change_message, content_type_id, user_id) FROM stdin; +1 2024-02-26 21:22:19.782392+00 1 Cliente object (1) 1 [{"added": {}}] 1 1 +2 2024-02-26 21:22:27.66004+00 2 Cliente object (2) 1 [{"added": {}}] 1 1 +3 2024-02-26 21:22:36.319745+00 3 Cliente object (3) 1 [{"added": {}}] 1 1 +4 2024-02-26 21:22:45.160391+00 4 Cliente object (4) 1 [{"added": {}}] 1 1 +5 2024-02-26 21:22:53.789337+00 5 Cliente object (5) 1 [{"added": {}}] 1 1 +\. + + +-- +-- Data for Name: django_content_type; Type: TABLE DATA; Schema: public; Owner: postgres +-- + +COPY public.django_content_type (id, app_label, model) FROM stdin; +1 core cliente +2 core transacao +3 admin logentry +4 auth permission +5 auth group +6 auth user +7 contenttypes contenttype +8 sessions session +\. + + +-- +-- Data for Name: django_migrations; Type: TABLE DATA; Schema: public; Owner: postgres +-- + +COPY public.django_migrations (id, app, name, applied) FROM stdin; +1 contenttypes 0001_initial 2024-02-26 21:20:30.522603+00 +2 auth 0001_initial 2024-02-26 21:20:30.569335+00 +3 admin 0001_initial 2024-02-26 21:20:30.583129+00 +4 admin 0002_logentry_remove_auto_add 2024-02-26 21:20:30.588241+00 +5 admin 0003_logentry_add_action_flag_choices 2024-02-26 21:20:30.593664+00 +6 contenttypes 0002_remove_content_type_name 2024-02-26 21:20:30.605887+00 +7 auth 0002_alter_permission_name_max_length 2024-02-26 21:20:30.612578+00 +8 auth 0003_alter_user_email_max_length 2024-02-26 21:20:30.619442+00 +9 auth 0004_alter_user_username_opts 2024-02-26 21:20:30.625239+00 +10 auth 0005_alter_user_last_login_null 2024-02-26 21:20:30.63229+00 +11 auth 0006_require_contenttypes_0002 2024-02-26 21:20:30.634276+00 +12 auth 0007_alter_validators_add_error_messages 2024-02-26 21:20:30.640056+00 +13 auth 0008_alter_user_username_max_length 2024-02-26 21:20:30.648543+00 +14 auth 0009_alter_user_last_name_max_length 2024-02-26 21:20:30.654689+00 +15 auth 0010_alter_group_name_max_length 2024-02-26 21:20:30.662724+00 +16 auth 0011_update_proxy_permissions 2024-02-26 21:20:30.668142+00 +17 auth 0012_alter_user_first_name_max_length 2024-02-26 21:20:30.674754+00 +18 core 0001_initial 2024-02-26 21:20:30.686673+00 +19 sessions 0001_initial 2024-02-26 21:20:30.694777+00 +\. + + +-- +-- Data for Name: django_session; Type: TABLE DATA; Schema: public; Owner: postgres +-- + +COPY public.django_session (session_key, session_data, expire_date) FROM stdin; +s0tee0isftjgyvuf0lr0zk59hsjjcez4 .eJxVjM0OwiAQhN-FsyFCcVk8eu8zkF1-pGpoUtqT8d2lSQ96m5lvZt7C07YWv7W0-CmKq1Di9JsxhWeqO4gPqvdZhrmuy8Ryr8iDNjnOMb1uR_fvoFArfZ2jOytjgbNRMGBUl0EjosIALnWPSdtMznbJQIAUDIO1QGwwZ9bi8wXGujec:1reiQ0:nchjmI5hAL-r7otR7Svfh6guOHmgC9LhPlXTFJ1A3Ao 2024-03-11 21:21:48.645449+00 +\. + + +-- +-- Name: auth_group_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres +-- + +SELECT pg_catalog.setval('public.auth_group_id_seq', 1, false); + + +-- +-- Name: auth_group_permissions_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres +-- + +SELECT pg_catalog.setval('public.auth_group_permissions_id_seq', 1, false); + + +-- +-- Name: auth_permission_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres +-- + +SELECT pg_catalog.setval('public.auth_permission_id_seq', 32, true); + + +-- +-- Name: auth_user_groups_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres +-- + +SELECT pg_catalog.setval('public.auth_user_groups_id_seq', 1, false); + + +-- +-- Name: auth_user_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres +-- + +SELECT pg_catalog.setval('public.auth_user_id_seq', 1, true); + + +-- +-- Name: auth_user_user_permissions_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres +-- + +SELECT pg_catalog.setval('public.auth_user_user_permissions_id_seq', 1, false); + + +-- +-- Name: core_cliente_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres +-- + +SELECT pg_catalog.setval('public.core_cliente_id_seq', 5, true); + + +-- +-- Name: core_transacao_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres +-- + +SELECT pg_catalog.setval('public.core_transacao_id_seq', 1, false); + + +-- +-- Name: django_admin_log_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres +-- + +SELECT pg_catalog.setval('public.django_admin_log_id_seq', 5, true); + + +-- +-- Name: django_content_type_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres +-- + +SELECT pg_catalog.setval('public.django_content_type_id_seq', 8, true); + + +-- +-- Name: django_migrations_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres +-- + +SELECT pg_catalog.setval('public.django_migrations_id_seq', 19, true); + + +-- +-- Name: auth_group auth_group_name_key; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.auth_group + ADD CONSTRAINT auth_group_name_key UNIQUE (name); + + +-- +-- Name: auth_group_permissions auth_group_permissions_group_id_permission_id_0cd325b0_uniq; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.auth_group_permissions + ADD CONSTRAINT auth_group_permissions_group_id_permission_id_0cd325b0_uniq UNIQUE (group_id, permission_id); + + +-- +-- Name: auth_group_permissions auth_group_permissions_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.auth_group_permissions + ADD CONSTRAINT auth_group_permissions_pkey PRIMARY KEY (id); + + +-- +-- Name: auth_group auth_group_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.auth_group + ADD CONSTRAINT auth_group_pkey PRIMARY KEY (id); + + +-- +-- Name: auth_permission auth_permission_content_type_id_codename_01ab375a_uniq; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.auth_permission + ADD CONSTRAINT auth_permission_content_type_id_codename_01ab375a_uniq UNIQUE (content_type_id, codename); + + +-- +-- Name: auth_permission auth_permission_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.auth_permission + ADD CONSTRAINT auth_permission_pkey PRIMARY KEY (id); + + +-- +-- Name: auth_user_groups auth_user_groups_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.auth_user_groups + ADD CONSTRAINT auth_user_groups_pkey PRIMARY KEY (id); + + +-- +-- Name: auth_user_groups auth_user_groups_user_id_group_id_94350c0c_uniq; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.auth_user_groups + ADD CONSTRAINT auth_user_groups_user_id_group_id_94350c0c_uniq UNIQUE (user_id, group_id); + + +-- +-- Name: auth_user auth_user_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.auth_user + ADD CONSTRAINT auth_user_pkey PRIMARY KEY (id); + + +-- +-- Name: auth_user_user_permissions auth_user_user_permissions_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.auth_user_user_permissions + ADD CONSTRAINT auth_user_user_permissions_pkey PRIMARY KEY (id); + + +-- +-- Name: auth_user_user_permissions auth_user_user_permissions_user_id_permission_id_14a6b632_uniq; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.auth_user_user_permissions + ADD CONSTRAINT auth_user_user_permissions_user_id_permission_id_14a6b632_uniq UNIQUE (user_id, permission_id); + + +-- +-- Name: auth_user auth_user_username_key; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.auth_user + ADD CONSTRAINT auth_user_username_key UNIQUE (username); + + +-- +-- Name: core_cliente core_cliente_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.core_cliente + ADD CONSTRAINT core_cliente_pkey PRIMARY KEY (id); + + +-- +-- Name: core_transacao core_transacao_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.core_transacao + ADD CONSTRAINT core_transacao_pkey PRIMARY KEY (id); + + +-- +-- Name: django_admin_log django_admin_log_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.django_admin_log + ADD CONSTRAINT django_admin_log_pkey PRIMARY KEY (id); + + +-- +-- Name: django_content_type django_content_type_app_label_model_76bd3d3b_uniq; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.django_content_type + ADD CONSTRAINT django_content_type_app_label_model_76bd3d3b_uniq UNIQUE (app_label, model); + + +-- +-- Name: django_content_type django_content_type_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.django_content_type + ADD CONSTRAINT django_content_type_pkey PRIMARY KEY (id); + + +-- +-- Name: django_migrations django_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.django_migrations + ADD CONSTRAINT django_migrations_pkey PRIMARY KEY (id); + + +-- +-- Name: django_session django_session_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.django_session + ADD CONSTRAINT django_session_pkey PRIMARY KEY (session_key); + + +-- +-- Name: auth_group_name_a6ea08ec_like; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX auth_group_name_a6ea08ec_like ON public.auth_group USING btree (name varchar_pattern_ops); + + +-- +-- Name: auth_group_permissions_group_id_b120cbf9; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX auth_group_permissions_group_id_b120cbf9 ON public.auth_group_permissions USING btree (group_id); + + +-- +-- Name: auth_group_permissions_permission_id_84c5c92e; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX auth_group_permissions_permission_id_84c5c92e ON public.auth_group_permissions USING btree (permission_id); + + +-- +-- Name: auth_permission_content_type_id_2f476e4b; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX auth_permission_content_type_id_2f476e4b ON public.auth_permission USING btree (content_type_id); + + +-- +-- Name: auth_user_groups_group_id_97559544; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX auth_user_groups_group_id_97559544 ON public.auth_user_groups USING btree (group_id); + + +-- +-- Name: auth_user_groups_user_id_6a12ed8b; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX auth_user_groups_user_id_6a12ed8b ON public.auth_user_groups USING btree (user_id); + + +-- +-- Name: auth_user_user_permissions_permission_id_1fbb5f2c; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX auth_user_user_permissions_permission_id_1fbb5f2c ON public.auth_user_user_permissions USING btree (permission_id); + + +-- +-- Name: auth_user_user_permissions_user_id_a95ead1b; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX auth_user_user_permissions_user_id_a95ead1b ON public.auth_user_user_permissions USING btree (user_id); + + +-- +-- Name: auth_user_username_6821ab7c_like; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX auth_user_username_6821ab7c_like ON public.auth_user USING btree (username varchar_pattern_ops); + + +-- +-- Name: core_transacao_cliente_id_ccbda40f; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX core_transacao_cliente_id_ccbda40f ON public.core_transacao USING btree (cliente_id); + + +-- +-- Name: django_admin_log_content_type_id_c4bce8eb; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX django_admin_log_content_type_id_c4bce8eb ON public.django_admin_log USING btree (content_type_id); + + +-- +-- Name: django_admin_log_user_id_c564eba6; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX django_admin_log_user_id_c564eba6 ON public.django_admin_log USING btree (user_id); + + +-- +-- Name: django_session_expire_date_a5c62663; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX django_session_expire_date_a5c62663 ON public.django_session USING btree (expire_date); + + +-- +-- Name: django_session_session_key_c0390e0f_like; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX django_session_session_key_c0390e0f_like ON public.django_session USING btree (session_key varchar_pattern_ops); + + +-- +-- Name: auth_group_permissions auth_group_permissio_permission_id_84c5c92e_fk_auth_perm; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.auth_group_permissions + ADD CONSTRAINT auth_group_permissio_permission_id_84c5c92e_fk_auth_perm FOREIGN KEY (permission_id) REFERENCES public.auth_permission(id) DEFERRABLE INITIALLY DEFERRED; + + +-- +-- Name: auth_group_permissions auth_group_permissions_group_id_b120cbf9_fk_auth_group_id; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.auth_group_permissions + ADD CONSTRAINT auth_group_permissions_group_id_b120cbf9_fk_auth_group_id FOREIGN KEY (group_id) REFERENCES public.auth_group(id) DEFERRABLE INITIALLY DEFERRED; + + +-- +-- Name: auth_permission auth_permission_content_type_id_2f476e4b_fk_django_co; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.auth_permission + ADD CONSTRAINT auth_permission_content_type_id_2f476e4b_fk_django_co FOREIGN KEY (content_type_id) REFERENCES public.django_content_type(id) DEFERRABLE INITIALLY DEFERRED; + + +-- +-- Name: auth_user_groups auth_user_groups_group_id_97559544_fk_auth_group_id; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.auth_user_groups + ADD CONSTRAINT auth_user_groups_group_id_97559544_fk_auth_group_id FOREIGN KEY (group_id) REFERENCES public.auth_group(id) DEFERRABLE INITIALLY DEFERRED; + + +-- +-- Name: auth_user_groups auth_user_groups_user_id_6a12ed8b_fk_auth_user_id; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.auth_user_groups + ADD CONSTRAINT auth_user_groups_user_id_6a12ed8b_fk_auth_user_id FOREIGN KEY (user_id) REFERENCES public.auth_user(id) DEFERRABLE INITIALLY DEFERRED; + + +-- +-- Name: auth_user_user_permissions auth_user_user_permi_permission_id_1fbb5f2c_fk_auth_perm; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.auth_user_user_permissions + ADD CONSTRAINT auth_user_user_permi_permission_id_1fbb5f2c_fk_auth_perm FOREIGN KEY (permission_id) REFERENCES public.auth_permission(id) DEFERRABLE INITIALLY DEFERRED; + + +-- +-- Name: auth_user_user_permissions auth_user_user_permissions_user_id_a95ead1b_fk_auth_user_id; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.auth_user_user_permissions + ADD CONSTRAINT auth_user_user_permissions_user_id_a95ead1b_fk_auth_user_id FOREIGN KEY (user_id) REFERENCES public.auth_user(id) DEFERRABLE INITIALLY DEFERRED; + + +-- +-- Name: core_transacao core_transacao_cliente_id_ccbda40f_fk_core_cliente_id; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.core_transacao + ADD CONSTRAINT core_transacao_cliente_id_ccbda40f_fk_core_cliente_id FOREIGN KEY (cliente_id) REFERENCES public.core_cliente(id) DEFERRABLE INITIALLY DEFERRED; + + +-- +-- Name: django_admin_log django_admin_log_content_type_id_c4bce8eb_fk_django_co; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.django_admin_log + ADD CONSTRAINT django_admin_log_content_type_id_c4bce8eb_fk_django_co FOREIGN KEY (content_type_id) REFERENCES public.django_content_type(id) DEFERRABLE INITIALLY DEFERRED; + + +-- +-- Name: django_admin_log django_admin_log_user_id_c564eba6_fk_auth_user_id; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.django_admin_log + ADD CONSTRAINT django_admin_log_user_id_c564eba6_fk_auth_user_id FOREIGN KEY (user_id) REFERENCES public.auth_user(id) DEFERRABLE INITIALLY DEFERRED; + + +-- +-- PostgreSQL database dump complete +-- + diff --git a/conf/nginx.conf b/conf/nginx.conf new file mode 100644 index 0000000..ca71823 --- /dev/null +++ b/conf/nginx.conf @@ -0,0 +1,20 @@ +events { + worker_connections 512; +} + +http { + access_log off; + + upstream api { + server api1:8080; + server api2:8080; + } + + server { + listen 9999; + + location / { + proxy_pass http://api; + } + } +} \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 0d7fcb4..247f5e4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -36,4 +36,27 @@ services: - "5050:80" environment: PGADMIN_DEFAULT_EMAIL: "rafaelpadovezi@gmail.com" - PGADMIN_DEFAULT_PASSWORD: "admin" \ No newline at end of file + PGADMIN_DEFAULT_PASSWORD: "admin" + + api1: &api1 + build: . + hostname: api1 + depends_on: + db: + condition: service_healthy + environment: + - DB_HOST=db + api2: + <<: *api1 + hostname: api2 + ports: + - "8080:8080" + nginx: + image: nginx:alpine + ports: + - "9999:9999" + volumes: + - ./conf/nginx.conf:/etc/nginx/nginx.conf:ro + depends_on: + - api1 + - api2 diff --git a/rinha/apps/core/serializers.py b/rinha/apps/core/serializers.py index e98ebe7..b30cbe5 100644 --- a/rinha/apps/core/serializers.py +++ b/rinha/apps/core/serializers.py @@ -3,7 +3,7 @@ class TransacaoSerializer(serializers.ModelSerializer): - descricao = serializers.CharField(required=True, max_length=10) + descricao = serializers.CharField(required=True, max_length=10, min_length=1) tipo = serializers.ChoiceField(choices=Transacao.TIPO_CHOICES) valor = serializers.IntegerField(required=True, min_value=1) diff --git a/rinha/apps/core/views.py b/rinha/apps/core/views.py index 57115c7..f8e9334 100644 --- a/rinha/apps/core/views.py +++ b/rinha/apps/core/views.py @@ -6,6 +6,9 @@ from rinha.apps.core.models import Transacao from django.db import transaction from rinha.apps.core.serializers import TransacaoSerializer +import logging + +logger = logging.getLogger(__name__) class TransacaoView(APIView): @@ -33,8 +36,10 @@ def get_extrato(request: Request, id: int) -> Response: return Response( { - "limite": cliente.limite, - "saldo": cliente.saldo, + "saldo": { + "limite": cliente.limite, + "total": cliente.saldo, + }, "ultimas_transacoes": ultimas_transacoes, } ) @@ -43,7 +48,8 @@ def get_extrato(request: Request, id: int) -> Response: @api_view(["POST"]) def create_transacao(request: Request, id: int) -> Response: serializer = TransacaoSerializer(data=request.data) - serializer.is_valid(raise_exception=True) + if not serializer.is_valid(): + return Response(serializer.errors, status=422) transacao = serializer.validated_data valor_transacao = ( diff --git a/rinha/settings.py b/rinha/settings.py index 256bc52..315c6dc 100644 --- a/rinha/settings.py +++ b/rinha/settings.py @@ -26,7 +26,28 @@ # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = [] +ALLOWED_HOSTS = ["*"] + +LOGGING = { + "version": 1, + "disable_existing_loggers": False, + "handlers": { + "console": { + "class": "logging.StreamHandler", + }, + }, + "root": { + "handlers": ["console"], + "level": "WARNING", + }, + "loggers": { + "django": { + "handlers": ["console"], + "level": os.getenv("DJANGO_LOG_LEVEL", "WARNING"), + "propagate": False, + }, + }, +} # Application definition