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.