XML MongoDB Node.js

-
Total Reservas
-
Valor Total
-
Valor Médio
-
Serviços Vendidos

Reservas por Unidade

Serviços por Tipo

Consultas API REST

A verificar...
GET
/api/reservas

Todas as reservas do sistema

Clica em Executar

GET
/api/reservas/hospede/:id

Reservas de um hóspede específico

Selecciona um hóspede

GET
/api/reservas/unidade

Quantidade de reservas por unidade hoteleira

Clica em Executar

GET
/api/servicos/total

Total de serviços adicionais vendidos por tipo

Clica em Executar

GET
/api/reservas/:numero

Todos os dados de uma reserva específica

Selecciona uma reserva

POST
/api/reservas

Criar uma nova reserva

Reserva
Formato: RESxxx
Hóspede
Formato: CLIxxx
9 dígitos
9 dígitos (começa com 9)
Email válido
Alojamento
Estadia
Serviços Extra

Spa

Massagens, tratamentos de beleza e relaxamento

Restaurante

Gastronomia portuguesa e internacional

Transporte

Transfers e transporte privado

Outros

Bar, lavandaria, room service, etc.

Preencha o formulário acima

PUT
/api/reservas/:numero

Atualizar uma reserva existente

Seleciona uma reserva para atualizar

DELETE
/api/reservas/:numero

Remover uma reserva do sistema

Cuidado: Ação irreversível

Unidades Hoteleiras

O hotel possui 5 unidades distribuídas pelas principais cidades de Portugal

LS

Lisboa

Capital de Portugal

- reservas
PO

Porto

Cidade Invicta

- reservas
CB

Coimbra

Cidade Universitária

- reservas
FR

Faro

Capital do Algarve

- reservas
BR

Braga

Cidade dos Arcebispos

- reservas

Serviços Adicionais Disponíveis

0

Spa

Massagens, tratamentos de beleza e relaxamento

0

Restaurante

Gastronomia portuguesa e internacional

0

Transporte

Transfers e transporte privado

0

Outros

Lavandaria, room service, etc.

Máximo de 4 serviços adicionais por reserva

MongoDB Aggregation Queries

1. Número total de serviços vendidos por tipo

Agrupa os serviços adicionais por tipo (spa, restaurante, transporte)

Clica em Executar

2. Quantidade de reservas por unidade

Agrupa reservas por unidade hoteleira (LS, PO, CB, FR, BR)

Clica em Executar

3. Valor médio das reservas

Calcula estatísticas gerais das reservas

Clica em Executar

4. Dados de uma reserva específica

Retorna todos os dados de uma reserva pelo número

Selecciona e Executa

XQuery - BaseX REST API

Query 1: Reservas de um hóspede

Apresenta todas as reservas de um hóspede específico

Selecciona e Executa

Query 2: Quantidade de reservas por unidade

Apresenta a quantidade de reservas por cada unidade hoteleira

Clica em Executar

Query 3: Total de serviços adicionais vendidos

Apresenta o total de serviços adicionais vendidos em todas as unidades

Clica em Executar

Schemas do Sistema

Estruturas de dados: XML, XSD e MongoDB

Exemplo XML - Reserva Completa

Estrutura de dados XML utilizada no sistema

<?xml version="1.0" encoding="UTF-8"?>
<reservas>
  <reserva numeroReserva="RES001">
    <hospede>
      <numeroCliente>CLI123</numeroCliente>
      <nome>João Silva</nome>
      <nif>123456789</nif>
      <telefone>912345678</telefone>
      <email>joao@example.com</email>
    </hospede>
    <unidade>LS</unidade>
    <quarto>101</quarto>
    <checkIn>2025-01-15</checkIn>
    <checkOut>2025-01-18</checkOut>
    <valorTotal>450.00</valorTotal>
    <servicosAdicionais>
      <servicoAdicional>
        <tipo>spa</tipo>
        <quantidade>2</quantidade>
        <preco>50.00</preco>
      </servicoAdicional>
      <servicoAdicional>
        <tipo>restaurante</tipo>
        <quantidade>1</quantidade>
        <preco>35.00</preco>
      </servicoAdicional>
    </servicosAdicionais>
  </reserva>
</reservas>

XML Schema (XSD) - Validação

Definição de tipos e regras de validação

Tipos Personalizados (simpleType)

tipoNumeroCliente

[A-Z]{3}[0-9]{3}

3 letras + 3 números (ex: CLI123)

tipoNIF

[0-9]{9}

9 dígitos numéricos

tipoTelefone

9[0-9]{8}

Começa por 9, 9 dígitos total

tipoEmail

[a-zA-Z0-9._%+-]+@...

Email válido (ex: user@example.com)

tipoNumeroReserva

RES[0-9]{3}

RES + 3 números (ex: RES001)

tipoServico

enumeration

spa | restaurante | transporte | outros

tipoUnidade

enumeration

LS | PO | CB | FR | BR

Restrição Importante

Não é permitida a introdução de mais do que 4 serviços adicionais numa mesma reserva.

maxOccurs="4"

MongoDB Schema - Estrutura de Documentos

Modelo NoSQL utilizado na base de dados

Documento Reserva (Collection: reservas)

{
  "_id": ObjectId("..."),
  "numeroReserva": "RES001",
  "hospede": {
    "numeroCliente": "CLI123",
    "nome": "João Silva",
    "nif": "123456789",
    "telefone": "912345678",
    "email": "joao@example.com"
  },
  "unidade": "LS",
  "quarto": "101",
  "checkIn": "2025-01-15",
  "checkOut": "2025-01-18",
  "valorTotal": 450.00,
  "servicosAdicionais": [
    {
      "tipo": "spa",
      "quantidade": 2,
      "preco": 50.00
    },
    {
      "tipo": "restaurante",
      "quantidade": 1,
      "preco": 35.00
    }
  ]
}

Validações e Regras

Índices

unique

numeroReserva (único)

Campos Obrigatórios

required

numeroReserva, hospede, unidade, checkIn

Tipo de Dados

Number, String, Array

valorTotal: Number, servicosAdicionais: Array

Validação Backend

maxServicos: 4

Máximo 4 serviços adicionais (server.js)

Diferenças XML vs MongoDB

XML: Estrutura hierárquica, validação via XSD, Schema estático

MongoDB: Documentos flexíveis (JSON), Schema dinâmico, validações no backend

Sobre o Projeto

Trabalho Prático desenvolvido no âmbito da unidade curricular Processo, Estruturação e Integração de Dados (PEID).

ESTG - Politécnico do Porto
DWDM - Desenvolvimento Web e Dispositivos Móveis
Ano Letivo 2025/2026

Stack Tecnológica

XML / XSD
BaseX / XQuery
MongoDB Atlas
Node.js / Express
HTML / CSS / JS
Render / Vercel

API Endpoints

GET /api/reservas Todas as reservas
GET /api/reservas/hospede/:numeroCliente Reservas de um hóspede
GET /api/reservas/unidade Quantidade por unidade
GET /api/servicos/total Total de serviços vendidos
GET /api/reservas/media Valor médio das reservas
GET /api/reservas/maior Reserva com maior valor
GET /api/reservas/:numeroReserva Dados de uma reserva
GET /api/estatisticas Dashboard stats
POST /api/reservas Criar nova reserva
PUT /api/reservas/:numeroReserva Atualizar reserva
DELETE /api/reservas/:numeroReserva Eliminar reserva

Pedidos HTTP (cURL)

Exemplos de chamadas à API REST utilizando cURL

Obter todas as reservas

curl -X GET http://localhost:3000/api/reservas

Reservas de um hóspede

curl -X GET http://localhost:3000/api/reservas/hospede/CLI123

Quantidade por unidade

curl -X GET http://localhost:3000/api/reservas/unidade

Total de serviços

curl -X GET http://localhost:3000/api/servicos/total

Valor médio

curl -X GET http://localhost:3000/api/reservas/media

Reserva específica

curl -X GET http://localhost:3000/api/reservas/R001

Estrutura Hóspede

Dados obrigatórios do hóspede

numeroCliente tipoNumeroCliente CLI123
nome xs:string João Silva
nif tipoNIF 123456789
email tipoEmail email@mail.com
telefone tipoTelefone 912345678

MongoDB Charts

Dashboard disponível no MongoDB Atlas

Gráfico 1: Reservas por Unidade

Distribuição das reservas pelas 5 unidades hoteleiras

Gráfico 2: Serviços por Tipo

Total de serviços vendidos agrupados por categoria


Ver Dashboard MongoDB Atlas Charts

Artefactos Desenvolvidos

reservas.xml
reservas.xsd
reservas.json
query1_reservas_hospede.xq
query2_reservas_por_unidade.xq
query3_total_servicos.xq
api_hotel.xqm
consultas_mongodb.js
server.js
package.json
index.html
styles.css
app.js
update-form.js
swagger.html