Remaining tables for the time-tracking database

With control_tiempo.usuarios in place, we add the rest of the relational core: roles, projects, tasks, and worked hours, then wire GRANTs for each database role.

Roles table

CREATE TABLE control_tiempo.roles (
    id SERIAL PRIMARY KEY,
    nombre VARCHAR(50),
    descripcion TEXT
);

Projects

CREATE TABLE control_tiempo.proyectos (
    id SERIAL PRIMARY KEY,
    nombre VARCHAR(100),
    descripcion TEXT,
    fecha_inicio DATE,
    fecha_fin DATE
);

Tasks

CREATE TABLE control_tiempo.tareas (
    id SERIAL PRIMARY KEY,
    nombre VARCHAR(100),
    descripcion TEXT,
    fecha_inicio DATE,
    fecha_fin DATE,
    id_proyecto INT REFERENCES control_tiempo.proyectos(id),
    id_usuario INT REFERENCES control_tiempo.usuarios(id)
);

Worked hours

CREATE TABLE control_tiempo.horas_trabajadas (
    id SERIAL PRIMARY KEY,
    horas DECIMAL(5, 2),
    fecha DATE,
    id_tarea INT REFERENCES control_tiempo.tareas(id),
    id_usuario INT REFERENCES control_tiempo.usuarios(id)
);

Grants (abbreviated labels)

GRANT ALL PRIVILEGES ON TABLE control_tiempo.roles TO dba_user;
GRANT ALL PRIVILEGES ON TABLE control_tiempo.proyectos TO dba_user;
GRANT ALL PRIVILEGES ON TABLE control_tiempo.tareas TO dba_user;
GRANT ALL PRIVILEGES ON TABLE control_tiempo.horas_trabajadas TO dba_user;

GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE control_tiempo.roles TO admin_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE control_tiempo.proyectos TO admin_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE control_tiempo.tareas TO admin_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE control_tiempo.horas_trabajadas TO admin_user;

GRANT SELECT ON TABLE control_tiempo.roles TO web_user;
GRANT SELECT ON TABLE control_tiempo.proyectos TO web_user;
GRANT SELECT ON TABLE control_tiempo.tareas TO web_user;
GRANT SELECT ON TABLE control_tiempo.horas_trabajadas TO web_user;

GRANT SELECT ON TABLE control_tiempo.usuarios TO anon_user;

Next

With tables and grants aligned, we talk to the API from clients—read Calling the REST API of the time-tracking app.