diff --git a/backend/internal/database/db.go b/backend/internal/database/db.go index 84937f1..2524f47 100644 --- a/backend/internal/database/db.go +++ b/backend/internal/database/db.go @@ -5,6 +5,7 @@ import ( "log" "os" "path/filepath" + "time" "github.com/jmoiron/sqlx" _ "github.com/mattn/go-sqlite3" @@ -15,12 +16,16 @@ type Database interface { AddUser(username string, password string) error RemoveUser(username string) error PromoteToAdmin(username string) error + PromoteToAdmin(username string) error GetUserId(username string) (int, error) AddProject(name string, description string, username string) error Migrate(dirname string) error // AddTimeReport(projectname string, start time.Time, end time.Time) error // AddUserToProject(username string, projectname string) error // ChangeUserRole(username string, projectname string, role string) error + // AddTimeReport(projectname string, start time.Time, end time.Time) error + // AddUserToProject(username string, projectname string) error + // ChangeUserRole(username string, projectname string, role string) error } // This struct is a wrapper type that holds the database connection @@ -39,6 +44,10 @@ const promoteToAdmin = "INSERT INTO site_admin (admin_id) SELECT id FROM users W // const addTimeReport = "" // const addUserToProject = "" // const changeUserRole = "" +const promoteToAdmin = "INSERT INTO site_admin (admin_id) SELECT id FROM users WHERE username = ?" +const addTimeReport = "INSERT INTO activity (report_id, activity_nbr, start_time, end_time, break, comment) VALUES (?, ?, ?, ?, ?, ?)" // WIP +const addUserToProject = "INSERT INTO project_member (project_id, user_id, role) VALUES (?, ?, ?)" // WIP +// const changeUserRole = "" // DbConnect connects to the database func DbConnect(dbpath string) Database { @@ -69,6 +78,32 @@ func DbConnect(dbpath string) Database { // } +func (d *Db) AddTimeReport(projectname string, start time.Time, end time.Time, breakTime uint32) error { // WIP + _, err := d.Exec(addTimeReport, projectname, 0, start, end, breakTime, false) + return err +} + +func (d *Db) AddUserToProject(username string, projectname string, role string) error { // WIP + var userid int + userid, err := d.GetUserId(username) + if err != nil { + panic(err) + } + + var projectid int + projectid, err2 := d.GetProjectId(projectname) + if err2 != nil { + panic(err2) + } + + _, err3 := d.Exec(addUserToProject, projectid, userid, role) + return err3 +} + +// func (d *Db) ChangeUserRole(username string, projectname string, role string) error { + +// } + // AddUser adds a user to the database func (d *Db) AddUser(username string, password string) error { _, err := d.Exec(userInsert, username, password) @@ -86,9 +121,20 @@ func (d *Db) PromoteToAdmin(username string) error { return err } +func (d *Db) PromoteToAdmin(username string) error { + _, err := d.Exec(promoteToAdmin, username) + return err +} + func (d *Db) GetUserId(username string) (int, error) { var id int - err := d.Get(&id, "SELECT id FROM users WHERE username = ?", username) + err := d.Get(&id, "SELECT id FROM users WHERE username = ?", username) // Borde det inte vara "user" i singular + return id, err +} + +func (d *Db) GetProjectId(projectname string) (int, error) { // WIP, denna kan vara goof + var id int + err := d.Get(&id, "SELECT id FROM project WHERE project_name = ?", projectname) return id, err } diff --git a/backend/internal/model/timereport.go b/backend/internal/model/timereport.go new file mode 100644 index 0000000..d48c5fb --- /dev/null +++ b/backend/internal/model/timereport.go @@ -0,0 +1,19 @@ +package model + +type TimeReport struct { + reportId string + projectName string + userName string + userRole string + reportDate string + timeWorked uint64 + isSigned bool + reportStatus string // Example "draft", "signed", "unsigned" +} + +type Project struct { + timeReports []TimeReport + projectName string + projectmembers map[string]User + projectRoles map[string]User +} diff --git a/backend/internal/model/user.go b/backend/internal/model/user.go new file mode 100644 index 0000000..c125a60 --- /dev/null +++ b/backend/internal/model/user.go @@ -0,0 +1,139 @@ +package model + +import ( + "errors" +) + +type Account struct { + fullName string + userName string +} + +type Administrator struct { + projects map[string]Project + Account + ProjectMember // comp +} + +// Administrator reciever functions +func (administrator Administrator) addUser(project *Project, user *User) error { + // WIP + return errors.New("WIP") +} + +func (administrator Administrator) removerUser(project *Project, user *User) error { + // WIP + return errors.New("WIP") +} + +func (administrator Administrator) deleteProject(project *Project) error { + // WIP + return errors.New("WIP") +} + +func (administrator Administrator) changeUserRole(project *Project, user *User) error { + // WIP + return errors.New("WIP") +} + +func (administrator *Administrator) login() error { + // WIP + return errors.New("WIP") +} + +func (administrator *Administrator) logout() error { + // WIP + return errors.New("WIP") +} + +type ProjectManager struct { + managedProjects map[string]Project // projekt som förvaltas av projektledaren + totalTime uint64 // total totalt tid arbetat av projektledaren + Account + ProjectMember // comp +} + +// ProjectManager reciever functions +func (projectManager ProjectManager) signReport(timeReport *TimeReport, user User) error { + // WIP + return errors.New("WIP") +} + +func (projectManager ProjectManager) unsignReport(timeReport *TimeReport, user User) error { + // WIP + return errors.New("WIP") +} + +func (projectManager ProjectManager) getAllReports(project *Project) ([]TimeReport, error) { + // WIP + return project.timeReports, errors.New("WIP") +} + +func (projectManager ProjectManager) assignRole(user *User, project *Project, newRole string) error { + // WIP + return errors.New("WIP") +} + +func (projectManager ProjectManager) removeMember(project *Project, user *User) error { + // WIP + return errors.New("WIP") +} + +func (projectManager ProjectManager) getTotalTime(project *Project) (uint64, error) { + // WIP + return 0, errors.New("WIP") +} + +func (projectManager *ProjectManager) login() error { + // WIP + return errors.New("WIP") +} + +func (projectManager *ProjectManager) logout() error { + // WIP + return errors.New("WIP") +} + +type ProjectMember struct { + timereports []TimeReport + role string // ????? + Account // comp +} + +// User reciever functions + +// function used to create a time report, returning a *TimeReport is questionable +func (ProjectMember *ProjectMember) createTimeReport(Project *Project) (*TimeReport, error) { + // WIP + return &TimeReport{}, errors.New("WIP") +} + +func (ProjectMember ProjectMember) getTimeReport(timereports *[]TimeReport) (*TimeReport, error) { + // WIP + return &TimeReport{}, errors.New("WIP") +} + +func (ProjectMember *ProjectMember) editTimeReport(timereport *TimeReport) { + // timereport.editReport() + // WIP +} + +func (projectUser ProjectMember) deleteTimeReport(timeReport *TimeReport) error { // Ska bara project manager kunna göra detta? fråga ledarna! + // WIP + return errors.New("WIP") +} + +func (projectUser *ProjectMember) login() error { + // WIP + return errors.New("WIP") +} + +func (projectUser *ProjectMember) logout() error { + // WIP + return errors.New("WIP") +} + +type User interface { + login() + logout() +} diff --git a/go.work.sum b/go.work.sum new file mode 100644 index 0000000..f0a8e9c --- /dev/null +++ b/go.work.sum @@ -0,0 +1,5 @@ +github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= +github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=