update profile

This commit is contained in:
2025-04-24 17:43:42 -03:00
parent 65946f61e0
commit ffc8758d95
72 changed files with 245 additions and 118 deletions

View File

@@ -64,8 +64,6 @@ class AuditLogMiddleware(BaseMiddlewareHandler):
ip_addr = req_context.http.source_ip
response = next_middleware(app)
print(app.context['_route'])
# Successful response
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status#successful_responses
if 200 <= response.status_code < 300 and user:

View File

@@ -10,9 +10,11 @@ from elasticsearch import Elasticsearch
from layercake.dynamodb import (
DynamoDBCollection,
DynamoDBPersistenceLayer,
KeyPair,
MissingError,
SortKey,
TransactKey,
)
from layercake.extra_types import CpfStr, NameStr
from pydantic import UUID4, BaseModel, StringConstraints
import cognito
@@ -21,6 +23,7 @@ from api_gateway import JSONResponse
from boto3clients import dynamodb_client, idp_client
from middlewares import AuditLogMiddleware
from models import User
from rules.user import update_user
from settings import ELASTIC_CONN, USER_POOOL_ID, USER_TABLE
from .emails import router as emails
@@ -65,6 +68,46 @@ def post_user(payload: User):
return JSONResponse(status_code=HTTPStatus.CREATED)
class UserData(BaseModel):
name: NameStr
cpf: CpfStr
@router.put(
'/<id>',
compress=True,
tags=['User'],
summary='Update user',
middlewares=[
AuditLogMiddleware('USER_UPDATE', user_collect, ('id', 'name', 'new_cpf'))
],
)
def put_user(id: str, payload: UserData):
update_user(
{
'id': id,
'name': payload.name,
'cpf': payload.cpf,
},
persistence_layer=user_layer,
)
return JSONResponse(
body={
'id': id,
'name': payload.name,
'new_cpf': payload.cpf,
},
status_code=HTTPStatus.OK,
)
@router.get('/<id>', compress=True, tags=['User'], summary='Get user')
def get_user(id: str):
return user_collect.get_items(
TransactKey(id) + SortKey('0') + SortKey('last_profile_edit')
)
class Password(BaseModel):
cognito_sub: UUID4
new_password: Annotated[str, StringConstraints(min_length=6)]
@@ -95,11 +138,6 @@ def password(id: str, payload: Password):
)
@router.get('/<id>', compress=True, tags=['User'], summary='Get user')
def get_user(id: str):
return user_collect.get_item(KeyPair(id, '0'))
@router.get('/<sub>/idp', compress=True, include_in_schema=False)
def get_idp(sub: str):
return cognito.admin_get_user(

View File

@@ -1,11 +1,88 @@
import json
from http import HTTPMethod, HTTPStatus
from layercake.dynamodb import DynamoDBCollection, DynamoDBPersistenceLayer, KeyPair
from layercake.dynamodb import (
DynamoDBCollection,
DynamoDBPersistenceLayer,
KeyPair,
SortKey,
TransactKey,
)
from ..conftest import HttpApiProxy, LambdaContext
def test_update_user_cpf(
mock_app,
dynamodb_seeds,
dynamodb_persistence_layer: DynamoDBPersistenceLayer,
http_api_proxy: HttpApiProxy,
lambda_context: LambdaContext,
):
r = mock_app.lambda_handler(
http_api_proxy(
raw_path='/users/5OxmMjL-ujoR5IMGegQz',
method=HTTPMethod.PUT,
body={
'name': 'Sérgio Siqueira',
'cpf': '26886156020',
},
),
lambda_context,
)
assert r['statusCode'] == HTTPStatus.OK
collect = DynamoDBCollection(dynamodb_persistence_layer)
user = collect.get_items(
TransactKey('5OxmMjL-ujoR5IMGegQz')
+ SortKey('0')
+ SortKey('last_profile_edit')
)
assert 'last_profile_edit' in user
def test_update_user_name(
mock_app,
dynamodb_seeds,
dynamodb_persistence_layer: DynamoDBPersistenceLayer,
http_api_proxy: HttpApiProxy,
lambda_context: LambdaContext,
):
r = mock_app.lambda_handler(
http_api_proxy(
raw_path='/users/5OxmMjL-ujoR5IMGegQz',
method=HTTPMethod.PUT,
body={
'name': 'Sérgio R Siqueira',
'cpf': '07879819908',
},
),
lambda_context,
)
assert r['statusCode'] == HTTPStatus.OK
def test_update_user_conflict_cpf(
mock_app,
dynamodb_seeds,
dynamodb_persistence_layer: DynamoDBPersistenceLayer,
http_api_proxy: HttpApiProxy,
lambda_context: LambdaContext,
):
r = mock_app.lambda_handler(
http_api_proxy(
raw_path='/users/5OxmMjL-ujoR5IMGegQz',
method=HTTPMethod.PUT,
body={
'name': 'Sérgio Siqueira',
'cpf': '08679004901',
},
),
lambda_context,
)
assert r['statusCode'] == HTTPStatus.BAD_REQUEST
def test_get_emails(
mock_app,
dynamodb_seeds,

View File

@@ -20,3 +20,4 @@
{"id": {"S": "QV4sXY3DvSTUMGJ4QqsrwJ"}, "sk": {"S": "generated_items#43ea4475-c369-4f90-b576-135b7df5106b"}}
{"id": {"S": "email"}, "sk": {"S": "sergio@somosbeta.com.br"}}
{"id": {"S": "cpf"}, "sk": {"S": "07879819908"}}
{"id": {"S": "cpf"}, "sk": {"S": "08679004901"}}

View File

@@ -22,7 +22,7 @@ const courses = defineCollection({
z.object({
id: z.string(),
title: z.string(),
summary: z.string(),
excerpt: z.string(),
slug: z.string(),
image: image().optional(),
course: z.object({

View File

@@ -2,7 +2,7 @@
id: 386f7086-2871-436f-85f5-31d632fbf624
title: Boas Práticas em Manipulação de Alimentos
slug: boas-praticas-em-manipulcao-de-alimentos
summary: ...
excerpt: ...
draft: true
course:

View File

@@ -2,7 +2,7 @@
id: 3c27ea9c-9464-46a1-9717-8c1441793186
title: CIPA Grau de Risco 1
slug: cipa-grau-de-risco-1
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 99bb3b60-4ded-4a8e-937c-ba2d78ec6454
title: CIPA Grau de Risco 2
slug: cipa-grau-de-risco-2
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 863214e8-26e2-440b-854b-a0ced0164bbf
title: CIPA Grau de Risco 3 (teórico)
slug: cipa-grau-de-risco-3-terico
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: f7def039-bf27-496a-94ff-0667c9c0c0db
title: CIPA Grau de Risco 3
slug: cipa-grau-de-risco-3
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 38d8ba20-49a4-4c69-b674-b70a985eb76a
title: CIPA Grau de Risco 4
slug: cipa-grau-de-risco-4
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 281198c2-f293-4acc-b96e-e4a2d5f6b73c
title: CIPA
slug: cipa
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 4866c068-577a-45b0-b41a-41a7dc6b9ab7
title: Combate a Incêndio
slug: combate-a-incendio
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 00ebdd8d-b4db-4437-8814-274811a4c469
title: Direção Defensiva (08 horas)
slug: direcao-defensiva-08-horas
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: a1a8727c-0519-4692-93e7-81dbe66e167f
title: Direção Defensiva (20 horas)
slug: direo-defensiva-20-horas
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 6d17d9cf-96be-42a4-bae5-75926e1e832a
title: Exposição ao Benzeno - (Portaria 1109)
slug: exposicao-ao-benzeno-portaria-1109
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: c19cd7ee-3cc8-4f9c-95ff-dad7993f49b1
title: Gestão da Cultura de Segurança
slug: gestao-da-cultura-de-seguranca
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -1,7 +1,7 @@
---
id: 96c03c32-089c-4ccb-8aa1-73b0f49228b9
title: Lei Lucas
summary: Capacitação obrigatória em primeiros socorros para profissionais da educação, conforme a Lei 13.722/2018, abordando técnicas essenciais como RCP, controle de hemorragias e desobstrução das vias aéreas.
excerpt: Capacitação obrigatória em primeiros socorros para profissionais da educação, conforme a Lei 13.722/2018, abordando técnicas essenciais como RCP, controle de hemorragias e desobstrução das vias aéreas.
slug: lei-lucas
draft: false
@@ -11,7 +11,8 @@ course:
import { Accordion, Item, Header, Body } from "~/components/Accordion";
<Accordion>
<Fragment slot="modules">
<Accordion>
<Item>
<Header>Introdução à Lei Lucas</Header>
<Body>
@@ -38,4 +39,6 @@ import { Accordion, Item, Header, Body } from "~/components/Accordion";
<Header>Sinais vitais e avaliação primária</Header>
<Body></Body>
</Item>
</Accordion>
</Accordion>
</Fragment>

View File

@@ -2,7 +2,7 @@
id: 80dfc302-4e05-4f23-944d-9a2768cb6c7d
title: LOTO Lockout e Tagout
slug: loto-lockout-e-tagout
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 439e9a43-ab92-469a-a849-b6e824370f80
title: Noções em Primeiros Socorros
slug: noes-em-primeiros-socorros
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 5c119d4b-573c-4d8d-a99d-63756af2f4c5
title: NR-06 - Equipamento de Proteção Individual - EPI
slug: nr-06-equipamento-de-proteo-individual-epi
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 4ea2498a-a6a9-4293-94d0-ceeb248e64b7
title: NR-10 Básico
slug: nr-10-basico
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 2e1c93c2-1779-482b-9552-c04e09db8349
title: NR-10 Complementar (SEP)
slug: nr-10-complementar-sep
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: b3d0e345-a8e5-4dc2-a3b0-218bc894ee55
title: NR-10 Noções do Risco Elétrico
slug: nr-10-nocoes-do-risco-eletrico
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 7f7905aa-ec6d-4189-b884-50fa9b1bd0b8
title: NR-10 Reciclagem
slug: nr-10-reciclagem
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: f10c3283-7722-41c6-ba5d-222f9f4f48af
title: NR-11 Operador de Empilhadeira
slug: nr-11-operador-de-empilhadeira
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 479516a7-5431-452e-8f28-228e34b86e0c
title: NR-11 Segurança em Transpaleteira
slug: nr-11-seguranca-em-transpaleteira
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: b945be62-408d-4099-a75c-4d1dda929659
title: NR-11 Segurança na Operação de Pontes Rolantes
slug: nr-11-seguranca-na-operacao-de-pontes-rolantes
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 4682187a-cb5c-47a8-9597-ad9243a6d717
title: NR-11 Segurança na Operação de Talhas
slug: nr-11-seguranca-na-operacao-de-talhas
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 70827c13-1db5-4499-977f-9a6623e45161
title: NR-11 Segurança na Operação de Rebocadores
slug: nr-11-seguranca-na-operao-de-rebocadores
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: a810dd22-56c0-4d9b-8cd2-7e2ee9c45839
title: NR-11 Transporte, movimentação, armazenagem e manuseio de materiais
slug: nr-11-transporte-movimentacao-armazenagem-e-manuseio-de-materiais
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 52b4a909-b6a9-456e-a7b9-c0b3c18ebe00
title: NR-12 Máquinas e Equipamentos
slug: nr-12-maquinas-e-equipamentos
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 5c53656d-9557-4ef9-8e05-08d3190bb115
title: NR-13 Operador de Caldeiras
slug: nr-13-operador-de-caldeiras
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 3b05b03c-8714-4f98-90e0-2a3ac4940035
title: NR-13 Vasos de Pressão e Unidades de Processo
slug: nr-13-vasos-de-pressao-e-unidades-de-processo
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: a3c46d94-cf31-4b5f-8de3-6aa1c2d423f0
title: NR-17 Ergonomia para Teleatendimento/Telemarketing
slug: nr-17-ergonomia-para-teleatendimento-telemarketing
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 4e52d4e9-0566-4f8c-8307-1db770e4c33c
title: NR-17 Ergonomia
slug: nr-17-ergonomia
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 7aba7598-83b2-4df7-938c-d075ffef47ca
title: NR-18 Construção Civil
slug: nr-18-construcao-civil
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -1,7 +1,7 @@
---
id: 450a70ca-8ab5-4520-8a22-0e277359797d
title: NR-18 PEMT Plataforma Móvel de Trabalho Aéreo
summary: Capacita os profissionais para identificar e minimizar riscos, utilizar corretamente os Equipamentos de Proteção Individual (EPIs), realizar manutenções preventivas e corretivas, além de garantir a segurança durante a operação de plataformas elevatórias.
excerpt: Capacita os profissionais para identificar e minimizar riscos, utilizar corretamente os Equipamentos de Proteção Individual (EPIs), realizar manutenções preventivas e corretivas, além de garantir a segurança durante a operação de plataformas elevatórias.
slug: nr-18-plataforma-de-trabalho-aereo
draft: false
image: ./_assets/nr-18-plataforma.png

View File

@@ -2,7 +2,7 @@
id: 96c2553a-d087-42ad-be5e-e960ea673c3d
title: NR-18 Sinaleiro e Amarrador de Cargas para Içamento
slug: nr-18-sinaleiro-e-amarrador-de-cargas-para-icamento
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: d800d2a9-ae76-46de-be82-3e06ae6afcee
title: NR-20 Básico
slug: nr-20-basico
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 95a1fcb9-ba16-4b3c-a59d-047ca32078ff
title: NR-20 Iniciação
slug: nr-20-inicicao
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 6689a04a-99c1-4150-b1ed-c131b6dc5bb5
title: NR-20 Intermediário
slug: nr-20-intermediario
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 07da69f2-2a2c-4771-b766-633295476ad7
title: NR-26 Sinalização de Segurança
slug: nr-26-sinalizao-de-seguranca
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 5c9c1ff1-361f-479d-bd2c-eb3b124a74fc
title: NR-31 CIPATR
slug: nr-31-cipatr
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 3f284753-85ce-4f53-8de7-cdfcdaf9515b
title: NR-33 Supervisor em Espaço Confinado
slug: nr-33-supervisor-em-espaco-confinado
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: b23493dd-6359-4352-97be-12dca3a21ca6
title: NR-33 Trabalhadores Autorizados e Vigias em Espaço Confinado
slug: nr-33-trabalhadores-autorizados-e-vigias-em-espaco-confinado
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: e1c44881-2fe3-484e-ada2-12b6bf5b9398
title: NR-35 Segurança nos Trabalhos em Altura (Teórico)
slug: nr-35-seguranca-nos-trabalhos-em-altura-teorico
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 6dd8f711-5c5a-477a-971f-122cbac4ce48
title: NR-35 Supervisor de Trabalho em Altura
slug: nr-35-supervisor-de-trabalho-em-altura
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: e1c44881-2fe3-484e-ada2-12b6bf5b9398
title: NR-35 Trabalho em Altura
slug: nr-35-trabalhos-em-altura-teorico
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: c2d1362f-aa7f-40b0-bd15-37570bda5f25
title: PCA - Programa de Conservação Auditiva
slug: pca-programa-de-conservacao-auditiva
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 1c7b1cf0-6973-4271-9407-6e974f0094e9
title: PPR Programa de Proteção Respiratória
slug: ppr-programa-de-protecao-respiratoria
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: f05293f0-2ff4-4026-9e65-2f0f67d9f83b
title: Prevenção e combate ao assédio sexual e às demais formas de violência no trabalho
slug: prevencao-e-combate-ao-assedio-sexual-e-as-demais-formas-de-violencia-no-trabalho
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 15ee05a3-4ceb-4b7e-9979-db75b28c9ade
title: Reciclagem de NR-10 SEP 08 horas
slug: reciclagem-de-nr-10-sep-08-horas
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 446426ce-c0f0-4238-83ed-95e8c0434f45
title: Reciclagem de NR-11 Segurança na Operação de Rebocadores
slug: reciclagem-de-nr-11-seguranca-na-opercao-de-rebocadores
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -1,7 +1,7 @@
---
id: 76a5ba94-e11c-48f5-88eb-9326df9be264
title: NR-12 Máquinas e Equipamentos
summary: Com foco na prevenção de acidentes, na conformidade com a NR-18 e no uso correto de EPIs, como operação, manutenção e inspeção de plataformas elevatórias, assegurando maior segurança e garantindo atendimento às exigências legais.
excerpt: Com foco na prevenção de acidentes, na conformidade com a NR-18 e no uso correto de EPIs, como operação, manutenção e inspeção de plataformas elevatórias, assegurando maior segurança e garantindo atendimento às exigências legais.
slug: reciclagem-de-nr-12-maquinas-e-equipamentos
draft: false
@@ -11,6 +11,6 @@ course:
reciclagem: true
modules:
- Descrição e identificação dos riscos associados com cada máquina e equipamento e as proteções específicas contra cada um deles
- 'Funcionamento das proteções: como e por que devem ser usadas'
- "Funcionamento das proteções: como e por que devem ser usadas"
- Como e em que circunstâncias uma proteção pode ser removida por quem, sendo na maioria dos casos, somente o pessoal de inspeção ou manutenção
---

View File

@@ -2,7 +2,7 @@
id: 0e39c7af-a812-49aa-ac12-72f4e0ede8c9
title: Reciclagem de NR-18 Plataforma de Trabalho Aéreo PEMT
slug: reciclagem-de-nr-18-plataforma-de-trabalho-aereo-pemt
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: c01ec8a2-0359-4351-befb-76c3577339e0
title: Reciclagem em NR-10 Básico
slug: reciclagem-em-nr-10-basico
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 39f89a69-3d94-4dd6-9049-66e540fb2f32
title: Reciclagem em NR-10 Complementar (SEP)
slug: reciclagem-em-nr-10-complementar-sep
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 6a403773-aeac-4e6a-ac39-dc958e4be52a
title: Reciclagem em NR-11 - Operador de Empilhadeira
slug: reciclagem-em-nr-11-operador-de-empilhadeira
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 4a0c4652-fcb3-4362-8fff-bc5ac3ba1cf3
title: Reciclagem em NR-11 Plataforma de Trabalho Elevatória (PTA)
slug: reciclagem-em-nr-11-plataforma-de-trabalho-elevatria-pta
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 124ca098-b609-4550-a83c-6b9120a2db42
title: Reciclagem em NR-11 Transpaleteiras
slug: reciclagem-em-nr-11-transpaleteiras
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: d6520884-89e7-4843-b77f-7777c5376d50
title: Reciclagem em NR-13 Operador de Caldeiras
slug: reciclagem-em-nr-13-operador-de-caldeiras
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 9301601e-385a-4525-a65a-4054f669632f
title: Reciclagem em NR-13 Vasos de Pressão e Unidades de Processo
slug: reciclagem-em-nr-13-vasos-de-pressao-e-unidades-de-processo
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 801d1115-b4e8-4213-96b1-0b4f99bf202e
title: Reciclagem em NR-18 Básico em segurança do trabalho
slug: reciclagem-em-nr-18-basico-em-segurana-do-trabalho
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: d9f9c3d6-ba97-4695-b1fb-e2539158b064
title: Reciclagem em NR-20 Avançado II
slug: reciclagem-em-nr-20-avancado-ii
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 8efe00d2-38e2-4281-8f5e-b9113e91374b
title: Reciclagem em NR-20 Básico
slug: reciclagem-em-nr-20-basico
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 0707270e-623f-486a-8dbd-d852377a208c
title: Reciclagem em NR-20 - Intermediário
slug: reciclagem-em-nr-20-intermediario
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: eb19c520-5546-4c57-898d-029c86e59fb6
title: Reciclagem em NR-33 Supervisores em Espaço Confinado
slug: reciclagem-em-nr-33-supervisores-em-espaco-confinado
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 2b9a6e19-2e2d-4fc2-8924-b45d47057715
title: Reciclagem em NR-33 Trabalhos em Espaços Confinados
slug: reciclagem-em-nr-33-trabalhos-em-espacos-confinados
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -2,7 +2,7 @@
id: 30bb357f-2f48-4764-93d1-ffe219cbc5d3
title: Reciclagem em NR-35 Trabalhos em Altura ( Teórico)
slug: reciclagem-em-nr-35-trabalhos-em-altura-teorico
summary: ...
excerpt: ...
draft: false
course:

View File

@@ -1,12 +1,12 @@
---
import '@fontsource/roboto'
import '~/styles/app.css'
import Logo from '~/components/logos/Eduseg.astro'
import Container from '~/components/Container.astro'
import HeaderNav from '~/components/HeaderNav.astro'
import { Icon } from 'astro-icon/components'
import "@fontsource/roboto";
import "~/styles/app.css";
import Logo from "~/components/logos/Eduseg.astro";
import Container from "~/components/Container.astro";
import HeaderNav from "~/components/HeaderNav.astro";
import { Icon } from "astro-icon/components";
const year = new Date().getFullYear()
const year = new Date().getFullYear();
---
<!doctype html>
@@ -18,7 +18,9 @@ const year = new Date().getFullYear()
<link rel="sitemap" href="/sitemap-index.xml" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<slot name="head">
<title>Educação que garante sua segurança &mdash; EDUSEG&reg;</title>
<title>
Educação que garante sua segurança &mdash; EDUSEG&reg;
</title>
</slot>
</head>
@@ -29,8 +31,14 @@ const year = new Date().getFullYear()
</a>
<div class="ml-auto">
<a href="//app.betaeducacao.com.br" class="flex gap-1 items-center hover:outline rounded-xs">
<Icon name="arrow-left-end-on-rectangle" class="size-5 rotate-180" />
<a
href="//app.betaeducacao.com.br"
class="flex gap-1 items-center hover:outline rounded-xs"
>
<Icon
name="arrow-left-end-on-rectangle"
class="size-5 rotate-180"
/>
<>Entrar</>
</a>
</div>
@@ -40,6 +48,7 @@ const year = new Date().getFullYear()
<main id="content">
<slot />
<slot name="modules" />
</main>
<footer class="py-6 text-white/70">

View File

@@ -1,9 +1,10 @@
---
import { Picture } from "astro:assets";
import { Icon } from "astro-icon/components";
import Layout from "~/layouts/Layout.astro";
import Layout from "~/layouts/CourseLayout.astro";
import Container from "~/components/Container.astro";
import Carousel from "~/components/Carousel.astro";
import Kordsa from "~/components/logos/Kordsa.astro";
import Semeq from "~/components/logos/Semeq.astro";
import Natura from "~/components/logos/Natura.astro";
@@ -40,11 +41,11 @@ const trainer = data.course?.trainer
: null;
---
<Fragment slot="head">
<title>{data.title}</title>
</Fragment>
<Layout>
<Fragment slot="head">
<title>{data.title}</title>
</Fragment>
<section class="space-y-6 lg:space-y-24">
<Container class="lg:flex items-center justify-start gap-6 max-lg:pt-6">
<Picture
@@ -68,7 +69,7 @@ const trainer = data.course?.trainer
{data.title}
</h1>
<p class="text-base/6">
{data.summary}
{data.excerpt}
<a
href="#modulos"
class="text-blue-400 *:hover:underline"