diff --git a/backend/Dockerfile.prod b/backend/Dockerfile.prod new file mode 100644 index 0000000..c3f03e2 --- /dev/null +++ b/backend/Dockerfile.prod @@ -0,0 +1,23 @@ +FROM alpine:3 + +RUN apk update +RUN apk --no-cache add php8 php8-openssl php8-pdo php8-pdo_mysql \ + php8-pdo_sqlite php8-pdo_pgsql php8-mbstring \ + php8-phar php8-curl php8-dom php8-xml \ + php8-xmlwriter php8-tokenizer \ + zip unzip curl sqlite + +RUN ln -s /usr/bin/php8 /usr/bin/php +RUN curl -s https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin/ --filename=composer + +WORKDIR /lumen + +COPY composer.json . +COPY composer.lock . + +RUN composer install --no-ansi --no-dev --no-interaction --no-plugins \ + --no-progress --no-scripts --optimize-autoloader + +COPY . /lumen + +ENTRYPOINT ["php", "-S", "0.0.0.0:8080", "-t", "public"] diff --git a/backend/app/Http/Controllers/UsuariosController.php b/backend/app/Http/Controllers/UsuariosController.php index 4e52a16..4f0804b 100644 --- a/backend/app/Http/Controllers/UsuariosController.php +++ b/backend/app/Http/Controllers/UsuariosController.php @@ -45,7 +45,7 @@ class UsuariosController extends Controller { */ public function get(Request $request, $id) { if (!str_starts_with($id, 'auth0')) app(UuidService::class)->validOrFail($id); - $usuario = Usuario::findOrFail($id); + $usuario = Usuario::findOrFail(urldecode($id)); return response()->json($usuario); } @@ -107,7 +107,7 @@ class UsuariosController extends Controller { 'roles.*' => ['sometimes', Rule::in(['admin', 'mesero', 'recaudador', 'productor'])], ]); - $usuario = Usuario::findOrFail($id); + $usuario = Usuario::findOrFail(urldecode($id)); $metadata = []; if ($request->input('roles')) $metadata['roles'] = $request->input('roles'); @@ -140,7 +140,7 @@ class UsuariosController extends Controller { public function delete(Request $request, $id) { if (!str_starts_with($id, 'auth0')) app(UuidService::class)->validOrFail($id); - $usuario = Usuario::findOrFail($id); + $usuario = Usuario::findOrFail(urldecode($id)); $auth0 = app(Auth0Service::class); $auth0Response = $auth0->deleteUser($usuario->auth0_id); @@ -157,6 +157,16 @@ class UsuariosController extends Controller { return response()->json([], 204); } + /** + * Obtiene los usuarios de un restaurant + */ + public function getRestaurantes(Request $request, $id) { + if (!str_starts_with($id, 'auth0')) app(UuidService::class)->validOrFail($id); + $usuario = Usuario::findOrFail(urldecode($id)); + + return response()->json($usuario->restaurantes); + } + /** * Agrega usuario a un restaurant */ @@ -164,7 +174,7 @@ class UsuariosController extends Controller { if (!str_starts_with($id, 'auth0')) app(UuidService::class)->validOrFail($id); app(UuidService::class)->validOrFail($restaurant); - $usuario = Usuario::findOrFail($id); + $usuario = Usuario::findOrFail(urldecode($id)); $restaurant = Restaurante::findOrFail($restaurant); if ($usuario->restaurantes->contains($restaurant)) { @@ -186,7 +196,7 @@ class UsuariosController extends Controller { if (!str_starts_with($id, 'auth0')) app(UuidService::class)->validOrFail($id); app(UuidService::class)->validOrFail($restaurant); - $usuario = Usuario::findOrFail($id); + $usuario = Usuario::findOrFail(urldecode($id)); $restaurant = Restaurante::findOrFail($restaurant); if (!$usuario->restaurantes->contains($restaurant)) { diff --git a/backend/app/Http/Middleware/CorsMiddleware.php b/backend/app/Http/Middleware/CorsMiddleware.php new file mode 100644 index 0000000..58a9a99 --- /dev/null +++ b/backend/app/Http/Middleware/CorsMiddleware.php @@ -0,0 +1,31 @@ + '*', + 'Access-Control-Allow-Methods' => 'POST, GET, OPTIONS, PUT, PATCH, DELETE', + 'Access-Control-Allow-Credentials' => 'true', + 'Access-Control-Max-Age' => '86400', + 'Access-Control-Allow-Headers' => 'Content-Type, Authorization, X-Requested-With' + ]; + + if ($request->isMethod('OPTIONS')) + { + return response()->json([], 200, $headers); + } + + $response = $next($request); + + foreach($headers as $key => $value) + { + $response->header($key, $value); + } + + return $response; + } +} diff --git a/backend/bootstrap/app.php b/backend/bootstrap/app.php index eacf562..891d15e 100644 --- a/backend/bootstrap/app.php +++ b/backend/bootstrap/app.php @@ -79,6 +79,10 @@ $app->routeMiddleware([ 'log_endpoint' => App\Http\Middleware\LogEndpointHitMiddleware::class ]); +$app->middleware([ + App\Http\Middleware\CorsMiddleware::class, +]); + /* |-------------------------------------------------------------------------- | Register Service Providers diff --git a/backend/routes/web.php b/backend/routes/web.php index 1a27326..ce37526 100644 --- a/backend/routes/web.php +++ b/backend/routes/web.php @@ -13,6 +13,7 @@ $router->group(['prefix' => 'api/v1', 'middleware' => ['auth', 'log_endpoint']], $router->post( '/', ['as' => 'users.create', 'uses' => 'UsuariosController@create']); $router->put( '/{id}', ['as' => 'users.update', 'uses' => 'UsuariosController@update']); $router->delete('/{id}', ['as' => 'users.delete', 'uses' => 'UsuariosController@delete']); + $router->get( '/{id}/restaurantes/', ['as' => 'users.get_restaurantes', 'uses' => 'UsuariosController@getRestaurantes']); $router->put( '/{id}/restaurantes/{restaurant}', ['as' => 'users.add_to_restaurant', 'uses' => 'UsuariosController@addToRestaurant']); $router->delete('/{id}/restaurantes/{restaurant}', ['as' => 'users.remove_from_restaurant', 'uses' => 'UsuariosController@removeFromRestaurant']); }); diff --git a/database/init/00-schema.sql b/database/init/00-schema.sql index da44e72..4f419b6 100644 --- a/database/init/00-schema.sql +++ b/database/init/00-schema.sql @@ -33,7 +33,8 @@ drop table if exists medios_pago cascade; drop table if exists cajas cascade; drop table if exists estados_produccion cascade; -create table restaurantes ( +create table restaurantes +( id uuid primary key default gen_random_uuid(), nombre text not null, created_at timestamptz not null default current_timestamp, @@ -41,7 +42,8 @@ create table restaurantes ( deleted_at timestamptz ); -create table categorias ( +create table categorias +( id uuid primary key default gen_random_uuid(), nombre text not null, restaurante_id uuid references restaurantes, @@ -50,7 +52,8 @@ create table categorias ( deleted_at timestamptz ); -create table zonas_produccion ( +create table zonas_produccion +( id uuid primary key default gen_random_uuid(), nombre text not null, restaurante_id uuid references restaurantes, @@ -59,7 +62,8 @@ create table zonas_produccion ( deleted_at timestamptz ); -create table usuarios ( +create table usuarios +( id uuid primary key default gen_random_uuid(), auth0_id text not null, nombre text not null, @@ -68,7 +72,8 @@ create table usuarios ( deleted_at timestamptz ); -create table usuarios_restaurantes ( +create table usuarios_restaurantes +( usuario_id uuid references usuarios, restaurante_id uuid references restaurantes, created_at timestamptz not null default current_timestamp, @@ -77,7 +82,8 @@ create table usuarios_restaurantes ( primary key (usuario_id, restaurante_id) ); -create table productores ( +create table productores +( id uuid primary key default gen_random_uuid(), usuario_id uuid references usuarios, zona_produccion_id uuid references zonas_produccion, @@ -86,7 +92,8 @@ create table productores ( deleted_at timestamptz ); -create table recaudadores ( +create table recaudadores +( id uuid primary key default gen_random_uuid(), usuario_id uuid references usuarios, created_at timestamptz not null default current_timestamp, @@ -94,7 +101,8 @@ create table recaudadores ( deleted_at timestamptz ); -create table meseros ( +create table meseros +( id uuid primary key default gen_random_uuid(), usuario_id uuid references usuarios, created_at timestamptz not null default current_timestamp, @@ -102,7 +110,8 @@ create table meseros ( deleted_at timestamptz ); -create table administradores ( +create table administradores +( id uuid primary key default gen_random_uuid(), usuario_id uuid references usuarios, created_at timestamptz not null default current_timestamp, @@ -110,7 +119,8 @@ create table administradores ( deleted_at timestamptz ); -create table ingredientes ( +create table ingredientes +( id uuid primary key default gen_random_uuid(), nombre text not null, medida text not null, @@ -120,7 +130,8 @@ create table ingredientes ( deleted_at timestamptz ); -create table productos ( +create table productos +( id uuid primary key default gen_random_uuid(), nombre text not null, precio_venta bigint not null, @@ -132,7 +143,8 @@ create table productos ( deleted_at timestamptz ); -create table recetas ( +create table recetas +( id uuid primary key default gen_random_uuid(), producto_id uuid references productos, ingrediente_id uuid references ingredientes, @@ -143,7 +155,8 @@ create table recetas ( primary key (producto_id, ingrediente_id) ); -create table proveedores ( +create table proveedores +( id uuid primary key default gen_random_uuid(), rut text not null, nombre text not null, @@ -156,7 +169,8 @@ create table proveedores ( deleted_at timestamptz ); -create table compras ( +create table compras +( id uuid primary key default gen_random_uuid(), fecha_compra date not null, en_arqueo bool not null default true, @@ -167,7 +181,8 @@ create table compras ( deleted_at timestamptz ); -create table facturas ( +create table facturas +( id uuid primary key default gen_random_uuid(), numero text not null, monto_bruto bigint not null, @@ -182,7 +197,8 @@ create table facturas ( deleted_at timestamptz ); -create table compra_ingredientes ( +create table compra_ingredientes +( id uuid primary key default gen_random_uuid(), unidades numeric not null, monto_unitario_bruto bigint not null, @@ -194,7 +210,8 @@ create table compra_ingredientes ( deleted_at timestamptz ); -create table sectores ( +create table sectores +( id uuid primary key default gen_random_uuid(), nombre text not null, restaurante_id uuid references restaurantes, @@ -203,7 +220,8 @@ create table sectores ( deleted_at timestamptz ); -create table tipos_canal ( +create table tipos_canal +( id uuid primary key default gen_random_uuid(), nombre text not null, created_at timestamptz not null default current_timestamp, @@ -211,7 +229,8 @@ create table tipos_canal ( deleted_at timestamptz ); -create table canales_venta ( +create table canales_venta +( id uuid primary key default gen_random_uuid(), nombre text not null, sector_id uuid references sectores, @@ -222,7 +241,8 @@ create table canales_venta ( deleted_at timestamptz ); -create table medios_pago ( +create table medios_pago +( id uuid primary key default gen_random_uuid(), nombre text not null, created_at timestamptz not null default current_timestamp, @@ -230,7 +250,8 @@ create table medios_pago ( deleted_at timestamptz ); -create table cajas ( +create table cajas +( id uuid primary key default gen_random_uuid(), fondo bigint not null, apertura timestamptz not null, @@ -240,7 +261,8 @@ create table cajas ( deleted_at timestamptz ); -create table efectivos ( +create table efectivos +( id uuid primary key default gen_random_uuid(), veinte_mil bigint not null, diez_mil bigint not null, @@ -257,7 +279,8 @@ create table efectivos ( deleted_at timestamptz ); -create table ventas ( +create table ventas +( id uuid primary key default gen_random_uuid(), tiempo_venta timestamptz, mesero_id uuid references meseros, @@ -270,7 +293,8 @@ create table ventas ( deleted_at timestamptz ); -create table boletas_electronicas ( +create table boletas_electronicas +( id uuid primary key default gen_random_uuid(), numero_boleta text not null, venta_id uuid references ventas, @@ -280,7 +304,8 @@ create table boletas_electronicas ( deleted_at timestamptz ); -create table boletas_exentas ( +create table boletas_exentas +( id uuid primary key default gen_random_uuid(), venta_id uuid references ventas, restaurante_id uuid references restaurantes, @@ -289,7 +314,8 @@ create table boletas_exentas ( deleted_at timestamptz ); -create table estados_produccion ( +create table estados_produccion +( id uuid primary key default gen_random_uuid(), nombre text not null, created_at timestamptz not null default current_timestamp, @@ -297,7 +323,8 @@ create table estados_produccion ( deleted_at timestamptz ); -create table venta_productos ( +create table venta_productos +( id uuid primary key default gen_random_uuid(), tiempo_entrada timestamptz not null, tiempo_salida timestamptz null, @@ -309,6 +336,28 @@ create table venta_productos ( deleted_at timestamptz ); +create table bodega_egresos +( + unidades numeric not null, + fecha timestamptz not null, + ingrediente_id uuid references ingredientes, + restaurante_id uuid references restaurantes, + created_at timestamptz not null default current_timestamp, + updated_at timestamptz not null default current_timestamp, + deleted_at timestamptz +); + +create table bodega_ingresos +( + unidades numeric not null, + fecha timestamptz not null, + ingrediente_id uuid references ingredientes, + restaurante_id uuid references restaurantes, + created_at timestamptz not null default current_timestamp, + updated_at timestamptz not null default current_timestamp, + deleted_at timestamptz +); + ------------------------------------ --- Indexes para todas las referencias ------------------------------------ @@ -343,31 +392,114 @@ create index boletas_exentas_restaurante_id on boletas_exentas (restaurante_id); create index venta_productos_venta_id on venta_productos (venta_id); create index venta_productos_producto_id on venta_productos (producto_id); create index venta_productos_estado_id on venta_productos (estado_id); +create index bodega_egresos_ingrediente_id on bodega_egresos (ingrediente_id); +create index bodega_egresos_restaurante_id on bodega_egresos (restaurante_id); +create index bodega_ingresos_ingrediente_id on bodega_ingresos (ingrediente_id); +create index bodega_ingresos_restaurante_id on bodega_ingresos (restaurante_id); + +------------------------------------ +--- Triggers para poblar la bodega +------------------------------------ + +create or replace function bodega_egresos_trigger_insert_procedure() returns trigger + language PLPGSQL as +$$ +BEGIN + insert into bodega_egresos (ingrediente_id, unidades, fecha, restaurante_id) + select recetas.ingrediente_id as ingrediente_id, + recetas.unidades as unidades, + date(venta_productos.tiempo_entrada) as fecha, + ventas.restaurante_id as restaurante_id + from ventas + join venta_productos on ventas.id = venta_productos.venta_id + join productos on venta_productos.producto_id = productos.id + join recetas on productos.id = recetas.producto_id + where venta_productos.id = NEW.id; + RETURN null; +END; +$$; + +create or replace function bodega_egresos_trigger_delete_procedure() + returns trigger + language PLPGSQL as +$$ +BEGIN + insert into bodega_egresos (ingrediente_id, unidades, fecha, restaurante_id) + select recetas.ingrediente_id as ingrediente_id, + recetas.unidades * -1 as unidades, + date(venta_productos.tiempo_entrada) as fecha, + ventas.restaurante_id as restaurante_id + from ventas + join venta_productos on ventas.id = venta_productos.venta_id + join productos on venta_productos.producto_id = productos.id + join recetas on productos.id = recetas.producto_id + where venta_productos.id = OLD.id; + RETURN null; +END; +$$; + +create or replace function bodega_ingresos_trigger_insert_procedure() + returns trigger + language PLPGSQL as +$$ +BEGIN + insert into bodega_ingresos (ingrediente_id, unidades, fecha, restaurante_id) + select compra_ingredientes.ingrediente_id as ingrediente_id, + compra_ingredientes.unidades as unidades, + compras.fecha_compra as fecha, + compras.restaurante_id as restaurante_id + from compras + join compra_ingredientes on compras.id = compra_ingredientes.compra_id + where compra_ingredientes.id = NEW.id; + RETURN null; +END; +$$; + +create or replace function bodega_ingresos_trigger_delete_procedure() + returns trigger + language PLPGSQL as +$$ +BEGIN + insert into bodega_ingresos (ingrediente_id, unidades, fecha, restaurante_id) + select compra_ingredientes.ingrediente_id as ingrediente_id, + compra_ingredientes.unidades * -1 as unidades, + compras.fecha_compra as fecha, + compras.restaurante_id as restaurante_id + from compras + join compra_ingredientes on compras.id = compra_ingredientes.compra_id + where compra_ingredientes.id = OLD.id; + RETURN null; +END; +$$; + +create trigger bodega_egresos_insert_trigger + after insert + on venta_productos + for each row +execute procedure bodega_egresos_trigger_insert_procedure(); + +create trigger bodega_egresos_delete_trigger + after update of deleted_at + on venta_productos + for each row +execute procedure bodega_egresos_trigger_delete_procedure(); + +create trigger bodega_ingresos_insert_trigger + after insert + on compra_ingredientes + for each row +execute procedure bodega_ingresos_trigger_insert_procedure(); + +create trigger bodega_ingresos_delete_trigger + after update of deleted_at + on compra_ingredientes + for each row +execute procedure bodega_ingresos_trigger_delete_procedure(); ------------------------------------ --- Views para crear la bodega ------------------------------------ ---- View para obtener la lista de egresos de bodega -create view bodega_egresos as -select recetas.ingrediente_id as ingrediente_id, - recetas.unidades as unidades, - date(venta_productos.tiempo_entrada) as fecha, - ventas.restaurante_id as restaurante_id -from ventas - join venta_productos on ventas.id = venta_productos.venta_id - join productos on venta_productos.producto_id = productos.id - join recetas on productos.id = recetas.producto_id; - ---- View para obtener la lista de ingresos a bodega -create view bodega_ingresos as -select compra_ingredientes.ingrediente_id as ingrediente_id, - compra_ingredientes.unidades as unidades, - compras.fecha_compra as fecha, - compras.restaurante_id as restaurante_id -from compras - join compra_ingredientes on compras.id = compra_ingredientes.compra_id; - --- View que une el estado de bodega en una sola tabla create view bodega_movimientos as select ingrediente_id, unidades * -1 as unidades, fecha, restaurante_id diff --git a/database/modelo.vpp b/database/modelo.vpp index c7f1752..ddb1d9f 100644 Binary files a/database/modelo.vpp and b/database/modelo.vpp differ diff --git a/database/modifications/01-user-admin-id.sql b/database/modifications/01-user-admin-id.sql new file mode 100644 index 0000000..395cf04 --- /dev/null +++ b/database/modifications/01-user-admin-id.sql @@ -0,0 +1 @@ +update usuarios set auth0_id = 'auth0|606df4dea32e970069755bd8' where auth0_id = 'auth0|6083af726b4de900695cb232'; diff --git a/database/modifications/02-from-views-to-trigger.sql b/database/modifications/02-from-views-to-trigger.sql new file mode 100644 index 0000000..5215349 --- /dev/null +++ b/database/modifications/02-from-views-to-trigger.sql @@ -0,0 +1,144 @@ +start transaction; + +drop view bodega_actual cascade; +drop view bodega_movimientos cascade; +drop view bodega_egresos cascade; +drop view bodega_ingresos cascade; + +create table bodega_egresos +( + unidades numeric not null, + fecha timestamptz not null, + ingrediente_id uuid references ingredientes, + restaurante_id uuid references restaurantes, + created_at timestamptz not null default current_timestamp, + updated_at timestamptz not null default current_timestamp, + deleted_at timestamptz +); + +create table bodega_ingresos +( + unidades numeric not null, + fecha timestamptz not null, + ingrediente_id uuid references ingredientes, + restaurante_id uuid references restaurantes, + created_at timestamptz not null default current_timestamp, + updated_at timestamptz not null default current_timestamp, + deleted_at timestamptz +); + +create index bodega_egresos_ingrediente_id on bodega_egresos (ingrediente_id); +create index bodega_egresos_restaurante_id on bodega_egresos (restaurante_id); +create index bodega_ingresos_ingrediente_id on bodega_ingresos (ingrediente_id); +create index bodega_ingresos_restaurante_id on bodega_ingresos (restaurante_id); + +create or replace function bodega_egresos_trigger_insert_procedure() returns trigger + language PLPGSQL as +$$ +BEGIN + insert into bodega_egresos (ingrediente_id, unidades, fecha, restaurante_id) + select recetas.ingrediente_id as ingrediente_id, + recetas.unidades as unidades, + date(venta_productos.tiempo_entrada) as fecha, + ventas.restaurante_id as restaurante_id + from ventas + join venta_productos on ventas.id = venta_productos.venta_id + join productos on venta_productos.producto_id = productos.id + join recetas on productos.id = recetas.producto_id + where venta_productos.id = NEW.id; + RETURN null; +END; +$$; + +create or replace function bodega_egresos_trigger_delete_procedure() + returns trigger + language PLPGSQL as +$$ +BEGIN + insert into bodega_egresos (ingrediente_id, unidades, fecha, restaurante_id) + select recetas.ingrediente_id as ingrediente_id, + recetas.unidades * -1 as unidades, + date(venta_productos.tiempo_entrada) as fecha, + ventas.restaurante_id as restaurante_id + from ventas + join venta_productos on ventas.id = venta_productos.venta_id + join productos on venta_productos.producto_id = productos.id + join recetas on productos.id = recetas.producto_id + where venta_productos.id = OLD.id; + RETURN null; +END; +$$; + +create or replace function bodega_ingresos_trigger_insert_procedure() + returns trigger + language PLPGSQL as +$$ +BEGIN + insert into bodega_ingresos (ingrediente_id, unidades, fecha, restaurante_id) + select compra_ingredientes.ingrediente_id as ingrediente_id, + compra_ingredientes.unidades as unidades, + compras.fecha_compra as fecha, + compras.restaurante_id as restaurante_id + from compras + join compra_ingredientes on compras.id = compra_ingredientes.compra_id + where compra_ingredientes.id = NEW.id; + RETURN null; +END; +$$; + +create or replace function bodega_ingresos_trigger_delete_procedure() + returns trigger + language PLPGSQL as +$$ +BEGIN + insert into bodega_ingresos (ingrediente_id, unidades, fecha, restaurante_id) + select compra_ingredientes.ingrediente_id as ingrediente_id, + compra_ingredientes.unidades * -1 as unidades, + compras.fecha_compra as fecha, + compras.restaurante_id as restaurante_id + from compras + join compra_ingredientes on compras.id = compra_ingredientes.compra_id + where compra_ingredientes.id = OLD.id; + RETURN null; +END; +$$; + +create trigger bodega_egresos_insert_trigger + after insert + on venta_productos + for each row +execute procedure bodega_egresos_trigger_insert_procedure(); + +create trigger bodega_egresos_delete_trigger + after update of deleted_at + on venta_productos + for each row +execute procedure bodega_egresos_trigger_delete_procedure(); + +create trigger bodega_ingresos_insert_trigger + after insert + on compra_ingredientes + for each row +execute procedure bodega_ingresos_trigger_insert_procedure(); + +create trigger bodega_ingresos_delete_trigger + after update of deleted_at + on compra_ingredientes + for each row +execute procedure bodega_ingresos_trigger_delete_procedure(); + +--- View que une el estado de bodega en una sola tabla +create view bodega_movimientos as +select ingrediente_id, unidades * -1 as unidades, fecha, restaurante_id +from bodega_egresos +union all +select ingrediente_id, unidades, fecha, restaurante_id +from bodega_ingresos; + +--- View que muestra el estado actual de la bodega por cada ingrediente +create view bodega_actual as +select ingrediente_id as ingrediente_id, sum(unidades) as stock, restaurante_id as restaurante_id +from bodega_movimientos +group by bodega_movimientos.ingrediente_id, bodega_movimientos.restaurante_id; + +commit; \ No newline at end of file diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml new file mode 100644 index 0000000..5e6af24 --- /dev/null +++ b/docker-compose.prod.yml @@ -0,0 +1,39 @@ +version: "3.9" + +services: + backend: + build: + context: ./backend + dockerfile: ./Dockerfile.prod + ports: + - 8080:8080 + + frontend: + build: + context: ./frontend + dockerfile: ./Dockerfile.prod + ports: + - 4200:80 + + database: + image: postgres:13 + restart: unless-stopped + environment: + POSTGRES_PASSWORD: admin + PGDATA: "/var/lib/postgresql/data/pgdata" + volumes: + - ./database/init:/docker-entrypoint-initdb.d + - database:/var/lib/postgresql/data + ports: + - 5400:5432 + + cache: + image: redis + restart: unless-stopped + volumes: + - cache:/data + +volumes: + database: + cache: + diff --git a/docker-compose.yml b/docker-compose.yml index 60589c3..2bc7af5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -24,17 +24,16 @@ services: build: context: ./frontend dockerfile: ./Dockerfile - ports: - - 4200:4200 volumes: - ./frontend/src:/angular/src - - ./frontend/karma.conf.js:/angular/karma.conf.js - ./frontend/angular.json:/angular/angular.json + - ./frontend/karma.conf.js:/angular/karma.conf.js + - ./frontend/README.md:/angular/README.md - ./frontend/tsconfig.app.json:/angular/tsconfig.app.json - ./frontend/tsconfig.json:/angular/tsconfig.json - ./frontend/tsconfig.spec.json:/angular/tsconfig.spec.json - - ./frontend/.editorconfig:/angular/.editorconfig - - ./frontend/.browserslistrc:/angular/.browserslistrc + ports: + - 4200:4200 database: image: postgres:13 @@ -45,6 +44,8 @@ services: volumes: - ./database/init:/docker-entrypoint-initdb.d - database:/var/lib/postgresql/data + ports: + - 5400:5432 cache: image: redis diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 81cd02d..c32e82a 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -1,11 +1,8 @@ -FROM node:14-alpine +FROM node:alpine as build WORKDIR /angular - -COPY package.json /angular - +COPY package.json package-lock.json /angular/ RUN npm install - COPY . /angular -ENTRYPOINT ["/angular/node_modules/@angular/cli/bin/ng", "serve", "--host", "0.0.0.0"] +ENTRYPOINT ["npm", "run", "start"] diff --git a/frontend/Dockerfile.prod b/frontend/Dockerfile.prod new file mode 100644 index 0000000..f4993fc --- /dev/null +++ b/frontend/Dockerfile.prod @@ -0,0 +1,10 @@ +FROM node:alpine as build +WORKDIR /angular +COPY package.json package-lock.json /angular/ +RUN npm install +COPY . /angular +RUN npm run build --prod + +FROM nginx:stable-alpine +COPY --from=build /angular/dist/frontend /usr/share/nginx/html +COPY nginx.conf /etc/nginx/conf.d/default.conf diff --git a/frontend/nginx.conf b/frontend/nginx.conf new file mode 100644 index 0000000..260aa42 --- /dev/null +++ b/frontend/nginx.conf @@ -0,0 +1,8 @@ +server { + listen 80; + location / { + root /usr/share/nginx/html; + index index.html index.htm; + try_files $uri $uri/ /index.html =404; + } +} diff --git a/frontend/package.json b/frontend/package.json index 886afeb..e11f8ef 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "scripts": { "ng": "ng", - "start": "ng serve", + "start": "ng serve --host 0.0.0.0", "build": "ng build", "watch": "ng build --watch --configuration development", "test": "ng test"