Skip to content

Latest commit

 

History

24 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SAMU Senac API

API em Node.js com Express e PostgreSQL para cadastro de usuarios e tipos de usuario.

Tecnologias

  • Node.js
  • Express
  • PostgreSQL
  • pg
  • dotenv
  • morgan

Como rodar

Instale as dependencias:

npm install

Crie o arquivo .env na raiz do projeto:

PORT=7777
DATABASE_URL=postgres://usuario:senha@localhost:5432/nome_do_banco

Crie as tabelas no banco usando o arquivo:

src/database/schema.sql

Inicie a API:

npm start

Para desenvolvimento:

npm run dev

Por padrao, a API roda em:

http://localhost:7777

Estrutura principal

src/
  app/
  controllers/
  database/
  models/
  routes/

O fluxo usado no projeto e:

routes -> controllers -> models -> database

Tipo de usuario

Base da rota:

/tipo-usuario

Listar tipos

GET /tipo-usuario

Resposta:

[
  {
    "id_tipo": 1,
    "tipo": "admin"
  }
]

Buscar tipo por ID

GET /tipo-usuario/1

Resposta:

{
  "id_tipo": 1,
  "tipo": "admin"
}

Cadastrar tipo

POST /tipo-usuario

Body:

{
  "tipo": "admin"
}

Resposta:

{
  "id_tipo": 1,
  "tipo": "admin"
}

Atualizar tipo

PUT /tipo-usuario/1

Body:

{
  "tipo": "medico"
}

Atualizar parcialmente

PATCH /tipo-usuario/1

Body:

{
  "tipo": "enfermeiro"
}

Remover tipo

DELETE /tipo-usuario/1

Quando remove com sucesso, retorna 204 No Content.

Se o tipo estiver sendo usado por algum usuario, a API retorna erro, porque existe chave estrangeira entre usuarios.tipo e tipo_usuario.id_tipo.

Usuarios

Base da rota:

/users

Listar usuarios

GET /users

Resposta:

[
  {
    "id_user": 1,
    "nome_usuario": "Guilherme",
    "tipo": 1,
    "tipo_usuario": "admin",
    "status": "ativo"
  }
]

Buscar usuario por ID

GET /users/1

Resposta:

{
  "id_user": 1,
  "nome_usuario": "Guilherme",
  "tipo": 1,
  "tipo_usuario": "admin",
  "status": "ativo"
}

Cadastrar usuario

POST /users

Body:

{
  "nome_usuario": "Guilherme",
  "senha": "123456",
  "tipo": 1,
  "status": "ativo"
}

O campo tipo pode receber o ID do tipo de usuario. O status e opcional; se nao for enviado, entra como ativo.

Atualizar usuario

PUT /users/1

Body:

{
  "nome_usuario": "Guilherme Souza",
  "senha": "123456",
  "tipo": 1,
  "status": "ativo"
}

Atualizar parcialmente

PATCH /users/1

Body:

{
  "status": "inativo"
}

Remover usuario

DELETE /users/1

Quando remove com sucesso, retorna 204 No Content.

Noticias

Base da rota:

/api/noticias

Buscar noticia principal

GET /api/noticias/principal

Criar noticia principal

POST /api/noticias/principal

Body:

{
  "titulo": "Titulo da noticia",
  "resumo": "Resumo sobre a noticia",
  "imagem": "url_do_banner",
  "conteudo": "Conteudo completo"
}

Listar noticias secundarias

GET /api/noticias/secundarias?limite=4&pagina=1

Criar noticia secundaria

POST /api/noticias/secundarias

Body:

{
  "resumo": "Resumo sobre a noticia",
  "imagem": "url_thumbnail",
  "link": "/noticia/1"
}

Atualizar noticia secundaria

PUT /api/noticias/secundarias/1

Remover noticia secundaria

DELETE /api/noticias/secundarias/1

Listar noticias diarias

GET /api/noticias?pagina=1&por_pagina=10

Criar noticia diaria

POST /api/noticias

Body:

{
  "titulo": "Titulo da noticia",
  "resumo": "Resumo da noticia",
  "banner": "url_do_banner",
  "conteudo": "Conteudo completo em HTML",
  "categoria": "diaria"
}

Atualizar noticia diaria

PUT /api/noticias/1

Atualizar parcialmente

PATCH /api/noticias/1

Body:

{
  "resumo": "Atualizar apenas o resumo"
}

Remover noticia

DELETE /api/noticias/1

Quando remove com sucesso, retorna 204 No Content.

Cursos

Pagina de cursos

Base da rota:

/api/course-page

Criar pagina

POST /api/course-page

O body segue o payload completo definido no Notion, com blocos como hero, overview, featuredCourse, learningPath, secondaryCourses e cta.

Buscar pagina

GET /api/course-page

Resposta:

{
  "success": true,
  "data": {
    "id": 1,
    "hero": {},
    "overview": [],
    "featuredCourse": {},
    "learningPath": {},
    "secondaryCourses": [],
    "cta": {}
  }
}

Atualizar pagina completa

PUT /api/course-page/1

Atualizar parcialmente

PATCH /api/course-page/1

Body:

{
  "hero": {
    "title": "Novo titulo do hero"
  }
}

Remover pagina

DELETE /api/course-page/1

Resposta:

{
  "success": true,
  "message": "Pagina removida com sucesso"
}

Cursos secundarios

Base da rota:

/api/courses

Criar curso

POST /api/courses

Body:

{
  "title": "Primeiros Socorros Basicos",
  "description": "Curso introdutorio de emergencia.",
  "thumbnail": "/uploads/thumb1.png",
  "status": "Publicado",
  "duration": "2h",
  "level": "Iniciante"
}

Listar cursos

GET /api/courses

Buscar curso por ID

GET /api/courses/1

Atualizar curso

PUT /api/courses/1

Body:

{
  "title": "Primeiros Socorros Avancado",
  "status": "Rascunho"
}

Remover curso

DELETE /api/courses/1

Quando remove com sucesso, retorna 204 No Content.

Validacoes

Alguns exemplos de erro:

{
  "message": "id de usuario invalido"
}
{
  "message": "Dados invalidos",
  "erros": [
    "nome_usuario e obrigatorio",
    "senha e obrigatoria",
    "tipo e obrigatorio"
  ]
}
{
  "message": "tipo informado nao existe"
}

Banco de dados

Tabelas usadas:

CREATE TABLE IF NOT EXISTS tipo_usuario (
    id_tipo SERIAL PRIMARY KEY,
    tipo VARCHAR(15)
);

CREATE TABLE IF NOT EXISTS usuarios (
    id_user SERIAL PRIMARY KEY,
    nome_usuario VARCHAR(100),
    senha TEXT,
    tipo INT,
    status VARCHAR(15),
    FOREIGN KEY (tipo) REFERENCES tipo_usuario(id_tipo)
        ON UPDATE CASCADE
        ON DELETE RESTRICT
);

CREATE TABLE IF NOT EXISTS noticias (
    id_noticia SERIAL PRIMARY KEY,
    titulo VARCHAR(150),
    resumo TEXT NOT NULL,
    imagem TEXT,
    banner TEXT,
    conteudo TEXT,
    link TEXT,
    categoria VARCHAR(20) NOT NULL DEFAULT 'diaria',
    data DATE NOT NULL DEFAULT CURRENT_DATE
);

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages