Duración: Miércoles 18/05/16 - Martes 24/05/16
Alcance
Objetivo
Hacer el login y CRUD de los usuarios, crear la mayoría de las tablas de la base de datos y dejar prototipada buena parte de la interfaz del admin y una porción del frontend.
No Entra
Files
- Etiquetas
- Usuario responsable
- Frecuencia de actualización
- Parseo y guardado de datos en la base de datos no relacional (CSVs)
Datasets
- Etiquetas
- Usuario responsable
Repositorios
- API: https://github.com/gcba-odin/odin
- Admin: https://github.com/gcba-odin/odin-admin
- Frontend: https://github.com/gcba-odin/odin-frontend
Tareas
API
- Escribir spec (en Api Blueprint) con los contenidos de este sprint
- Crear seed para la base de datos, con 3 - 5 elementos de cada entidad
-
Desarrollar endpoints.
Nota 1: en ningún caso los campos id, createdAt y updatedAt deben ser editables a través de la API. Son campos que se crean y actualizan (updatedAt) automáticamente, y en todo otro caso deben ser de sólo lectura.
Nota 2: la API sólo debe aceptar requests con body en JSON. Por lo tanto las requests con body deben contener la cabecera
Content-Type
con el valorapplication/json
. Caso contrario, la API debe devolver un error. -
Correr tests de Dredd
- Desarrollar subida de archivos
- Instalar y configurar sails-permissions
Input Yeoman
Application questions:
? Application name odin
Configuration questions:
? Database name odin
? Enable CORS? Yes
Logger questions:
? Choose which logger you want to configure Winston
Blueprint questions:
? Use overridden blueprints? Yes
Controller questions:
? Choose which predefined controllers you want to copy (Press <space> to select)PingController, SearchController
Hook questions:
? Choose which predefined hooks you want to copy (Press <space> to select)CountHook, PluralizeHook
Cron questions:
? Do you need cron? Yes
Swagger questions:
? Do you need Swagger UI Explorer? No
Authentication questions:
? Do you need authentication layer? Yes
Service questions:
? Select which services you want to use CipherService, HashService, MailerService, StorageService
? Mailer provider direct
? Storage provider Local
Guardar la secret key generada en Google Drive.
Admin
- Login (funcional)
- CRUD de users (funcional)
- CRUD de organizations (sólo UI)
- CRUD de statuses (sólo UI)
- CRUD de filetypes (sólo UI)
- CRUD de files (sólo UI)
- CRUD de databases (sólo UI)
- CRUD de datasets (sólo UI)
Frontend
- Landing page (home, sólo UI)
- Listado datasets (sólo UI)
- Ver dataset (sólo UI)
Prioridades
- Login
- CRUD de usuarios
Endpoints
Users
GET /users
POST /users
OPTIONS /users
GET /users/first
OPTIONS /users/first
GET /users/last
OPTIONS /users/last
GET /users/count
OPTIONS /users/count
GET /users/:id
PATCH /users/:id
DELETE /users/:id
HEAD /users/:id
OPTIONS /users/:id
GET /users/refreshToken/:id
OPTIONS /users/refreshToken/:id
POST /users/login
OPTIONS /users/login
Organizations
GET /organizations
POST /organizations
OPTIONS /organizations
GET /organizations/first
OPTIONS /organizations/first
GET /organizations/last
OPTIONS /organizations/last
GET /organizations/count
OPTIONS /organizations/count
GET /organizations/:id
PATCH /organizations/:id
DELETE /organizations/:id
HEAD /organizations/:id
OPTIONS /organizations/:id
Categories
GET /categories
POST /categories
OPTIONS /categories
GET /categories/first
OPTIONS /categories/first
GET /categories/last
OPTIONS /categories/last
GET /categories/count
OPTIONS /categories/count
GET /categories/:id
PATCH /categories/:id
DELETE /categories/:id
HEAD /categories/:id
OPTIONS /categories/:id
Statuses
GET /statuses
POST /statuses
OPTIONS /statuses
GET /statuses/first
OPTIONS /statuses/first
GET /statuses/last
OPTIONS /statuses/last
GET /statuses/count
OPTIONS /statuses/count
GET /statuses/:id
PATCH /statuses/:id
DELETE /statuses/:id
HEAD /statuses/:id
OPTIONS /statuses/:id
Filetypes
GET /filetypes
POST /filetypes
OPTIONS /filetypes
GET /filetypes/first
OPTIONS /filetypes/first
GET /filetypes/last
OPTIONS /filetypes/last
GET /filetypes/count
OPTIONS /filetypes/count
GET /filetypes/:id
PATCH /filetypes/:id
DELETE /filetypes/:id
HEAD /filetypes/:id
OPTIONS /filetypes/:id
Files
GET /files
POST /files
OPTIONS /files
GET /files/first
OPTIONS /files/first
GET /files/last
OPTIONS /files/last
GET /files/count
OPTIONS /files/count
GET /files/:id
PATCH /files/:id
DELETE /files/:id
HEAD /files/:id
OPTIONS /files/:id
Databases
GET /databases
POST /databases
OPTIONS /databases
GET /databases/first
OPTIONS /databases/first
GET /databases/last
OPTIONS /databases/last
GET /databases/count
OPTIONS /databases/count
GET /databases/:id
PATCH /databases/:id
DELETE /databases/:id
HEAD /databases/:id
OPTIONS /databases/:id
Datasets
GET /datasets
POST /datasets
OPTIONS /datasets
GET /datasets/first
OPTIONS /datasets/first
GET /datasets/last
OPTIONS /datasets/last
GET /datasets/count
OPTIONS /datasets/count
GET /datasets/:id
PATCH /datasets/:id
DELETE /datasets/:id
HEAD /datasets/:id
OPTIONS /datasets/:id
Estructura de las responses
GET
En el caso de que se devuelva un solo registro, en data no va un array, sino ese registro sólo. Y si no hay registros, en data habrá un objeto vacío.
{
"meta": {
...
},
"data": [
{
...
},
{
...
},
{
...
}
],
"links": {
...
}
}
POST
{
"meta": {
...
},
"links": {
...
}
}
PATCH
{
"meta": {
...
},
"links": {
...
}
}
DELETE
{
"meta": {
...
},
"links": {
...
}
}
HEAD
Una response a una request HEAD no incluye un body.
OPTIONS
{
"meta": {
...
},
"methods": [
{
"verb": ...,
"url": ...,
"headers": {
...
},
"parameters": {
...
}
},
]
}
Base de datos
Users
-
id
Tipo: string
Requerido: sí
Único: sí
Max: 15 carácteres
-
username
Tipo: string
Requerido: sí
Único: sí
Max: 25 carácteres
-
password
Tipo: string
Requerido: sí
-
email
Tipo: email
Requerido: sí
Único: sí
Max: 250 carácteres
-
firstName
Tipo: string
Max: 50 carácteres
Default: '' (empty string)
-
lastName
Tipo: string
Max: 100 carácteres
Default: '' (empty string)
-
avatar
Tipo: string
Max: 500 carácteres
-
active
Tipo: boolean
-
createdAt
Tipo: datetime
Default: fecha y hora actuales
-
updatedAt
Tipo: datetime
Default: fecha y hora actuales
Claves Foráneas
-
organization
El ID de la organización a que pertenece. En el caso del Admin (usuario 1) por el momento será la primera organización generada por el seedeo de la base de datos (ej. "Organización 1").
Tipo: string
Requerido: sí
Max: 15 carácteres
-
createdBy
El ID del admin que creó el usuario. En el caso del Admin (usuario 1), es sí mismo (1).
Tipo: string
Requerido: sí
Max: 15 carácteres
Calculados
-
fullName
Es el resultado de concatenar firstName y lastName, separados por un espacio en blanco.
Tipo: string
Ejemplo: Juan Pérez
Organizations
-
id
Tipo: string
Requerido: sí
Único: sí
Max: 15 carácteres
-
name
Tipo: string
Requerido: sí
Max: 150 carácteres
-
description
Tipo: string
Max: 350 carácteres
-
address
Tipo: string
Max: 150 carácteres
-
active
Tipo: boolean
-
createdAt
Tipo: datetime
Default: fecha y hora actuales
-
updatedAt
Tipo: datetime
Default: fecha y hora actuales
Claves Foráneas
-
parent
El ID de la organización a que pertenece. En caso de una organización que no depende de alguna otra existente en la base de datos, va NULL.
Tipo: string
Max: 15 carácteres
-
createdBy
El ID del usuario que creó la organización.
Tipo: string
Requerido: sí
Max: 15 carácteres
Categories
-
id
Tipo: string
Requerido: sí
Único: sí
Max: 15 carácteres
-
name
Tipo: string
Requerido: sí
Max: 150 carácteres
-
description
Tipo: string
Max: 350 carácteres
-
createdAt
Tipo: datetime
Default: fecha y hora actuales
-
updatedAt
Tipo: datetime
Default: fecha y hora actuales
Claves Foráneas
-
createdBy
El ID del usuario que creó la categoría.
Tipo: string
Requerido: sí
Max: 15 carácteres
Statuses
-
id
Tipo: string
Requerido: sí
Único: sí
Max: 15 carácteres
-
name
Tipo: string
Requerido: sí
Max: 150 carácteres
-
createdAt
Tipo: datetime
Default: fecha y hora actuales
-
updatedAt
Tipo: datetime
Default: fecha y hora actuales
Nota: a los fines del seedeo, los estados por recurso son:
- Draft
- Under Review
- Rejected
- Published
- Unpublished
Filetypes
-
id
Tipo: string
Requerido: sí
Único: sí
Max: 15 carácteres
-
name
Tipo: string
Requerido: sí
Max: 150 carácteres
-
createdAt
Tipo: datetime
Default: fecha y hora actuales
-
updatedAt
Tipo: datetime
Default: fecha y hora actuales
Nota: a los fines del seedeo, los tipos de archivo son:
- csv
- html
- ics
- rar
- shp
- xls
- xml
- xlsx
- zip
Files
-
id
Tipo: string
Requerido: sí
Único: sí
Max: 15 carácteres
-
name
Tipo: string
Requerido: sí
Max: 150 carácteres
-
description
Tipo: string
Max: 350 carácteres
-
notes
Tipo: string
Max: 500 carácteres
-
url
Tipo: string
Max: 500 carácteres
-
visibility
Tipo: boolean
-
publishedAt
Tipo: datetime
-
createdAt
Tipo: datetime
Default: fecha y hora actuales
-
updatedAt
Tipo: datetime
Default: fecha y hora actuales
Claves Foráneas
-
type
El ID del tipo de archivo.
Requerido: sí
Max: 15 carácteres
-
status
El ID del status que posee el archivo.
Requerido: sí
Max: 15 carácteres
-
organization
El ID de la organización que provee los datos.
Requerido: sí
Max: 15 carácteres
-
dataset
El ID del dataset al que pertenece.
Tipo: string
Requerido: sí
Max: 15 carácteres
-
createdBy
El ID del usuario que creó el archivo.
Tipo: string
Requerido: sí
Max: 15 carácteres
Databases
-
id
Tipo: string
Requerido: sí
Único: sí
Max: 15 carácteres
-
name
Tipo: string
Requerido: sí
Max: 150 carácteres
-
collection
Tipo: string
Max: 150 carácteres
-
url
Tipo: string
Max: 500 carácteres
-
createdAt
Tipo: datetime
Default: fecha y hora actuales
-
updatedAt
Tipo: datetime
Default: fecha y hora actuales
Datasets
-
id
Tipo: string
Requerido: sí
Único: sí
Max: 15 carácteres
-
name
Tipo: string
Requerido: sí
Max: 150 carácteres
-
description
Tipo: string
Max: 350 carácteres
-
notes
Tipo: string
Max: 500 carácteres
-
visible
Tipo: boolean
-
starred
Tipo: boolean
-
optional1
Tipo: string
Max: 500 carácteres
-
optional2
Tipo: string
Max: 500 carácteres
-
optional3
Tipo: string
Max: 500 carácteres
-
optional4
Tipo: string
Max: 500 carácteres
-
optional5
Tipo: string
Max: 500 carácteres
-
optional6
Tipo: string
Max: 500 carácteres
-
optional7
Tipo: string
Max: 500 carácteres
-
optional8
Tipo: string
Max: 500 carácteres
-
optional9
Tipo: string
Max: 500 carácteres
-
optional10
Tipo: string
Max: 500 carácteres
-
publishedAt
Tipo: datetime
-
createdAt
Tipo: datetime
Default: fecha y hora actuales
-
updatedAt
Tipo: datetime
Default: fecha y hora actuales
Claves Foráneas
-
category
El ID de la categoría del dataset.
Requerido: sí
Max: 15 carácteres
-
status
El ID del status que posee el dataset.
Requerido: sí
Max: 15 carácteres
-
createdBy
El ID del usuario que creó el dataset.
Tipo: string
Requerido: sí
Max: 15 carácteres