Skip to content

Commit

Permalink
Merge pull request #51 from Arquisoft/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
UO271588 authored Mar 15, 2023
2 parents dc0c0c6 + 60b70fa commit c015633
Show file tree
Hide file tree
Showing 68 changed files with 60,705 additions and 12,708 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ node_modules
/.pnp
.pnp.js

#package-lock
#package-lock.json

# testing
webapp/coverage
restapi/coverage
Expand Down
4 changes: 2 additions & 2 deletions docs/01_introduction_and_goals.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ Los principales requisitos funcionales de la aplicación serán:

|===
|Prioridad|Meta|Motivación
| 1 | Usabilidad | La aplicación debe ser fácilmente usable por cualquier usuario, con mucha o poca experiencia.
| 2 | Calidad | La aplicación debe satisfacer las necesidades del usuario de una forma correcta.
| 1 | Usabilidad | La aplicación debe ser fácilmente usable por cualquier usuario, con mucha o poca experiencia. Para ello se llevarán a cabo tanto cuestionarios como pruebas de usabilidad exhaustivas.
| 2 | Calidad | La aplicación debe tener una calidad y claridad de código que será revisada con ESLint.
| 3 | Privacidad | El tratamiento de la información privada del usuario debe ser descentralizada, asegurando así su privacidad.
| 4 | Eficiencia | Al abrir la aplicación o seleccionar un elemento debe ser eficiente y sus tiempos de carga bajos.
|===
Expand Down
14 changes: 7 additions & 7 deletions docs/03_system_scope_and_context.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ image:03_business_context.png["Business Context de la Aplicación"]
[options="header", cols="1,1,1"]
|===
| Elemento de comunicación | Input| Output
| Frontend | El Frontend recibe como entradas los datos solicitados al POD así como peticiones por parte del Usuario de diferentes pantallas de la pagina Web. También recibe las respuestas de las peticiones al Backend de la aplicación. | Las salidas que proporciona el Frontend son peticiones al Backend de la aplicación para la obtención de información sobre un lugar así como peticiones al POD para obtener información de los mapas de un usuario. También proporciona una visualización al usuario de forma gráfica.
| Backend | Recibe como entradas las peticiones por parte del Frontend y las respuestas por parte de la BBDD | El Backend tiene como salidas las respuestas a las peticiones del Frontend y las peticiones de datos a la BBDD.
| WebAPP | El Frontend recibe como entradas los datos solicitados al POD así como peticiones por parte del Usuario de diferentes pantallas de la pagina Web. También recibe las respuestas de las peticiones al Backend de la aplicación. | Las salidas que proporciona el Frontend son peticiones al Backend de la aplicación para la obtención de información sobre un lugar así como peticiones al POD para obtener información de los mapas de un usuario. También proporciona una visualización al usuario de forma gráfica.
| REST API | Recibe como entradas las peticiones por parte del Frontend y las respuestas por parte de la BBDD | El Backend tiene como salidas las respuestas a las peticiones del Frontend y las peticiones de datos a la BBDD.
| BBDD | Como entrada tiene las peticiones de datos almacenados por parte del Backend de la aplicación | Como salidas devuelve los objetos solicitados o un mensaje de error en el caso de que no exista lo que el Backend solicita.
| POD | Como entrada el POD recibe una petición de obtención de los datos de un Usuario | Como salida devuelve los datos del Usuario si está autorizada la petición o un mensaje de error en caso contrario.
| POD SOLID | Como entrada el POD recibe una petición de obtención de los datos de un Usuario | Como salida devuelve los datos del Usuario si está autorizada la petición o un mensaje de error en caso contrario.
| Usuario | El usuario visualiza de forma gráfica la petición que ha realizado al Frontend de la aplicación | El usuario solicita al Frontend la visualización de una pagina de la aplicación.
|===

Expand All @@ -32,8 +32,8 @@ image:03_technical_context.png["Technical Context de la Aplicación"]
[options="header", cols="1,1,1"]
|===
|Canal de comunicación|Input|Output
| SOLID-WebAPP | Se utiliza una comunicación HTTPS para solicitar datos a SOLID | Se utiliza una comunicación HTTPS para la obtención de la respuesta por parte de SOLID.
| _WebApp-RestAPI_ | Se utiliza una petición HTTPS desde la WebApp hacía la RestAPI | Se utiliza una respuesta HTTPS desde la RestAPI hacía la WebApp.
| _RestAPI-MongoDB_ | Se utiliza una petición HTTPS desde la RestAP hacía la base de datos MongoDB online | Se devuelve una respuesta HTTPS por parte de la base de datos MongoDB hacía la RestAPI.
| _WebAPP-Usuario_ | La WebApp recibe una peticíon HTTP por parte del Usuario | La WebApp devuelve una pagina dinámica al Usuario por medio de una respuesta HTTP.
| POD SOLID-WebAPP | Se utiliza una comunicación HTTPS para solicitar datos a SOLID | Se utiliza una comunicación HTTPS para la obtención de la respuesta por parte de SOLID.
| WebApp-RestAPI | Se utiliza una petición HTTPS desde la WebApp hacía la RestAPI | Se utiliza una respuesta HTTPS desde la RestAPI hacía la WebApp.
| RestAPI-MongoDB | Se utiliza una petición HTTPS desde la RestAP hacía la base de datos MongoDB online | Se devuelve una respuesta HTTPS por parte de la base de datos MongoDB hacía la RestAPI.
| WebAPP-Usuario | La WebApp recibe una peticíon HTTP por parte del Usuario | La WebApp devuelve una pagina dinámica al Usuario por medio de una respuesta HTTP.
|===
6 changes: 5 additions & 1 deletion docs/05_building_block_view.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,17 @@

El código se descompone de manera estructurada por niveles, en los que se enseñan las dependencias internas de cada elemento.
El sistema se divide en Whitebox y Blackbox.
El sistema se divide en Whitebox y Blackbox.


=== Whitebox Overall System

.Añadir el dibujo del whitebox
image:05_Esquema_Whitebox.jpg["Whitebox"]

[options="header",cols="1,2"]
|===
|Actores | Descripción
|Actores | Descripción
| Cliente / Usuario | Es el que interactúa directamente con la aplicación y su interfaz de usuario. Cada uno tiene un POD en el cual se almacenan sus datos y al cual se puede acceder.
| Administrador | Tiene acceso al completo de la aplicación y puede administrarla para que funcione correctamente.
|===
Expand All @@ -21,6 +24,7 @@ El sistema se divide en Whitebox y Blackbox.
[options="header",cols="1,2"]
|===
| Nombre | Descripción
| Nombre | Descripción
| SOLID | Cada usuario tiene su POD y permite a la aplicación acceder a sus datos.
| Base de Datos | Provee a la aplicación de la información necesaria, ya sean los mapas o los puntos de interés.
| Interfaz de usuario | La interfaz con la que interactúa el usuario.
Expand Down
26 changes: 13 additions & 13 deletions docs/06_runtime_view.adoc
Original file line number Diff line number Diff line change
@@ -1,28 +1,28 @@
[[section-runtime-view]]
== Vista en tiempo de ejecución

=== <Runtime Scenario 1>
=== Registro en aplicación

* Registro en aplicación
[plantuml,"registro",png]
----
@startuml
actor Bob
participant Iomap
participant Pod
database Pod
Bob -> Iomap: Bob pide registrarse
Iomap -> Pod: Redirecciona registro al proveedor del POD
Bob <-- Pod: Pide datos del registro
Bob -> Pod: Bob inserta sus datos
Iomap <-- Pod: Validación
Bob <-- Iomap: Confirmación registro
----
=== <Runtime Scenario 2>

* Inicio de sesión en aplicación
=== Inicio de sesión en aplicación

[plantuml,"inicioSesion",png]
----
actor Bob
participant Iomap
participant Pod
database Pod
Bob -> Iomap: Bob pide iniciar sesión
Iomap -> Pod: Redirecciona al proveedor del POD
Bob <-- Pod: Pide datos del inicio de sesión
Expand All @@ -31,27 +31,27 @@ Iomap <-- Pod: Validación
Bob <-- Iomap: Confirmación inicio sesión
----

=== <Runtime Scenario 3>
* Busqueda de lugares mediante filtros (considerando que la sesión ya está iniciada)
=== Busqueda de lugares mediante filtros (considerando que la sesión ya está iniciada)

[plantuml,"filtro",png]
----
actor Bob
participant Iomap
participant Pod
database Pod
database DataBase as "DataBase"
Bob -> Iomap: Pulsa en filtro "Restaurantes"
Iomap-> DataBase: Pide la lista de restaurantes
DataBase --> Iomap: Devuelve la lista de restaurantes
Iomap-> Iomap: Muestra solo los restaurantes en el mapa
----

=== <Runtime Scenario 4>
* Añadir nuevo lugar al mapa (considerando que la sesión ya está iniciada)
=== Añadir nuevo lugar al mapa (considerando que la sesión ya está iniciada)

[plantuml,"añadirLugar",png]
----
actor Bob
participant Iomap
participant Pod
database Pod
database DataBase as "DataBase"
Bob -> Iomap: Pulsa en "Crear lugar"
Iomap-> Iomap: Bob es redireccionado a la vista de "Crear lugar"
Expand Down
Binary file modified docs/images/03_business_context.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/images/03_technical_context.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/05_Esquema_Whitebox.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
39 changes: 39 additions & 0 deletions extras/mongodb/Playground_mongodb.mongodb
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// MongoDB Playground
// To disable this template go to Settings | MongoDB | Use Default Template For Playground.
// Make sure you are connected to enable completions and to be able to run a playground.
// Use Ctrl+Space inside a snippet or a string literal to trigger completions.

// PRUEBA DE INSERCIONES EN LA BASE DE DATOS --> OTRA MANERA INTERESANTE DE REALIZAR INSERCIONES

// Select the database to use.
use('mongodbVSCodePlaygroundDB');

// The drop() command destroys all data from a collection.
// Make sure you run it against the correct database and collection.
db.sales.drop();

// Insert a few documents into the sales collection.
db.sales.insertMany([
{ '_id': 1, 'item': 'abc', 'price': 10, 'quantity': 2, 'date': new Date('2014-03-01T08:00:00Z') },
{ '_id': 2, 'item': 'jkl', 'price': 20, 'quantity': 1, 'date': new Date('2014-03-01T09:00:00Z') },
{ '_id': 3, 'item': 'xyz', 'price': 5, 'quantity': 10, 'date': new Date('2014-03-15T09:00:00Z') },
{ '_id': 4, 'item': 'xyz', 'price': 5, 'quantity': 20, 'date': new Date('2014-04-04T11:21:39.736Z') },
{ '_id': 5, 'item': 'abc', 'price': 10, 'quantity': 10, 'date': new Date('2014-04-04T21:23:13.331Z') },
{ '_id': 6, 'item': 'def', 'price': 7.5, 'quantity': 5, 'date': new Date('2015-06-04T05:08:13Z') },
{ '_id': 7, 'item': 'def', 'price': 7.5, 'quantity': 10, 'date': new Date('2015-09-10T08:43:00Z') },
{ '_id': 8, 'item': 'abc', 'price': 10, 'quantity': 5, 'date': new Date('2016-02-06T20:20:13Z') },
]);

// Run a find command to view items sold on April 4th, 2014.
db.sales.find({ date: { $gte: new Date('2014-04-04'), $lt: new Date('2014-04-05') } });

// Build an aggregation to view total sales for each product in 2014.
const aggregation = [
{ $match: { date: { $gte: new Date('2014-01-01'), $lt: new Date('2015-01-01') } } },
{ $group: { _id: '$item', totalSaleAmount: { $sum: { $multiply: [ '$price', '$quantity' ] } } } }
];

// Run the aggregation and open a cursor to the results.
// Use toArray() to exhaust the cursor to return the whole result set.
// You can use hasNext()/next() to iterate through the cursor page by page.
db.sales.aggregate(aggregation);
1 change: 1 addition & 0 deletions restapi/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
MONGODB = "mongodb+srv://lomap:12345@lomap-es3b.fsvk8vk.mongodb.net/Lomap-es3b?retryWrites=true&w=majority"
16 changes: 15 additions & 1 deletion restapi/api.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import express, { Request, Response, Router } from 'express';
import {check} from 'express-validator';

const api:Router = express.Router()
const Place= require("./models/place")

const api:Router = express.Router()
interface User {
name: string;
email: string;
Expand All @@ -19,6 +20,19 @@ api.get(
}
);

// Prueba de base de datos
api.get(
"/prueba",
function(req: Request, res: Response): void {
var place = {
name : "Oviedo", direction : "Calle Uria", coord : "23"
}
Place.collection.insertOne(place);
console.log(place)
res.sendStatus(200);
}
)

api.post(
"/users/add",[
check('name').isLength({ min: 1 }).trim().escape(),
Expand Down
35 changes: 35 additions & 0 deletions restapi/database/config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
const mongoose = require('mongoose')

const { MONGODB, MONGODB_ATLAS_TEST, NODE_ENV } = process.env // saca del .env la ruta a la base de datos

//const connectionString = NODE_ENV === 'test' ? MONGODB_ATLAS_TEST : MONGODB_ATLAS

const connectionString = MONGODB // el enlace a la base de datos

if (!connectionString) {
console.error('Yoy must define your connection string')
}

// Realiza la conexion con la base de datos
const dbConnection = async () => {
try {
mongoose.set("strictQuery", false)
await mongoose.connect(connectionString), { // se conecta con el mongoose
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true,
useFindAndModify: false
}
// en caso de conectar correctamente con la base de datos
console.log('Database online succesfully')
} catch (err) {
console.log(err)
throw new Error('Cannot connect to the database ')
}

process.on('uncaughtException', error => {
console.error(error)
mongoose.disconnect()
})
}
module.exports = { dbConnection }
62 changes: 62 additions & 0 deletions restapi/models/place.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
const { Schema, model } = require('mongoose')

// Esquema para la base de datos y el json
const PlaceSchema = Schema(
{
name: {
type: String,
required: true
},
direction: {
type: String,
required: true
},
latitude: {
type: Number,
required: true
},
longitud: {
type: Number,
required: true
},
comments: { // Los comentarios igual conviene sacarlos de otro apartado de la base de datos
type: String,
required: true
},
photoLink: {
type: [String],
reguired: true
}
},

{
timestamps: true
}
)

// Esquema temporal para ver como seria el de los pods
const PodSchema = Schema(
{
id: {
type: String,
required: true
},
ratings: [{ // temporal para pruebas
rating1: String,
rating2: String,
rating3: String
}]
},

{
timestamps: true
}
)

PlaceSchema.methods.toJSON = function () {
const { __v, _id, ...place } = this.toObject()
place.uid = _id
return place
}

module.exports = model('Place', PlaceSchema)
Loading

0 comments on commit c015633

Please sign in to comment.