From cfd46133a88523c03b4603fc021695a0ccf33afc Mon Sep 17 00:00:00 2001 From: elraphty Date: Wed, 17 Apr 2024 13:35:45 +0100 Subject: [PATCH 01/21] added count to budget and added workspace/next endpoint --- db/structs.go | 3 +++ db/workspaces.go | 12 ++++++++++++ handlers/workspaces_test.go | 3 +++ routes/bounty.go | 2 ++ 4 files changed, 20 insertions(+) diff --git a/db/structs.go b/db/structs.go index 934f1ae15..3abe1edb0 100644 --- a/db/structs.go +++ b/db/structs.go @@ -501,8 +501,11 @@ type StatusBudget struct { OrgUuid string `json:"org_uuid"` CurrentBudget uint `json:"current_budget"` OpenBudget uint `json:"open_budget"` + OpenCount int64 `json:"open_count"` AssignedBudget uint `json:"assigned_budget"` + AssignedCount int64 `json:"assigned_count"` CompletedBudget uint `json:"completed_budget"` + CompletedCount int64 `json:"completed_count"` } type BudgetInvoiceRequest struct { diff --git a/db/workspaces.go b/db/workspaces.go index 29ea28ee4..97cf37e37 100644 --- a/db/workspaces.go +++ b/db/workspaces.go @@ -159,18 +159,30 @@ func (db database) GetWorkspaceStatusBudget(org_uuid string) StatusBudget { var openBudget uint db.db.Model(&Bounty{}).Where("assignee = '' ").Where("paid != true").Select("SUM(price)").Row().Scan(&openBudget) + var openCount int64 + db.db.Model(&Bounty{}).Where("assignee = '' ").Where("paid != true").Count(&openCount) + var assignedBudget uint db.db.Model(&Bounty{}).Where("assignee != '' ").Where("paid != true").Select("SUM(price)").Row().Scan(&assignedBudget) + var assignedCount int64 + db.db.Model(&Bounty{}).Where("assignee != '' ").Where("paid != true").Count(&assignedCount) + var completedBudget uint db.db.Model(&Bounty{}).Where("completed = true ").Where("paid != true").Select("SUM(price)").Row().Scan(&completedBudget) + var completedCount int64 + db.db.Model(&Bounty{}).Where("completed = true ").Where("paid != true").Count(&completedCount) + statusBudget := StatusBudget{ OrgUuid: org_uuid, CurrentBudget: orgBudget.TotalBudget, OpenBudget: openBudget, + OpenCount: openCount, AssignedBudget: assignedBudget, + AssignedCount: assignedCount, CompletedBudget: completedBudget, + CompletedCount: completedCount, } return statusBudget diff --git a/handlers/workspaces_test.go b/handlers/workspaces_test.go index 8630709b6..6917d2030 100644 --- a/handlers/workspaces_test.go +++ b/handlers/workspaces_test.go @@ -436,8 +436,11 @@ func TestGetWorkspaceBudget(t *testing.T) { OrgUuid: orgUUID, CurrentBudget: 10000, OpenBudget: 1000, + OpenCount: 10, AssignedBudget: 2000, + AssignedCount: 15, CompletedBudget: 3000, + CompletedCount: 5, } oHandler.userHasAccess = mockUserHasAccess diff --git a/routes/bounty.go b/routes/bounty.go index 3d440c0e4..6f743d479 100644 --- a/routes/bounty.go +++ b/routes/bounty.go @@ -21,6 +21,8 @@ func BountyRoutes() chi.Router { r.Get("/previous/{created}", bountyHandler.GetPreviousBountyByCreated) r.Get("/org/next/{uuid}/{created}", bountyHandler.GetWorkspaceNextBountyByCreated) r.Get("/org/previous/{uuid}/{created}", bountyHandler.GetWorkspacePreviousBountyByCreated) + r.Get("/workspace/next/{uuid}/{created}", bountyHandler.GetWorkspaceNextBountyByCreated) + r.Get("/workspace/previous/{uuid}/{created}", bountyHandler.GetWorkspacePreviousBountyByCreated) r.Get("/created/{created}", bountyHandler.GetBountyByCreated) r.Get("/count/{personKey}/{tabType}", handlers.GetUserBountyCount) From c94681fa91d72bb8b7e4db075078eca733a92042 Mon Sep 17 00:00:00 2001 From: elraphty Date: Wed, 17 Apr 2024 17:31:21 +0100 Subject: [PATCH 02/21] added completed to bounties status --- db/db.go | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/db/db.go b/db/db.go index 0d04078c0..461db5135 100644 --- a/db/db.go +++ b/db/db.go @@ -522,9 +522,12 @@ func (db database) GetBountiesCount(r *http.Request) int64 { open := keys.Get("Open") assingned := keys.Get("Assigned") paid := keys.Get("Paid") + completed := keys.Get("Completed") + openQuery := "" assignedQuery := "" paidQuery := "" + completedQuery := "" if open != "" && open == "true" { openQuery = "AND assignee = '' AND paid != true" @@ -537,6 +540,13 @@ func (db database) GetBountiesCount(r *http.Request) int64 { assignedQuery = "AND assignee != '' AND paid = false" } } + if completed != "" && completed == "true" { + if open != "" && open == "true" { + completedQuery = "OR assignee != '' AND completed = true AND paid = false" + } else { + completedQuery = "AND assignee != '' AND completed = true AND paid = false" + } + } if paid != "" && paid == "true" { if open != "" && open == "true" || assingned != "" && assingned == "true" { paidQuery = "OR paid = true" @@ -550,7 +560,7 @@ func (db database) GetBountiesCount(r *http.Request) int64 { var count int64 query := "SELECT COUNT(*) FROM bounty WHERE show != false" - allQuery := query + " " + openQuery + " " + assignedQuery + " " + paidQuery + allQuery := query + " " + openQuery + " " + assignedQuery + " " + completedQuery + " " + paidQuery db.db.Raw(allQuery).Scan(&count) return count } @@ -579,6 +589,7 @@ func (db database) GetWorkspaceBounties(r *http.Request, org_uuid string) []Boun offset, limit, sortBy, direction, search := utils.GetPaginationParams(r) open := keys.Get("Open") assingned := keys.Get("Assigned") + completed := keys.Get("Completed") paid := keys.Get("Paid") languages := keys.Get("languages") languageArray := strings.Split(languages, ",") @@ -614,6 +625,9 @@ func (db database) GetWorkspaceBounties(r *http.Request, org_uuid string) []Boun if assingned == "true" { statusConditions = append(statusConditions, "assignee != '' AND paid = false") } + if completed == "true" { + statusConditions = append(statusConditions, "assignee != '' AND completed = true AND paid = false") + } if paid == "true" { statusConditions = append(statusConditions, "paid = true") } @@ -662,6 +676,7 @@ func (db database) GetWorkspaceBountiesCount(r *http.Request, org_uuid string) i search := keys.Get("search") open := keys.Get("Open") assingned := keys.Get("Assigned") + completed := keys.Get("Completed") paid := keys.Get("Paid") languages := keys.Get("languages") languageArray := strings.Split(languages, ",") @@ -682,6 +697,9 @@ func (db database) GetWorkspaceBountiesCount(r *http.Request, org_uuid string) i if assingned == "true" { statusConditions = append(statusConditions, "assignee != '' AND paid = false") } + if completed == "true" { + statusConditions = append(statusConditions, "assignee != '' AND completed = true AND paid = false") + } if paid == "true" { statusConditions = append(statusConditions, "paid = true") } @@ -901,6 +919,7 @@ func (db database) GetPreviousBountyByCreated(r *http.Request) (uint, error) { open := keys.Get("Open") assingned := keys.Get("Assigned") + completed := keys.Get("Completed") paid := keys.Get("Paid") languages := keys.Get("languages") languageArray := strings.Split(languages, ",") @@ -921,6 +940,9 @@ func (db database) GetPreviousBountyByCreated(r *http.Request) (uint, error) { if assingned == "true" { statusConditions = append(statusConditions, "assignee != '' AND paid = false") } + if completed == "true" { + statusConditions = append(statusConditions, "assignee != '' AND completed = true AND paid = false") + } if paid == "true" { statusConditions = append(statusConditions, "paid = true") } @@ -963,6 +985,7 @@ func (db database) GetNextWorkspaceBountyByCreated(r *http.Request) (uint, error open := keys.Get("Open") assingned := keys.Get("Assigned") + completed := keys.Get("Completed") paid := keys.Get("Paid") languages := keys.Get("languages") languageArray := strings.Split(languages, ",") @@ -983,6 +1006,9 @@ func (db database) GetNextWorkspaceBountyByCreated(r *http.Request) (uint, error if assingned == "true" { statusConditions = append(statusConditions, "assignee != '' AND paid = false") } + if completed == "true" { + statusConditions = append(statusConditions, "assignee != '' AND completed = true AND paid = false") + } if paid == "true" { statusConditions = append(statusConditions, "paid = true") } @@ -1025,6 +1051,7 @@ func (db database) GetPreviousWorkspaceBountyByCreated(r *http.Request) (uint, e open := keys.Get("Open") assingned := keys.Get("Assigned") + completed := keys.Get("Completed") paid := keys.Get("Paid") languages := keys.Get("languages") languageArray := strings.Split(languages, ",") @@ -1045,6 +1072,9 @@ func (db database) GetPreviousWorkspaceBountyByCreated(r *http.Request) (uint, e if assingned == "true" { statusConditions = append(statusConditions, "assignee != '' AND paid = false") } + if completed == "true" { + statusConditions = append(statusConditions, "assignee != '' AND completed = true AND paid = false") + } if paid == "true" { statusConditions = append(statusConditions, "paid = true") } @@ -1101,6 +1131,7 @@ func (db database) GetAllBounties(r *http.Request) []Bounty { offset, limit, sortBy, direction, search := utils.GetPaginationParams(r) open := keys.Get("Open") assingned := keys.Get("Assigned") + completed := keys.Get("Completed") paid := keys.Get("Paid") orgUuid := keys.Get("org_uuid") languages := keys.Get("languages") @@ -1135,6 +1166,9 @@ func (db database) GetAllBounties(r *http.Request) []Bounty { if assingned == "true" { statusConditions = append(statusConditions, "assignee != '' AND paid = false") } + if completed == "true" { + statusConditions = append(statusConditions, "assignee != '' AND completed = true AND paid = false") + } if paid == "true" { statusConditions = append(statusConditions, "paid = true") } From 4439c2f8d798934fa3f73db894f2b5eb014c7926 Mon Sep 17 00:00:00 2001 From: elraphty Date: Wed, 17 Apr 2024 17:50:48 +0100 Subject: [PATCH 03/21] added completed count to filter status count --- db/db.go | 9 ++++++--- db/structs.go | 7 ++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/db/db.go b/db/db.go index 461db5135..4bce4e82d 100644 --- a/db/db.go +++ b/db/db.go @@ -568,16 +568,19 @@ func (db database) GetBountiesCount(r *http.Request) int64 { func (db database) GetFilterStatusCount() FilterStattuCount { var openCount int64 var assignedCount int64 + var completedCount int64 var paidCount int64 db.db.Model(&Bounty{}).Where("show != false").Where("assignee = ''").Where("paid != true").Count(&openCount) db.db.Model(&Bounty{}).Where("show != false").Where("assignee != ''").Where("paid != true").Count(&assignedCount) + db.db.Model(&Bounty{}).Where("show != false").Where("assignee != ''").Where("completed = true").Where("paid != true").Count(&completedCount) db.db.Model(&Bounty{}).Where("show != false").Where("assignee != ''").Where("paid = true").Count(&paidCount) ms := FilterStattuCount{ - Open: openCount, - Assigned: assignedCount, - Paid: paidCount, + Open: openCount, + Assigned: assignedCount, + Completed: completedCount, + Paid: paidCount, } return ms diff --git a/db/structs.go b/db/structs.go index 3abe1edb0..ee8233045 100644 --- a/db/structs.go +++ b/db/structs.go @@ -698,9 +698,10 @@ type MetricsBountyCsv struct { } type FilterStattuCount struct { - Open int64 `json:"open"` - Assigned int64 `json:"assigned"` - Paid int64 `json:"paid"` + Open int64 `json:"open"` + Assigned int64 `json:"assigned"` + Completed int64 `json:"completed"` + Paid int64 `json:"paid"` } func (Person) TableName() string { From ca433a5921cff0e56d76030409bc4876bb4a1820 Mon Sep 17 00:00:00 2001 From: elraphty Date: Thu, 18 Apr 2024 17:23:54 +0100 Subject: [PATCH 04/21] changed organization to workdspace --- db/config.go | 53 +++++- db/config_test.go | 34 ++-- db/db.go | 14 +- db/interface.go | 42 ++--- db/structs.go | 42 ++++- db/workspaces.go | 148 ++++++++-------- handlers/bounty.go | 27 +-- handlers/bounty_test.go | 56 +++--- handlers/metrics_test.go | 6 +- handlers/workspaces.go | 158 ++++++++--------- handlers/workspaces_test.go | 40 ++--- mocks/Database.go | 342 ++++++++++++++++++------------------ routes/workspaces.go | 18 +- 13 files changed, 533 insertions(+), 447 deletions(-) diff --git a/db/config.go b/db/config.go index f317cbfcf..1336f32b1 100644 --- a/db/config.go +++ b/db/config.go @@ -12,7 +12,7 @@ import ( type database struct { db *gorm.DB - getWorkspaceByUuid func(uuid string) Organization + getWorkspaceByUuid func(uuid string) Workspace getUserRoles func(uuid string, pubkey string) []UserRoles } @@ -76,6 +76,8 @@ func InitDB() { db.AutoMigrate(&InvoiceList{}) db.AutoMigrate(&UserInvoiceData{}) + DB.MigrateOrganizationToWorkspace() + people := DB.GetAllPeople() for _, p := range people { if p.Uuid == "" { @@ -178,6 +180,55 @@ func (db database) GetRolesCount() int64 { return count } +func (db database) MigrateOrganizationToWorkspace() { + if (db.db.Migrator().HasTable(&Organization{}) && !db.db.Migrator().HasTable("workspaces")) { + db.db.Migrator().RenameTable(&Organization{}, "workspaces") + } + + if (db.db.Migrator().HasTable(&OrganizationUsers{}) && !db.db.Migrator().HasTable("workspace_users")) { + if !db.db.Migrator().HasColumn(&OrganizationUsers{}, "workspace_uuid") { + db.db.Migrator().RenameColumn(&OrganizationUsers{}, "org_uuid", "workspace_uuid") + } + db.db.Migrator().RenameTable(&OrganizationUsers{}, "workspace_users") + } + + if (db.db.Migrator().HasTable(&UserRoles{})) { + if !db.db.Migrator().HasColumn(&UserRoles{}, "workspace_uuid") { + db.db.Migrator().RenameColumn(&UserRoles{}, "org_uuid", "workspace_uuid") + } + } + + if (db.db.Migrator().HasTable(&Bounty{})) { + if !db.db.Migrator().HasColumn(&Bounty{}, "workspace_uuid") { + db.db.Migrator().RenameColumn(&Bounty{}, "org_uuid", "workspace_uuid") + } + } + + if (db.db.Migrator().HasTable(&BountyBudget{})) { + if !db.db.Migrator().HasColumn(&BountyBudget{}, "workspace_uuid") { + db.db.Migrator().RenameColumn(&BountyBudget{}, "org_uuid", "workspace_uuid") + } + } + + if (db.db.Migrator().HasTable(&BudgetHistory{})) { + if !db.db.Migrator().HasColumn(&BudgetHistory{}, "workspace_uuid") { + db.db.Migrator().RenameColumn(&BudgetHistory{}, "org_uuid", "workspace_uuid") + } + } + + if (db.db.Migrator().HasTable(&PaymentHistory{})) { + if !db.db.Migrator().HasColumn(&PaymentHistory{}, "workspace_uuid") { + db.db.Migrator().RenameColumn(&PaymentHistory{}, "org_uuid", "workspace_uuid") + } + } + + if (db.db.Migrator().HasTable(&InvoiceList{})) { + if !db.db.Migrator().HasColumn(&InvoiceList{}, "workspace_uuid") { + db.db.Migrator().RenameColumn(&InvoiceList{}, "org_uuid", "workspace_uuid") + } + } +} + func (db database) CreateRoles() { db.db.Create(&ConfigBountyRoles) } diff --git a/db/config_test.go b/db/config_test.go index b804fe76d..386c8dfd5 100644 --- a/db/config_test.go +++ b/db/config_test.go @@ -55,8 +55,8 @@ func TestCheckUser(t *testing.T) { } func TestUserHasAccess(t *testing.T) { - mockGetWorkspaceByUuid := func(uuid string) Organization { - return Organization{ + mockGetWorkspaceByUuid := func(uuid string) Workspace { + return Workspace{ Uuid: uuid, OwnerPubKey: "org_admin", } @@ -74,17 +74,17 @@ func TestUserHasAccess(t *testing.T) { databaseConfig.getWorkspaceByUuid = mockGetWorkspaceByUuid databaseConfig.getUserRoles = mockGetUserRoles - t.Run("Should test that if the user is the admin of an organization returns true", func(t *testing.T) { - result := databaseConfig.UserHasAccess("org_admin", "org_uuid", "ADD BOUNTY") + t.Run("Should test that if the user is the admin of an workspace returns true", func(t *testing.T) { + result := databaseConfig.UserHasAccess("org_admin", "workspace_uuid", "ADD BOUNTY") // Assert that it returns true since the user is the org admin if !result { - t.Errorf("Expected UserHasAccess to return true for organization admin, got false") + t.Errorf("Expected UserHasAccess to return true for workspace admin, got false") } }) - t.Run("Should test that if the user is not the organization admin, and the user has the required role it should return true", func(t *testing.T) { - result := databaseConfig.UserHasAccess("user_pubkey", "org_uuid", "ADD BOUNTY") + t.Run("Should test that if the user is not the workspace admin, and the user has the required role it should return true", func(t *testing.T) { + result := databaseConfig.UserHasAccess("user_pubkey", "workspace_uuid", "ADD BOUNTY") // Assert that it returns true since the user has the required role if !result { @@ -92,8 +92,8 @@ func TestUserHasAccess(t *testing.T) { } }) - t.Run("Should test that if the user is not the organization admin, and the user has not the required role it should return false", func(t *testing.T) { - result := databaseConfig.UserHasAccess("user_pubkey", "org_uuid", "DELETE BOUNTY") + t.Run("Should test that if the user is not the workspace admin, and the user has not the required role it should return false", func(t *testing.T) { + result := databaseConfig.UserHasAccess("user_pubkey", "workspace_uuid", "DELETE BOUNTY") // Assert that it returns false since the user does not have the required role if result { @@ -103,15 +103,15 @@ func TestUserHasAccess(t *testing.T) { } func TestUserHasManageBountyRoles(t *testing.T) { - mockGetWorkspaceByUuid := func(uuid string) Organization { - return Organization{ + mockGetWorkspaceByUuid := func(uuid string) Workspace { + return Workspace{ Uuid: uuid, OwnerPubKey: "org_admin", } } mockGetUserRoles := func(uuid string, pubkey string) []UserRoles { - if uuid == "org_uuid" { + if uuid == "workspace_uuid" { return []UserRoles{ {Role: "ADD BOUNTY", OwnerPubKey: pubkey, OrgUuid: uuid, Created: &time.Time{}}, } @@ -131,22 +131,22 @@ func TestUserHasManageBountyRoles(t *testing.T) { databaseConfig.getWorkspaceByUuid = mockGetWorkspaceByUuid databaseConfig.getUserRoles = mockGetUserRoles - t.Run("Should test that if the user is the organization admin return true", func(t *testing.T) { - result := databaseConfig.UserHasManageBountyRoles("org_admin", "org_uuid") + t.Run("Should test that if the user is the workspace admin return true", func(t *testing.T) { + result := databaseConfig.UserHasManageBountyRoles("org_admin", "workspace_uuid") // Assert that it returns true since the user is the org admin - assert.True(t, result, "Expected UserHasManageBountyRoles to return true for organization admin") + assert.True(t, result, "Expected UserHasManageBountyRoles to return true for workspace admin") }) t.Run("Should test that if the user has all bounty roles return true", func(t *testing.T) { - result := databaseConfig.UserHasManageBountyRoles("user_pubkey", "org_uuid2") + result := databaseConfig.UserHasManageBountyRoles("user_pubkey", "workspace_uuid2") // Assert that it returns true since the user has all bounty roles assert.True(t, result, "Expected UserHasManageBountyRoles to return true for user with all bounty roles") }) t.Run("Should test that if the user don't have all bounty roles return false.", func(t *testing.T) { - result := databaseConfig.UserHasManageBountyRoles("user_pubkey", "org_uuid") + result := databaseConfig.UserHasManageBountyRoles("user_pubkey", "workspace_uuid") // Assert that it returns false since the user does not have all bounty roles assert.False(t, result, "Expected UserHasManageBountyRoles to return false for user without all bounty roles") diff --git a/db/db.go b/db/db.go index 4bce4e82d..615eb23d1 100644 --- a/db/db.go +++ b/db/db.go @@ -586,7 +586,7 @@ func (db database) GetFilterStatusCount() FilterStattuCount { return ms } -func (db database) GetWorkspaceBounties(r *http.Request, org_uuid string) []Bounty { +func (db database) GetWorkspaceBounties(r *http.Request, workspace_uuid string) []Bounty { keys := r.URL.Query() tags := keys.Get("tags") // this is a string of tags separated by commas offset, limit, sortBy, direction, search := utils.GetPaginationParams(r) @@ -656,7 +656,7 @@ func (db database) GetWorkspaceBounties(r *http.Request, org_uuid string) []Boun } } - query := `SELECT * FROM bounty WHERE org_uuid = '` + org_uuid + `'` + query := `SELECT * FROM bounty WHERE workspace_uuid = '` + workspace_uuid + `'` allQuery := query + " " + statusQuery + " " + searchQuery + " " + languageQuery + " " + orderQuery + " " + limitQuery theQuery := db.db.Raw(allQuery) @@ -673,7 +673,7 @@ func (db database) GetWorkspaceBounties(r *http.Request, org_uuid string) []Boun return ms } -func (db database) GetWorkspaceBountiesCount(r *http.Request, org_uuid string) int64 { +func (db database) GetWorkspaceBountiesCount(r *http.Request, workspace_uuid string) int64 { keys := r.URL.Query() tags := keys.Get("tags") // this is a string of tags separated by commas search := keys.Get("search") @@ -730,7 +730,7 @@ func (db database) GetWorkspaceBountiesCount(r *http.Request, org_uuid string) i var count int64 - query := `SELECT COUNT(*) FROM bounty WHERE org_uuid = '` + org_uuid + `'` + query := `SELECT COUNT(*) FROM bounty WHERE workspace_uuid = '` + workspace_uuid + `'` allQuery := query + " " + statusQuery + " " + searchQuery + " " + languageQuery theQuery := db.db.Raw(allQuery) @@ -1036,7 +1036,7 @@ func (db database) GetNextWorkspaceBountyByCreated(r *http.Request) (uint, error } } - query := `SELECT id FROM public.bounty WHERE org_uuid = '` + uuid + `' AND created > '` + created + `' AND show = true` + query := `SELECT id FROM public.bounty WHERE workspace_uuid = '` + uuid + `' AND created > '` + created + `' AND show = true` orderQuery := "ORDER BY created ASC LIMIT 1" allQuery := query + " " + searchQuery + " " + statusQuery + " " + languageQuery + " " + orderQuery @@ -1102,7 +1102,7 @@ func (db database) GetPreviousWorkspaceBountyByCreated(r *http.Request) (uint, e } } - query := `SELECT id FROM public.bounty WHERE org_uuid = '` + uuid + `' AND created < '` + created + `' AND show = true` + query := `SELECT id FROM public.bounty WHERE workspace_uuid = '` + uuid + `' AND created < '` + created + `' AND show = true` orderQuery := "ORDER BY created DESC LIMIT 1" allQuery := query + " " + searchQuery + " " + statusQuery + " " + languageQuery + " " + orderQuery @@ -1184,7 +1184,7 @@ func (db database) GetAllBounties(r *http.Request) []Bounty { } if orgUuid != "" { - orgQuery = "AND org_uuid = '" + orgUuid + "'" + orgQuery = "AND workspace_uuid = '" + orgUuid + "'" } if languageLength > 0 { langs := "" diff --git a/db/interface.go b/db/interface.go index 4bd082473..2dc58fa04 100644 --- a/db/interface.go +++ b/db/interface.go @@ -31,8 +31,8 @@ type Database interface { GetListedPosts(r *http.Request) ([]PeopleExtra, error) GetUserBountiesCount(personKey string, tabType string) int64 GetBountiesCount(r *http.Request) int64 - GetWorkspaceBounties(r *http.Request, org_uuid string) []Bounty - GetWorkspaceBountiesCount(r *http.Request, org_uuid string) int64 + GetWorkspaceBounties(r *http.Request, workspace_uuid string) []Bounty + GetWorkspaceBountiesCount(r *http.Request, workspace_uuid string) int64 GetAssignedBounties(r *http.Request) ([]Bounty, error) GetCreatedBounties(r *http.Request) ([]Bounty, error) GetBountyById(id string) ([]Bounty, error) @@ -83,41 +83,41 @@ type Database interface { GetLnUser(lnKey string) int64 CreateLnUser(lnKey string) (Person, error) GetBountiesLeaderboard() []LeaderData - GetWorkspaces(r *http.Request) []Organization + GetWorkspaces(r *http.Request) []Workspace GetWorkspacesCount() int64 - GetWorkspaceByUuid(uuid string) Organization - GetWorkspaceByName(name string) Organization - CreateOrEditWorkspace(m Organization) (Organization, error) - GetWorkspaceUsers(uuid string) ([]OrganizationUsersData, error) + GetWorkspaceByUuid(uuid string) Workspace + GetWorkspaceByName(name string) Workspace + CreateOrEditWorkspace(m Workspace) (Workspace, error) + GetWorkspaceUsers(uuid string) ([]WorkspaceUsersData, error) GetWorkspaceUsersCount(uuid string) int64 GetWorkspaceBountyCount(uuid string) int64 - GetWorkspaceUser(pubkey string, org_uuid string) OrganizationUsers - CreateWorkspaceUser(orgUser OrganizationUsers) OrganizationUsers - DeleteWorkspaceUser(orgUser OrganizationUsersData, org string) OrganizationUsersData + GetWorkspaceUser(pubkey string, workspace_uuid string) WorkspaceUsers + CreateWorkspaceUser(orgUser WorkspaceUsers) WorkspaceUsers + DeleteWorkspaceUser(orgUser WorkspaceUsersData, org string) WorkspaceUsersData GetBountyRoles() []BountyRoles CreateUserRoles(roles []UserRoles, uuid string, pubkey string) []UserRoles - GetUserCreatedWorkspaces(pubkey string) []Organization - GetUserAssignedWorkspaces(pubkey string) []OrganizationUsers + GetUserCreatedWorkspaces(pubkey string) []Workspace + GetUserAssignedWorkspaces(pubkey string) []WorkspaceUsers AddBudgetHistory(budget BudgetHistory) BudgetHistory CreateWorkspaceBudget(budget BountyBudget) BountyBudget UpdateWorkspaceBudget(budget BountyBudget) BountyBudget - GetPaymentHistoryByCreated(created *time.Time, org_uuid string) PaymentHistory - GetWorkspaceBudget(org_uuid string) BountyBudget - GetWorkspaceStatusBudget(org_uuid string) StatusBudget - GetWorkspaceBudgetHistory(org_uuid string) []BudgetHistoryData + GetPaymentHistoryByCreated(created *time.Time, workspace_uuid string) PaymentHistory + GetWorkspaceBudget(workspace_uuid string) BountyBudget + GetWorkspaceStatusBudget(workspace_uuid string) StatusBudget + GetWorkspaceBudgetHistory(workspace_uuid string) []BudgetHistoryData AddAndUpdateBudget(invoice InvoiceList) PaymentHistory - WithdrawBudget(sender_pubkey string, org_uuid string, amount uint) + WithdrawBudget(sender_pubkey string, workspace_uuid string, amount uint) AddPaymentHistory(payment PaymentHistory) PaymentHistory - GetPaymentHistory(org_uuid string, r *http.Request) []PaymentHistory + GetPaymentHistory(workspace_uuid string, r *http.Request) []PaymentHistory GetInvoice(payment_request string) InvoiceList - GetWorkspaceInvoices(org_uuid string) []InvoiceList - GetWorkspaceInvoicesCount(org_uuid string) int64 + GetWorkspaceInvoices(workspace_uuid string) []InvoiceList + GetWorkspaceInvoicesCount(workspace_uuid string) int64 UpdateInvoice(payment_request string) InvoiceList AddInvoice(invoice InvoiceList) InvoiceList AddUserInvoiceData(userData UserInvoiceData) UserInvoiceData GetUserInvoiceData(payment_request string) UserInvoiceData DeleteUserInvoiceData(payment_request string) UserInvoiceData - ChangeWorkspaceDeleteStatus(org_uuid string, status bool) Organization + ChangeWorkspaceDeleteStatus(workspace_uuid string, status bool) Workspace UpdateWorkspaceForDeletion(uuid string) error DeleteAllUsersFromWorkspace(uuid string) error GetFilterStatusCount() FilterStattuCount diff --git a/db/structs.go b/db/structs.go index ee8233045..d8018ea51 100644 --- a/db/structs.go +++ b/db/structs.go @@ -429,10 +429,11 @@ type BountyData struct { } type BountyResponse struct { - Bounty Bounty `json:"bounty"` - Assignee Person `json:"assignee"` - Owner Person `json:"owner"` - Organization OrganizationShort `json:"organization"` + Bounty Bounty `json:"bounty"` + Assignee Person `json:"assignee"` + Owner Person `json:"owner"` + Organization WorkspaceShort `json:"organization"` + Workspace WorkspaceShort `json:"workspace"` } type BountyCountResponse struct { @@ -458,7 +459,24 @@ type Organization struct { Description string `json:"description" validate:"omitempty,lte=120"` } -type OrganizationShort struct { +type Workspace struct { + ID uint `json:"id"` + Uuid string `json:"uuid"` + Name string `gorm:"unique;not null" json:"name"` + OwnerPubKey string `json:"owner_pubkey"` + Img string `json:"img"` + Created *time.Time `json:"created"` + Updated *time.Time `json:"updated"` + Show bool `json:"show"` + Deleted bool `gorm:"default:false" json:"deleted"` + BountyCount int64 `json:"bounty_count,omitempty"` + Budget uint `json:"budget,omitempty"` + Website string `json:"website" validate:"omitempty,uri"` + Github string `json:"github" validate:"omitempty,uri"` + Description string `json:"description" validate:"omitempty,lte=120"` +} + +type WorkspaceShort struct { Uuid string `json:"uuid"` Name string `gorm:"unique;not null" json:"name"` Img string `json:"img"` @@ -472,9 +490,17 @@ type OrganizationUsers struct { Updated *time.Time `json:"updated"` } -type OrganizationUsersData struct { - OrgUuid string `json:"org_uuid"` - UserCreated *time.Time `json:"user_created"` +type WorkspaceUsers struct { + ID uint `json:"id"` + OwnerPubKey string `json:"owner_pubkey"` + WorkspaceUuid string `json:"workspace_uuid"` + Created *time.Time `json:"created"` + Updated *time.Time `json:"updated"` +} + +type WorkspaceUsersData struct { + WorkspaceUuid string `json:"workspace_uuid"` + UserCreated *time.Time `json:"user_created"` Person } diff --git a/db/workspaces.go b/db/workspaces.go index 97cf37e37..0e46bd54c 100644 --- a/db/workspaces.go +++ b/db/workspaces.go @@ -9,8 +9,8 @@ import ( "github.com/stakwork/sphinx-tribes/utils" ) -func (db database) GetWorkspaces(r *http.Request) []Organization { - ms := []Organization{} +func (db database) GetWorkspaces(r *http.Request) []Workspace { + ms := []Workspace{} offset, limit, sortBy, direction, search := utils.GetPaginationParams(r) // return if like owner_alias, unique_name, or equals pubkey @@ -20,29 +20,29 @@ func (db database) GetWorkspaces(r *http.Request) []Organization { func (db database) GetWorkspacesCount() int64 { var count int64 - db.db.Model(&Organization{}).Count(&count) + db.db.Model(&Workspace{}).Count(&count) return count } -func (db database) GetWorkspaceByUuid(uuid string) Organization { - ms := Organization{} +func (db database) GetWorkspaceByUuid(uuid string) Workspace { + ms := Workspace{} - db.db.Model(&Organization{}).Where("uuid = ?", uuid).Find(&ms) + db.db.Model(&Workspace{}).Where("uuid = ?", uuid).Find(&ms) return ms } -func (db database) GetWorkspaceByName(name string) Organization { - ms := Organization{} +func (db database) GetWorkspaceByName(name string) Workspace { + ms := Workspace{} - db.db.Model(&Organization{}).Where("name = ?", name).Find(&ms) + db.db.Model(&Workspace{}).Where("name = ?", name).Find(&ms) return ms } -func (db database) CreateOrEditWorkspace(m Organization) (Organization, error) { +func (db database) CreateOrEditWorkspace(m Workspace) (Workspace, error) { if m.OwnerPubKey == "" { - return Organization{}, errors.New("no pub key") + return Workspace{}, errors.New("no pub key") } if db.db.Model(&m).Where("uuid = ?", m.Uuid).Updates(&m).RowsAffected == 0 { @@ -52,41 +52,41 @@ func (db database) CreateOrEditWorkspace(m Organization) (Organization, error) { return m, nil } -func (db database) GetWorkspaceUsers(uuid string) ([]OrganizationUsersData, error) { - ms := []OrganizationUsersData{} +func (db database) GetWorkspaceUsers(uuid string) ([]WorkspaceUsersData, error) { + ms := []WorkspaceUsersData{} - err := db.db.Raw(`SELECT org.org_uuid, org.created as user_created, person.* FROM public.organization_users AS org LEFT OUTER JOIN public.people AS person ON org.owner_pub_key = person.owner_pub_key WHERE org.org_uuid = '` + uuid + `' ORDER BY org.created DESC`).Find(&ms).Error + err := db.db.Raw(`SELECT org.workspace_uuid, org.created as user_created, person.* FROM public.Workspace_users AS org LEFT OUTER JOIN public.people AS person ON org.owner_pub_key = person.owner_pub_key WHERE org.workspace_uuid = '` + uuid + `' ORDER BY org.created DESC`).Find(&ms).Error return ms, err } func (db database) GetWorkspaceUsersCount(uuid string) int64 { var count int64 - db.db.Model(&OrganizationUsers{}).Where("org_uuid = ?", uuid).Count(&count) + db.db.Model(&WorkspaceUsers{}).Where("workspace_uuid = ?", uuid).Count(&count) return count } func (db database) GetWorkspaceBountyCount(uuid string) int64 { var count int64 - db.db.Model(&Bounty{}).Where("org_uuid = ?", uuid).Count(&count) + db.db.Model(&Bounty{}).Where("workspace_uuid = ?", uuid).Count(&count) return count } -func (db database) GetWorkspaceUser(pubkey string, org_uuid string) OrganizationUsers { - ms := OrganizationUsers{} - db.db.Where("org_uuid = ?", org_uuid).Where("owner_pub_key = ?", pubkey).Find(&ms) +func (db database) GetWorkspaceUser(pubkey string, workspace_uuid string) WorkspaceUsers { + ms := WorkspaceUsers{} + db.db.Where("workspace_uuid = ?", workspace_uuid).Where("owner_pub_key = ?", pubkey).Find(&ms) return ms } -func (db database) CreateWorkspaceUser(orgUser OrganizationUsers) OrganizationUsers { +func (db database) CreateWorkspaceUser(orgUser WorkspaceUsers) WorkspaceUsers { db.db.Create(&orgUser) return orgUser } -func (db database) DeleteWorkspaceUser(orgUser OrganizationUsersData, org string) OrganizationUsersData { - db.db.Where("owner_pub_key = ?", orgUser.OwnerPubKey).Where("org_uuid = ?", org).Delete(&OrganizationUsers{}) - db.db.Where("owner_pub_key = ?", orgUser.OwnerPubKey).Where("org_uuid = ?", org).Delete(&UserRoles{}) +func (db database) DeleteWorkspaceUser(orgUser WorkspaceUsersData, org string) WorkspaceUsersData { + db.db.Where("owner_pub_key = ?", orgUser.OwnerPubKey).Where("workspace_uuid = ?", org).Delete(&WorkspaceUsers{}) + db.db.Where("owner_pub_key = ?", orgUser.OwnerPubKey).Where("workspace_uuid = ?", org).Delete(&UserRoles{}) return orgUser } @@ -98,7 +98,7 @@ func (db database) GetBountyRoles() []BountyRoles { func (db database) CreateUserRoles(roles []UserRoles, uuid string, pubkey string) []UserRoles { // delete roles and create new ones - db.db.Where("org_uuid = ?", uuid).Where("owner_pub_key = ?", pubkey).Delete(&UserRoles{}) + db.db.Where("workspace_uuid = ?", uuid).Where("owner_pub_key = ?", pubkey).Delete(&UserRoles{}) db.db.Create(&roles) return roles @@ -106,18 +106,18 @@ func (db database) CreateUserRoles(roles []UserRoles, uuid string, pubkey string func (db database) GetUserRoles(uuid string, pubkey string) []UserRoles { ms := []UserRoles{} - db.db.Where("org_uuid = ?", uuid).Where("owner_pub_key = ?", pubkey).Find(&ms) + db.db.Where("workspace_uuid = ?", uuid).Where("owner_pub_key = ?", pubkey).Find(&ms) return ms } -func (db database) GetUserCreatedWorkspaces(pubkey string) []Organization { - ms := []Organization{} +func (db database) GetUserCreatedWorkspaces(pubkey string) []Workspace { + ms := []Workspace{} db.db.Where("owner_pub_key = ?", pubkey).Where("deleted != ?", true).Find(&ms) return ms } -func (db database) GetUserAssignedWorkspaces(pubkey string) []OrganizationUsers { - ms := []OrganizationUsers{} +func (db database) GetUserAssignedWorkspaces(pubkey string) []WorkspaceUsers { + ms := []WorkspaceUsers{} db.db.Where("owner_pub_key = ?", pubkey).Find(&ms) return ms } @@ -133,28 +133,28 @@ func (db database) CreateWorkspaceBudget(budget BountyBudget) BountyBudget { } func (db database) UpdateWorkspaceBudget(budget BountyBudget) BountyBudget { - db.db.Model(&BountyBudget{}).Where("org_uuid = ?", budget.OrgUuid).Updates(map[string]interface{}{ + db.db.Model(&BountyBudget{}).Where("workspace_uuid = ?", budget.OrgUuid).Updates(map[string]interface{}{ "total_budget": budget.TotalBudget, }) return budget } -func (db database) GetPaymentHistoryByCreated(created *time.Time, org_uuid string) PaymentHistory { +func (db database) GetPaymentHistoryByCreated(created *time.Time, workspace_uuid string) PaymentHistory { ms := PaymentHistory{} - db.db.Where("created = ?", created).Where("org_uuid = ? ", org_uuid).Find(&ms) + db.db.Where("created = ?", created).Where("workspace_uuid = ? ", workspace_uuid).Find(&ms) return ms } -func (db database) GetWorkspaceBudget(org_uuid string) BountyBudget { +func (db database) GetWorkspaceBudget(workspace_uuid string) BountyBudget { ms := BountyBudget{} - db.db.Where("org_uuid = ?", org_uuid).Find(&ms) + db.db.Where("workspace_uuid = ?", workspace_uuid).Find(&ms) return ms } -func (db database) GetWorkspaceStatusBudget(org_uuid string) StatusBudget { +func (db database) GetWorkspaceStatusBudget(workspace_uuid string) StatusBudget { - orgBudget := db.GetWorkspaceBudget(org_uuid) + orgBudget := db.GetWorkspaceBudget(workspace_uuid) var openBudget uint db.db.Model(&Bounty{}).Where("assignee = '' ").Where("paid != true").Select("SUM(price)").Row().Scan(&openBudget) @@ -175,7 +175,7 @@ func (db database) GetWorkspaceStatusBudget(org_uuid string) StatusBudget { db.db.Model(&Bounty{}).Where("completed = true ").Where("paid != true").Count(&completedCount) statusBudget := StatusBudget{ - OrgUuid: org_uuid, + OrgUuid: workspace_uuid, CurrentBudget: orgBudget.TotalBudget, OpenBudget: openBudget, OpenCount: openCount, @@ -188,59 +188,59 @@ func (db database) GetWorkspaceStatusBudget(org_uuid string) StatusBudget { return statusBudget } -func (db database) GetWorkspaceBudgetHistory(org_uuid string) []BudgetHistoryData { +func (db database) GetWorkspaceBudgetHistory(workspace_uuid string) []BudgetHistoryData { budgetHistory := []BudgetHistoryData{} - db.db.Raw(`SELECT budget.id, budget.org_uuid, budget.amount, budget.created, budget.updated, budget.payment_type, budget.status, budget.sender_pub_key, sender.unique_name AS sender_name FROM public.budget_histories AS budget LEFT OUTER JOIN public.people AS sender ON budget.sender_pub_key = sender.owner_pub_key WHERE budget.org_uuid = '` + org_uuid + `' ORDER BY budget.created DESC`).Find(&budgetHistory) + db.db.Raw(`SELECT budget.id, budget.workspace_uuid, budget.amount, budget.created, budget.updated, budget.payment_type, budget.status, budget.sender_pub_key, sender.unique_name AS sender_name FROM public.budget_histories AS budget LEFT OUTER JOIN public.people AS sender ON budget.sender_pub_key = sender.owner_pub_key WHERE budget.workspace_uuid = '` + workspace_uuid + `' ORDER BY budget.created DESC`).Find(&budgetHistory) return budgetHistory } func (db database) AddAndUpdateBudget(invoice InvoiceList) PaymentHistory { created := invoice.Created - org_uuid := invoice.OrgUuid + workspace_uuid := invoice.OrgUuid - paymentHistory := db.GetPaymentHistoryByCreated(created, org_uuid) + paymentHistory := db.GetPaymentHistoryByCreated(created, workspace_uuid) if paymentHistory.OrgUuid != "" && paymentHistory.Amount != 0 { paymentHistory.Status = true - db.db.Where("created = ?", created).Where("org_uuid = ? ", org_uuid).Updates(paymentHistory) + db.db.Where("created = ?", created).Where("workspace_uuid = ? ", workspace_uuid).Updates(paymentHistory) - // get organization budget and add payment to total budget - organizationBudget := db.GetWorkspaceBudget(org_uuid) + // get Workspace budget and add payment to total budget + WorkspaceBudget := db.GetWorkspaceBudget(workspace_uuid) - if organizationBudget.OrgUuid == "" { + if WorkspaceBudget.OrgUuid == "" { now := time.Now() orgBudget := BountyBudget{ - OrgUuid: org_uuid, + OrgUuid: workspace_uuid, TotalBudget: paymentHistory.Amount, Created: &now, Updated: &now, } db.CreateWorkspaceBudget(orgBudget) } else { - totalBudget := organizationBudget.TotalBudget - organizationBudget.TotalBudget = totalBudget + paymentHistory.Amount - db.UpdateWorkspaceBudget(organizationBudget) + totalBudget := WorkspaceBudget.TotalBudget + WorkspaceBudget.TotalBudget = totalBudget + paymentHistory.Amount + db.UpdateWorkspaceBudget(WorkspaceBudget) } } return paymentHistory } -func (db database) WithdrawBudget(sender_pubkey string, org_uuid string, amount uint) { - // get organization budget and add payment to total budget - organizationBudget := db.GetWorkspaceBudget(org_uuid) - totalBudget := organizationBudget.TotalBudget +func (db database) WithdrawBudget(sender_pubkey string, workspace_uuid string, amount uint) { + // get Workspace budget and add payment to total budget + WorkspaceBudget := db.GetWorkspaceBudget(workspace_uuid) + totalBudget := WorkspaceBudget.TotalBudget newBudget := totalBudget - amount - db.db.Model(&BountyBudget{}).Where("org_uuid = ?", org_uuid).Updates(map[string]interface{}{ + db.db.Model(&BountyBudget{}).Where("workspace_uuid = ?", workspace_uuid).Updates(map[string]interface{}{ "total_budget": newBudget, }) now := time.Now() budgetHistory := PaymentHistory{ - OrgUuid: org_uuid, + OrgUuid: workspace_uuid, Amount: amount, Status: true, PaymentType: "withdraw", @@ -256,21 +256,21 @@ func (db database) WithdrawBudget(sender_pubkey string, org_uuid string, amount func (db database) AddPaymentHistory(payment PaymentHistory) PaymentHistory { db.db.Create(&payment) - // get organization budget and subtract payment from total budget - organizationBudget := db.GetWorkspaceBudget(payment.OrgUuid) - totalBudget := organizationBudget.TotalBudget + // get Workspace budget and subtract payment from total budget + WorkspaceBudget := db.GetWorkspaceBudget(payment.OrgUuid) + totalBudget := WorkspaceBudget.TotalBudget // deduct amount if it's a bounty payment if payment.PaymentType == "payment" { - organizationBudget.TotalBudget = totalBudget - payment.Amount + WorkspaceBudget.TotalBudget = totalBudget - payment.Amount } - db.UpdateWorkspaceBudget(organizationBudget) + db.UpdateWorkspaceBudget(WorkspaceBudget) return payment } -func (db database) GetPaymentHistory(org_uuid string, r *http.Request) []PaymentHistory { +func (db database) GetPaymentHistory(workspace_uuid string, r *http.Request) []PaymentHistory { payment := []PaymentHistory{} offset, limit, _, _, _ := utils.GetPaginationParams(r) @@ -278,29 +278,29 @@ func (db database) GetPaymentHistory(org_uuid string, r *http.Request) []Payment limitQuery = fmt.Sprintf("LIMIT %d OFFSET %d", limit, offset) - query := `SELECT * FROM payment_histories WHERE org_uuid = '` + org_uuid + `' AND status = true ORDER BY created DESC` + query := `SELECT * FROM payment_histories WHERE workspace_uuid = '` + workspace_uuid + `' AND status = true ORDER BY created DESC` db.db.Raw(query + " " + limitQuery).Find(&payment) return payment } -func (db database) GetWorkspaceInvoices(org_uuid string) []InvoiceList { +func (db database) GetWorkspaceInvoices(workspace_uuid string) []InvoiceList { ms := []InvoiceList{} - db.db.Where("org_uuid = ?", org_uuid).Where("status", false).Find(&ms) + db.db.Where("workspace_uuid = ?", workspace_uuid).Where("status", false).Find(&ms) return ms } -func (db database) GetWorkspaceInvoicesCount(org_uuid string) int64 { +func (db database) GetWorkspaceInvoicesCount(workspace_uuid string) int64 { var count int64 ms := InvoiceList{} - db.db.Model(&ms).Where("org_uuid = ?", org_uuid).Where("status", false).Count(&count) + db.db.Model(&ms).Where("workspace_uuid = ?", workspace_uuid).Where("status", false).Count(&count) return count } -func (db database) ChangeWorkspaceDeleteStatus(org_uuid string, status bool) Organization { - ms := Organization{} - db.db.Model(&ms).Where("uuid", org_uuid).Updates(map[string]interface{}{ +func (db database) ChangeWorkspaceDeleteStatus(workspace_uuid string, status bool) Workspace { + ms := Workspace{} + db.db.Model(&ms).Where("uuid", workspace_uuid).Updates(map[string]interface{}{ "deleted": status, }) return ms @@ -314,7 +314,7 @@ func (db database) UpdateWorkspaceForDeletion(uuid string) error { "show": false, } - result := db.db.Model(&Organization{}).Where("uuid = ?", uuid).Updates(updates) + result := db.db.Model(&Workspace{}).Where("uuid = ?", uuid).Updates(updates) if result.Error != nil { return result.Error } @@ -327,14 +327,14 @@ func (db database) DeleteAllUsersFromWorkspace(org string) error { return errors.New("no org uuid provided") } - // Delete all users associated with the organization - result := db.db.Where("org_uuid = ?", org).Delete(&OrganizationUsers{}) + // Delete all users associated with the Workspace + result := db.db.Where("workspace_uuid = ?", org).Delete(&WorkspaceUsers{}) if result.Error != nil { return result.Error } - // Delete all user roles associated with the organization - result = db.db.Where("org_uuid = ?", org).Delete(&UserRoles{}) + // Delete all user roles associated with the Workspace + result = db.db.Where("workspace_uuid = ?", org).Delete(&UserRoles{}) if result.Error != nil { return result.Error } diff --git a/handlers/bounty.go b/handlers/bounty.go index d3f9e58fa..8115f5f3b 100644 --- a/handlers/bounty.go +++ b/handlers/bounty.go @@ -359,7 +359,7 @@ func (h *bountyHandler) GenerateBountyResponse(bounties []db.Bounty) []db.Bounty owner := h.db.GetPersonByPubkey(bounty.OwnerID) assignee := h.db.GetPersonByPubkey(bounty.Assignee) - organization := h.db.GetWorkspaceByUuid(bounty.OrgUuid) + workspace := h.db.GetWorkspaceByUuid(bounty.OrgUuid) b := db.BountyResponse{ Bounty: db.Bounty{ @@ -424,10 +424,15 @@ func (h *bountyHandler) GenerateBountyResponse(bounties []db.Bounty) []db.Bounty PriceToMeet: owner.PriceToMeet, TwitterConfirmed: owner.TwitterConfirmed, }, - Organization: db.OrganizationShort{ - Name: organization.Name, - Uuid: organization.Uuid, - Img: organization.Img, + Organization: db.WorkspaceShort{ + Name: workspace.Name, + Uuid: workspace.Uuid, + Img: workspace.Img, + }, + Workspace: db.WorkspaceShort{ + Name: workspace.Name, + Uuid: workspace.Uuid, + Img: workspace.Img, }, } bountyResponse = append(bountyResponse, b) @@ -472,7 +477,7 @@ func (h *bountyHandler) MakeBountyPayment(w http.ResponseWriter, r *http.Request return } - // check if user is the admin of the organization + // check if user is the admin of the workspace // or has a pay bounty role hasRole := h.userHasAccess(pubKeyFromAuth, bounty.OrgUuid, db.PayBounty) if !hasRole { @@ -481,12 +486,12 @@ func (h *bountyHandler) MakeBountyPayment(w http.ResponseWriter, r *http.Request return } - // check if the organization bounty balance + // check if the workspace bounty balance // is greater than the amount orgBudget := h.db.GetWorkspaceBudget(bounty.OrgUuid) if orgBudget.TotalBudget < amount { w.WriteHeader(http.StatusForbidden) - json.NewEncoder(w).Encode("organization budget is not enough to pay the amount") + json.NewEncoder(w).Encode("workspace budget is not enough to pay the amount") return } @@ -592,7 +597,7 @@ func (h *bountyHandler) BountyBudgetWithdraw(w http.ResponseWriter, r *http.Requ return } - // check if user is the admin of the organization + // check if user is the admin of the workspace // or has a withdraw bounty budget role hasRole := h.userHasAccess(pubKeyFromAuth, request.OrgUuid, db.WithdrawBudget) if !hasRole { @@ -605,7 +610,7 @@ func (h *bountyHandler) BountyBudgetWithdraw(w http.ResponseWriter, r *http.Requ amount := utils.GetInvoiceAmount(request.PaymentRequest) if err == nil && amount > 0 { - // check if the organization bounty balance + // check if the workspace bounty balance // is greater than the amount orgBudget := h.db.GetWorkspaceBudget(request.OrgUuid) if amount > orgBudget.TotalBudget { @@ -616,7 +621,7 @@ func (h *bountyHandler) BountyBudgetWithdraw(w http.ResponseWriter, r *http.Requ } paymentSuccess, paymentError := h.PayLightningInvoice(request.PaymentRequest) if paymentSuccess.Success { - // withdraw amount from organization budget + // withdraw amount from workspace budget h.db.WithdrawBudget(pubKeyFromAuth, request.OrgUuid, amount) w.WriteHeader(http.StatusOK) json.NewEncoder(w).Encode(paymentSuccess) diff --git a/handlers/bounty_test.go b/handlers/bounty_test.go index 21432500a..f5ca869db 100644 --- a/handlers/bounty_test.go +++ b/handlers/bounty_test.go @@ -503,7 +503,7 @@ func TestGetBountyByCreated(t *testing.T) { assignee := db.Person{ ID: 1, } - organization := db.OrganizationShort{ + workspace := db.WorkspaceShort{ Uuid: "uuid", } @@ -511,7 +511,8 @@ func TestGetBountyByCreated(t *testing.T) { Bounty: bounty, Assignee: assignee, Owner: owner, - Organization: organization, + Organization: workspace, + Workspace: workspace, } bountyResponses = append(bountyResponses, bountyResponse) } @@ -540,7 +541,7 @@ func TestGetBountyByCreated(t *testing.T) { mockDb.On("GetBountyDataByCreated", createdStr).Return([]db.Bounty{bounty}, nil).Once() mockDb.On("GetPersonByPubkey", "owner-1").Return(db.Person{}).Once() mockDb.On("GetPersonByPubkey", "user1").Return(db.Person{}).Once() - mockDb.On("GetWorkspaceByUuid", "org-1").Return(db.Organization{}).Once() + mockDb.On("GetWorkspaceByUuid", "org-1").Return(db.Workspace{}).Once() handler.ServeHTTP(rr, req) var returnedBounty []db.BountyResponse @@ -598,7 +599,7 @@ func TestGetPersonAssignedBounties(t *testing.T) { mockDb.On("GetAssignedBounties", req).Return([]db.Bounty{bounty}, nil).Once() mockDb.On("GetPersonByPubkey", "owner-1").Return(db.Person{}, nil).Once() mockDb.On("GetPersonByPubkey", "user1").Return(db.Person{}, nil).Once() - mockDb.On("GetWorkspaceByUuid", "org-1").Return(db.Organization{}, nil).Once() + mockDb.On("GetWorkspaceByUuid", "org-1").Return(db.Workspace{}, nil).Once() handler.ServeHTTP(rr, req) var returnedBounty []db.BountyResponse @@ -626,7 +627,7 @@ func TestGetPersonCreatedBounties(t *testing.T) { assignee := db.Person{ ID: 1, } - organization := db.OrganizationShort{ + workspace := db.WorkspaceShort{ Uuid: "uuid", } @@ -634,7 +635,8 @@ func TestGetPersonCreatedBounties(t *testing.T) { Bounty: bounty, Assignee: assignee, Owner: owner, - Organization: organization, + Organization: workspace, + Workspace: workspace, } bountyResponses = append(bountyResponses, bountyResponse) } @@ -650,7 +652,7 @@ func TestGetPersonCreatedBounties(t *testing.T) { mockDb.On("GetCreatedBounties", mock.Anything).Return(expectedBounties, nil).Once() mockDb.On("GetPersonByPubkey", mock.Anything).Return(db.Person{}, nil) - mockDb.On("GetWorkspaceByUuid", mock.Anything).Return(db.Organization{}, nil) + mockDb.On("GetWorkspaceByUuid", mock.Anything).Return(db.Workspace{}, nil) rr := httptest.NewRecorder() req, err := http.NewRequest("GET", "/people/wanteds/created/uuid", nil) req = req.WithContext(ctx) @@ -717,7 +719,7 @@ func TestGetPersonCreatedBounties(t *testing.T) { assignee := db.Person{ ID: 1, } - organization := db.OrganizationShort{ + workspace := db.WorkspaceShort{ Uuid: "uuid", } @@ -725,7 +727,8 @@ func TestGetPersonCreatedBounties(t *testing.T) { Bounty: bounty, Assignee: assignee, Owner: owner, - Organization: organization, + Organization: workspace, + Workspace: workspace, } bountyResponses = append(bountyResponses, bountyResponse) } @@ -742,7 +745,7 @@ func TestGetPersonCreatedBounties(t *testing.T) { mockDb.On("GetCreatedBounties", mock.Anything).Return(expectedBounties, nil).Once() mockDb.On("GetPersonByPubkey", mock.Anything).Return(db.Person{}, nil) - mockDb.On("GetWorkspaceByUuid", mock.Anything).Return(db.Organization{}, nil) + mockDb.On("GetWorkspaceByUuid", mock.Anything).Return(db.Workspace{}, nil) rr := httptest.NewRecorder() req, err := http.NewRequest("GET", "/people/wanteds/created/uuid?Open=true&Assigned=true&Paid=true&offset=0&limit=2", nil) @@ -816,7 +819,7 @@ func TestGetWorkspaceNextBountyByCreated(t *testing.T) { mockHttpClient := mocks.NewHttpClient(t) bHandler := NewBountyHandler(mockHttpClient, mockDb) - t.Run("Should test that the next bounty on the organization bounties homepage can be gotten by its created value and the selected filters", func(t *testing.T) { + t.Run("Should test that the next bounty on the workspace bounties homepage can be gotten by its created value and the selected filters", func(t *testing.T) { mockDb.On("GetNextWorkspaceBountyByCreated", mock.AnythingOfType("*http.Request")).Return(uint(1), nil).Once() rr := httptest.NewRecorder() @@ -835,7 +838,7 @@ func TestGetWorkspacePreviousBountyByCreated(t *testing.T) { mockHttpClient := mocks.NewHttpClient(t) bHandler := NewBountyHandler(mockHttpClient, mockDb) - t.Run("Should test that the previous bounty on the organization bounties homepage can be gotten by its created value and the selected filters", func(t *testing.T) { + t.Run("Should test that the previous bounty on the workspace bounties homepage can be gotten by its created value and the selected filters", func(t *testing.T) { mockDb.On("GetPreviousWorkspaceBountyByCreated", mock.AnythingOfType("*http.Request")).Return(uint(1), nil).Once() rr := httptest.NewRecorder() @@ -899,7 +902,7 @@ func TestGetBountyById(t *testing.T) { mockDb.On("GetBountyById", mock.Anything).Return([]db.Bounty{bounty}, nil).Once() mockDb.On("GetPersonByPubkey", "owner123").Return(db.Person{}).Once() mockDb.On("GetPersonByPubkey", "user1").Return(db.Person{}).Once() - mockDb.On("GetWorkspaceByUuid", "org-789").Return(db.Organization{}).Once() + mockDb.On("GetWorkspaceByUuid", "org-789").Return(db.Workspace{}).Once() handler.ServeHTTP(rr, req) @@ -943,7 +946,7 @@ func GetPersonAssigned(t *testing.T) { assignee := db.Person{ ID: 1, } - organization := db.OrganizationShort{ + workspace := db.WorkspaceShort{ Uuid: "uuid", } @@ -951,7 +954,8 @@ func GetPersonAssigned(t *testing.T) { Bounty: bounty, Assignee: assignee, Owner: owner, - Organization: organization, + Organization: workspace, + Workspace: workspace, } bountyResponses = append(bountyResponses, bountyResponse) } @@ -969,7 +973,7 @@ func GetPersonAssigned(t *testing.T) { mockDb.On("GetAssignedBounties", mock.Anything).Return(expectedBounties, nil).Once() mockDb.On("GetPersonByPubkey", mock.Anything).Return(db.Person{}, nil) - mockDb.On("GetWorkspaceByUuid", mock.Anything).Return(db.Organization{}, nil) + mockDb.On("GetWorkspaceByUuid", mock.Anything).Return(db.Workspace{}, nil) rr := httptest.NewRecorder() req, err := http.NewRequest("GET", "/wanteds/assigned/uuid?Assigned=true&Paid=true&offset=0&limit=4", nil) req = req.WithContext(ctx) @@ -1101,7 +1105,7 @@ func TestGetAllBounties(t *testing.T) { mockDb.On("GetAllBounties", req).Return(bounties) mockDb.On("GetPersonByPubkey", mock.Anything).Return(db.Person{}, nil) - mockDb.On("GetWorkspaceByUuid", mock.Anything).Return(db.Organization{}, nil) + mockDb.On("GetWorkspaceByUuid", mock.Anything).Return(db.Workspace{}, nil) handler.ServeHTTP(rr, req) var returnedBounty []db.BountyResponse @@ -1247,7 +1251,7 @@ func TestMakeBountyPayment(t *testing.T) { mockDb.AssertExpectations(t) }) - t.Run("401 error if user not organization admin or does not have PAY BOUNTY role", func(t *testing.T) { + t.Run("401 error if user not workspace admin or does not have PAY BOUNTY role", func(t *testing.T) { bHandler.userHasAccess = mockUserHasAccessFalse mockDb.On("GetBounty", mock.AnythingOfType("uint")).Return(db.Bounty{ @@ -1273,7 +1277,7 @@ func TestMakeBountyPayment(t *testing.T) { }) - t.Run("403 error when amount exceeds organization's budget balance", func(t *testing.T) { + t.Run("403 error when amount exceeds workspace's budget balance", func(t *testing.T) { ctx := context.WithValue(context.Background(), auth.ContextKey, "valid-key") mockDb := dbMocks.NewDatabase(t) @@ -1302,7 +1306,7 @@ func TestMakeBountyPayment(t *testing.T) { r.ServeHTTP(rr, req) - assert.Equal(t, http.StatusForbidden, rr.Code, "Expected 403 Forbidden when the payment exceeds the organization's budget") + assert.Equal(t, http.StatusForbidden, rr.Code, "Expected 403 Forbidden when the payment exceeds the workspace's budget") }) @@ -1447,7 +1451,7 @@ func TestBountyBudgetWithdraw(t *testing.T) { assert.Equal(t, http.StatusNotAcceptable, rr.Code) }) - t.Run("401 error if user is not the organization admin or does not have WithdrawBudget role", func(t *testing.T) { + t.Run("401 error if user is not the workspace admin or does not have WithdrawBudget role", func(t *testing.T) { bHandler.userHasAccess = mockUserHasAccessFalse rr := httptest.NewRecorder() @@ -1465,7 +1469,7 @@ func TestBountyBudgetWithdraw(t *testing.T) { assert.Contains(t, rr.Body.String(), "You don't have appropriate permissions to withdraw bounty budget") }) - t.Run("403 error when amount exceeds organization's budget", func(t *testing.T) { + t.Run("403 error when amount exceeds workspace's budget", func(t *testing.T) { ctxs := context.WithValue(context.Background(), auth.ContextKey, "valid-key") mockDb := dbMocks.NewDatabase(t) mockHttpClient := mocks.NewHttpClient(t) @@ -1491,11 +1495,11 @@ func TestBountyBudgetWithdraw(t *testing.T) { bHandler.BountyBudgetWithdraw(rr, req) - assert.Equal(t, http.StatusForbidden, rr.Code, "Expected 403 Forbidden when the payment exceeds the organization's budget") + assert.Equal(t, http.StatusForbidden, rr.Code, "Expected 403 Forbidden when the payment exceeds the workspace's budget") assert.Contains(t, rr.Body.String(), "Workspace budget is not enough to withdraw the amount", "Expected specific error message") }) - t.Run("budget invoices get paid if amount is lesser than organization's budget", func(t *testing.T) { + t.Run("budget invoices get paid if amount is lesser than workspace's budget", func(t *testing.T) { ctxs := context.WithValue(context.Background(), auth.ContextKey, "valid-key") mockDb := dbMocks.NewDatabase(t) mockHttpClient := mocks.NewHttpClient(t) @@ -1615,7 +1619,7 @@ func TestBountyBudgetWithdraw(t *testing.T) { assert.NoError(t, err) assert.True(t, response.Success, "Expected invoice payment to succeed") finalBudget := mockDb.GetWorkspaceBudget("org-1") - assert.Equal(t, expectedFinalBudget, finalBudget.TotalBudget, "The organization's final budget should reflect the deductions from the successful withdrawals") + assert.Equal(t, expectedFinalBudget, finalBudget.TotalBudget, "The workspace's final budget should reflect the deductions from the successful withdrawals") } }) @@ -1776,7 +1780,7 @@ func TestPollInvoice(t *testing.T) { mockHttpClient.AssertExpectations(t) }) - t.Run("If the invoice is settled and the invoice.Type is equal to BUDGET the invoice amount should be added to the organization budget and the payment status of the related invoice should be sent to true on the payment history table", func(t *testing.T) { + t.Run("If the invoice is settled and the invoice.Type is equal to BUDGET the invoice amount should be added to the workspace budget and the payment status of the related invoice should be sent to true on the payment history table", func(t *testing.T) { ctx := context.Background() mockDb := &dbMocks.Database{} mockHttpClient := &mocks.HttpClient{} diff --git a/handlers/metrics_test.go b/handlers/metrics_test.go index 087101143..38695f8ac 100644 --- a/handlers/metrics_test.go +++ b/handlers/metrics_test.go @@ -161,7 +161,7 @@ func TestMetricsBounties(t *testing.T) { mockDb.On("GetBountiesByDateRange", dateRange, req).Return(bounties).Once() mockDb.On("GetPersonByPubkey", "owner-1").Return(db.Person{ID: 1}).Once() mockDb.On("GetPersonByPubkey", "").Return(db.Person{}).Once() - mockDb.On("GetWorkspaceByUuid", "").Return(db.Organization{}).Once() + mockDb.On("GetWorkspaceByUuid", "").Return(db.Workspace{}).Once() handler.ServeHTTP(rr, req) var res []db.BountyData @@ -216,10 +216,10 @@ func TestMetricsBounties(t *testing.T) { mockDb.On("GetBountiesByDateRange", dateRange, req).Return(bounties).Once() mockDb.On("GetPersonByPubkey", "provider1").Return(db.Person{ID: 1}).Once() mockDb.On("GetPersonByPubkey", "").Return(db.Person{}).Once() - mockDb.On("GetWorkspaceByUuid", "").Return(db.Organization{}).Once() + mockDb.On("GetWorkspaceByUuid", "").Return(db.Workspace{}).Once() mockDb.On("GetPersonByPubkey", "provider2").Return(db.Person{ID: 2}).Once() mockDb.On("GetPersonByPubkey", "").Return(db.Person{}).Once() - mockDb.On("GetWorkspaceByUuid", "").Return(db.Organization{}).Once() + mockDb.On("GetWorkspaceByUuid", "").Return(db.Workspace{}).Once() handler.ServeHTTP(rr, req) diff --git a/handlers/workspaces.go b/handlers/workspaces.go index 8922ce63f..0407c8724 100644 --- a/handlers/workspaces.go +++ b/handlers/workspaces.go @@ -46,7 +46,7 @@ func (oh *workspaceHandler) CreateOrEditWorkspace(w http.ResponseWriter, r *http } now := time.Now() - workspace := db.Organization{} + workspace := db.Workspace{} body, _ := io.ReadAll(r.Body) r.Body.Close() err := json.Unmarshal(body, &workspace) @@ -60,16 +60,16 @@ func (oh *workspaceHandler) CreateOrEditWorkspace(w http.ResponseWriter, r *http workspace.Name = strings.TrimSpace(workspace.Name) if len(workspace.Name) == 0 || len(workspace.Name) > 20 { - fmt.Printf("invalid organization name %s\n", workspace.Name) + fmt.Printf("invalid workspace name %s\n", workspace.Name) w.WriteHeader(http.StatusBadRequest) - json.NewEncoder(w).Encode("Error: organization name must be present and should not exceed 20 character") + json.NewEncoder(w).Encode("Error: workspace name must be present and should not exceed 20 character") return } if len(workspace.Description) > 120 { - fmt.Printf("invalid organization name %s\n", workspace.Description) + fmt.Printf("invalid workspace name %s\n", workspace.Description) w.WriteHeader(http.StatusBadRequest) - json.NewEncoder(w).Encode("Error: organization description should not exceed 120 character") + json.NewEncoder(w).Encode("Error: workspace description should not exceed 120 character") return } @@ -111,7 +111,7 @@ func (oh *workspaceHandler) CreateOrEditWorkspace(w http.ResponseWriter, r *http name := workspace.Name - // check if the organization name already exists + // check if the workspace name already exists orgName := oh.db.GetWorkspaceByName(name) if orgName.Name == name { @@ -127,13 +127,13 @@ func (oh *workspaceHandler) CreateOrEditWorkspace(w http.ResponseWriter, r *http } else { if workspace.ID == 0 { // can't create that already exists - fmt.Println("can't create existing organization") + fmt.Println("can't create existing workspace") w.WriteHeader(http.StatusUnauthorized) return } if workspace.ID != existing.ID { // can't edit someone else's - fmt.Println("cant edit another organization") + fmt.Println("cant edit another workspace") w.WriteHeader(http.StatusUnauthorized) return } @@ -176,13 +176,13 @@ func CreateWorkspaceUser(w http.ResponseWriter, r *http.Request) { pubKeyFromAuth, _ := ctx.Value(auth.ContextKey).(string) now := time.Now() - orgUser := db.OrganizationUsers{} + workspaceUser := db.WorkspaceUsers{} body, err := io.ReadAll(r.Body) r.Body.Close() - err = json.Unmarshal(body, &orgUser) + err = json.Unmarshal(body, &workspaceUser) // get orgnanization - workspace := db.DB.GetWorkspaceByUuid(orgUser.OrgUuid) + workspace := db.DB.GetWorkspaceByUuid(workspaceUser.WorkspaceUuid) if err != nil { fmt.Println(err) @@ -196,22 +196,22 @@ func CreateWorkspaceUser(w http.ResponseWriter, r *http.Request) { return } - // check if the user is the organization admin - if orgUser.OwnerPubKey == workspace.OwnerPubKey { + // check if the user is the workspace admin + if workspaceUser.OwnerPubKey == workspace.OwnerPubKey { w.WriteHeader(http.StatusUnauthorized) - json.NewEncoder(w).Encode("Cannot add organization admin as a user") + json.NewEncoder(w).Encode("Cannot add workspace admin as a user") return } // check if the user tries to add their self - if pubKeyFromAuth == orgUser.OwnerPubKey { + if pubKeyFromAuth == workspaceUser.OwnerPubKey { w.WriteHeader(http.StatusUnauthorized) json.NewEncoder(w).Encode("Cannot add userself as a user") return } // if not the orgnization admin - hasRole := db.UserHasAccess(pubKeyFromAuth, orgUser.OrgUuid, db.AddUser) + hasRole := db.UserHasAccess(pubKeyFromAuth, workspaceUser.WorkspaceUuid, db.AddUser) if !hasRole { w.WriteHeader(http.StatusUnauthorized) json.NewEncoder(w).Encode("Don't have access to add user") @@ -219,15 +219,15 @@ func CreateWorkspaceUser(w http.ResponseWriter, r *http.Request) { } // check if the user exists on peoples table - isUser := db.DB.GetPersonByPubkey(orgUser.OwnerPubKey) - if isUser.OwnerPubKey != orgUser.OwnerPubKey { + isUser := db.DB.GetPersonByPubkey(workspaceUser.OwnerPubKey) + if isUser.OwnerPubKey != workspaceUser.OwnerPubKey { w.WriteHeader(http.StatusUnauthorized) json.NewEncoder(w).Encode("User doesn't exists in people") return } // check if user already exists - userExists := db.DB.GetWorkspaceUser(orgUser.OwnerPubKey, orgUser.OrgUuid) + userExists := db.DB.GetWorkspaceUser(workspaceUser.OwnerPubKey, workspaceUser.WorkspaceUuid) if userExists.ID != 0 { w.WriteHeader(http.StatusUnauthorized) @@ -235,21 +235,21 @@ func CreateWorkspaceUser(w http.ResponseWriter, r *http.Request) { return } - orgUser.Created = &now - orgUser.Updated = &now + workspaceUser.Created = &now + workspaceUser.Updated = &now // create user - user := db.DB.CreateWorkspaceUser(orgUser) + user := db.DB.CreateWorkspaceUser(workspaceUser) w.WriteHeader(http.StatusOK) json.NewEncoder(w).Encode(user) } func GetWorkspaceUsers(w http.ResponseWriter, r *http.Request) { uuid := chi.URLParam(r, "uuid") - orgUsers, _ := db.DB.GetWorkspaceUsers(uuid) + workspaceUsers, _ := db.DB.GetWorkspaceUsers(uuid) w.WriteHeader(http.StatusOK) - json.NewEncoder(w).Encode(orgUsers) + json.NewEncoder(w).Encode(workspaceUsers) } func GetWorkspaceUser(w http.ResponseWriter, r *http.Request) { @@ -263,10 +263,10 @@ func GetWorkspaceUser(w http.ResponseWriter, r *http.Request) { } uuid := chi.URLParam(r, "uuid") - orgUser := db.DB.GetWorkspaceUser(pubKeyFromAuth, uuid) + workspaceUser := db.DB.GetWorkspaceUser(pubKeyFromAuth, uuid) w.WriteHeader(http.StatusOK) - json.NewEncoder(w).Encode(orgUser) + json.NewEncoder(w).Encode(workspaceUser) } func GetWorkspaceUsersCount(w http.ResponseWriter, r *http.Request) { @@ -281,10 +281,10 @@ func DeleteWorkspaceUser(w http.ResponseWriter, r *http.Request) { ctx := r.Context() pubKeyFromAuth, _ := ctx.Value(auth.ContextKey).(string) - orgUser := db.OrganizationUsersData{} + workspaceUser := db.WorkspaceUsersData{} body, err := io.ReadAll(r.Body) r.Body.Close() - err = json.Unmarshal(body, &orgUser) + err = json.Unmarshal(body, &workspaceUser) if err != nil { fmt.Println(err) @@ -298,25 +298,25 @@ func DeleteWorkspaceUser(w http.ResponseWriter, r *http.Request) { return } - workspace := db.DB.GetWorkspaceByUuid(orgUser.OrgUuid) + workspace := db.DB.GetWorkspaceByUuid(workspaceUser.WorkspaceUuid) - if orgUser.OwnerPubKey == workspace.OwnerPubKey { + if workspaceUser.OwnerPubKey == workspace.OwnerPubKey { w.WriteHeader(http.StatusUnauthorized) - json.NewEncoder(w).Encode("Cannot delete organization admin") + json.NewEncoder(w).Encode("Cannot delete workspace admin") return } - hasRole := db.UserHasAccess(pubKeyFromAuth, orgUser.OrgUuid, db.DeleteUser) + hasRole := db.UserHasAccess(pubKeyFromAuth, workspaceUser.WorkspaceUuid, db.DeleteUser) if !hasRole { w.WriteHeader(http.StatusUnauthorized) json.NewEncoder(w).Encode("Don't have access to delete user") return } - db.DB.DeleteWorkspaceUser(orgUser, orgUser.OrgUuid) + db.DB.DeleteWorkspaceUser(workspaceUser, workspaceUser.WorkspaceUuid) w.WriteHeader(http.StatusOK) - json.NewEncoder(w).Encode(orgUser) + json.NewEncoder(w).Encode(workspaceUser) } func GetBountyRoles(w http.ResponseWriter, r *http.Request) { @@ -407,10 +407,10 @@ func AddUserRoles(w http.ResponseWriter, r *http.Request) { // check if user already exists userExists := db.DB.GetWorkspaceUser(user, uuid) - // if not the organization admin - if userExists.OwnerPubKey != user || userExists.OrgUuid != uuid { + // if not the workspace admin + if userExists.OwnerPubKey != user || userExists.WorkspaceUuid != uuid { w.WriteHeader(http.StatusUnauthorized) - json.NewEncoder(w).Encode("User does not exists in the organization") + json.NewEncoder(w).Encode("User does not exists in the workspace") return } @@ -443,27 +443,27 @@ func GetUserWorkspaces(w http.ResponseWriter, r *http.Request) { user := db.DB.GetPerson(userId) // get the workspaces created by the user, then get all the workspaces - // the user has been added to, loop through to get the organization + // the user has been added to, loop through to get the workspace workspaces := GetCreatedWorkspaces(user.OwnerPubKey) assignedWorkspaces := db.DB.GetUserAssignedWorkspaces(user.OwnerPubKey) for _, value := range assignedWorkspaces { - uuid := value.OrgUuid - organization := db.DB.GetWorkspaceByUuid(uuid) + uuid := value.WorkspaceUuid + workspace := db.DB.GetWorkspaceByUuid(uuid) bountyCount := db.DB.GetWorkspaceBountyCount(uuid) hasRole := db.UserHasAccess(user.OwnerPubKey, uuid, db.ViewReport) // don't add deleted workspaces to the list - if !organization.Deleted { + if !workspace.Deleted { if hasRole { budget := db.DB.GetWorkspaceBudget(uuid) - organization.Budget = budget.TotalBudget + workspace.Budget = budget.TotalBudget } else { - organization.Budget = 0 + workspace.Budget = 0 } - organization.BountyCount = bountyCount + workspace.BountyCount = bountyCount - workspaces = append(workspaces, organization) + workspaces = append(workspaces, workspace) } } @@ -484,28 +484,28 @@ func (oh *workspaceHandler) GetUserDropdownWorkspaces(w http.ResponseWriter, r * user := db.DB.GetPerson(userId) // get the workspaces created by the user, then get all the workspaces - // the user has been added to, loop through to get the organization + // the user has been added to, loop through to get the workspace workspaces := GetCreatedWorkspaces(user.OwnerPubKey) assignedWorkspaces := db.DB.GetUserAssignedWorkspaces(user.OwnerPubKey) for _, value := range assignedWorkspaces { - uuid := value.OrgUuid - organization := db.DB.GetWorkspaceByUuid(uuid) + uuid := value.WorkspaceUuid + workspace := db.DB.GetWorkspaceByUuid(uuid) bountyCount := db.DB.GetWorkspaceBountyCount(uuid) hasRole := db.UserHasAccess(user.OwnerPubKey, uuid, db.ViewReport) hasBountyRoles := oh.userHasManageBountyRoles(user.OwnerPubKey, uuid) // don't add deleted workspaces to the list - if !organization.Deleted && hasBountyRoles { + if !workspace.Deleted && hasBountyRoles { if hasRole { budget := db.DB.GetWorkspaceBudget(uuid) - organization.Budget = budget.TotalBudget + workspace.Budget = budget.TotalBudget } else { - organization.Budget = 0 + workspace.Budget = 0 } - organization.BountyCount = bountyCount + workspace.BountyCount = bountyCount - workspaces = append(workspaces, organization) + workspaces = append(workspaces, workspace) } } @@ -513,9 +513,9 @@ func (oh *workspaceHandler) GetUserDropdownWorkspaces(w http.ResponseWriter, r * json.NewEncoder(w).Encode(workspaces) } -func GetCreatedWorkspaces(pubkey string) []db.Organization { +func GetCreatedWorkspaces(pubkey string) []db.Workspace { workspaces := db.DB.GetUserCreatedWorkspaces(pubkey) - // add bounty count to the organization + // add bounty count to the workspace for index, value := range workspaces { uuid := value.Uuid bountyCount := db.DB.GetWorkspaceBountyCount(uuid) @@ -535,10 +535,10 @@ func GetCreatedWorkspaces(pubkey string) []db.Organization { func (oh *workspaceHandler) GetWorkspaceBounties(w http.ResponseWriter, r *http.Request) { uuid := chi.URLParam(r, "uuid") - // get the organization bounties - organizationBounties := oh.db.GetWorkspaceBounties(r, uuid) + // get the workspace bounties + workspaceBounties := oh.db.GetWorkspaceBounties(r, uuid) - var bountyResponse []db.BountyResponse = oh.generateBountyHandler(organizationBounties) + var bountyResponse []db.BountyResponse = oh.generateBountyHandler(workspaceBounties) w.WriteHeader(http.StatusOK) json.NewEncoder(w).Encode(bountyResponse) } @@ -546,10 +546,10 @@ func (oh *workspaceHandler) GetWorkspaceBounties(w http.ResponseWriter, r *http. func (oh *workspaceHandler) GetWorkspaceBountiesCount(w http.ResponseWriter, r *http.Request) { uuid := chi.URLParam(r, "uuid") - organizationBountiesCount := oh.db.GetWorkspaceBountiesCount(r, uuid) + workspaceBountiesCount := oh.db.GetWorkspaceBountiesCount(r, uuid) w.WriteHeader(http.StatusOK) - json.NewEncoder(w).Encode(organizationBountiesCount) + json.NewEncoder(w).Encode(workspaceBountiesCount) } func (oh *workspaceHandler) GetWorkspaceBudget(w http.ResponseWriter, r *http.Request) { @@ -563,7 +563,7 @@ func (oh *workspaceHandler) GetWorkspaceBudget(w http.ResponseWriter, r *http.Re return } - // if not the organization admin + // if not the workspace admin hasRole := oh.userHasAccess(pubKeyFromAuth, uuid, db.ViewReport) if !hasRole { w.WriteHeader(http.StatusUnauthorized) @@ -571,11 +571,11 @@ func (oh *workspaceHandler) GetWorkspaceBudget(w http.ResponseWriter, r *http.Re return } - // get the organization budget - organizationBudget := oh.db.GetWorkspaceStatusBudget(uuid) + // get the workspace budget + workspaceBudget := oh.db.GetWorkspaceStatusBudget(uuid) w.WriteHeader(http.StatusOK) - json.NewEncoder(w).Encode(organizationBudget) + json.NewEncoder(w).Encode(workspaceBudget) } func (oh *workspaceHandler) GetWorkspaceBudgetHistory(w http.ResponseWriter, r *http.Request) { @@ -583,7 +583,7 @@ func (oh *workspaceHandler) GetWorkspaceBudgetHistory(w http.ResponseWriter, r * pubKeyFromAuth, _ := ctx.Value(auth.ContextKey).(string) uuid := chi.URLParam(r, "uuid") - // if not the organization admin + // if not the workspace admin hasRole := oh.userHasAccess(pubKeyFromAuth, uuid, db.ViewReport) if !hasRole { w.WriteHeader(http.StatusUnauthorized) @@ -591,11 +591,11 @@ func (oh *workspaceHandler) GetWorkspaceBudgetHistory(w http.ResponseWriter, r * return } - // get the organization budget - organizationBudget := oh.db.GetWorkspaceBudgetHistory(uuid) + // get the workspace budget + workspaceBudget := oh.db.GetWorkspaceBudgetHistory(uuid) w.WriteHeader(http.StatusOK) - json.NewEncoder(w).Encode(organizationBudget) + json.NewEncoder(w).Encode(workspaceBudget) } func GetPaymentHistory(w http.ResponseWriter, r *http.Request) { @@ -609,7 +609,7 @@ func GetPaymentHistory(w http.ResponseWriter, r *http.Request) { return } - // if not the organization admin + // if not the workspace admin hasRole := db.UserHasAccess(pubKeyFromAuth, uuid, db.ViewReport) if !hasRole { w.WriteHeader(http.StatusUnauthorized) @@ -617,7 +617,7 @@ func GetPaymentHistory(w http.ResponseWriter, r *http.Request) { return } - // get the organization payment history + // get the workspace payment history paymentHistory := db.DB.GetPaymentHistory(uuid, r) paymentHistoryData := []db.PaymentHistoryData{} @@ -700,32 +700,32 @@ func (oh *workspaceHandler) DeleteWorkspace(w http.ResponseWriter, r *http.Reque return } - organization := oh.db.GetWorkspaceByUuid(uuid) + workspace := oh.db.GetWorkspaceByUuid(uuid) - if pubKeyFromAuth != organization.OwnerPubKey { - msg := "only workspace admin can delete an organization" + if pubKeyFromAuth != workspace.OwnerPubKey { + msg := "only workspace admin can delete an workspace" fmt.Println(msg) w.WriteHeader(http.StatusUnauthorized) json.NewEncoder(w).Encode(msg) return } - // Update organization to hide and clear certain fields + // Update workspace to hide and clear certain fields if err := oh.db.UpdateWorkspaceForDeletion(uuid); err != nil { - fmt.Println("Error updating organization:", err) + fmt.Println("Error updating workspace:", err) w.WriteHeader(http.StatusInternalServerError) return } - // Delete all users from the organization + // Delete all users from the workspace if err := oh.db.DeleteAllUsersFromWorkspace(uuid); err != nil { - fmt.Println("Error removing users from organization:", err) + fmt.Println("Error removing users from workspace:", err) w.WriteHeader(http.StatusInternalServerError) return } - // soft delete organization - workspace := oh.db.ChangeWorkspaceDeleteStatus(uuid, true) + // soft delete workspace + workspace = oh.db.ChangeWorkspaceDeleteStatus(uuid, true) w.WriteHeader(http.StatusOK) json.NewEncoder(w).Encode(workspace) } diff --git a/handlers/workspaces_test.go b/handlers/workspaces_test.go index 6917d2030..e3cf75ed0 100644 --- a/handlers/workspaces_test.go +++ b/handlers/workspaces_test.go @@ -105,11 +105,11 @@ func TestUnitCreateOrEditWorkspace(t *testing.T) { rr := httptest.NewRecorder() handler := http.HandlerFunc(oHandler.CreateOrEditWorkspace) - mockDb.On("GetWorkspaceByUuid", mock.AnythingOfType("string")).Return(db.Organization{}).Once() - mockDb.On("GetWorkspaceByName", "Abdul").Return(db.Organization{}).Once() - mockDb.On("CreateOrEditWorkspace", mock.MatchedBy(func(org db.Organization) bool { + mockDb.On("GetWorkspaceByUuid", mock.AnythingOfType("string")).Return(db.Workspace{}).Once() + mockDb.On("GetWorkspaceByName", "Abdul").Return(db.Workspace{}).Once() + mockDb.On("CreateOrEditWorkspace", mock.MatchedBy(func(org db.Workspace) bool { return org.Name == "Abdul" && org.Uuid != "" && org.Updated != nil && org.Created != nil - })).Return(db.Organization{Name: "Abdul"}, nil).Once() + })).Return(db.Workspace{Name: "Abdul"}, nil).Once() jsonInput := []byte(`{"name": " Abdul ", "owner_pubkey": "test-key" ,"description": "Test"}`) req, err := http.NewRequestWithContext(ctx, http.MethodPost, "/", bytes.NewReader(jsonInput)) @@ -121,7 +121,7 @@ func TestUnitCreateOrEditWorkspace(t *testing.T) { assert.Equal(t, http.StatusOK, rr.Code) - var responseOrg db.Organization + var responseOrg db.Workspace err = json.Unmarshal(rr.Body.Bytes(), &responseOrg) if err != nil { t.Fatal(err) @@ -134,11 +134,11 @@ func TestUnitCreateOrEditWorkspace(t *testing.T) { rr := httptest.NewRecorder() handler := http.HandlerFunc(oHandler.CreateOrEditWorkspace) - mockDb.On("GetWorkspaceByUuid", mock.AnythingOfType("string")).Return(db.Organization{}).Once() - mockDb.On("GetWorkspaceByName", "TestWorkspace").Return(db.Organization{}).Once() - mockDb.On("CreateOrEditWorkspace", mock.MatchedBy(func(org db.Organization) bool { + mockDb.On("GetWorkspaceByUuid", mock.AnythingOfType("string")).Return(db.Workspace{}).Once() + mockDb.On("GetWorkspaceByName", "TestWorkspace").Return(db.Workspace{}).Once() + mockDb.On("CreateOrEditWorkspace", mock.MatchedBy(func(org db.Workspace) bool { return org.Name == "TestWorkspace" && org.Uuid != "" && org.Updated != nil && org.Created != nil - })).Return(db.Organization{}, nil).Once() + })).Return(db.Workspace{}, nil).Once() invalidJson := []byte(`{"name": "TestWorkspace", "owner_pubkey": "test-key" ,"description": "Test"}`) req, err := http.NewRequestWithContext(ctx, http.MethodPost, "/", bytes.NewReader(invalidJson)) @@ -204,10 +204,10 @@ func TestDeleteWorkspace(t *testing.T) { orgUUID := "org-uuid" // Mock expected database interactions - mockDb.On("GetWorkspaceByUuid", orgUUID).Return(db.Organization{OwnerPubKey: "test-key"}).Once() + mockDb.On("GetWorkspaceByUuid", orgUUID).Return(db.Workspace{OwnerPubKey: "test-key"}).Once() mockDb.On("UpdateWorkspaceForDeletion", orgUUID).Return(nil).Once() mockDb.On("DeleteAllUsersFromWorkspace", orgUUID).Return(nil).Once() - mockDb.On("ChangeWorkspaceDeleteStatus", orgUUID, true).Return(db.Organization{Uuid: orgUUID, Deleted: true}).Once() + mockDb.On("ChangeWorkspaceDeleteStatus", orgUUID, true).Return(db.Workspace{Uuid: orgUUID, Deleted: true}).Once() rr := httptest.NewRecorder() handler := http.HandlerFunc(oHandler.DeleteWorkspace) @@ -229,7 +229,7 @@ func TestDeleteWorkspace(t *testing.T) { orgUUID := "org-uuid" // Mock database interactions with error - mockDb.On("GetWorkspaceByUuid", orgUUID).Return(db.Organization{OwnerPubKey: "test-key"}).Once() + mockDb.On("GetWorkspaceByUuid", orgUUID).Return(db.Workspace{OwnerPubKey: "test-key"}).Once() mockDb.On("UpdateWorkspaceForDeletion", orgUUID).Return(errors.New("update error")).Once() rr := httptest.NewRecorder() @@ -252,10 +252,10 @@ func TestDeleteWorkspace(t *testing.T) { orgUUID := "org-uuid" // Mock the database interactions - mockDb.On("GetWorkspaceByUuid", orgUUID).Return(db.Organization{OwnerPubKey: "test-key"}).Once() + mockDb.On("GetWorkspaceByUuid", orgUUID).Return(db.Workspace{OwnerPubKey: "test-key"}).Once() mockDb.On("UpdateWorkspaceForDeletion", orgUUID).Return(nil).Once() mockDb.On("DeleteAllUsersFromWorkspace", orgUUID).Return(nil).Once() - mockDb.On("ChangeWorkspaceDeleteStatus", orgUUID, true).Return(db.Organization{Uuid: orgUUID, Deleted: true}).Once() + mockDb.On("ChangeWorkspaceDeleteStatus", orgUUID, true).Return(db.Workspace{Uuid: orgUUID, Deleted: true}).Once() rr := httptest.NewRecorder() handler := http.HandlerFunc(oHandler.DeleteWorkspace) @@ -273,7 +273,7 @@ func TestDeleteWorkspace(t *testing.T) { assert.Equal(t, http.StatusOK, rr.Code) // Decoding the response to check if Deleted field is true - var updatedOrg db.Organization + var updatedOrg db.Workspace err = json.Unmarshal(rr.Body.Bytes(), &updatedOrg) if err != nil { t.Fatal(err) @@ -286,7 +286,7 @@ func TestDeleteWorkspace(t *testing.T) { t.Run("should set Website, Github, and Description to empty strings", func(t *testing.T) { orgUUID := "org-uuid" - updatedOrg := db.Organization{ + updatedOrg := db.Workspace{ Uuid: orgUUID, OwnerPubKey: "test-key", Website: "", @@ -294,7 +294,7 @@ func TestDeleteWorkspace(t *testing.T) { Description: "", } - mockDb.On("GetWorkspaceByUuid", orgUUID).Return(db.Organization{OwnerPubKey: "test-key"}).Once() + mockDb.On("GetWorkspaceByUuid", orgUUID).Return(db.Workspace{OwnerPubKey: "test-key"}).Once() mockDb.On("UpdateWorkspaceForDeletion", orgUUID).Return(nil).Once() mockDb.On("DeleteAllUsersFromWorkspace", orgUUID).Return(nil).Once() mockDb.On("ChangeWorkspaceDeleteStatus", orgUUID, true).Return(updatedOrg).Once() @@ -312,7 +312,7 @@ func TestDeleteWorkspace(t *testing.T) { handler.ServeHTTP(rr, req) assert.Equal(t, http.StatusOK, rr.Code) - var returnedOrg db.Organization + var returnedOrg db.Workspace err = json.Unmarshal(rr.Body.Bytes(), &returnedOrg) if err != nil { t.Fatal(err) @@ -328,10 +328,10 @@ func TestDeleteWorkspace(t *testing.T) { orgUUID := "org-uuid" // Setting up the expected behavior of the mock database - mockDb.On("GetWorkspaceByUuid", orgUUID).Return(db.Organization{OwnerPubKey: "test-key"}).Once() + mockDb.On("GetWorkspaceByUuid", orgUUID).Return(db.Workspace{OwnerPubKey: "test-key"}).Once() mockDb.On("UpdateWorkspaceForDeletion", orgUUID).Return(nil).Once() mockDb.On("DeleteAllUsersFromWorkspace", orgUUID).Return(nil).Run(func(args mock.Arguments) {}).Once() - mockDb.On("ChangeWorkspaceDeleteStatus", orgUUID, true).Return(db.Organization{Uuid: orgUUID, Deleted: true}).Once() + mockDb.On("ChangeWorkspaceDeleteStatus", orgUUID, true).Return(db.Workspace{Uuid: orgUUID, Deleted: true}).Once() rr := httptest.NewRecorder() handler := http.HandlerFunc(oHandler.DeleteWorkspace) diff --git a/mocks/Database.go b/mocks/Database.go index c55befc41..716cff8b3 100644 --- a/mocks/Database.go +++ b/mocks/Database.go @@ -449,19 +449,19 @@ func (_c *Database_BountiesPaidPercentage_Call) RunAndReturn(run func(db.Payment return _c } -// ChangeWorkspaceDeleteStatus provides a mock function with given fields: org_uuid, status -func (_m *Database) ChangeWorkspaceDeleteStatus(org_uuid string, status bool) db.Organization { - ret := _m.Called(org_uuid, status) +// ChangeWorkspaceDeleteStatus provides a mock function with given fields: workspace_uuid, status +func (_m *Database) ChangeWorkspaceDeleteStatus(workspace_uuid string, status bool) db.Workspace { + ret := _m.Called(workspace_uuid, status) if len(ret) == 0 { panic("no return value specified for ChangeWorkspaceDeleteStatus") } - var r0 db.Organization - if rf, ok := ret.Get(0).(func(string, bool) db.Organization); ok { - r0 = rf(org_uuid, status) + var r0 db.Workspace + if rf, ok := ret.Get(0).(func(string, bool) db.Workspace); ok { + r0 = rf(workspace_uuid, status) } else { - r0 = ret.Get(0).(db.Organization) + r0 = ret.Get(0).(db.Workspace) } return r0 @@ -473,25 +473,25 @@ type Database_ChangeWorkspaceDeleteStatus_Call struct { } // ChangeWorkspaceDeleteStatus is a helper method to define mock.On call -// - org_uuid string +// - workspace_uuid string // - status bool -func (_e *Database_Expecter) ChangeWorkspaceDeleteStatus(org_uuid interface{}, status interface{}) *Database_ChangeWorkspaceDeleteStatus_Call { - return &Database_ChangeWorkspaceDeleteStatus_Call{Call: _e.mock.On("ChangeWorkspaceDeleteStatus", org_uuid, status)} +func (_e *Database_Expecter) ChangeWorkspaceDeleteStatus(workspace_uuid interface{}, status interface{}) *Database_ChangeWorkspaceDeleteStatus_Call { + return &Database_ChangeWorkspaceDeleteStatus_Call{Call: _e.mock.On("ChangeWorkspaceDeleteStatus", workspace_uuid, status)} } -func (_c *Database_ChangeWorkspaceDeleteStatus_Call) Run(run func(org_uuid string, status bool)) *Database_ChangeWorkspaceDeleteStatus_Call { +func (_c *Database_ChangeWorkspaceDeleteStatus_Call) Run(run func(workspace_uuid string, status bool)) *Database_ChangeWorkspaceDeleteStatus_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(string), args[1].(bool)) }) return _c } -func (_c *Database_ChangeWorkspaceDeleteStatus_Call) Return(_a0 db.Organization) *Database_ChangeWorkspaceDeleteStatus_Call { +func (_c *Database_ChangeWorkspaceDeleteStatus_Call) Return(_a0 db.Workspace) *Database_ChangeWorkspaceDeleteStatus_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_ChangeWorkspaceDeleteStatus_Call) RunAndReturn(run func(string, bool) db.Organization) *Database_ChangeWorkspaceDeleteStatus_Call { +func (_c *Database_ChangeWorkspaceDeleteStatus_Call) RunAndReturn(run func(string, bool) db.Workspace) *Database_ChangeWorkspaceDeleteStatus_Call { _c.Call.Return(run) return _c } @@ -1040,25 +1040,25 @@ func (_c *Database_CreateOrEditTribe_Call) RunAndReturn(run func(db.Tribe) (db.T } // CreateOrEditWorkspace provides a mock function with given fields: m -func (_m *Database) CreateOrEditWorkspace(m db.Organization) (db.Organization, error) { +func (_m *Database) CreateOrEditWorkspace(m db.Workspace) (db.Workspace, error) { ret := _m.Called(m) if len(ret) == 0 { panic("no return value specified for CreateOrEditWorkspace") } - var r0 db.Organization + var r0 db.Workspace var r1 error - if rf, ok := ret.Get(0).(func(db.Organization) (db.Organization, error)); ok { + if rf, ok := ret.Get(0).(func(db.Workspace) (db.Workspace, error)); ok { return rf(m) } - if rf, ok := ret.Get(0).(func(db.Organization) db.Organization); ok { + if rf, ok := ret.Get(0).(func(db.Workspace) db.Workspace); ok { r0 = rf(m) } else { - r0 = ret.Get(0).(db.Organization) + r0 = ret.Get(0).(db.Workspace) } - if rf, ok := ret.Get(1).(func(db.Organization) error); ok { + if rf, ok := ret.Get(1).(func(db.Workspace) error); ok { r1 = rf(m) } else { r1 = ret.Error(1) @@ -1073,24 +1073,24 @@ type Database_CreateOrEditWorkspace_Call struct { } // CreateOrEditWorkspace is a helper method to define mock.On call -// - m db.Organization +// - m db.Workspace func (_e *Database_Expecter) CreateOrEditWorkspace(m interface{}) *Database_CreateOrEditWorkspace_Call { return &Database_CreateOrEditWorkspace_Call{Call: _e.mock.On("CreateOrEditWorkspace", m)} } -func (_c *Database_CreateOrEditWorkspace_Call) Run(run func(m db.Organization)) *Database_CreateOrEditWorkspace_Call { +func (_c *Database_CreateOrEditWorkspace_Call) Run(run func(m db.Workspace)) *Database_CreateOrEditWorkspace_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(db.Organization)) + run(args[0].(db.Workspace)) }) return _c } -func (_c *Database_CreateOrEditWorkspace_Call) Return(_a0 db.Organization, _a1 error) *Database_CreateOrEditWorkspace_Call { +func (_c *Database_CreateOrEditWorkspace_Call) Return(_a0 db.Workspace, _a1 error) *Database_CreateOrEditWorkspace_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *Database_CreateOrEditWorkspace_Call) RunAndReturn(run func(db.Organization) (db.Organization, error)) *Database_CreateOrEditWorkspace_Call { +func (_c *Database_CreateOrEditWorkspace_Call) RunAndReturn(run func(db.Workspace) (db.Workspace, error)) *Database_CreateOrEditWorkspace_Call { _c.Call.Return(run) return _c } @@ -1192,18 +1192,18 @@ func (_c *Database_CreateWorkspaceBudget_Call) RunAndReturn(run func(db.BountyBu } // CreateWorkspaceUser provides a mock function with given fields: orgUser -func (_m *Database) CreateWorkspaceUser(orgUser db.OrganizationUsers) db.OrganizationUsers { +func (_m *Database) CreateWorkspaceUser(orgUser db.WorkspaceUsers) db.WorkspaceUsers { ret := _m.Called(orgUser) if len(ret) == 0 { panic("no return value specified for CreateWorkspaceUser") } - var r0 db.OrganizationUsers - if rf, ok := ret.Get(0).(func(db.OrganizationUsers) db.OrganizationUsers); ok { + var r0 db.WorkspaceUsers + if rf, ok := ret.Get(0).(func(db.WorkspaceUsers) db.WorkspaceUsers); ok { r0 = rf(orgUser) } else { - r0 = ret.Get(0).(db.OrganizationUsers) + r0 = ret.Get(0).(db.WorkspaceUsers) } return r0 @@ -1215,24 +1215,24 @@ type Database_CreateWorkspaceUser_Call struct { } // CreateWorkspaceUser is a helper method to define mock.On call -// - orgUser db.OrganizationUsers +// - orgUser db.WorkspaceUsers func (_e *Database_Expecter) CreateWorkspaceUser(orgUser interface{}) *Database_CreateWorkspaceUser_Call { return &Database_CreateWorkspaceUser_Call{Call: _e.mock.On("CreateWorkspaceUser", orgUser)} } -func (_c *Database_CreateWorkspaceUser_Call) Run(run func(orgUser db.OrganizationUsers)) *Database_CreateWorkspaceUser_Call { +func (_c *Database_CreateWorkspaceUser_Call) Run(run func(orgUser db.WorkspaceUsers)) *Database_CreateWorkspaceUser_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(db.OrganizationUsers)) + run(args[0].(db.WorkspaceUsers)) }) return _c } -func (_c *Database_CreateWorkspaceUser_Call) Return(_a0 db.OrganizationUsers) *Database_CreateWorkspaceUser_Call { +func (_c *Database_CreateWorkspaceUser_Call) Return(_a0 db.WorkspaceUsers) *Database_CreateWorkspaceUser_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_CreateWorkspaceUser_Call) RunAndReturn(run func(db.OrganizationUsers) db.OrganizationUsers) *Database_CreateWorkspaceUser_Call { +func (_c *Database_CreateWorkspaceUser_Call) RunAndReturn(run func(db.WorkspaceUsers) db.WorkspaceUsers) *Database_CreateWorkspaceUser_Call { _c.Call.Return(run) return _c } @@ -1387,18 +1387,18 @@ func (_c *Database_DeleteUserInvoiceData_Call) RunAndReturn(run func(string) db. } // DeleteWorkspaceUser provides a mock function with given fields: orgUser, org -func (_m *Database) DeleteWorkspaceUser(orgUser db.OrganizationUsersData, org string) db.OrganizationUsersData { +func (_m *Database) DeleteWorkspaceUser(orgUser db.WorkspaceUsersData, org string) db.WorkspaceUsersData { ret := _m.Called(orgUser, org) if len(ret) == 0 { panic("no return value specified for DeleteWorkspaceUser") } - var r0 db.OrganizationUsersData - if rf, ok := ret.Get(0).(func(db.OrganizationUsersData, string) db.OrganizationUsersData); ok { + var r0 db.WorkspaceUsersData + if rf, ok := ret.Get(0).(func(db.WorkspaceUsersData, string) db.WorkspaceUsersData); ok { r0 = rf(orgUser, org) } else { - r0 = ret.Get(0).(db.OrganizationUsersData) + r0 = ret.Get(0).(db.WorkspaceUsersData) } return r0 @@ -1410,25 +1410,25 @@ type Database_DeleteWorkspaceUser_Call struct { } // DeleteWorkspaceUser is a helper method to define mock.On call -// - orgUser db.OrganizationUsersData +// - orgUser db.WorkspaceUsersData // - org string func (_e *Database_Expecter) DeleteWorkspaceUser(orgUser interface{}, org interface{}) *Database_DeleteWorkspaceUser_Call { return &Database_DeleteWorkspaceUser_Call{Call: _e.mock.On("DeleteWorkspaceUser", orgUser, org)} } -func (_c *Database_DeleteWorkspaceUser_Call) Run(run func(orgUser db.OrganizationUsersData, org string)) *Database_DeleteWorkspaceUser_Call { +func (_c *Database_DeleteWorkspaceUser_Call) Run(run func(orgUser db.WorkspaceUsersData, org string)) *Database_DeleteWorkspaceUser_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(db.OrganizationUsersData), args[1].(string)) + run(args[0].(db.WorkspaceUsersData), args[1].(string)) }) return _c } -func (_c *Database_DeleteWorkspaceUser_Call) Return(_a0 db.OrganizationUsersData) *Database_DeleteWorkspaceUser_Call { +func (_c *Database_DeleteWorkspaceUser_Call) Return(_a0 db.WorkspaceUsersData) *Database_DeleteWorkspaceUser_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_DeleteWorkspaceUser_Call) RunAndReturn(run func(db.OrganizationUsersData, string) db.OrganizationUsersData) *Database_DeleteWorkspaceUser_Call { +func (_c *Database_DeleteWorkspaceUser_Call) RunAndReturn(run func(db.WorkspaceUsersData, string) db.WorkspaceUsersData) *Database_DeleteWorkspaceUser_Call { _c.Call.Return(run) return _c } @@ -3226,9 +3226,9 @@ func (_c *Database_GetOpenGithubIssues_Call) RunAndReturn(run func(*http.Request return _c } -// GetPaymentHistory provides a mock function with given fields: org_uuid, r -func (_m *Database) GetPaymentHistory(org_uuid string, r *http.Request) []db.PaymentHistory { - ret := _m.Called(org_uuid, r) +// GetPaymentHistory provides a mock function with given fields: workspace_uuid, r +func (_m *Database) GetPaymentHistory(workspace_uuid string, r *http.Request) []db.PaymentHistory { + ret := _m.Called(workspace_uuid, r) if len(ret) == 0 { panic("no return value specified for GetPaymentHistory") @@ -3236,7 +3236,7 @@ func (_m *Database) GetPaymentHistory(org_uuid string, r *http.Request) []db.Pay var r0 []db.PaymentHistory if rf, ok := ret.Get(0).(func(string, *http.Request) []db.PaymentHistory); ok { - r0 = rf(org_uuid, r) + r0 = rf(workspace_uuid, r) } else { if ret.Get(0) != nil { r0 = ret.Get(0).([]db.PaymentHistory) @@ -3252,13 +3252,13 @@ type Database_GetPaymentHistory_Call struct { } // GetPaymentHistory is a helper method to define mock.On call -// - org_uuid string +// - workspace_uuid string // - r *http.Request -func (_e *Database_Expecter) GetPaymentHistory(org_uuid interface{}, r interface{}) *Database_GetPaymentHistory_Call { - return &Database_GetPaymentHistory_Call{Call: _e.mock.On("GetPaymentHistory", org_uuid, r)} +func (_e *Database_Expecter) GetPaymentHistory(workspace_uuid interface{}, r interface{}) *Database_GetPaymentHistory_Call { + return &Database_GetPaymentHistory_Call{Call: _e.mock.On("GetPaymentHistory", workspace_uuid, r)} } -func (_c *Database_GetPaymentHistory_Call) Run(run func(org_uuid string, r *http.Request)) *Database_GetPaymentHistory_Call { +func (_c *Database_GetPaymentHistory_Call) Run(run func(workspace_uuid string, r *http.Request)) *Database_GetPaymentHistory_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(string), args[1].(*http.Request)) }) @@ -3275,9 +3275,9 @@ func (_c *Database_GetPaymentHistory_Call) RunAndReturn(run func(string, *http.R return _c } -// GetPaymentHistoryByCreated provides a mock function with given fields: created, org_uuid -func (_m *Database) GetPaymentHistoryByCreated(created *time.Time, org_uuid string) db.PaymentHistory { - ret := _m.Called(created, org_uuid) +// GetPaymentHistoryByCreated provides a mock function with given fields: created, workspace_uuid +func (_m *Database) GetPaymentHistoryByCreated(created *time.Time, workspace_uuid string) db.PaymentHistory { + ret := _m.Called(created, workspace_uuid) if len(ret) == 0 { panic("no return value specified for GetPaymentHistoryByCreated") @@ -3285,7 +3285,7 @@ func (_m *Database) GetPaymentHistoryByCreated(created *time.Time, org_uuid stri var r0 db.PaymentHistory if rf, ok := ret.Get(0).(func(*time.Time, string) db.PaymentHistory); ok { - r0 = rf(created, org_uuid) + r0 = rf(created, workspace_uuid) } else { r0 = ret.Get(0).(db.PaymentHistory) } @@ -3300,12 +3300,12 @@ type Database_GetPaymentHistoryByCreated_Call struct { // GetPaymentHistoryByCreated is a helper method to define mock.On call // - created *time.Time -// - org_uuid string -func (_e *Database_Expecter) GetPaymentHistoryByCreated(created interface{}, org_uuid interface{}) *Database_GetPaymentHistoryByCreated_Call { - return &Database_GetPaymentHistoryByCreated_Call{Call: _e.mock.On("GetPaymentHistoryByCreated", created, org_uuid)} +// - workspace_uuid string +func (_e *Database_Expecter) GetPaymentHistoryByCreated(created interface{}, workspace_uuid interface{}) *Database_GetPaymentHistoryByCreated_Call { + return &Database_GetPaymentHistoryByCreated_Call{Call: _e.mock.On("GetPaymentHistoryByCreated", created, workspace_uuid)} } -func (_c *Database_GetPaymentHistoryByCreated_Call) Run(run func(created *time.Time, org_uuid string)) *Database_GetPaymentHistoryByCreated_Call { +func (_c *Database_GetPaymentHistoryByCreated_Call) Run(run func(created *time.Time, workspace_uuid string)) *Database_GetPaymentHistoryByCreated_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(*time.Time), args[1].(string)) }) @@ -4135,19 +4135,19 @@ func (_c *Database_GetUnconfirmedTwitter_Call) RunAndReturn(run func() []db.Pers } // GetUserAssignedWorkspaces provides a mock function with given fields: pubkey -func (_m *Database) GetUserAssignedWorkspaces(pubkey string) []db.OrganizationUsers { +func (_m *Database) GetUserAssignedWorkspaces(pubkey string) []db.WorkspaceUsers { ret := _m.Called(pubkey) if len(ret) == 0 { panic("no return value specified for GetUserAssignedWorkspaces") } - var r0 []db.OrganizationUsers - if rf, ok := ret.Get(0).(func(string) []db.OrganizationUsers); ok { + var r0 []db.WorkspaceUsers + if rf, ok := ret.Get(0).(func(string) []db.WorkspaceUsers); ok { r0 = rf(pubkey) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]db.OrganizationUsers) + r0 = ret.Get(0).([]db.WorkspaceUsers) } } @@ -4172,12 +4172,12 @@ func (_c *Database_GetUserAssignedWorkspaces_Call) Run(run func(pubkey string)) return _c } -func (_c *Database_GetUserAssignedWorkspaces_Call) Return(_a0 []db.OrganizationUsers) *Database_GetUserAssignedWorkspaces_Call { +func (_c *Database_GetUserAssignedWorkspaces_Call) Return(_a0 []db.WorkspaceUsers) *Database_GetUserAssignedWorkspaces_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_GetUserAssignedWorkspaces_Call) RunAndReturn(run func(string) []db.OrganizationUsers) *Database_GetUserAssignedWorkspaces_Call { +func (_c *Database_GetUserAssignedWorkspaces_Call) RunAndReturn(run func(string) []db.WorkspaceUsers) *Database_GetUserAssignedWorkspaces_Call { _c.Call.Return(run) return _c } @@ -4230,19 +4230,19 @@ func (_c *Database_GetUserBountiesCount_Call) RunAndReturn(run func(string, stri } // GetUserCreatedWorkspaces provides a mock function with given fields: pubkey -func (_m *Database) GetUserCreatedWorkspaces(pubkey string) []db.Organization { +func (_m *Database) GetUserCreatedWorkspaces(pubkey string) []db.Workspace { ret := _m.Called(pubkey) if len(ret) == 0 { panic("no return value specified for GetUserCreatedWorkspaces") } - var r0 []db.Organization - if rf, ok := ret.Get(0).(func(string) []db.Organization); ok { + var r0 []db.Workspace + if rf, ok := ret.Get(0).(func(string) []db.Workspace); ok { r0 = rf(pubkey) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]db.Organization) + r0 = ret.Get(0).([]db.Workspace) } } @@ -4267,12 +4267,12 @@ func (_c *Database_GetUserCreatedWorkspaces_Call) Run(run func(pubkey string)) * return _c } -func (_c *Database_GetUserCreatedWorkspaces_Call) Return(_a0 []db.Organization) *Database_GetUserCreatedWorkspaces_Call { +func (_c *Database_GetUserCreatedWorkspaces_Call) Return(_a0 []db.Workspace) *Database_GetUserCreatedWorkspaces_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_GetUserCreatedWorkspaces_Call) RunAndReturn(run func(string) []db.Organization) *Database_GetUserCreatedWorkspaces_Call { +func (_c *Database_GetUserCreatedWorkspaces_Call) RunAndReturn(run func(string) []db.Workspace) *Database_GetUserCreatedWorkspaces_Call { _c.Call.Return(run) return _c } @@ -4323,9 +4323,9 @@ func (_c *Database_GetUserInvoiceData_Call) RunAndReturn(run func(string) db.Use return _c } -// GetWorkspaceBounties provides a mock function with given fields: r, org_uuid -func (_m *Database) GetWorkspaceBounties(r *http.Request, org_uuid string) []db.Bounty { - ret := _m.Called(r, org_uuid) +// GetWorkspaceBounties provides a mock function with given fields: r, workspace_uuid +func (_m *Database) GetWorkspaceBounties(r *http.Request, workspace_uuid string) []db.Bounty { + ret := _m.Called(r, workspace_uuid) if len(ret) == 0 { panic("no return value specified for GetWorkspaceBounties") @@ -4333,7 +4333,7 @@ func (_m *Database) GetWorkspaceBounties(r *http.Request, org_uuid string) []db. var r0 []db.Bounty if rf, ok := ret.Get(0).(func(*http.Request, string) []db.Bounty); ok { - r0 = rf(r, org_uuid) + r0 = rf(r, workspace_uuid) } else { if ret.Get(0) != nil { r0 = ret.Get(0).([]db.Bounty) @@ -4350,12 +4350,12 @@ type Database_GetWorkspaceBounties_Call struct { // GetWorkspaceBounties is a helper method to define mock.On call // - r *http.Request -// - org_uuid string -func (_e *Database_Expecter) GetWorkspaceBounties(r interface{}, org_uuid interface{}) *Database_GetWorkspaceBounties_Call { - return &Database_GetWorkspaceBounties_Call{Call: _e.mock.On("GetWorkspaceBounties", r, org_uuid)} +// - workspace_uuid string +func (_e *Database_Expecter) GetWorkspaceBounties(r interface{}, workspace_uuid interface{}) *Database_GetWorkspaceBounties_Call { + return &Database_GetWorkspaceBounties_Call{Call: _e.mock.On("GetWorkspaceBounties", r, workspace_uuid)} } -func (_c *Database_GetWorkspaceBounties_Call) Run(run func(r *http.Request, org_uuid string)) *Database_GetWorkspaceBounties_Call { +func (_c *Database_GetWorkspaceBounties_Call) Run(run func(r *http.Request, workspace_uuid string)) *Database_GetWorkspaceBounties_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(*http.Request), args[1].(string)) }) @@ -4372,9 +4372,9 @@ func (_c *Database_GetWorkspaceBounties_Call) RunAndReturn(run func(*http.Reques return _c } -// GetWorkspaceBountiesCount provides a mock function with given fields: r, org_uuid -func (_m *Database) GetWorkspaceBountiesCount(r *http.Request, org_uuid string) int64 { - ret := _m.Called(r, org_uuid) +// GetWorkspaceBountiesCount provides a mock function with given fields: r, workspace_uuid +func (_m *Database) GetWorkspaceBountiesCount(r *http.Request, workspace_uuid string) int64 { + ret := _m.Called(r, workspace_uuid) if len(ret) == 0 { panic("no return value specified for GetWorkspaceBountiesCount") @@ -4382,7 +4382,7 @@ func (_m *Database) GetWorkspaceBountiesCount(r *http.Request, org_uuid string) var r0 int64 if rf, ok := ret.Get(0).(func(*http.Request, string) int64); ok { - r0 = rf(r, org_uuid) + r0 = rf(r, workspace_uuid) } else { r0 = ret.Get(0).(int64) } @@ -4397,12 +4397,12 @@ type Database_GetWorkspaceBountiesCount_Call struct { // GetWorkspaceBountiesCount is a helper method to define mock.On call // - r *http.Request -// - org_uuid string -func (_e *Database_Expecter) GetWorkspaceBountiesCount(r interface{}, org_uuid interface{}) *Database_GetWorkspaceBountiesCount_Call { - return &Database_GetWorkspaceBountiesCount_Call{Call: _e.mock.On("GetWorkspaceBountiesCount", r, org_uuid)} +// - workspace_uuid string +func (_e *Database_Expecter) GetWorkspaceBountiesCount(r interface{}, workspace_uuid interface{}) *Database_GetWorkspaceBountiesCount_Call { + return &Database_GetWorkspaceBountiesCount_Call{Call: _e.mock.On("GetWorkspaceBountiesCount", r, workspace_uuid)} } -func (_c *Database_GetWorkspaceBountiesCount_Call) Run(run func(r *http.Request, org_uuid string)) *Database_GetWorkspaceBountiesCount_Call { +func (_c *Database_GetWorkspaceBountiesCount_Call) Run(run func(r *http.Request, workspace_uuid string)) *Database_GetWorkspaceBountiesCount_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(*http.Request), args[1].(string)) }) @@ -4465,9 +4465,9 @@ func (_c *Database_GetWorkspaceBountyCount_Call) RunAndReturn(run func(string) i return _c } -// GetWorkspaceBudget provides a mock function with given fields: org_uuid -func (_m *Database) GetWorkspaceBudget(org_uuid string) db.BountyBudget { - ret := _m.Called(org_uuid) +// GetWorkspaceBudget provides a mock function with given fields: workspace_uuid +func (_m *Database) GetWorkspaceBudget(workspace_uuid string) db.BountyBudget { + ret := _m.Called(workspace_uuid) if len(ret) == 0 { panic("no return value specified for GetWorkspaceBudget") @@ -4475,7 +4475,7 @@ func (_m *Database) GetWorkspaceBudget(org_uuid string) db.BountyBudget { var r0 db.BountyBudget if rf, ok := ret.Get(0).(func(string) db.BountyBudget); ok { - r0 = rf(org_uuid) + r0 = rf(workspace_uuid) } else { r0 = ret.Get(0).(db.BountyBudget) } @@ -4489,12 +4489,12 @@ type Database_GetWorkspaceBudget_Call struct { } // GetWorkspaceBudget is a helper method to define mock.On call -// - org_uuid string -func (_e *Database_Expecter) GetWorkspaceBudget(org_uuid interface{}) *Database_GetWorkspaceBudget_Call { - return &Database_GetWorkspaceBudget_Call{Call: _e.mock.On("GetWorkspaceBudget", org_uuid)} +// - workspace_uuid string +func (_e *Database_Expecter) GetWorkspaceBudget(workspace_uuid interface{}) *Database_GetWorkspaceBudget_Call { + return &Database_GetWorkspaceBudget_Call{Call: _e.mock.On("GetWorkspaceBudget", workspace_uuid)} } -func (_c *Database_GetWorkspaceBudget_Call) Run(run func(org_uuid string)) *Database_GetWorkspaceBudget_Call { +func (_c *Database_GetWorkspaceBudget_Call) Run(run func(workspace_uuid string)) *Database_GetWorkspaceBudget_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(string)) }) @@ -4511,9 +4511,9 @@ func (_c *Database_GetWorkspaceBudget_Call) RunAndReturn(run func(string) db.Bou return _c } -// GetWorkspaceBudgetHistory provides a mock function with given fields: org_uuid -func (_m *Database) GetWorkspaceBudgetHistory(org_uuid string) []db.BudgetHistoryData { - ret := _m.Called(org_uuid) +// GetWorkspaceBudgetHistory provides a mock function with given fields: workspace_uuid +func (_m *Database) GetWorkspaceBudgetHistory(workspace_uuid string) []db.BudgetHistoryData { + ret := _m.Called(workspace_uuid) if len(ret) == 0 { panic("no return value specified for GetWorkspaceBudgetHistory") @@ -4521,7 +4521,7 @@ func (_m *Database) GetWorkspaceBudgetHistory(org_uuid string) []db.BudgetHistor var r0 []db.BudgetHistoryData if rf, ok := ret.Get(0).(func(string) []db.BudgetHistoryData); ok { - r0 = rf(org_uuid) + r0 = rf(workspace_uuid) } else { if ret.Get(0) != nil { r0 = ret.Get(0).([]db.BudgetHistoryData) @@ -4537,12 +4537,12 @@ type Database_GetWorkspaceBudgetHistory_Call struct { } // GetWorkspaceBudgetHistory is a helper method to define mock.On call -// - org_uuid string -func (_e *Database_Expecter) GetWorkspaceBudgetHistory(org_uuid interface{}) *Database_GetWorkspaceBudgetHistory_Call { - return &Database_GetWorkspaceBudgetHistory_Call{Call: _e.mock.On("GetWorkspaceBudgetHistory", org_uuid)} +// - workspace_uuid string +func (_e *Database_Expecter) GetWorkspaceBudgetHistory(workspace_uuid interface{}) *Database_GetWorkspaceBudgetHistory_Call { + return &Database_GetWorkspaceBudgetHistory_Call{Call: _e.mock.On("GetWorkspaceBudgetHistory", workspace_uuid)} } -func (_c *Database_GetWorkspaceBudgetHistory_Call) Run(run func(org_uuid string)) *Database_GetWorkspaceBudgetHistory_Call { +func (_c *Database_GetWorkspaceBudgetHistory_Call) Run(run func(workspace_uuid string)) *Database_GetWorkspaceBudgetHistory_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(string)) }) @@ -4560,18 +4560,18 @@ func (_c *Database_GetWorkspaceBudgetHistory_Call) RunAndReturn(run func(string) } // GetWorkspaceByName provides a mock function with given fields: name -func (_m *Database) GetWorkspaceByName(name string) db.Organization { +func (_m *Database) GetWorkspaceByName(name string) db.Workspace { ret := _m.Called(name) if len(ret) == 0 { panic("no return value specified for GetWorkspaceByName") } - var r0 db.Organization - if rf, ok := ret.Get(0).(func(string) db.Organization); ok { + var r0 db.Workspace + if rf, ok := ret.Get(0).(func(string) db.Workspace); ok { r0 = rf(name) } else { - r0 = ret.Get(0).(db.Organization) + r0 = ret.Get(0).(db.Workspace) } return r0 @@ -4595,29 +4595,29 @@ func (_c *Database_GetWorkspaceByName_Call) Run(run func(name string)) *Database return _c } -func (_c *Database_GetWorkspaceByName_Call) Return(_a0 db.Organization) *Database_GetWorkspaceByName_Call { +func (_c *Database_GetWorkspaceByName_Call) Return(_a0 db.Workspace) *Database_GetWorkspaceByName_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_GetWorkspaceByName_Call) RunAndReturn(run func(string) db.Organization) *Database_GetWorkspaceByName_Call { +func (_c *Database_GetWorkspaceByName_Call) RunAndReturn(run func(string) db.Workspace) *Database_GetWorkspaceByName_Call { _c.Call.Return(run) return _c } // GetWorkspaceByUuid provides a mock function with given fields: uuid -func (_m *Database) GetWorkspaceByUuid(uuid string) db.Organization { +func (_m *Database) GetWorkspaceByUuid(uuid string) db.Workspace { ret := _m.Called(uuid) if len(ret) == 0 { panic("no return value specified for GetWorkspaceByUuid") } - var r0 db.Organization - if rf, ok := ret.Get(0).(func(string) db.Organization); ok { + var r0 db.Workspace + if rf, ok := ret.Get(0).(func(string) db.Workspace); ok { r0 = rf(uuid) } else { - r0 = ret.Get(0).(db.Organization) + r0 = ret.Get(0).(db.Workspace) } return r0 @@ -4641,19 +4641,19 @@ func (_c *Database_GetWorkspaceByUuid_Call) Run(run func(uuid string)) *Database return _c } -func (_c *Database_GetWorkspaceByUuid_Call) Return(_a0 db.Organization) *Database_GetWorkspaceByUuid_Call { +func (_c *Database_GetWorkspaceByUuid_Call) Return(_a0 db.Workspace) *Database_GetWorkspaceByUuid_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_GetWorkspaceByUuid_Call) RunAndReturn(run func(string) db.Organization) *Database_GetWorkspaceByUuid_Call { +func (_c *Database_GetWorkspaceByUuid_Call) RunAndReturn(run func(string) db.Workspace) *Database_GetWorkspaceByUuid_Call { _c.Call.Return(run) return _c } -// GetWorkspaceInvoices provides a mock function with given fields: org_uuid -func (_m *Database) GetWorkspaceInvoices(org_uuid string) []db.InvoiceList { - ret := _m.Called(org_uuid) +// GetWorkspaceInvoices provides a mock function with given fields: workspace_uuid +func (_m *Database) GetWorkspaceInvoices(workspace_uuid string) []db.InvoiceList { + ret := _m.Called(workspace_uuid) if len(ret) == 0 { panic("no return value specified for GetWorkspaceInvoices") @@ -4661,7 +4661,7 @@ func (_m *Database) GetWorkspaceInvoices(org_uuid string) []db.InvoiceList { var r0 []db.InvoiceList if rf, ok := ret.Get(0).(func(string) []db.InvoiceList); ok { - r0 = rf(org_uuid) + r0 = rf(workspace_uuid) } else { if ret.Get(0) != nil { r0 = ret.Get(0).([]db.InvoiceList) @@ -4677,12 +4677,12 @@ type Database_GetWorkspaceInvoices_Call struct { } // GetWorkspaceInvoices is a helper method to define mock.On call -// - org_uuid string -func (_e *Database_Expecter) GetWorkspaceInvoices(org_uuid interface{}) *Database_GetWorkspaceInvoices_Call { - return &Database_GetWorkspaceInvoices_Call{Call: _e.mock.On("GetWorkspaceInvoices", org_uuid)} +// - workspace_uuid string +func (_e *Database_Expecter) GetWorkspaceInvoices(workspace_uuid interface{}) *Database_GetWorkspaceInvoices_Call { + return &Database_GetWorkspaceInvoices_Call{Call: _e.mock.On("GetWorkspaceInvoices", workspace_uuid)} } -func (_c *Database_GetWorkspaceInvoices_Call) Run(run func(org_uuid string)) *Database_GetWorkspaceInvoices_Call { +func (_c *Database_GetWorkspaceInvoices_Call) Run(run func(workspace_uuid string)) *Database_GetWorkspaceInvoices_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(string)) }) @@ -4699,9 +4699,9 @@ func (_c *Database_GetWorkspaceInvoices_Call) RunAndReturn(run func(string) []db return _c } -// GetWorkspaceInvoicesCount provides a mock function with given fields: org_uuid -func (_m *Database) GetWorkspaceInvoicesCount(org_uuid string) int64 { - ret := _m.Called(org_uuid) +// GetWorkspaceInvoicesCount provides a mock function with given fields: workspace_uuid +func (_m *Database) GetWorkspaceInvoicesCount(workspace_uuid string) int64 { + ret := _m.Called(workspace_uuid) if len(ret) == 0 { panic("no return value specified for GetWorkspaceInvoicesCount") @@ -4709,7 +4709,7 @@ func (_m *Database) GetWorkspaceInvoicesCount(org_uuid string) int64 { var r0 int64 if rf, ok := ret.Get(0).(func(string) int64); ok { - r0 = rf(org_uuid) + r0 = rf(workspace_uuid) } else { r0 = ret.Get(0).(int64) } @@ -4723,12 +4723,12 @@ type Database_GetWorkspaceInvoicesCount_Call struct { } // GetWorkspaceInvoicesCount is a helper method to define mock.On call -// - org_uuid string -func (_e *Database_Expecter) GetWorkspaceInvoicesCount(org_uuid interface{}) *Database_GetWorkspaceInvoicesCount_Call { - return &Database_GetWorkspaceInvoicesCount_Call{Call: _e.mock.On("GetWorkspaceInvoicesCount", org_uuid)} +// - workspace_uuid string +func (_e *Database_Expecter) GetWorkspaceInvoicesCount(workspace_uuid interface{}) *Database_GetWorkspaceInvoicesCount_Call { + return &Database_GetWorkspaceInvoicesCount_Call{Call: _e.mock.On("GetWorkspaceInvoicesCount", workspace_uuid)} } -func (_c *Database_GetWorkspaceInvoicesCount_Call) Run(run func(org_uuid string)) *Database_GetWorkspaceInvoicesCount_Call { +func (_c *Database_GetWorkspaceInvoicesCount_Call) Run(run func(workspace_uuid string)) *Database_GetWorkspaceInvoicesCount_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(string)) }) @@ -4745,9 +4745,9 @@ func (_c *Database_GetWorkspaceInvoicesCount_Call) RunAndReturn(run func(string) return _c } -// GetWorkspaceStatusBudget provides a mock function with given fields: org_uuid -func (_m *Database) GetWorkspaceStatusBudget(org_uuid string) db.StatusBudget { - ret := _m.Called(org_uuid) +// GetWorkspaceStatusBudget provides a mock function with given fields: workspace_uuid +func (_m *Database) GetWorkspaceStatusBudget(workspace_uuid string) db.StatusBudget { + ret := _m.Called(workspace_uuid) if len(ret) == 0 { panic("no return value specified for GetWorkspaceStatusBudget") @@ -4755,7 +4755,7 @@ func (_m *Database) GetWorkspaceStatusBudget(org_uuid string) db.StatusBudget { var r0 db.StatusBudget if rf, ok := ret.Get(0).(func(string) db.StatusBudget); ok { - r0 = rf(org_uuid) + r0 = rf(workspace_uuid) } else { r0 = ret.Get(0).(db.StatusBudget) } @@ -4769,12 +4769,12 @@ type Database_GetWorkspaceStatusBudget_Call struct { } // GetWorkspaceStatusBudget is a helper method to define mock.On call -// - org_uuid string -func (_e *Database_Expecter) GetWorkspaceStatusBudget(org_uuid interface{}) *Database_GetWorkspaceStatusBudget_Call { - return &Database_GetWorkspaceStatusBudget_Call{Call: _e.mock.On("GetWorkspaceStatusBudget", org_uuid)} +// - workspace_uuid string +func (_e *Database_Expecter) GetWorkspaceStatusBudget(workspace_uuid interface{}) *Database_GetWorkspaceStatusBudget_Call { + return &Database_GetWorkspaceStatusBudget_Call{Call: _e.mock.On("GetWorkspaceStatusBudget", workspace_uuid)} } -func (_c *Database_GetWorkspaceStatusBudget_Call) Run(run func(org_uuid string)) *Database_GetWorkspaceStatusBudget_Call { +func (_c *Database_GetWorkspaceStatusBudget_Call) Run(run func(workspace_uuid string)) *Database_GetWorkspaceStatusBudget_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(string)) }) @@ -4791,19 +4791,19 @@ func (_c *Database_GetWorkspaceStatusBudget_Call) RunAndReturn(run func(string) return _c } -// GetWorkspaceUser provides a mock function with given fields: pubkey, org_uuid -func (_m *Database) GetWorkspaceUser(pubkey string, org_uuid string) db.OrganizationUsers { - ret := _m.Called(pubkey, org_uuid) +// GetWorkspaceUser provides a mock function with given fields: pubkey, workspace_uuid +func (_m *Database) GetWorkspaceUser(pubkey string, workspace_uuid string) db.WorkspaceUsers { + ret := _m.Called(pubkey, workspace_uuid) if len(ret) == 0 { panic("no return value specified for GetWorkspaceUser") } - var r0 db.OrganizationUsers - if rf, ok := ret.Get(0).(func(string, string) db.OrganizationUsers); ok { - r0 = rf(pubkey, org_uuid) + var r0 db.WorkspaceUsers + if rf, ok := ret.Get(0).(func(string, string) db.WorkspaceUsers); ok { + r0 = rf(pubkey, workspace_uuid) } else { - r0 = ret.Get(0).(db.OrganizationUsers) + r0 = ret.Get(0).(db.WorkspaceUsers) } return r0 @@ -4816,46 +4816,46 @@ type Database_GetWorkspaceUser_Call struct { // GetWorkspaceUser is a helper method to define mock.On call // - pubkey string -// - org_uuid string -func (_e *Database_Expecter) GetWorkspaceUser(pubkey interface{}, org_uuid interface{}) *Database_GetWorkspaceUser_Call { - return &Database_GetWorkspaceUser_Call{Call: _e.mock.On("GetWorkspaceUser", pubkey, org_uuid)} +// - workspace_uuid string +func (_e *Database_Expecter) GetWorkspaceUser(pubkey interface{}, workspace_uuid interface{}) *Database_GetWorkspaceUser_Call { + return &Database_GetWorkspaceUser_Call{Call: _e.mock.On("GetWorkspaceUser", pubkey, workspace_uuid)} } -func (_c *Database_GetWorkspaceUser_Call) Run(run func(pubkey string, org_uuid string)) *Database_GetWorkspaceUser_Call { +func (_c *Database_GetWorkspaceUser_Call) Run(run func(pubkey string, workspace_uuid string)) *Database_GetWorkspaceUser_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(string), args[1].(string)) }) return _c } -func (_c *Database_GetWorkspaceUser_Call) Return(_a0 db.OrganizationUsers) *Database_GetWorkspaceUser_Call { +func (_c *Database_GetWorkspaceUser_Call) Return(_a0 db.WorkspaceUsers) *Database_GetWorkspaceUser_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_GetWorkspaceUser_Call) RunAndReturn(run func(string, string) db.OrganizationUsers) *Database_GetWorkspaceUser_Call { +func (_c *Database_GetWorkspaceUser_Call) RunAndReturn(run func(string, string) db.WorkspaceUsers) *Database_GetWorkspaceUser_Call { _c.Call.Return(run) return _c } // GetWorkspaceUsers provides a mock function with given fields: uuid -func (_m *Database) GetWorkspaceUsers(uuid string) ([]db.OrganizationUsersData, error) { +func (_m *Database) GetWorkspaceUsers(uuid string) ([]db.WorkspaceUsersData, error) { ret := _m.Called(uuid) if len(ret) == 0 { panic("no return value specified for GetWorkspaceUsers") } - var r0 []db.OrganizationUsersData + var r0 []db.WorkspaceUsersData var r1 error - if rf, ok := ret.Get(0).(func(string) ([]db.OrganizationUsersData, error)); ok { + if rf, ok := ret.Get(0).(func(string) ([]db.WorkspaceUsersData, error)); ok { return rf(uuid) } - if rf, ok := ret.Get(0).(func(string) []db.OrganizationUsersData); ok { + if rf, ok := ret.Get(0).(func(string) []db.WorkspaceUsersData); ok { r0 = rf(uuid) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]db.OrganizationUsersData) + r0 = ret.Get(0).([]db.WorkspaceUsersData) } } @@ -4886,12 +4886,12 @@ func (_c *Database_GetWorkspaceUsers_Call) Run(run func(uuid string)) *Database_ return _c } -func (_c *Database_GetWorkspaceUsers_Call) Return(_a0 []db.OrganizationUsersData, _a1 error) *Database_GetWorkspaceUsers_Call { +func (_c *Database_GetWorkspaceUsers_Call) Return(_a0 []db.WorkspaceUsersData, _a1 error) *Database_GetWorkspaceUsers_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *Database_GetWorkspaceUsers_Call) RunAndReturn(run func(string) ([]db.OrganizationUsersData, error)) *Database_GetWorkspaceUsers_Call { +func (_c *Database_GetWorkspaceUsers_Call) RunAndReturn(run func(string) ([]db.WorkspaceUsersData, error)) *Database_GetWorkspaceUsers_Call { _c.Call.Return(run) return _c } @@ -4943,19 +4943,19 @@ func (_c *Database_GetWorkspaceUsersCount_Call) RunAndReturn(run func(string) in } // GetWorkspaces provides a mock function with given fields: r -func (_m *Database) GetWorkspaces(r *http.Request) []db.Organization { +func (_m *Database) GetWorkspaces(r *http.Request) []db.Workspace { ret := _m.Called(r) if len(ret) == 0 { panic("no return value specified for GetWorkspaces") } - var r0 []db.Organization - if rf, ok := ret.Get(0).(func(*http.Request) []db.Organization); ok { + var r0 []db.Workspace + if rf, ok := ret.Get(0).(func(*http.Request) []db.Workspace); ok { r0 = rf(r) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]db.Organization) + r0 = ret.Get(0).([]db.Workspace) } } @@ -4980,12 +4980,12 @@ func (_c *Database_GetWorkspaces_Call) Run(run func(r *http.Request)) *Database_ return _c } -func (_c *Database_GetWorkspaces_Call) Return(_a0 []db.Organization) *Database_GetWorkspaces_Call { +func (_c *Database_GetWorkspaces_Call) Return(_a0 []db.Workspace) *Database_GetWorkspaces_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_GetWorkspaces_Call) RunAndReturn(run func(*http.Request) []db.Organization) *Database_GetWorkspaces_Call { +func (_c *Database_GetWorkspaces_Call) RunAndReturn(run func(*http.Request) []db.Workspace) *Database_GetWorkspaces_Call { _c.Call.Return(run) return _c } @@ -6405,9 +6405,9 @@ func (_c *Database_UserHasManageBountyRoles_Call) RunAndReturn(run func(string, return _c } -// WithdrawBudget provides a mock function with given fields: sender_pubkey, org_uuid, amount -func (_m *Database) WithdrawBudget(sender_pubkey string, org_uuid string, amount uint) { - _m.Called(sender_pubkey, org_uuid, amount) +// WithdrawBudget provides a mock function with given fields: sender_pubkey, workspace_uuid, amount +func (_m *Database) WithdrawBudget(sender_pubkey string, workspace_uuid string, amount uint) { + _m.Called(sender_pubkey, workspace_uuid, amount) } // Database_WithdrawBudget_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WithdrawBudget' @@ -6417,13 +6417,13 @@ type Database_WithdrawBudget_Call struct { // WithdrawBudget is a helper method to define mock.On call // - sender_pubkey string -// - org_uuid string +// - workspace_uuid string // - amount uint -func (_e *Database_Expecter) WithdrawBudget(sender_pubkey interface{}, org_uuid interface{}, amount interface{}) *Database_WithdrawBudget_Call { - return &Database_WithdrawBudget_Call{Call: _e.mock.On("WithdrawBudget", sender_pubkey, org_uuid, amount)} +func (_e *Database_Expecter) WithdrawBudget(sender_pubkey interface{}, workspace_uuid interface{}, amount interface{}) *Database_WithdrawBudget_Call { + return &Database_WithdrawBudget_Call{Call: _e.mock.On("WithdrawBudget", sender_pubkey, workspace_uuid, amount)} } -func (_c *Database_WithdrawBudget_Call) Run(run func(sender_pubkey string, org_uuid string, amount uint)) *Database_WithdrawBudget_Call { +func (_c *Database_WithdrawBudget_Call) Run(run func(sender_pubkey string, workspace_uuid string, amount uint)) *Database_WithdrawBudget_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(string), args[1].(string), args[2].(uint)) }) diff --git a/routes/workspaces.go b/routes/workspaces.go index 8a0c8b6ef..54b740c9f 100644 --- a/routes/workspaces.go +++ b/routes/workspaces.go @@ -9,22 +9,22 @@ import ( func WorkspaceRoutes() chi.Router { r := chi.NewRouter() - organizationHandlers := handlers.NewWorkspaceHandler(db.DB) + workspaceHandlers := handlers.NewWorkspaceHandler(db.DB) r.Group(func(r chi.Router) { r.Get("/", handlers.GetWorkspaces) r.Get("/count", handlers.GetWorkspacesCount) r.Get("/{uuid}", handlers.GetWorkspaceByUuid) r.Get("/users/{uuid}", handlers.GetWorkspaceUsers) r.Get("/users/{uuid}/count", handlers.GetWorkspaceUsersCount) - r.Get("/bounties/{uuid}", organizationHandlers.GetWorkspaceBounties) - r.Get("/bounties/{uuid}/count", organizationHandlers.GetWorkspaceBountiesCount) + r.Get("/bounties/{uuid}", workspaceHandlers.GetWorkspaceBounties) + r.Get("/bounties/{uuid}/count", workspaceHandlers.GetWorkspaceBountiesCount) r.Get("/user/{userId}", handlers.GetUserWorkspaces) - r.Get("/user/dropdown/{userId}", organizationHandlers.GetUserDropdownWorkspaces) + r.Get("/user/dropdown/{userId}", workspaceHandlers.GetUserDropdownWorkspaces) }) r.Group(func(r chi.Router) { r.Use(auth.PubKeyContext) - r.Post("/", organizationHandlers.CreateOrEditWorkspace) + r.Post("/", workspaceHandlers.CreateOrEditWorkspace) r.Post("/users/{uuid}", handlers.CreateWorkspaceUser) r.Delete("/users/{uuid}", handlers.DeleteWorkspaceUser) r.Post("/users/role/{uuid}/{user}", handlers.AddUserRoles) @@ -32,12 +32,12 @@ func WorkspaceRoutes() chi.Router { r.Get("/foruser/{uuid}", handlers.GetWorkspaceUser) r.Get("/bounty/roles", handlers.GetBountyRoles) r.Get("/users/role/{uuid}/{user}", handlers.GetUserRoles) - r.Get("/budget/{uuid}", organizationHandlers.GetWorkspaceBudget) - r.Get("/budget/history/{uuid}", organizationHandlers.GetWorkspaceBudgetHistory) + r.Get("/budget/{uuid}", workspaceHandlers.GetWorkspaceBudget) + r.Get("/budget/history/{uuid}", workspaceHandlers.GetWorkspaceBudgetHistory) r.Get("/payments/{uuid}", handlers.GetPaymentHistory) - r.Get("/poll/invoices/{uuid}", organizationHandlers.PollBudgetInvoices) + r.Get("/poll/invoices/{uuid}", workspaceHandlers.PollBudgetInvoices) r.Get("/invoices/count/{uuid}", handlers.GetInvoicesCount) - r.Delete("/delete/{uuid}", organizationHandlers.DeleteWorkspace) + r.Delete("/delete/{uuid}", workspaceHandlers.DeleteWorkspace) }) return r } From 9e0e8ff0fc6b6b902f0807ef9aeaf22c67bf5aef Mon Sep 17 00:00:00 2001 From: elraphty Date: Mon, 22 Apr 2024 14:07:22 +0100 Subject: [PATCH 05/21] modified migration --- .../Edit Mission -- passes (failed).png | Bin 0 -> 145879 bytes ...Edit Schematics Url -- passes (failed).png | Bin 0 -> 237052 bytes .../Edit Tactics -- passes (failed).png | Bin 0 -> 227769 bytes db/config.go | 23 +- db/db.go | 2 +- yarn.lock | 1215 +++++++++++++++++ 6 files changed, 1230 insertions(+), 10 deletions(-) create mode 100644 cypress/screenshots/01_workspaces.cy.ts/Edit Mission -- passes (failed).png create mode 100644 cypress/screenshots/01_workspaces.cy.ts/Edit Schematics Url -- passes (failed).png create mode 100644 cypress/screenshots/01_workspaces.cy.ts/Edit Tactics -- passes (failed).png create mode 100644 yarn.lock diff --git a/cypress/screenshots/01_workspaces.cy.ts/Edit Mission -- passes (failed).png b/cypress/screenshots/01_workspaces.cy.ts/Edit Mission -- passes (failed).png new file mode 100644 index 0000000000000000000000000000000000000000..ffdfddc30f4892c94dd353974db1cc0a1f2662f3 GIT binary patch literal 145879 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�h+wz3I6sPSxVuS;p+@h$4{i{v`l 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%0D^d zn0?qKQXksbXfS-1P9rdoT-ZWZ+yq-U&oJY<`I6;q?-KGNxkZGtZazo?>3sQg(jcIB zHL0>@5I(FUeA2)RCSr0+s<>m*DXsAi*ZX|t88JCJ<5s{EPJ0Z#--ZrK-rV?GET}WZ{^;omlFocL%;&qXAPgG&5z7fr3CPI8 zfN2JqTv|;H3FIJ?>Xr)3o`*mpDTVy*p99Rwm?bwV8rtyUViYK&%Lq;ai*Nes70rVO zaQ^=O8{69w+S)`rE*?LgfXFI7J|09JqWb#eS65f*lddgB?2?|hm*Oe-!6QvN2%0vy zkmg;dmOReZxd|*sE0Lgnmxr8qX+3fQOpG|gmVtJ2r{`?qt_L&W1H8aEpM)!XQItM8 z*=R$34wyx>!Zav{TW(XqJH*5r!QB=~=PgY}rW_>YGuGAmN=`0Yurst#^fWX$37@!} zTwPmC$%%a+I5@+C*c63d#<#V#gNxJz@jk|kmAQNU*MiPCJUNT+6tN(D0+Gd+lHg!W-I)2 zhJSu@?Gi)iGTyfBI<(mpQ3N^emI)F3*Y*DXGvj#|gjy9FWSk&;HGTV;QR1IZ|K~S8 zJh(own^6%j$I5Kc|GfRrA6(yZrc;1;{*RYbB#h|4zmAqRC_rROgC!GTWp3H%_%b;y)I&y91VL2q+;gShqEGK zGx1M~I*e}euaD8$4i!t76Z38mg}Nr4L${oSRC0f&X?2Meh7$O_`yVgMbPE=M~S$g_i2qd zu(Wg^K(+P?ojp;pOfWMMOk*Z}Y2puMqpYiSA}0Mlco6(MEpSF)cfHALKIfy2$AcE$pvj~y<9imwcV=dkcw-;U!&+*U z^kFO$I{FEK4_|{>YyGZi)uyULD~6Y+Y_?xYW>=I2;cE0LOXipDmb#$pvnG)*bPe7` zRJ}ofpkwMD#z3!H%KPl^VyL;fF`m|30zcn6G0NR#T>8a7QubM|sFICv`OM=S4ac|#3M*sQqQ)}hTjd;O}Dx9t; zs?J6s0sqLvK5mI<`B&BJDM;xWx%QiCEdFMW5RsVNCozNnET;r22HYFb<46hT>(nMIt03<1eI1H&j&Tsq zD9uXL3F9k?%f0HDs6?vB1c(R_2xBBgQ12?b$Igs%6)fa2A*bcwIP$EOW#sbKI6p)b zgmx1}vwVS^DFSCZ3oyB3qp)sZImtgG8axXBma3MEyLT=Nc%(mi`cMGC3#slZTH^hD z;>1Gf{Y$R?s;79#Db%oSS8pE^`RCi*@k6(xT(+Nq>prMqhKYv(?R1`NWrhH@L*{qs zPdK$h$69G-^ng86JV`KlWT*v`C658&bN^*DwPJB~z!^^(E$F{?ZL4Zx0=MI$ocNRG zdd^1suc785qkVIpuhxMgR&O_RjJhnkXd=_;x`7VC);jng_Q!N4Yy%UXu%0)ufGXLuWng4prs6cU~| zZAT|+V^16shLLEKZGk33&6D$U;~zFMU}=0V)(H#`SAh6xB_e=D@a7FmD_@O%B!FK~ zwiOk%?GIvvh5)`bOK}eQKn>jJ(Ge=Skb|gG|7x!`>as{&Z(x+LCy@{s%Ddpn2;w>j zB$jzHUnTvK6@^l{Z6~Nh6eyo7+H2ePw()1@X^% z8BQ|gc&@rQ#J^`B9dy^aDrEjm3(tjks4kV}uNbWEu~lYp4Ss&K=onb(4TT6=`BLSE zOtIowkyJ0DNDJo}roV6#(VzZTqjAAd1QtRicdTUAxNN_G1{?ErIq zHF8__lyPH!U&6JD5^Nb}Qh7$P+Nlh^mT7ez&j(-jrm#Q5@vFIMD6B6i-{1%xHMsCo z0Q6R*^(9YwLj%Fnrgr5Jm{N{OOvI+}fV0BfPM%;yvX;w!$4 z5@JyAW-~HL4n{^l`@p3}vn%`IiTWY>N7;-INd;oM?ua0ia<4tz*xaN%Cc&kkh~UeT z*WtxP2VjvHYup1yMk@JO(jZD9;BjE!wcNrZBBb1<8Gf$d(ZtFdSLh5)n)@0o5}ddl zPVp_L>~C|Yax&N){P&lTVFYBOg*@@5SEcYx&X{YX@gviOt$w_#6!X_y(7HFZ>o+g7J zkjimRVIHaM6#XdqSkgNTT+4^#7^JG%h_&sA5?z+};1a_<=^pPmwVHAuhDS>xXyLll z=$jaDPMy2giy-~uoVAzBZ%z@R-#AW)LVeO~3u>Og|FvzvvvV=dH=f!Q7?ff9u2Z$W z;UQbNJKi52$jwbL=($|%A8GjAsRldz_^R9IHXj?dZaW1@RllBnW6E3@N-%tt z8zWN++-d7o9Q0~GfVyq(#l8e7eaG7D{>f{KozBJvs^yDP36sW7Zq4n$V{|Mm<%a=P z?)~nvS!&=vD`VZ6#!>1_nmU#BxDdOw6O^gl%J;=WJSY58bd-R+wGvO60}T zAjwmwe0&H-MRckwLkT_!w|rsNW?gDgGy6L9&q0@stkd_zUoGyk`-fk8yrtkH1q)iU= z3`h;gatk)A&towszyF5|kaw>qIuHwsYFvj!o%=#0!zhG2()fpIN^|l&L!<38Xym}%1TL}YhwTmMMJYHX-4s(Y-BMgD{#cNp8 zsV}S%;GY@tYHBA*mLw#nq-++a(Yu!MOiG=C-oeV(SNVn*rp+rC5A&IaQKu?-{ z0zjN1b@?4tb^GLA5QDZ2tOYVsQpTg71yof_rIDXqk&=_Q3)nW%xHo!qwEwvG?Iot0 zp}t<`N~z5$^Hj~t*gn}{2kS6!B8sO~1jY3?VecCgTf)!dtrxyito91hj1&!E)}Q{xGo5cAR6G7G&MD0-Jd_Lr8K@C>)RFyeoe?7p&S6d1WL`mZe<3OdARsMA{Yn= zVyz$$Ls4jR2O{T}#qffYFoR{c>ms-3A2@GEwC@O2AGEa0*Dc7re0fyugZVeW zPKatnfyUym_sJd%rrPG%)?=r2n@YWw8&FUP`yF9h=)a?ve{c3&?lp;4aScMFF=C+j zJD@YfYMXOC1%!mLFOPR;rP7gHXH|21B=G%+_`St793Yy^!>4=PO%@wnr ze&nFg@oE~__VYe)4AK(h;b%aUlFAZm^MO#uNSVyDR4HzFVajM|;8VICjKZWx1){~h zpJ{V1)NR0w^10efqlvz_fcISMW`n1Q`&7`98Fec)bU?L~Ynm;m6u*>DZ0PNsZZ~KH zF829!&8Q2DPj@$|b(vEv{$M;qocx^YNBpu(PiZZz02U5#bdCg~Ff zdoQGxi8rn$@03eiYx}bQV-uw^iW;5!jFPny{dz)2o})l7d&VqPo~xo3@|-MIB=l>I zB^CL1n!eZBbr1~qD>3(LgKqWsoa#>47I z4I$xYBcn8`Y^z9#EH#tWJSG}=)rvE%q@t%dS^|?H_lWM7FT^0Ix6jA83Jr-yYe_q< zFqbT3$`*gU`EvMrdd8h1j&*|e$rF-%tzs#SPk=)YJG)nn)N~8>S13){JxA6209hKz z(k-vx0p&m%i9{0Y$is2Z2Anw7@rzRGnvx-Vb zZ*|apH-GP*rhhstb3fK=RMSXSEsO-ldC!-3>IukR5)xM4hlaNH#A>SCvkhcRfclS3 zzQFCTsIM1Cj-B4+*>T%f-q^7YR$!3$&Oq=gtT!D47gNyvR~okOBPN6Q;nB@uU7((;v=bZ{8AG4TC4l4^&K4%IS)}CG|?abDx=Txq*l9`c`pWJll85^U3cA(+0 zDeAl**=muL`A2ACZ9fIH& zRMqUaJ7)t+K~2YUaKdQFtm9`#Z)sWyvM)S6{i}zp&jW(4dQA*GUcW^Ewz`~)H@&P3 z&Y`9i5B2mBDI=(Lr*S}%iiIM;owH+}Jb3bmB!0%aK)-=?<8pGbR?6)Tt~v17d}w0A zul@!>r~JpL?o;4SttQ{Jzf(Sg7Yf!d5`Fm*k!t@M`_ZGDzV$*LUOfB1*Jrr#1LI} znvoa|Ffu6Boz`V=t7iFIi#i+?q&b?U z8$%@G0}YMo&PoHxzYV1gE65^~Ot>(Y`gy(KK$J4$$bB)xd#8$APRBrx(iN{LO)glX ztz)R6#R?CZoz;`NzIjn?r=`QHr_YLtLS870?IPN@>GadJxZ(X>qX8s^Fe|aj8VN#2 zN0$NajwN%`n$RmMvK{7{|hc^h&8Qg1tU{lv;Sn#TaD zJ-D)BYuR*yg@6FIdjC!aq@!#E1Z}h4Sq_Q@uXh!|w!aJ~U9;o>bN5 zonaU?+7OetT}_J}%fs3y`W!1C`_Pkf;@q^dd({Elb!g>yN`4FA9D(xxVyz}EXut^C zc^?_sNdYqCp$`;PI~SaHS5{E!opY~L&$!^=;ANLO71bIQjI6r%vno|z3QZt>2e@eDo1?dbT&;CcN3@Yy81 z7q3dc9IlZyy;GWGo!KK3SDg473fsV_OfI%Adog3plU`Us!l+CMM%>w8k)?ik-_ygL zVejFx4}k#76`Af46u`4)l{c~SE93!9>MYeh*{uyG21ekG4I*dspeaXfUERUezJXuc za&rit%)!Qra(Ye<+Bn_~S54%SAxk^)F?Kc5ZG;PXLM~T`tUAKz_h* zbJaOAGeY;+)zuZH*P%w=LJv)JjOY9)OPA&b$qhEFk)ZQtk!tb0sM?KY&u8h$=xlqtLMzW6>eT0yf;vggYACB%~<#(uBw5luK!^}V{3 zC^N;0fc_Y}%o(xQ|*G z)#n~semFQBvpT(W{4j1AKl-0Ik#ta}0CiOj}F6@Y+xk|AUi` zMi4+=4-9Y4NNzXox-}5kt%cfn#aYaom9?01plJ4vZ4DWhftYtXpy*Mwq_N^SBBXgd z{}kv-8)cp8rbEv7Aw-acBwN?vyL5TcKJH*Y;4kVe(!&#b!jVGK4xfWzXDHXTrKP3S zQ1vKd03P{On4V;*bp(4Y*nvqDEk?w*&mJ#&5JECC>K#8)KYD#4w6!&Ykd&YQELiGQ z%GozL?|t*#8q$Is9Ts>8Ku8V(TihADxe$=MAP@4BW1?eBk<# zajJDm;&;a9h*vndIVdDFKSh}Yxt{gB3)U|O1mM7;07pz*K|$eOMHKJD&Gd%T!naX;ImWs+wiv_!EeRfA z-#5Vf9ZJp0>f{s{7KYj*1TK;=$t561BSr z#>VDwSYFAcmUSZ2vQ~iF!(SPw4m?eH=DyipC2;^~?61nq#MrOD4cZ`XR*${61eBf^ zD1sLUcq>{v32cZ+NW=5<^yMeshnJ}+?D{`@9^73t&ard~y!HnB0fEBaXF@rcq!H=C77;eSUzC;4@0Bkf|C)A{;U>e?H(Q@V8*VYYDe{SJ(k&ssdpF%2#lw# zakNX|+hd8cdp)oIvG%GD8DdU@P@!)lG*MKtx5dDdY2*C!@LnQ_X2^wvp`l+~B61Z> zb@p?4%Lm ztKaQr$r%_K!)97^ADi9mRk2+KyrjDbw)MtR+nj0clg zSGz_G0tm4vG=@3z57VXrv%7??=^&wrnsuKOR6?HIL}t@Buh2c1NGul1loQ)*rT@{( z45}3{rW}J*VnC*IUg!Q7<7_^(o>&o`!=aA$JKAbQ^hsTcZ-}H{QL~< z@7}$|FRu zLHrd92Psm3xq^!p>&+|k^+1u=f1XT6qK=ouK@kj-=3G6-KacL6E`b2s4C(JxH5}m& zBU)>$P~MX`yGq3L-l#w;kwsTKcPyhv;_e-sp;QN2Ain};HXfj~tQgpe8KaDhR6uCa z4q-A|S_TF%xwsK4d(b;X%0ahrEvbfK@dcY;dHi$+PnBA(2C|l0BoVZj#sfo09I#k@ zVCZmB=DgFfd=}2z^4G?msHRC}X-P0qKvmbT`7<-Ve&{7AQI>d>58}rWP7WBi1uCD$ zS$7Xm<1(d)G#-0V^S+ju2nMoA67P0WnjOGo0jQ}oaK4T2T4nQT7#OVrupdD-?(x4& z?hU7dN>2pX_2NlaT7fRS0TN2e))qLAK(FV|pSFG<1$7@~y{WxDR@H}F?T2mb*PgDR zv3ToNcTedgp%EBRq+AU|z!HgJj0|w!6brmYciHd>;$ zlo+(d;3PV*EV?#nuI1k_8 zk*yG29K#>AW{#VsAL=%gq@)u>aU)>x*ACA(yg&}f*RY)PfIfKm@Bls&4HY%;!FsC~ z`>^?t!Yv`j$vH|dfQ?nU7?Jlq#9ylYu#EXzy5+JgU~xzu-U2Y0AqG_l?~Y^={fmGZ!emUwZR>%>W^&8-NKBs{Q3D8EkQ64 z%C{$Sf=5&8Zof*i?G|sN0-PJ1w|P+4-{dsm-U%KPBGY`6_4g+%lf!Ri)>C8E*gG<> znho4Chm^SYvt;n(fL*;a@}BkgM`Ro}Zr`VBuDx$yCV%uZi>e-q8+!rgQ10`CwP;M! zzyQao=b~Lx~+`}Uy#fE>}0F+y+NSArXDyQkOWrZcMFEDe! zV$ggkw|<+IgPQ15;*c?U^0Aj7C#T>jXGW-e)Gj5?ESbLo01+yaX~bGjS*={8_4Ov8;;zst9kLN}t(Cjx*8A1Z|aF~^= zYj>FHWel@9$Hg{)dXRR)D0ifSA}pXlGZ>LCp=1c&wXfT)9!celS>h8$234U4*>D-! zqVn6&g08#|iP{hdpUcV6kEFJh!n?^ytLE5Vq6f7_y{oNYYEi&>B_MnPK3-;NDGY0N z_Qz3>!?hfgtT)V8ol6KF{#u7|6ZZrziynX^;^HrH3E5bQ20V5xDH4jq;Cw-9ZX(rT znU1>DIa`^L<3=;1n+S>!(JARtN=m|@dPoz#IpNxReymqx$pT908#^QEUrlj%=4$B+ zCUdtfg8O-pJ7jgtwkthK9LD*}tKPP9NSlZVPd5pCtYXdCYP$yR02d%c;F%~3pGxW1 z+hKxkvU?PQ4p;f0@8y#y&w)%r7G1w_tBDnmI+T~|6Xm76=KNmb*3GfZ2Q^A!vmcj2 zNx99pO{-Ytx8_ljM); zEkDkASzd&(-L3KtP4ZqTzzC*uK~?rmi%=i{{H2cT1-Y-?&Qy9@S2+Dg^C3p6eQ`NC z5}-ZlYPpBnhIeEDuJH#p`6~y>#~AJ(1KkpUdcbNZ92LX(AYYo;(_7W;XZK(xs7VpA zB}phpQFgxbrlWtY(pay?Hvl5>Y>#q>><;VJ(#+t1r9}WvrKxpf78a7ceT()XCXtO? z&&#dJ4yqIg@{q=H3g8DWej0lJM&*FZ$hd7SHVILdZ65^`JV1SlPEKadvvXg*Az20+ z&Lw=(@Vp8cOwT>MCl#jwI1X@+KuHf2zj;u*oUetj%vOXCxc^vAZi9Rob8{pPX{L(L zv9X!=j81!m5hI(~a*V^nkXH8~9(A3_h=?|?a}g$f@5M$e<3kil+&?hpJhHeZbktJa z=0{~UeaBO=S&A~$zZ3vEM95~4{ZBV;P<{=`c{nIC)YZjE-DsU#vWQ2Dh7NJhr)Qza z#b*S1n5aj+Q#Fk!aX+1}D6OP~xYyI~F{KSTe>GNgz)5GB%h#(^K*Itofy6n4Sxh@`Ke^q+~CM3CMwlz;R)Yj-l&od05{V`k3wy z2?>#7V<&0XY)K+v&xowxDt$^;2HkcJv(rJz5439Nf0r$X0${)beZ-~?oCqWojPQ@R z6Yy1?x%0>UqFfsBoLKQ1z5$B(R`lTAQ5M<*<6l1{kI+epH@X@d1WI=!J#YvJ5Nh;k z^3?c})zn9&7Fm3_vm?Wp?qHgSA0Vmf=+KsT46r?v^nO>JVD#)6o>B@Q|EuGq4ReRp z9t7*sIeLxJ`^s8{I|V2!-mBKsx&Y6@TS5?5h61c+*QM^B$Aifs?gxNCPDGwLUqxuLjfH1F{@W< z7L)3Vm=KVB{+MXq&nn|kj*0}5lbIQVS#K5y^Kg({u(l3 zp{A;~g+h?b=fbyh2_rf#dnyt(jX%`Lr4Q!QT%0~@Y90?_29;;L3S)G$NtylSdDlDa zA^y=-hh-3LyMf#Wb$t7Vo114Ta2-lj^dcV%nYng;FD(}C9N>EZCPQ^IZ01 z$xGn={9rtFX;%bF3C@mF^)jLzz`KWuhENWREaBuLiYD((qMUrRg0ZQEg?s2WJuj>JdDSFBWN4SGbXBtcF6>}{XLyB znP#RB1bwT$OlcaqFp>)iv&A^ysPkSsg5$sw2iPw@9$8Sf!wK=>JYY4>+#@v%wsc;9KaUIJNR4V`krgOhjdbKL| zHwPeV(HV!@n5MTzq%UCoelH`Jp?ly3zw1Y;Q46;(P}yhdD~XF&G{A?|O@lgL7br~Q z5YS7xxUgEgkky{Pz{~s2``Kg93mHi137U}FeaFnEqsDQQ(C|rOl3h2(bM{YIxFrW(rWJONSE(%ufZSx-D zmjWl(y6PgfI8MURxAKf3Oxoc)qP@L*`;XNUoxXco=d@|kJCZ^4_{XGxEdy|=56t)_ zUlda&EqETx^&|jn=f{v)iz!z|cDBHdJ)mWPBncb^NU3PsoFOL(;2odStR^wF?}z~C zJm}o_p*Z6PWl_3V_n8I;1_ombH)O)Hb%8ai%0#BaLlm&|aEP)4+BO5GO(hLeVKBQc z2H`{KdN?P)nx34Vr4<*u_W0+=Tq@L?ez*9Vl?7@;fOR2-{|k+Qk(VmfYwNl3Z3iG3 zH8kSg^IxCWY;1Fe>jkRNMpHkMgUgZ+oSNbTm0kAu@C~eEA+V#2QKiCK)epcMLp6jN zE{a-0CkYGLWLfi9L0eO>X0 z*ZNe%koS6<@%|at4xgU&?+zGP!zgee=(93{v1;E|=e9239~=C9O{U|xr89M3Dg=cQ zKykls{3?1X%yLW?1(;;tuO{7+l#l@JB`x;IuXOg!hJ|hNP=#3-sD`Yqbsl1!EZd<6 z-=_3wV|JBf&znVgx2_YDlS={y(EF~M`8|}Trey=iHFnhgZCEkDFA+4 zT_ZGDle|I6EF901uzH@A7=50dxHj8OEA!h=PJ6x}K*-_QtO1w9h47l}WNN?XA1(kz z`0TE6N=3aT_X=SlQ`qJ`l( zj^y!ukbi-W>d3^Cnr|^$iMR*CU;4GaC`>#Ras9mr6Bd78MS)iDmp8UuV1CwphqfA6gS6J|2ahD!w#&&Ju|7X>Y# z2<(Z4V(0l9_CR|((TOI;k)Tv=pFjUnuu!7l_s5nziOn5HUT*xL3F-F-)cpI49WH+f z`S4I2kcIELz`Rd{{cRrK2(G8(V`yUo4tQSyd3!!y+WQFqd7k%ocf#NiE^iF`gH(9% zjO%X$^IE;Ege?WX#1JG|q-+`${3I8d_c8gmzy`$Rb`tG)T2}C>G0|PqW9r!3*(d9I%gA{RtMO#Q#M@&bVaM;cie_=JRnrH3^1lDdC()v$ zP{JJf=>*vg8sQQi?7O_F594qGPKci(!!>h%`WbYYeh)%N4)Wji`C}wljnRyLpX={G z2~X0QE`Z5+$kI*1o0P59mHw5FaYMLlnn{Bp$(n5GUf5mMC=0Cdf0!KKfvW!3=QAFq zYjs4{_!Jzxpo={n+p6|uPmy0mL3D=;uyiKZ$ZKX#x0Pidc^k>w)vZDJH@ifxgfRT~ zIo^j8rG<@2GHqX0!ebKD_W~NhA~v7)qE<_b!mCq}--l*wwxj+xmtK;KzBAvKh>4F_ z?o_`eUe7!gO<{br?KEsk(5u6dOhdDdhW_C{^x&*{YfMIg7)v2@lS z`j9?tjgbRO%!JQ3z2(D{_45CAIBkYj2ck7vc7tsW^@0;x73z|c2J}zsd4kgS>6B)L zr{`@{p%eSiVV}Vfh2PiyUT|jj+jI)-AI(fM;&`5}rEJJ-WJ@3lElJ;Z&)M>6X^s4& z8;%Ife-`%dgTea#bYPpi&8G2#P2<8wkUM*OD4jEaTX?LZE1^uDfXJTRo`H$j{4w42@`BBz!c+f-=_tOx%K7iY=P^&W{_kFJsmD5B z223f*UG;NRl0g~3OJe)WuBRe{vJRUL7!grE^9jXJV8jst&vK86{_hPBpM2;)ga0G2 zKmTrY0#UuQ&s)nKw;!@p7Z19qXYsm)b7P3%won;-mK91?^)eMa0iE^3mwy#50qb9y z{{EFEcaAMK(q^9-vjT(F51#r)lP@<0T z;E|69Z9a`For&6C#T#rYalul`_&t3@#yRCRTvN7{bSBRh!D)~vHH|yoH)3>RGHdcK zmJkZC$zKfH8{Rj`7rlGlb<^dFJkxwi-y@T!s(;GwYx-_%<(#uBMsp<`-98x^PI|OO zEw;DleA$z9lyaQHX>Rtu=2lQrvI_5ib+kxwJxcL&#Vhn9A|MH$ODab}fCxQCy--A6nqQl! zNon;_e=W0vG7J6V-gY|)|M;ALK2nH|7&DpYR@UM)*sp%QxQU7PSNs2^f{MDjmIYm> zDdP5JfmJn%=GTUQR8`>J|893lz_lIUGc(~Em`!3(FD)+3ZL>NRsf5zsAD!|4b1;Z7 z^bv-}O<_IU8#a0R0)DHi#mz5HAsC0DJg*WCA%gB`V`MaBUj-&Hb!}dGvIM(d?oSGM zW)+m9Ejs03zUF_D)nvk^i=mNa2#k{Sv&qLu=3&-l(ZWB&N}KH&MEkq)!P-wIBq90v z7~D8VU0JHtP3R?*aV6{N3(bv_q#m`5&)1hOY{$iLHMO zv_{g`Tnsi`t4xpZOK{R9Jm-M)a$Ek&)jWu)C1S;h?ZrkV8Tr&KA3?ghCPvPCmOlKl z<~Zi}ZT}Y36&V2m33|iAFTzkxVg(E9tuF-We73tjx8++XR9$+`Z6TC@X@X3|kR$|J zKUkW$ZWWD5Uo-;EoY&i;i_H+V%m;@*z6-X)Zy!Wq*>-3{4@ec@;5da|WC$>cGIV6# z=}LA}7;5uCSP0P)9&2%7>Kc{L;?Ts=sIkg?(nl=R2-V1f?UqNtBv#;CoD?Y|`X41c z;iY5ZAbz#Fr+FCE=Dix?`sZgE)p(+ECQ4Zn|9 z48vC$SJL|VMQzF{Z_$_E-AyHNQrV_9uuGKD)gHgZcMzmpLaLC2g;YN^>g+;%pukgS z(S)0=Zyh8bQmAWa@fCNjc$`|7rc0n9=*i%zs147}*aN8MHwqWxYowvq>>28|qOYEj z^<`?{f0E16Nk|A7%R#1-3CaZTzc%4yozIh2*FMi#H~7MiR3mrzegvU)vI~jA9Zt8_ z!!A7owZj?1u5qS(L-w)47tXa)bk6vGx280^xohRIwWLerA-=m;6KUi8Tdo=orhJ49 zePZrTbk;5c@}vnWI?p5WKJ!Ff4@N|E);~3=LU_9}_H?Ri?$1-Y*OfhZ5s`>Vt!72V zU9d#WA5*VaTrI+{s{{42Z_vt*Kl~d!-R>Gg>okZ)^R~QHw(|njIwBLUaF1^ki`?9Ku&@u$xi$_41gV^4&S#YiTCk&@0B2ua5 zb{Kjr?y-h^xz!k-@fMl$+=LVwb{5)EZ9|u7YcNsqQp0hejhHA^7A*8)Nb9izKGLz) zpkf!ERo_LGt8ja4o^F+irG~ucN(;*m#n5xNf#5h+@!$pD^}B1Vk{N3VIZU&1p)UVc z1>g1%nT;OAPEH=TvE+4f$($|a2`Qv6HSS%pUNrT}Z&0eD9W^!K7r=pO!qX z7hl1eCr$Lu3CvX+sAo_#NR#$|_<}ma=^ZlKLF(paxIC;;ToYTl+9SkWmz%~qSN-KC zV}?Wu4|j~}vHgb_)f3tgl36e19Z`oY4mQVo4|jsNf7Zy;xgDwt%(wcqjmgt{A8cTn zcGYQr_wZifF9siP@z#}15_c>Ml+J2DPCV+W*dG})y=j|J%s5zNuTcoH-JAM(diOsT zWd3zI`&?G5+Qw;$gi}?Rf$fn_EIS8>>0B2v%T3or({HQFrT*n%9okpPKsZR~Hkr8_ zgQTnUH~A2^zy~F+LsP*@`Oa!xPmS1VJ= z=uz+=9P;F0`4Vh08K%m0^0rSd$sZ`cv9+889;QLVJK|(aEY|LK8no{em^ubty{*<2 z8X=@*&ko5!HUcZr$B2ZT((}t17h9tbSGFl`^c+`gcL& zOI<|@ppb#DM&bQp@D9gjVv)~ABdr#Z;(i(NT}{r6hAr+0z{V?tvb`~g5;es5ii=XY z&eFcxLt5O$XXuTln4F^bsO*gD9}x}jtgL5?S;_-cR;a3%1w3z4(;pQ13E8}Ed$^nn z$58}#CjZ11kANw02vf(!`L&If-yeiV5X&i)JS(4n_D(t%9-{Mx$7urtLQXKW*4ZHn zo0d_7fI;zsvWt1up*?5=n~Km+_?X&qmVan$oTXgpltG>-pgae;{Oly-YdVTnBF4K$ z()6D{o6``4zC}aTsdlmh6}BFxye1{~HO}cFhrnN6iPOYkM36~F#Z{K6g}|%UQnv>O ziqgcT7d7CW?j~@BlV-5lb_ z3Q>)sx&z*c*;~!Vf7jWCgXEBsw+E)9eu*)zoGsP1Z6AH-jU3(mAx$H#NAOIj$ZEg6 zv3D|HHAd>y#c(zy;pfqe2Z4~KTeNkwZ2=7F8;d~?cFYDMvwVa)?Z+^XzNjdPPpsGx z5;TMU=~Y^rwnb+HM$^#~enE?m=N&WPy%Yj+hXGTFr>_0YlPb z(rj8z2GsL)zM{ICIwYKTFb3xlBM3B{4DveOmqYgWT3T=rgL47Ka_oBx3Rc6i zJ%l{A>u$9WE5Pe+w_7IgVD1_r(CzX7#dwz2#adcRA04u!{~Y1&bQf!WATfqGs@Qto zm)g*9*uAX7Z&E3#W5G{+YIl#jpW|i5!CX* zOKXud!G7(ShRg{Ep0V>_Nqw!~mmZ>$4w69j$^sx7{>f zy4<3Y{39`vUx>$cE26DG5aL%Ww=J3Qc((lOhn-+K7m)yPbp{T8dcGg;rStn`R-E%= zNi~0$o4aB~&3N;xzq`pH;m>2jh0$%rhb;Lf7k>jo)B*_KGodPD7Q$@03<=xjsKqOz zKAy_+gac8Z0HmwTS&P>GTEsC|C)#%9u$>D&)!0(*=bK$pk=6H+ zXzVqMvMb=A?DBH(lMx?4WUj}P+TE7xxLkiiH}4GaioSRp`%9uCR9~Lc;x7^@iPA4R29aqoZ_w{7)cfA zX`p_P#S3h$SKnx+CHM}K9f<;ser0@xrxBf+oeWk+Ee<&=+}}w0yq%OsoomuqNQhQ2 z>eSbnJ``W9ftn==TNaEOmf5Ws8r=HGNOy9tTDyp*oDz!wtuDd~dB}qNS^z<$SYr~H zMcm3)9UV*BsXnNac~8?da}V@Ooa%DC+0uN;Ikyh$zD*??oHu zBs+d6W&6xs?ThmBEpvBy z&WwUm61KhRu!Y8Gl~@oGo2oz{GUIjG6Gixy1PghsQD-{@pG9h&2z>6gjt^8HE@i41 zb$!&oG0u6h--+OdEfXR2H5!jHO zCuhrSi~~w5dJOHeoH!9QtDKeS-XmjFNEiBv0uv3=zs6TxpIa zTWK7am7|Sb3e)@lSo`X@D8KI82auNT7EwW3KsqD@1xYDkD3O-#M(I`&5NQx;2Bfrosi*vsrKobqu2|_kY)}1VQO0jI(_VDi8R7_k*2|zyyWj&;;av7^M*NahS+22WU zq4iq-2yU}%YplOulwV6U1!3OaHyYjEQ>1zvii1PUaXHvixG*E}^{$}cRFCrqFyfA` z1oN$;@t3LBvtUt#z7j_6x-(KB;Rv20eRRt3G<-$9>amWwl9&Tfwah*nIh#^rU~p7v z>V-3nhTFB@ec&drUMBq7PSs(Y(laV`zoe!h#wveuB)G=|FaqH`PzS!f&CGq-7IsQAM842-m)FMTBo*4ev;4i4q`hHilP0IN}sfaPUhwUV^w7udwg%}pO zCB|ESAs9XqP z%PmviI=bh)Fr}q5a4y{)u<&MvwQ;Ddvt5I_XcBj0>QiU8w;Bm1(p^fRG_`MUkn0I&@bxAqKGY~R!G^U6ewrT(RT3tV-GUl0jD;ph z_)r$W;GFFhr~H9Y3qnljzS4GNvC{o7Jq?3|$qy`SU&p~eT3P1Jk;PEjERFf>_y&t3lYXs3Oe1HLE zV%`!%zk`xiuN7UtjJvDekcnR9=&bzjpw@WGJj7sP<#C(ZbPeQA8?2d=e_izILH$e# zymCJ(STo2C8H)Iq~+ns9af@_Q+1qU96LXz6BFR2!|{o?(a3Db z99(EnUWmr{XY;RWUDL`10@+R_`ELg0#;pddFUjLaryhZD>f})#VR&_j8DoV z7d`;Dsbw&jc4_RmsEL#n-S3Lu`Z;7;-ri%=zgM!}#*$}CJ38i4PhY|aIzc$Rs4`E4 zN6V8II4;7_d#b&2VR!Z?_{UzBq!nsK7el_#gU8ZLM@gKNqcFW_$BHskv*3w~J3+y7 zp3yHUblOcjI^6LfolU0wxW~*o(K|gBCEBVY=8{QLQDAr#1ky@w1nA;pP0BIG*GHR#sE07=v){2RP? zzMCYST(DZ06Qla+I()I8{f-w+)_cVVIoT14*SS5^j;Ev#I?@;OI6IX&)2t|)cQC;l zG3!O2#p3cvuJrkI3j4%~1+rK=-ula@AOQ;ol4Ikb?+uAp^^Hp8F0kAt7F}7!S}xZu z%%RSb`uPG#y0ldebkT({9O&EQu#R`{Z-J5v9Z)u@&nk7sDl6dxW(u<3(Ktg={W~-{ zn%9|ojlo>WSmu9_+5SC3-Ke_4`@FeoGQFw@1>v)Z7d`3lZob5`4fKry6|cm}`eX*T zzNGu@hzqoq((0Q`=mM7OC=dZhH`&oT54C+;?qM}RKwy0Y44MP(aW~+&j_PQQs`JXN z!?gZK^(bw#JF%&{Icr|%#msvDwr1JX&=6-Cp=sM+D}0UaJut`5cOs8XJ#buagFX`R z1auvh^d68Oli)ET)t5S3{(E1)m0zQ5Bw%vBEG!VNaP$z}^gv9P z(`74spMxJs>dVjPEL(4Ev`nRce;GPwbkbI;Ja4IiH}WDYT6n9sL&+F0QR+BCuge-v zy7!eARw9Y{TwEmY#xsG)J6K@>yntQJCm1ONOG$~qq*$I+x2FnQqweEYzu*?Sc|Cvm zGxphVnfoQz&BPj6);sdh`C2uzeQ6O~owdd`{^uHFu_m9pNqxI{!(Y zeV1rR&trAB$(-REDt7|unwSRS%ruTt(l=t{-_q0F-EckdC}FvltNv|QS){V1k3Y|G`5!NU zgx~i#&9cK4#@I)MbhK9lsgVSrQv{TfQ{&eEl_@jEZv%#x66YGe)_UR-lLyKi-iIC} zYEPe2o&J{FGHS2-(`bq4sYMwJ$QQe?cu^3M`ssD;wbPFF^#_s&C={C(87D=ny*gVm zLxn!pdiDtz%1XKAbd;o$>bC}Mup7B6nR71%U}OSlOn0hzD=65V_KHA~pcQ}BYYW3o zP{)as55#mR?eH#?uclpJGI>5-_au5U@&ZlJ?J#I`clo1F>JIZymRn6Y8VE!oZV#6_IgKK z80%C)K1Jc>FU&I|YVHMO;Qo!bf|e-!u7|V1o-=LxG^5yO<3<#bwZl_k2s**A-a-SW zYYh{ghbNsg$~#Yx^4Vf-3y>jV(Tb(WwrM|cv$or)f_vhnTjr== z2ikdBoP2SYL3jiTuQ)%Y(U)q(q!AVC?Fvip^tZxA>!*HH%ul@ak5lolfH^3Bmj!-? zr!jaM_Ph;H)t}_#TI6!=L`*HDN%Y0NP_y(||5m6# z!Pj4JCD_M|a}?Oy_u}tj{==<1HYvxqy2XCZ<02?HBu?NGsp$!Qo1av32@7!pl=2_i z8ZgvE$dIZ$^=$N_cG;u|EnygFreC^mSiHtF+fCCm?Q> z>Nn;||6FL?;;8ZM1&|qTvU5WhOOj4h5$2n#f#c72g=Ik+;$a~~p}x<@db=j_&J`0m zXqdF~YnvQ}=Pv!>=uOL<+eLT}!rNZo2`7v6C#T$Wk@;p4^1h4ccD$qrDQ78)pdt61 zm%$}nG91uopF+5=fZzH`fcJYd+Yg$X{@lL4*Uqf^!L+kd<`O;#sue$34h3o4L58xx zMT9j`cl!0)t77enG4C^<%~wm;gUcD4Rq7goHFU*hm^&@Ce?L{++ex+;j=PuGzyEJE zgQ1MfDz!4b6gOiBruSpg!6xW?q7D?%7;D|=P6!r{j+y>IP~`&5en-@1ENwXKV?`8p zAZ9l?uI0o8vv*IeYV>fBgwx^kYS~E9avUGEyEhjdWWFzc+f}XJw8d1hq5o=c%s?%N z{d9)2-rKthroo$jFQ~zX^7K@7++n-&%Y9w;D|B;=1hv2OW^#`7vUL*KKdkcKpZljn zf!O%*umDo}cxpE>6zmjBoGXw1`UTIm&QCjUAN5(6rw^Jw3~vkTxbv66_+_B*hGC2$WB>Wazn{TN5Ns5KX2~M@lV)x_zp1i6KF|aI$Tmzj zpD!>S_@|Wq_j|0t{V!|7Ur+8t0lZKD4#U3>RyaWm$3LI<>Z||tjlcOv-u4yAaFYDi z`<*cEm>l*x-PaJq>}N74*SE+N0u~)j$f|~?g#G{CGxyKv5d)u*=~a4u6r?ZUe4N&0 znAHF4yf7Slq}gC|!CqIxO62s%l89*LBol`)F;D1M>v}ww_d^1a!u($m1V%_72nz2G z`qI8M$s?Chn*f%puf-}xzw}R$X`SH%=<|SH3S4X*wdt9G($rZ$S}7 z+7c~MkIR#r$#e)x&o()5fYwgL7AJt+1&@@`A=+yFfRU6L`{-#PccM_^O?Y_PpXd-l zv#aN^+DY$L>@RJR+v~?q#x?_|2_!SsY6=B(+1-9h_}pI`J1@8{T4E{$JwS{`Gy5PX zCwV$*ldnC1nRD|PXA-6LW33ykPKC%;b8I);KrX7pi2 z1w)*lnm+THDCt^KLEu;B@$9#gAPV_vhUX z?23xAo^X2Gl)IG2RRP5+UPgn$P?PNuUA5j|=Chx>!(GL!On4BGa3TTYzFm>L?zlc` zsHcfhMxXaMg{yY)9>jvO6W%K}clZI|a@FC1APU4(IDUPzcb&}Z#>q1LMDiYzLW9KE zD7~)z9skA#|I;X?=nf?;f;IvMPf8T(@?slglJ*8HF1Q{&@T7H)guX*@F=>VcY~B6! z>JV%1uq}7~OD)g2oGUYu^Uqe)(|VvOo2RU{p9Dy#kRN1lNa-1^!WP>i2zb4g9@Bfx z!t9R~F`x|&mLwIGl{u4e2%459iGnfY?j6|AX}}6{P$7W%jF-REStRXl?4C(?Ff!zc zCdBYzDgUGV)eO1GWs!iip3+g#I7Rt4GRBq9J!#~{7utIxhZI{<(@{VUue?ek= zD9}2frb#odC{Nmcb@wy94@!~AdM90-r7d65eUE~+0B_X~V@sSgwd4OIzsYQYtWnb? zR(6Ym7y>yOR4T?(3oU3DB|NSD{3rgn@kSNe0oL(sRso}TRf&#YLOVO}q&YfYPGa_!mMCbMe@Pm($)K>k#+}OTEJ;wkl2Jqf>++d3|G6oG z2oUY_V7h$^2}PaF5wBWydbLu@6YJ;!Haze24ZxtL#XM^Din1sxaPg5xwcN?nBDGiI zM&;tzV7F!I^nJ(wF=v46lhLRMuv!6GnktisIR1sdKZ~`wRCKO#nI311WcDFhoC#0v zj!vdJBYTrUnJ*|mU245o#;9{h9p*%Pq|PtW)K~&cV#e7mu{XS6-Ua}|n4X;Gyb)t2 zCr|8NfZ4_yN^p#rW}!jifMEttzd&DW{FoESsbEaJU~ZcgKa{iHFmdu-bCmM$x8?)3 z|8C<+P32oq3mO_B4Ryp0nVG;Oun@T%diGX1+EREKq<6;yg1%e=$0)h61 zkk}m(pcNagFxX8B3?T^KrGJmJT>Mtb5&w8voEdx*10$RHV1HyB*L-tJ(pndDUP^kW z%dEcgh|Uyq=YY$ASUkVga#94;Gc1+_NtB%UP|=S^Wa6X#nruEtNFOJv$gA-LYzpDa z8e1exl~VcUTf^zP>qfs86hJ4&JfN9ZBXsbrcJsIyhss?m5PEQWwq&3{AIHMYs2^2>ps9v zG8W#0RqG=l>xW*p@lKY$662BWG$ewzLk{3 zIv9Sy8JhvH6M$K3lOi3?)|Oes_UX+bxcyhHZwlq22iosMk1nx~DTkjFtE`kYm~U)I z>3K4HoV6pxuyJ?fUOwWMIxjEQwqCiPpfWh}>T0d{;qukI5f>zKkbACQ2SdHxF*RnM z^BxCQmWDfvFAv77C9^^GqfHT=w`gS@6hkH}jZcQ(nI|8-jrV%l~I>pF<^8&aJzE^di zoAYT)_;Nyqmy7G%coFm|A6T$yM~}aLTzu2@0-R)U7WVxxHzHc5!7IAy`sARM;ivhonL0XHRP% zqU7>sk)4d6or!Ap>wFNzG?=cz2CHBHDIjfpj+%X@ate>#QUI3!1*Ck5SGV-#1 zf9}Jm5a7Ffiajw&r4d9|MXvuSf@qUBVfg}xBJJlwC6Hff7TK7tN(hCE#5IQOopn&0 zo*!IzQ#x5NCIe9c*bazLKNNuqU}rCVfyLz%X@4h1z67Xh8#-~A3F@p9{M_cvB{Xd( z+up&`?GIN`cYP~tW#wN~O;!MGHGdqe9nZo9hGCUAKSU%-iq zJgnWBPM&;2O!lhfyXB)B%`Gw=`+AczuTp)B86=PgoO7O^^UCoM?uUx1v%C8=`+*M% z@|S)0<@j7Z2~3ohgrGaVz9T;rI}p>2Jqs}8`hq`@ML%~~H~sXz^f?PO3ou)9#f$>J z4Z|P*wx0TXW}x^vZRmw;6=Yd-j%^*p&-i8TjYzzlX1VszG#rSqUhQ{*Fpb>11d$GC z7|)>+H;_d9 zSQ}}-tSMS*6RUfI0`VAUT;Z2jU+s=>U_!vvb7hqKVGK;WO94SQI&a@v04k%Z!|M*P zO@n38LG+8)Jr_7kxS5TLAwm7M?WWrUQY0E}>=ZxeH-|}Ipwyi2Zv{`GYWroPE?#;RId{BEln3%J1d;B?_?6#* zR`RBEhe25)Xqqjq3YZV%9ttX>RQ+;%zFXSsGXVz9PCfd(ZCM;IQr^pejEAbB)=DJK z1G^F>Dy{*C3lUz_epU+_S}}uD@@{b6qP#>7*{FUKWMn553f)~0-qyZzM*HOWf(o8{ zj>M}?MAH6=e0ZZl>z$DV31)JjH7uCwq4ArVG2Uc>{4y^L0bAM=k3fY$&F{8w;BGV( zm-I5-1W~x8sY=ELaf@j9h&+P@eIJ>7qs$FNB;3g(a?&uJ)wuiop2=1=YN9%x9wqP{ zYCvAP8TO+xUf%~OWuw;18ny{zHg;6v_j->5JWm@Ol)fR#h3e1uRRnj(BAydiX=G((e!h%5G`@pR3IaOhfa+K1@w`om!pOx&UKk5~J48a~T z(lE`l!&_hOCDSmw4rX!ZeYOC@tJP5aZXHH~dKgFbIN*ywd%hhoP3#&r;#kJq5$8`B z)lI?b#U(Bp0tiW#pFA?_uZvlE@jB_Hc(#*jSprnaZ{Nm}{5aDf?lnKKRN9c~II-2G zzG!AL3km^%pJZO;1D5oB_ZxQl#7yxG#9Qu^1_aTqF2%48KzYN8@`yBk;yU0o2}PsP zTASa7kUsm~Zyw#M($NbBx=f}0Q=x1Dk$4VNh|kGs4mQrw&%b;l)v>9UWck4mXgSUb zLKTpXEiX%EWv#_nbtlqPS>KY=g_bnzJ%8d7>YM-+yWV@XaguHFUwPew_pF5hQB(_fKaW$D-))AhyU*54vR+d%@C%z7hT zs6L;b6~2?r#QboHX<$Kd{QRL6)xtidGH&&(yov`D zM^`rCEx!*yy#}7HioTlSR>LNcX(7l61*!dp8#6F=ctLnX24qE`PGdoW&(wqds=3ST z=*z@e!7J7|+8pq=#Q>)^&Ybh_WD{R$L}gj}4Dju6o5^cUs@QkAgit70WnX_J;L^K= z<8iT<=`ZM|IAysDuenjVX43u&#cS6UUKKbB+_(1mxnx|-ZNL{H1-Lv;KA9m+=Nb@> zk3j(>{h=4FI*MD-&Ct)hahfguL6)7@;ZY*yZnW==KX9=4F>RdWFQ){+?)bx_aX=Kd zFeFRKmM}KAtS6S^32N~V*81}BB&N-*aG6g*Mi15zzQ8N9glPja` z*JwUHXC<(k=q)#;Qz;Lfh=_@JoALt1BLz`~4<7j(?lRV$xAkIACZ{qkkD~dLk8QZT z>`90|Sb0?EJI4d;;8IYZJ0dq}Fb434Kz&7lX2g8^3&|Wb)*sa_nkO?6-U8FMFqqyC z#`+M%^re?C19XG`D-mHCT8@q5H7I*;!+pS-Z>~+?IHM(t%>GNfybDCQwjFG{Ifm+6 zzR(cM$2S*jTgPTeCi3!2Z*9JTuLD+xjbOt*m)6KEbFUYU-@=7%YI2|!(EE-qX6H@n zoOV7;?rVU1@_{gUr&=j8jL>@YG^g0gJ*5~nJQ1|ra1@uLc*rKF%;>8hWIlDeQJulP z9F6cYFyHhlDnM1#n|AX$2Y&R5TtR7q;+HRgE~K*IR?i}2G=obD|I(BGQMbDgc<-RA zVnbEW-#i%<4ZuA{m=zb!+SIkuI*;cXw#auO>)$Xu$A}|Ubhc~23ouA7rfWkF^)d$*{ z*yRQ7e<3h`Xd5(d>BJM!-L5OLw2%h74PL0_?nLi<-i(naTHrHSJ|ju%pKa@Ky;7^p z)tL(26wyp8xij-S&pEF*n%yaVRyJiu@6I*+y+8GM_v3~mx8AW?-RIM@<$|1|=G9(F z@6yv=$vlCC&aXjv_O2ID(}Qt#yOV$Hyf6@arXWbjS-1!3m0M4El*f zLRrMvVEsUcV0k%Gin?c%OtJ;t@^U*WxZhoS^gj&!k|S9q{+w$`)Z1-ZnfbX8O;Sg0 zatIh!`(2i~mF&G2s(SM^&Suv^qtBMFZV`t8E3)p&ck+QzEGX)2U&KByE;z!=Sd%ye zUOkbUG5M{=C7nm}y^@zNz5!PYup~?J90+MACj<>ASWr@y&FVOF04HNh08DKH4wB#(@0N}l_EUO~cvwR_V{oDpWfPMsoH^DkGy@stwxk6f>h3 z$XEF|0Y$Ryb;f4AWx(UK0csTh##)Xoz#fqSuocJT4C9Jil~KKWWygOd*_G3g^kcil zu6THBud(Nq*7C6j>lNA@y+WHvq|pC{HmS;<^cu7yu#3o2fE9GqsFfo$dk_Gg08C-j zAY0|M(^O#4m6mR9wz}_}!KyuYTbm8Pjq-Gw?W+)cP$w+XH3;D6%lAyF9B0!OZQtlJX0g#2ShF>XNixwDrqHLC#_0HgSdq@LaRRV_db%Yr9jL1zevaU{@+qjj3#dr@eV@9sJmQ?*LwdS! z{jv?XYWPG1KAdJ`tE|!6+`Y;p!zz%&_NMcz43}a+s5R`b=}O&@N1g4q^`=rw_+d|9 zo1NKo`<9#Mm;QDn3TQzH5%fmy*Kqpx7kZ56&hwDI*SaZimmchL`anSu4tNivv%Rtx zKg~=!Y@+=C@dC_#bGFa#_k1;M+FJcZ_e#))LI`k)thf0;%4n3&fDSJv;hFD7b{rS$ z;Mt?VrEyS;CKtG9mt9hHrgW6l1Bw%1&?A9%0DrAYqoFmdL?)5x@BApz=^BI(^Tjrp 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°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�qUgJ=u;N6!cub?6unIE%)TfrH7sJm#6nc>~_-!x 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

XA=NX`_8cbfIcDyZ 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

B0y?{^q1CH`C{a>C9 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%0A}-1dH88l%R65Jr!SXSC+wmzIVhF}PBP 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 z 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

ZIQW9$$qsUX`|@z^J+l|s>{eP-Sc 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 literal 0 HcmV?d00001 diff --git a/cypress/screenshots/01_workspaces.cy.ts/Edit Tactics -- passes (failed).png b/cypress/screenshots/01_workspaces.cy.ts/Edit Tactics -- passes (failed).png new file mode 100644 index 0000000000000000000000000000000000000000..39cea55c0126b20f8e0f71af2c76e566c8625859 GIT binary patch literal 227769 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 literal 0 HcmV?d00001 diff --git a/db/config.go b/db/config.go index 1336f32b1..ee6eb5d29 100644 --- a/db/config.go +++ b/db/config.go @@ -66,8 +66,6 @@ func InitDB() { db.AutoMigrate(&LeaderBoard{}) db.AutoMigrate(&ConnectionCodes{}) db.AutoMigrate(&Bounty{}) - db.AutoMigrate(&Organization{}) - db.AutoMigrate(&OrganizationUsers{}) db.AutoMigrate(&BountyRoles{}) db.AutoMigrate(&UserRoles{}) db.AutoMigrate(&BountyBudget{}) @@ -76,6 +74,13 @@ func InitDB() { db.AutoMigrate(&InvoiceList{}) db.AutoMigrate(&UserInvoiceData{}) + if !db.Migrator().HasTable("workspaces") { + db.AutoMigrate(&Organization{}) + } + if !db.Migrator().HasTable("workspace_users") { + db.AutoMigrate(&OrganizationUsers{}) + } + DB.MigrateOrganizationToWorkspace() people := DB.GetAllPeople() @@ -186,44 +191,44 @@ func (db database) MigrateOrganizationToWorkspace() { } if (db.db.Migrator().HasTable(&OrganizationUsers{}) && !db.db.Migrator().HasTable("workspace_users")) { - if !db.db.Migrator().HasColumn(&OrganizationUsers{}, "workspace_uuid") { + if db.db.Migrator().HasColumn(&OrganizationUsers{}, "org_uuid") { db.db.Migrator().RenameColumn(&OrganizationUsers{}, "org_uuid", "workspace_uuid") } db.db.Migrator().RenameTable(&OrganizationUsers{}, "workspace_users") } if (db.db.Migrator().HasTable(&UserRoles{})) { - if !db.db.Migrator().HasColumn(&UserRoles{}, "workspace_uuid") { + if db.db.Migrator().HasColumn(&UserRoles{}, "org_uuid") { db.db.Migrator().RenameColumn(&UserRoles{}, "org_uuid", "workspace_uuid") } } if (db.db.Migrator().HasTable(&Bounty{})) { - if !db.db.Migrator().HasColumn(&Bounty{}, "workspace_uuid") { + if db.db.Migrator().HasColumn(&Bounty{}, "org_uuid") { db.db.Migrator().RenameColumn(&Bounty{}, "org_uuid", "workspace_uuid") } } if (db.db.Migrator().HasTable(&BountyBudget{})) { - if !db.db.Migrator().HasColumn(&BountyBudget{}, "workspace_uuid") { + if db.db.Migrator().HasColumn(&BountyBudget{}, "org_uuid") { db.db.Migrator().RenameColumn(&BountyBudget{}, "org_uuid", "workspace_uuid") } } if (db.db.Migrator().HasTable(&BudgetHistory{})) { - if !db.db.Migrator().HasColumn(&BudgetHistory{}, "workspace_uuid") { + if db.db.Migrator().HasColumn(&BudgetHistory{}, "org_uuid") { db.db.Migrator().RenameColumn(&BudgetHistory{}, "org_uuid", "workspace_uuid") } } if (db.db.Migrator().HasTable(&PaymentHistory{})) { - if !db.db.Migrator().HasColumn(&PaymentHistory{}, "workspace_uuid") { + if db.db.Migrator().HasColumn(&PaymentHistory{}, "org_uuid") { db.db.Migrator().RenameColumn(&PaymentHistory{}, "org_uuid", "workspace_uuid") } } if (db.db.Migrator().HasTable(&InvoiceList{})) { - if !db.db.Migrator().HasColumn(&InvoiceList{}, "workspace_uuid") { + if db.db.Migrator().HasColumn(&InvoiceList{}, "org_uuid") { db.db.Migrator().RenameColumn(&InvoiceList{}, "org_uuid", "workspace_uuid") } } diff --git a/db/db.go b/db/db.go index 615eb23d1..8908ddd53 100644 --- a/db/db.go +++ b/db/db.go @@ -1136,7 +1136,7 @@ func (db database) GetAllBounties(r *http.Request) []Bounty { assingned := keys.Get("Assigned") completed := keys.Get("Completed") paid := keys.Get("Paid") - orgUuid := keys.Get("org_uuid") + orgUuid := keys.Get("workspace_uuid") languages := keys.Get("languages") languageArray := strings.Split(languages, ",") languageLength := len(languageArray) diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 000000000..9656c772b --- /dev/null +++ b/yarn.lock @@ -0,0 +1,1215 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@cypress/request@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.1.tgz#72d7d5425236a2413bd3d8bb66d02d9dc3168960" + integrity sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + http-signature "~1.3.6" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + performance-now "^2.1.0" + qs "6.10.4" + safe-buffer "^5.1.2" + tough-cookie "^4.1.3" + tunnel-agent "^0.6.0" + uuid "^8.3.2" + +"@cypress/xvfb@^1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" + integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== + dependencies: + debug "^3.1.0" + lodash.once "^4.1.1" + +"@types/dotenv@^8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@types/dotenv/-/dotenv-8.2.0.tgz#5cd64710c3c98e82d9d15844375a33bf1b45d053" + integrity sha512-ylSC9GhfRH7m1EUXBXofhgx4lUWmFeQDINW5oLuS+gxWdfUeW4zJdeVTYVkexEW+e2VUvlZR2kGnGGipAWR7kw== + dependencies: + dotenv "*" + +"@types/node@*": + version "20.12.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384" + integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== + dependencies: + undici-types "~5.26.4" + +"@types/sinonjs__fake-timers@8.1.1": + version "8.1.1" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" + integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== + +"@types/sizzle@^2.3.2": + version "2.3.8" + resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.8.tgz#518609aefb797da19bf222feb199e8f653ff7627" + integrity sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg== + +"@types/yauzl@^2.9.1": + version "2.10.3" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== + dependencies: + "@types/node" "*" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +arch@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async@^3.2.0: + version "3.2.5" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + +blob-util@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" + integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== + +bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer@^5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +cachedir@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.4.0.tgz#7fef9cf7367233d7c88068fe6e34ed0d355a610d" + integrity sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ== + +call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +check-more-types@^2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" + integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-table3@~0.6.1: + version "0.6.4" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.4.tgz#d1c536b8a3f2e7bec58f67ac9e5769b1b30088b0" + integrity sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^2.0.16: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + +common-tags@^1.8.0: + version "1.8.2" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +cross-spawn@^7.0.0: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cypress@^13.8.0: + version "13.8.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.8.0.tgz#118e94161334e03841714c9b9b3600ae853c11f9" + integrity sha512-Qau//mtrwEGOU9cn2YjavECKyDUwBh8J2tit+y9s1wsv6C3BX+rlv6I9afmQnL8PmEEzJ6be7nppMHacFzZkTw== + dependencies: + "@cypress/request" "^3.0.0" + "@cypress/xvfb" "^1.2.4" + "@types/sinonjs__fake-timers" "8.1.1" + "@types/sizzle" "^2.3.2" + arch "^2.2.0" + blob-util "^2.0.2" + bluebird "^3.7.2" + buffer "^5.7.1" + cachedir "^2.3.0" + chalk "^4.1.0" + check-more-types "^2.24.0" + cli-cursor "^3.1.0" + cli-table3 "~0.6.1" + commander "^6.2.1" + common-tags "^1.8.0" + dayjs "^1.10.4" + debug "^4.3.4" + enquirer "^2.3.6" + eventemitter2 "6.4.7" + execa "4.1.0" + executable "^4.1.1" + extract-zip "2.0.1" + figures "^3.2.0" + fs-extra "^9.1.0" + getos "^3.2.1" + is-ci "^3.0.1" + is-installed-globally "~0.4.0" + lazy-ass "^1.6.0" + listr2 "^3.8.3" + lodash "^4.17.21" + log-symbols "^4.0.0" + minimist "^1.2.8" + ospath "^1.2.2" + pretty-bytes "^5.6.0" + process "^0.11.10" + proxy-from-env "1.0.0" + request-progress "^3.0.0" + semver "^7.5.3" + supports-color "^8.1.1" + tmp "~0.2.1" + untildify "^4.0.0" + yauzl "^2.10.0" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +dayjs@^1.10.4: + version "1.11.10" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" + integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== + +debug@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.1, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +dotenv@*, dotenv@^16.4.5: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enquirer@^2.3.6: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +eventemitter2@6.4.7: + version "6.4.7" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" + integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== + +execa@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +executable@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" + integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== + dependencies: + pify "^2.2.0" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + +figures@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-stream@^5.0.0, get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +getos@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" + integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== + dependencies: + async "^3.2.0" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + +global-dirs@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== + dependencies: + ini "2.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +hasown@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +http-signature@~1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" + integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw== + dependencies: + assert-plus "^1.0.0" + jsprim "^2.0.2" + sshpk "^1.14.1" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +is-ci@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-installed-globally@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-2.0.2.tgz#77ca23dbcd4135cd364800d22ff82c2185803d4d" + integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +lazy-ass@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" + integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== + +listr2@^3.8.3: + version "3.14.0" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" + integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.5.1" + through "^2.3.8" + wrap-ansi "^7.0.0" + +lodash.once@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimist@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +ospath@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" + integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +pify@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pretty-bytes@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +proxy-from-env@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== + +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +qs@6.10.4: + version "6.10.4" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.4.tgz#6a3003755add91c0ec9eacdc5f878b034e73f9e7" + integrity sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g== + dependencies: + side-channel "^1.0.4" + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +request-progress@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" + integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== + dependencies: + throttleit "^1.0.0" + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +rfdc@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f" + integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== + +rxjs@^7.5.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.2: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^7.5.3: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +sshpk@^1.14.1: + version "1.18.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" + integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +throttleit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.1.tgz#304ec51631c3b770c65c6c6f76938b384000f4d5" + integrity sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ== + +through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tmp@~0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== + +tough-cookie@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tslib@^2.1.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +typescript@^5.4.5: + version "5.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" From 326d13efdaa570a648a737d8af117726da9b645e Mon Sep 17 00:00:00 2001 From: elraphty Date: Mon, 22 Apr 2024 15:08:05 +0100 Subject: [PATCH 06/21] fixed user roles migration --- db/config.go | 12 +++++++----- db/config_test.go | 32 ++++++++++++++++---------------- db/interface.go | 2 +- db/structs.go | 8 ++++++++ db/workspaces.go | 8 ++++---- handlers/workspaces.go | 4 ++-- mocks/Database.go | 18 +++++++++--------- 7 files changed, 47 insertions(+), 37 deletions(-) diff --git a/db/config.go b/db/config.go index ee6eb5d29..b756f48c5 100644 --- a/db/config.go +++ b/db/config.go @@ -13,7 +13,7 @@ import ( type database struct { db *gorm.DB getWorkspaceByUuid func(uuid string) Workspace - getUserRoles func(uuid string, pubkey string) []UserRoles + getUserRoles func(uuid string, pubkey string) []WorkspaceUserRoles } func NewDatabaseConfig(db *gorm.DB) *database { @@ -197,10 +197,12 @@ func (db database) MigrateOrganizationToWorkspace() { db.db.Migrator().RenameTable(&OrganizationUsers{}, "workspace_users") } - if (db.db.Migrator().HasTable(&UserRoles{})) { + if (db.db.Migrator().HasTable(&UserRoles{}) && !db.db.Migrator().HasTable("workspace_user_roles")) { if db.db.Migrator().HasColumn(&UserRoles{}, "org_uuid") { db.db.Migrator().RenameColumn(&UserRoles{}, "org_uuid", "workspace_uuid") } + + db.db.Migrator().RenameTable(&UserRoles{}, "workspace_user_roles") } if (db.db.Migrator().HasTable(&Bounty{})) { @@ -261,7 +263,7 @@ func GetRolesMap() map[string]string { return roles } -func GetUserRolesMap(userRoles []UserRoles) map[string]string { +func GetUserRolesMap(userRoles []WorkspaceUserRoles) map[string]string { roles := map[string]string{} for _, v := range userRoles { roles[v.Role] = v.Role @@ -291,7 +293,7 @@ func (db database) ConvertMetricsBountiesToMap(metricsCsv []MetricsBountyCsv) [] return metricsMap } -func RolesCheck(userRoles []UserRoles, check string) bool { +func RolesCheck(userRoles []WorkspaceUserRoles, check string) bool { rolesMap := GetRolesMap() userRolesMap := GetUserRolesMap(userRoles) @@ -309,7 +311,7 @@ func RolesCheck(userRoles []UserRoles, check string) bool { return true } -func CheckUser(userRoles []UserRoles, pubkey string) bool { +func CheckUser(userRoles []WorkspaceUserRoles, pubkey string) bool { for _, role := range userRoles { if role.OwnerPubKey == pubkey { return true diff --git a/db/config_test.go b/db/config_test.go index 386c8dfd5..2c92099e0 100644 --- a/db/config_test.go +++ b/db/config_test.go @@ -10,8 +10,8 @@ import ( func TestRolesCheck_UserHasRole(t *testing.T) { // Mock user roles - userRoles := []UserRoles{ - {Role: "ADD BOUNTY", OwnerPubKey: "user1", OrgUuid: "org1", Created: &time.Time{}}, + userRoles := []WorkspaceUserRoles{ + {Role: "ADD BOUNTY", OwnerPubKey: "user1", WorkspaceUuid: "org1", Created: &time.Time{}}, } // Role to check @@ -28,8 +28,8 @@ func TestRolesCheck_UserHasRole(t *testing.T) { func TestRolesCheck_UserDoesNotHaveRole(t *testing.T) { // Mock user roles - userRoles := []UserRoles{ - {Role: "DELETE BOUNTY", OwnerPubKey: "user2", OrgUuid: "org1", Created: &time.Time{}}, + userRoles := []WorkspaceUserRoles{ + {Role: "DELETE BOUNTY", OwnerPubKey: "user2", WorkspaceUuid: "org1", Created: &time.Time{}}, } // Role to check @@ -45,7 +45,7 @@ func TestRolesCheck_UserDoesNotHaveRole(t *testing.T) { } func TestCheckUser(t *testing.T) { - userRoles := []UserRoles{ + userRoles := []WorkspaceUserRoles{ {OwnerPubKey: "userPublicKey"}, } @@ -62,9 +62,9 @@ func TestUserHasAccess(t *testing.T) { } } - mockGetUserRoles := func(uuid string, pubkey string) []UserRoles { - return []UserRoles{ - {Role: "ADD BOUNTY", OwnerPubKey: pubkey, OrgUuid: uuid, Created: &time.Time{}}, + mockGetUserRoles := func(uuid string, pubkey string) []WorkspaceUserRoles { + return []WorkspaceUserRoles{ + {Role: "ADD BOUNTY", OwnerPubKey: pubkey, WorkspaceUuid: uuid, Created: &time.Time{}}, } } @@ -110,17 +110,17 @@ func TestUserHasManageBountyRoles(t *testing.T) { } } - mockGetUserRoles := func(uuid string, pubkey string) []UserRoles { + mockGetUserRoles := func(uuid string, pubkey string) []WorkspaceUserRoles { if uuid == "workspace_uuid" { - return []UserRoles{ - {Role: "ADD BOUNTY", OwnerPubKey: pubkey, OrgUuid: uuid, Created: &time.Time{}}, + return []WorkspaceUserRoles{ + {Role: "ADD BOUNTY", OwnerPubKey: pubkey, WorkspaceUuid: uuid, Created: &time.Time{}}, } } else { - return []UserRoles{ - {Role: "ADD BOUNTY", OwnerPubKey: pubkey, OrgUuid: uuid, Created: &time.Time{}}, - {Role: "UPDATE BOUNTY", OwnerPubKey: pubkey, OrgUuid: uuid, Created: &time.Time{}}, - {Role: "DELETE BOUNTY", OwnerPubKey: pubkey, OrgUuid: uuid, Created: &time.Time{}}, - {Role: "PAY BOUNTY", OwnerPubKey: pubkey, OrgUuid: uuid, Created: &time.Time{}}, + return []WorkspaceUserRoles{ + {Role: "ADD BOUNTY", OwnerPubKey: pubkey, WorkspaceUuid: uuid, Created: &time.Time{}}, + {Role: "UPDATE BOUNTY", OwnerPubKey: pubkey, WorkspaceUuid: uuid, Created: &time.Time{}}, + {Role: "DELETE BOUNTY", OwnerPubKey: pubkey, WorkspaceUuid: uuid, Created: &time.Time{}}, + {Role: "PAY BOUNTY", OwnerPubKey: pubkey, WorkspaceUuid: uuid, Created: &time.Time{}}, } } } diff --git a/db/interface.go b/db/interface.go index 2dc58fa04..c0cffb051 100644 --- a/db/interface.go +++ b/db/interface.go @@ -95,7 +95,7 @@ type Database interface { CreateWorkspaceUser(orgUser WorkspaceUsers) WorkspaceUsers DeleteWorkspaceUser(orgUser WorkspaceUsersData, org string) WorkspaceUsersData GetBountyRoles() []BountyRoles - CreateUserRoles(roles []UserRoles, uuid string, pubkey string) []UserRoles + CreateUserRoles(roles []WorkspaceUserRoles, uuid string, pubkey string) []WorkspaceUserRoles GetUserCreatedWorkspaces(pubkey string) []Workspace GetUserAssignedWorkspaces(pubkey string) []WorkspaceUsers AddBudgetHistory(budget BudgetHistory) BudgetHistory diff --git a/db/structs.go b/db/structs.go index d8018ea51..679266739 100644 --- a/db/structs.go +++ b/db/structs.go @@ -515,6 +515,14 @@ type UserRoles struct { Created *time.Time `json:"created"` } +// change back to UserRoles after migration +type WorkspaceUserRoles struct { + Role string `json:"role"` + OwnerPubKey string `json:"owner_pubkey"` + WorkspaceUuid string `json:"workspace_uuid"` + Created *time.Time `json:"created"` +} + type BountyBudget struct { ID uint `json:"id"` OrgUuid string `json:"org_uuid"` diff --git a/db/workspaces.go b/db/workspaces.go index 0e46bd54c..0619b38cc 100644 --- a/db/workspaces.go +++ b/db/workspaces.go @@ -96,16 +96,16 @@ func (db database) GetBountyRoles() []BountyRoles { return ms } -func (db database) CreateUserRoles(roles []UserRoles, uuid string, pubkey string) []UserRoles { +func (db database) CreateUserRoles(roles []WorkspaceUserRoles, uuid string, pubkey string) []WorkspaceUserRoles { // delete roles and create new ones - db.db.Where("workspace_uuid = ?", uuid).Where("owner_pub_key = ?", pubkey).Delete(&UserRoles{}) + db.db.Where("workspace_uuid = ?", uuid).Where("owner_pub_key = ?", pubkey).Delete(&WorkspaceUserRoles{}) db.db.Create(&roles) return roles } -func (db database) GetUserRoles(uuid string, pubkey string) []UserRoles { - ms := []UserRoles{} +func (db database) GetUserRoles(uuid string, pubkey string) []WorkspaceUserRoles { + ms := []WorkspaceUserRoles{} db.db.Where("workspace_uuid = ?", uuid).Where("owner_pub_key = ?", pubkey).Find(&ms) return ms } diff --git a/handlers/workspaces.go b/handlers/workspaces.go index 0407c8724..5dc7f54e2 100644 --- a/handlers/workspaces.go +++ b/handlers/workspaces.go @@ -339,7 +339,7 @@ func AddUserRoles(w http.ResponseWriter, r *http.Request) { return } - roles := []db.UserRoles{} + roles := []db.WorkspaceUserRoles{} body, err := io.ReadAll(r.Body) r.Body.Close() err = json.Unmarshal(body, &roles) @@ -380,7 +380,7 @@ func AddUserRoles(w http.ResponseWriter, r *http.Request) { } rolesMap := db.GetRolesMap() - insertRoles := []db.UserRoles{} + insertRoles := []db.WorkspaceUserRoles{} for _, role := range roles { _, ok := rolesMap[role.Role] // if any of the roles does not exists return an error diff --git a/mocks/Database.go b/mocks/Database.go index 716cff8b3..abf970283 100644 --- a/mocks/Database.go +++ b/mocks/Database.go @@ -1096,19 +1096,19 @@ func (_c *Database_CreateOrEditWorkspace_Call) RunAndReturn(run func(db.Workspac } // CreateUserRoles provides a mock function with given fields: roles, uuid, pubkey -func (_m *Database) CreateUserRoles(roles []db.UserRoles, uuid string, pubkey string) []db.UserRoles { +func (_m *Database) CreateUserRoles(roles []db.WorkspaceUserRoles, uuid string, pubkey string) []db.WorkspaceUserRoles { ret := _m.Called(roles, uuid, pubkey) if len(ret) == 0 { panic("no return value specified for CreateUserRoles") } - var r0 []db.UserRoles - if rf, ok := ret.Get(0).(func([]db.UserRoles, string, string) []db.UserRoles); ok { + var r0 []db.WorkspaceUserRoles + if rf, ok := ret.Get(0).(func([]db.WorkspaceUserRoles, string, string) []db.WorkspaceUserRoles); ok { r0 = rf(roles, uuid, pubkey) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]db.UserRoles) + r0 = ret.Get(0).([]db.WorkspaceUserRoles) } } @@ -1121,26 +1121,26 @@ type Database_CreateUserRoles_Call struct { } // CreateUserRoles is a helper method to define mock.On call -// - roles []db.UserRoles +// - roles []db.WorkspaceUserRoles // - uuid string // - pubkey string func (_e *Database_Expecter) CreateUserRoles(roles interface{}, uuid interface{}, pubkey interface{}) *Database_CreateUserRoles_Call { return &Database_CreateUserRoles_Call{Call: _e.mock.On("CreateUserRoles", roles, uuid, pubkey)} } -func (_c *Database_CreateUserRoles_Call) Run(run func(roles []db.UserRoles, uuid string, pubkey string)) *Database_CreateUserRoles_Call { +func (_c *Database_CreateUserRoles_Call) Run(run func(roles []db.WorkspaceUserRoles, uuid string, pubkey string)) *Database_CreateUserRoles_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].([]db.UserRoles), args[1].(string), args[2].(string)) + run(args[0].([]db.WorkspaceUserRoles), args[1].(string), args[2].(string)) }) return _c } -func (_c *Database_CreateUserRoles_Call) Return(_a0 []db.UserRoles) *Database_CreateUserRoles_Call { +func (_c *Database_CreateUserRoles_Call) Return(_a0 []db.WorkspaceUserRoles) *Database_CreateUserRoles_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_CreateUserRoles_Call) RunAndReturn(run func([]db.UserRoles, string, string) []db.UserRoles) *Database_CreateUserRoles_Call { +func (_c *Database_CreateUserRoles_Call) RunAndReturn(run func([]db.WorkspaceUserRoles, string, string) []db.WorkspaceUserRoles) *Database_CreateUserRoles_Call { _c.Call.Return(run) return _c } From 6d0e70c49b8b03e33399c385332e2d29484fc432 Mon Sep 17 00:00:00 2001 From: elraphty Date: Mon, 22 Apr 2024 15:22:16 +0100 Subject: [PATCH 07/21] made UserROles migration conditional --- db/config.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/db/config.go b/db/config.go index b756f48c5..a466932b0 100644 --- a/db/config.go +++ b/db/config.go @@ -67,13 +67,15 @@ func InitDB() { db.AutoMigrate(&ConnectionCodes{}) db.AutoMigrate(&Bounty{}) db.AutoMigrate(&BountyRoles{}) - db.AutoMigrate(&UserRoles{}) db.AutoMigrate(&BountyBudget{}) db.AutoMigrate(&BudgetHistory{}) db.AutoMigrate(&PaymentHistory{}) db.AutoMigrate(&InvoiceList{}) db.AutoMigrate(&UserInvoiceData{}) + if !db.Migrator().HasTable("workspace_user_roles") { + db.AutoMigrate(&UserRoles{}) + } if !db.Migrator().HasTable("workspaces") { db.AutoMigrate(&Organization{}) } From f317d8cd1559e9cf259ef6e7f48e60147e6adb96 Mon Sep 17 00:00:00 2001 From: elraphty Date: Mon, 22 Apr 2024 16:05:42 +0100 Subject: [PATCH 08/21] added commision for migrating tables with org_uid --- db/config.go | 53 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/db/config.go b/db/config.go index a466932b0..86ea7c294 100644 --- a/db/config.go +++ b/db/config.go @@ -65,24 +65,10 @@ func InitDB() { db.AutoMigrate(&Channel{}) db.AutoMigrate(&LeaderBoard{}) db.AutoMigrate(&ConnectionCodes{}) - db.AutoMigrate(&Bounty{}) db.AutoMigrate(&BountyRoles{}) - db.AutoMigrate(&BountyBudget{}) - db.AutoMigrate(&BudgetHistory{}) - db.AutoMigrate(&PaymentHistory{}) - db.AutoMigrate(&InvoiceList{}) db.AutoMigrate(&UserInvoiceData{}) - if !db.Migrator().HasTable("workspace_user_roles") { - db.AutoMigrate(&UserRoles{}) - } - if !db.Migrator().HasTable("workspaces") { - db.AutoMigrate(&Organization{}) - } - if !db.Migrator().HasTable("workspace_users") { - db.AutoMigrate(&OrganizationUsers{}) - } - + DB.MigrateTablesWithOrgUuid() DB.MigrateOrganizationToWorkspace() people := DB.GetAllPeople() @@ -187,6 +173,43 @@ func (db database) GetRolesCount() int64 { return count } +func (db database) MigrateTablesWithOrgUuid() { + if !db.db.Migrator().HasTable("bounty") { + if !db.db.Migrator().HasColumn(Bounty{}, "workspace_uuid") { + db.db.AutoMigrate(&Bounty{}) + } + } + if !db.db.Migrator().HasTable("budget_histories") { + if !db.db.Migrator().HasColumn(BudgetHistory{}, "workspace_uuid") { + db.db.AutoMigrate(&BudgetHistory{}) + } + } + if !db.db.Migrator().HasTable("payment_histories") { + if !db.db.Migrator().HasColumn(PaymentHistory{}, "workspace_uuid") { + db.db.AutoMigrate(&PaymentHistory{}) + } + } + if !db.db.Migrator().HasTable("invoice_list") { + if !db.db.Migrator().HasColumn(InvoiceList{}, "workspace_uuid") { + db.db.AutoMigrate(&InvoiceList{}) + } + } + if !db.db.Migrator().HasTable("bounty_budgets") { + if !db.db.Migrator().HasColumn(BountyBudget{}, "workspace_uuid") { + db.db.AutoMigrate(&BountyBudget{}) + } + } + if !db.db.Migrator().HasTable("workspace_user_roles") { + db.db.AutoMigrate(&UserRoles{}) + } + if !db.db.Migrator().HasTable("workspaces") { + db.db.AutoMigrate(&Organization{}) + } + if !db.db.Migrator().HasTable("workspace_users") { + db.db.AutoMigrate(&OrganizationUsers{}) + } +} + func (db database) MigrateOrganizationToWorkspace() { if (db.db.Migrator().HasTable(&Organization{}) && !db.db.Migrator().HasTable("workspaces")) { db.db.Migrator().RenameTable(&Organization{}, "workspaces") From 4ecd70044ca118ef62e0889ba4dc5fc40b299e1d Mon Sep 17 00:00:00 2001 From: elraphty Date: Mon, 22 Apr 2024 16:54:03 +0100 Subject: [PATCH 09/21] added conditional for user_roles --- db/config.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/db/config.go b/db/config.go index 86ea7c294..9789078b9 100644 --- a/db/config.go +++ b/db/config.go @@ -200,7 +200,9 @@ func (db database) MigrateTablesWithOrgUuid() { } } if !db.db.Migrator().HasTable("workspace_user_roles") { - db.db.AutoMigrate(&UserRoles{}) + if !db.db.Migrator().HasColumn(UserRoles{}, "workspace_uuid") { + db.db.AutoMigrate(&UserRoles{}) + } } if !db.db.Migrator().HasTable("workspaces") { db.db.AutoMigrate(&Organization{}) From cf3e62aeb7746a4fa2a73dd7756b9a37011f674f Mon Sep 17 00:00:00 2001 From: elraphty Date: Tue, 23 Apr 2024 16:14:17 +0100 Subject: [PATCH 10/21] added new tables --- .github/workflows/frontend-e2e.yml | 16 +- db/db.go | 73 +++--- db/interface.go | 48 ++-- db/structs.go | 124 ++++++++-- db/workspaces.go | 49 ++-- handlers/bounty.go | 35 ++- handlers/bounty_test.go | 264 ++++++++++---------- handlers/tribes.go | 14 +- handlers/workspaces.go | 15 +- handlers/workspaces_test.go | 2 +- mocks/Database.go | 370 ++++++++++++++--------------- 11 files changed, 573 insertions(+), 437 deletions(-) diff --git a/.github/workflows/frontend-e2e.yml b/.github/workflows/frontend-e2e.yml index 2053dacbc..d284d6a53 100644 --- a/.github/workflows/frontend-e2e.yml +++ b/.github/workflows/frontend-e2e.yml @@ -39,10 +39,10 @@ jobs: chmod 777 -R ./lnd; chmod 777 -R ./proxy; chmod 777 -R ./cln; - + - name: Check for NODES uses: nick-fields/retry@v2 - with: + with: timeout_minutes: 10 max_attempts: 3 command: | @@ -53,12 +53,12 @@ jobs: docker logs dave.sphinx docker wait stack_relaysetup_1 cat stack/relay/NODES.json; - + - name: Copy Node.json uses: canastro/copy-file-action@master with: - source: 'stack/relay/NODES.json' - target: 'tribes-frontend/cypress/fixtures/nodes.json' + source: "stack/relay/NODES.json" + target: "tribes-frontend/cypress/fixtures/nodes.json" - name: Install Frontend Dependencies working-directory: ./tribes-frontend @@ -73,14 +73,14 @@ jobs: run: | sleep 20 yarn run cypress:run - + - name: Upload Cypress logs if: failure() uses: actions/upload-artifact@v2 with: name: cypress-logs path: tribes-frontend/cypress/videos - + - name: Stop Stack working-directory: ./stack - run: docker-compose down \ No newline at end of file + run: docker-compose down diff --git a/db/db.go b/db/db.go index 8908ddd53..fffda8a02 100644 --- a/db/db.go +++ b/db/db.go @@ -586,7 +586,7 @@ func (db database) GetFilterStatusCount() FilterStattuCount { return ms } -func (db database) GetWorkspaceBounties(r *http.Request, workspace_uuid string) []Bounty { +func (db database) GetWorkspaceBounties(r *http.Request, workspace_uuid string) []NewBounty { keys := r.URL.Query() tags := keys.Get("tags") // this is a string of tags separated by commas offset, limit, sortBy, direction, search := utils.GetPaginationParams(r) @@ -598,7 +598,7 @@ func (db database) GetWorkspaceBounties(r *http.Request, workspace_uuid string) languageArray := strings.Split(languages, ",") languageLength := len(languageArray) - ms := []Bounty{} + ms := []NewBounty{} orderQuery := "" limitQuery := "" @@ -747,7 +747,7 @@ func (db database) GetWorkspaceBountiesCount(r *http.Request, workspace_uuid str return count } -func (db database) GetAssignedBounties(r *http.Request) ([]Bounty, error) { +func (db database) GetAssignedBounties(r *http.Request) ([]NewBounty, error) { offset, limit, sortBy, direction, _ := utils.GetPaginationParams(r) uuid := chi.URLParam(r, "uuid") person := db.GetPersonByUuid(uuid) @@ -788,7 +788,7 @@ func (db database) GetAssignedBounties(r *http.Request) ([]Bounty, error) { limitQuery = fmt.Sprintf("LIMIT %d OFFSET %d", limit, offset) } - ms := []Bounty{} + ms := []NewBounty{} query := `SELECT * FROM public.bounty WHERE assignee = '` + pubkey + `' AND show != false` allQuery := query + " " + statusQuery + " " + orderQuery + " " + limitQuery @@ -796,7 +796,7 @@ func (db database) GetAssignedBounties(r *http.Request) ([]Bounty, error) { return ms, err } -func (db database) GetCreatedBounties(r *http.Request) ([]Bounty, error) { +func (db database) GetCreatedBounties(r *http.Request) ([]NewBounty, error) { offset, limit, sortBy, direction, _ := utils.GetPaginationParams(r) uuid := chi.URLParam(r, "uuid") person := db.GetPersonByUuid(uuid) @@ -838,7 +838,7 @@ func (db database) GetCreatedBounties(r *http.Request) ([]Bounty, error) { limitQuery = fmt.Sprintf("LIMIT %d OFFSET %d", limit, offset) } - ms := []Bounty{} + ms := []NewBounty{} query := `SELECT * FROM public.bounty WHERE owner_id = '` + pubkey + `'` allQuery := query + " " + statusQuery + " " + orderQuery + " " + limitQuery @@ -847,8 +847,8 @@ func (db database) GetCreatedBounties(r *http.Request) ([]Bounty, error) { return ms, err } -func (db database) GetBountyById(id string) ([]Bounty, error) { - ms := []Bounty{} +func (db database) GetBountyById(id string) ([]NewBounty, error) { + ms := []NewBounty{} err := db.db.Raw(`SELECT * FROM public.bounty WHERE id = '` + id + `'`).Find(&ms).Error return ms, err } @@ -1117,8 +1117,8 @@ func (db database) GetBountyIndexById(id string) int64 { return index } -func (db database) GetBountyDataByCreated(created string) ([]Bounty, error) { - ms := []Bounty{} +func (db database) GetBountyDataByCreated(created string) ([]NewBounty, error) { + ms := []NewBounty{} err := db.db.Raw(`SELECT * FROM public.bounty WHERE created = '` + created + `'`).Find(&ms).Error return ms, err } @@ -1128,7 +1128,7 @@ func (db database) AddBounty(b Bounty) (Bounty, error) { return b, nil } -func (db database) GetAllBounties(r *http.Request) []Bounty { +func (db database) GetAllBounties(r *http.Request) []NewBounty { keys := r.URL.Query() tags := keys.Get("tags") // this is a string of tags separated by commas offset, limit, sortBy, direction, search := utils.GetPaginationParams(r) @@ -1136,17 +1136,22 @@ func (db database) GetAllBounties(r *http.Request) []Bounty { assingned := keys.Get("Assigned") completed := keys.Get("Completed") paid := keys.Get("Paid") - orgUuid := keys.Get("workspace_uuid") + orgUuid := keys.Get("org_uuid") + workspaceUuid := keys.Get("workspace_uuid") languages := keys.Get("languages") languageArray := strings.Split(languages, ",") languageLength := len(languageArray) - ms := []Bounty{} + if workspaceUuid != "" && orgUuid != "" { + workspaceUuid = orgUuid + } + + ms := []NewBounty{} orderQuery := "" limitQuery := "" searchQuery := "" - orgQuery := "" + workspaceQuery := "" languageQuery := "" if sortBy != "" && direction != "" { @@ -1183,8 +1188,8 @@ func (db database) GetAllBounties(r *http.Request) []Bounty { statusQuery = "" } - if orgUuid != "" { - orgQuery = "AND workspace_uuid = '" + orgUuid + "'" + if workspaceUuid != "" { + workspaceQuery = "AND workspace_uuid = '" + workspaceUuid + "'" } if languageLength > 0 { langs := "" @@ -1202,7 +1207,7 @@ func (db database) GetAllBounties(r *http.Request) []Bounty { query := "SELECT * FROM public.bounty WHERE show != false" - allQuery := query + " " + statusQuery + " " + searchQuery + " " + orgQuery + " " + languageQuery + " " + orderQuery + " " + limitQuery + allQuery := query + " " + statusQuery + " " + searchQuery + " " + workspaceQuery + " " + languageQuery + " " + orderQuery + " " + limitQuery theQuery := db.db.Raw(allQuery) @@ -1219,9 +1224,9 @@ func (db database) GetAllBounties(r *http.Request) []Bounty { return ms } -func (db database) CreateOrEditBounty(b Bounty) (Bounty, error) { +func (db database) CreateOrEditBounty(b NewBounty) (NewBounty, error) { if b.OwnerID == "" { - return Bounty{}, errors.New("no pub key") + return NewBounty{}, errors.New("no pub key") } if db.db.Model(&b).Where("id = ? OR owner_id = ? AND created = ?", b.ID, b.OwnerID, b.Created).Updates(&b).RowsAffected == 0 { @@ -1230,14 +1235,14 @@ func (db database) CreateOrEditBounty(b Bounty) (Bounty, error) { return b, nil } -func (db database) UpdateBountyNullColumn(b Bounty, column string) Bounty { +func (db database) UpdateBountyNullColumn(b NewBounty, column string) NewBounty { columnMap := make(map[string]interface{}) columnMap[column] = "" db.db.Model(&b).Where("created = ?", b.Created).UpdateColumns(&columnMap) return b } -func (db database) UpdateBountyBoolColumn(b Bounty, column string) Bounty { +func (db database) UpdateBountyBoolColumn(b NewBounty, column string) NewBounty { columnMap := make(map[string]interface{}) columnMap[column] = false db.db.Model(&b).Select(column).UpdateColumns(columnMap) @@ -1250,24 +1255,24 @@ func (db database) DeleteBounty(pubkey string, created string) (Bounty, error) { return m, nil } -func (db database) GetBountyByCreated(created uint) (Bounty, error) { - b := Bounty{} +func (db database) GetBountyByCreated(created uint) (NewBounty, error) { + b := NewBounty{} err := db.db.Where("created", created).Find(&b).Error return b, err } -func (db database) GetBounty(id uint) Bounty { - b := Bounty{} +func (db database) GetBounty(id uint) NewBounty { + b := NewBounty{} db.db.Where("id", id).Find(&b) return b } -func (db database) UpdateBounty(b Bounty) (Bounty, error) { +func (db database) UpdateBounty(b NewBounty) (NewBounty, error) { db.db.Where("created", b.Created).Updates(&b) return b, nil } -func (db database) UpdateBountyPayment(b Bounty) (Bounty, error) { +func (db database) UpdateBountyPayment(b NewBounty) (NewBounty, error) { db.db.Model(&b).Where("created", b.Created).Updates(map[string]interface{}{ "paid": b.Paid, }) @@ -1275,7 +1280,7 @@ func (db database) UpdateBountyPayment(b Bounty) (Bounty, error) { return b, nil } -func (db database) UpdateBountyCompleted(b Bounty) (Bounty, error) { +func (db database) UpdateBountyCompleted(b NewBounty) (NewBounty, error) { db.db.Model(&b).Where("created", b.Created).Updates(map[string]interface{}{ "completed": b.Completed, }) @@ -1676,20 +1681,20 @@ func GetLeaderData(arr []LeaderData, key string) (int, int) { return found, index } -func (db database) GetInvoice(payment_request string) InvoiceList { - ms := InvoiceList{} +func (db database) GetInvoice(payment_request string) NewInvoiceList { + ms := NewInvoiceList{} db.db.Where("payment_request = ?", payment_request).Find(&ms) return ms } -func (db database) UpdateInvoice(payment_request string) InvoiceList { - ms := InvoiceList{} - db.db.Model(&InvoiceList{}).Where("payment_request = ?", payment_request).Update("status", true) +func (db database) UpdateInvoice(payment_request string) NewInvoiceList { + ms := NewInvoiceList{} + db.db.Model(&NewInvoiceList{}).Where("payment_request = ?", payment_request).Update("status", true) ms.Status = true return ms } -func (db database) AddInvoice(invoice InvoiceList) InvoiceList { +func (db database) AddInvoice(invoice NewInvoiceList) NewInvoiceList { db.db.Create(&invoice) return invoice } diff --git a/db/interface.go b/db/interface.go index c0cffb051..0a2371294 100644 --- a/db/interface.go +++ b/db/interface.go @@ -31,27 +31,27 @@ type Database interface { GetListedPosts(r *http.Request) ([]PeopleExtra, error) GetUserBountiesCount(personKey string, tabType string) int64 GetBountiesCount(r *http.Request) int64 - GetWorkspaceBounties(r *http.Request, workspace_uuid string) []Bounty + GetWorkspaceBounties(r *http.Request, workspace_uuid string) []NewBounty GetWorkspaceBountiesCount(r *http.Request, workspace_uuid string) int64 - GetAssignedBounties(r *http.Request) ([]Bounty, error) - GetCreatedBounties(r *http.Request) ([]Bounty, error) - GetBountyById(id string) ([]Bounty, error) + GetAssignedBounties(r *http.Request) ([]NewBounty, error) + GetCreatedBounties(r *http.Request) ([]NewBounty, error) + GetBountyById(id string) ([]NewBounty, error) GetNextBountyByCreated(r *http.Request) (uint, error) GetPreviousBountyByCreated(r *http.Request) (uint, error) GetNextWorkspaceBountyByCreated(r *http.Request) (uint, error) GetPreviousWorkspaceBountyByCreated(r *http.Request) (uint, error) GetBountyIndexById(id string) int64 - GetBountyDataByCreated(created string) ([]Bounty, error) + GetBountyDataByCreated(created string) ([]NewBounty, error) AddBounty(b Bounty) (Bounty, error) - GetAllBounties(r *http.Request) []Bounty - CreateOrEditBounty(b Bounty) (Bounty, error) - UpdateBountyNullColumn(b Bounty, column string) Bounty - UpdateBountyBoolColumn(b Bounty, column string) Bounty + GetAllBounties(r *http.Request) []NewBounty + CreateOrEditBounty(b NewBounty) (NewBounty, error) + UpdateBountyNullColumn(b NewBounty, column string) NewBounty + UpdateBountyBoolColumn(b NewBounty, column string) NewBounty DeleteBounty(pubkey string, created string) (Bounty, error) - GetBountyByCreated(created uint) (Bounty, error) - GetBounty(id uint) Bounty - UpdateBounty(b Bounty) (Bounty, error) - UpdateBountyPayment(b Bounty) (Bounty, error) + GetBountyByCreated(created uint) (NewBounty, error) + GetBounty(id uint) NewBounty + UpdateBounty(b NewBounty) (NewBounty, error) + UpdateBountyPayment(b NewBounty) (NewBounty, error) GetListedOffers(r *http.Request) ([]PeopleExtra, error) UpdateBot(uuid string, u map[string]interface{}) bool GetAllTribes() []Tribe @@ -99,21 +99,21 @@ type Database interface { GetUserCreatedWorkspaces(pubkey string) []Workspace GetUserAssignedWorkspaces(pubkey string) []WorkspaceUsers AddBudgetHistory(budget BudgetHistory) BudgetHistory - CreateWorkspaceBudget(budget BountyBudget) BountyBudget - UpdateWorkspaceBudget(budget BountyBudget) BountyBudget - GetPaymentHistoryByCreated(created *time.Time, workspace_uuid string) PaymentHistory - GetWorkspaceBudget(workspace_uuid string) BountyBudget + CreateWorkspaceBudget(budget NewBountyBudget) NewBountyBudget + UpdateWorkspaceBudget(budget NewBountyBudget) NewBountyBudget + GetPaymentHistoryByCreated(created *time.Time, workspace_uuid string) NewPaymentHistory + GetWorkspaceBudget(workspace_uuid string) NewBountyBudget GetWorkspaceStatusBudget(workspace_uuid string) StatusBudget GetWorkspaceBudgetHistory(workspace_uuid string) []BudgetHistoryData - AddAndUpdateBudget(invoice InvoiceList) PaymentHistory + AddAndUpdateBudget(invoice NewInvoiceList) NewPaymentHistory WithdrawBudget(sender_pubkey string, workspace_uuid string, amount uint) - AddPaymentHistory(payment PaymentHistory) PaymentHistory - GetPaymentHistory(workspace_uuid string, r *http.Request) []PaymentHistory - GetInvoice(payment_request string) InvoiceList - GetWorkspaceInvoices(workspace_uuid string) []InvoiceList + AddPaymentHistory(payment NewPaymentHistory) NewPaymentHistory + GetPaymentHistory(workspace_uuid string, r *http.Request) []NewPaymentHistory + GetInvoice(payment_request string) NewInvoiceList + GetWorkspaceInvoices(workspace_uuid string) []NewInvoiceList GetWorkspaceInvoicesCount(workspace_uuid string) int64 - UpdateInvoice(payment_request string) InvoiceList - AddInvoice(invoice InvoiceList) InvoiceList + UpdateInvoice(payment_request string) NewInvoiceList + AddInvoice(invoice NewInvoiceList) NewInvoiceList AddUserInvoiceData(userData UserInvoiceData) UserInvoiceData GetUserInvoiceData(payment_request string) UserInvoiceData DeleteUserInvoiceData(payment_request string) UserInvoiceData diff --git a/db/structs.go b/db/structs.go index 679266739..7a34d2520 100644 --- a/db/structs.go +++ b/db/structs.go @@ -389,6 +389,41 @@ type Bounty struct { CodingLanguages pq.StringArray `gorm:"type:text[];not null default:'[]'" json:"coding_languages"` } +// Todo: Change back to Bounty +type NewBounty struct { + ID uint `json:"id"` + OwnerID string `json:"owner_id"` + Paid bool `json:"paid"` + Show bool `gorm:"default:false" json:"show"` + Completed bool `gorm:"default:false" json:"completed"` + Type string `json:"type"` + Award string `json:"award"` + AssignedHours uint8 `json:"assigned_hours"` + BountyExpires string `json:"bounty_expires"` + CommitmentFee uint64 `json:"commitment_fee"` + Price uint `json:"price"` + Title string `json:"title"` + Tribe string `json:"tribe"` + Assignee string `json:"assignee"` + TicketUrl string `json:"ticket_url"` + OrgUuid string `gorm:"-" json:"org_uuid"` + WorkspaceUuid string `json:"workspace_uuid"` + Description string `json:"description"` + WantedType string `json:"wanted_type"` + Deliverables string `json:"deliverables"` + GithubDescription bool `json:"github_description"` + OneSentenceSummary string `json:"one_sentence_summary"` + EstimatedSessionLength string `json:"estimated_session_length"` + EstimatedCompletionDate string `json:"estimated_completion_date"` + Created int64 `json:"created"` + Updated *time.Time `json:"updated"` + AssignedDate *time.Time `json:"assigned_date,omitempty"` + CompletionDate *time.Time `json:"completion_date,omitempty"` + MarkAsPaidDate *time.Time `json:"mark_as_paid_date,omitempty"` + PaidDate *time.Time `json:"paid_date,omitempty"` + CodingLanguages pq.StringArray `gorm:"type:text[];not null default:'[]'" json:"coding_languages"` +} + type BountyOwners struct { OwnerID string `json:"owner_id"` } @@ -429,7 +464,7 @@ type BountyData struct { } type BountyResponse struct { - Bounty Bounty `json:"bounty"` + Bounty NewBounty `json:"bounty"` Assignee Person `json:"assignee"` Owner Person `json:"owner"` Organization WorkspaceShort `json:"organization"` @@ -493,13 +528,15 @@ type OrganizationUsers struct { type WorkspaceUsers struct { ID uint `json:"id"` OwnerPubKey string `json:"owner_pubkey"` - WorkspaceUuid string `json:"workspace_uuid"` + OrgUuid string `gorm:"-" json:"org_uuid"` + WorkspaceUuid string `json:"workspace_uuid,omitempty"` Created *time.Time `json:"created"` Updated *time.Time `json:"updated"` } type WorkspaceUsersData struct { - WorkspaceUuid string `json:"workspace_uuid"` + OrgUuid string `gorm:"-" json:"org_uuid"` + WorkspaceUuid string `json:"workspace_uuid,omitempty"` UserCreated *time.Time `json:"user_created"` Person } @@ -519,20 +556,33 @@ type UserRoles struct { type WorkspaceUserRoles struct { Role string `json:"role"` OwnerPubKey string `json:"owner_pubkey"` - WorkspaceUuid string `json:"workspace_uuid"` + OrgUuid string `gorm:"-" json:"org_uuid"` + WorkspaceUuid string `json:"workspace_uuid,omitempty"` Created *time.Time `json:"created"` } type BountyBudget struct { - ID uint `json:"id"` - OrgUuid string `json:"org_uuid"` - TotalBudget uint `json:"total_budget"` - Created *time.Time `json:"created"` - Updated *time.Time `json:"updated"` + ID uint `json:"id"` + OrgUuid string `json:"org_uuid"` + WorkspaceUuid string `gorm:"-" json:"workspace_uuid,omitempty"` + TotalBudget uint `json:"total_budget"` + Created *time.Time `json:"created"` + Updated *time.Time `json:"updated"` +} + +// Rename back to BountyBudget +type NewBountyBudget struct { + ID uint `json:"id"` + OrgUuid string `gorm:"-" json:"org_uuid"` + WorkspaceUuid string `json:"workspace_uuid"` + TotalBudget uint `json:"total_budget"` + Created *time.Time `json:"created"` + Updated *time.Time `json:"updated"` } type StatusBudget struct { OrgUuid string `json:"org_uuid"` + WorkspaceUuid string `json:"workspace_uuid"` CurrentBudget uint `json:"current_budget"` OpenBudget uint `json:"open_budget"` OpenCount int64 `json:"open_count"` @@ -545,7 +595,8 @@ type StatusBudget struct { type BudgetInvoiceRequest struct { Amount uint `json:"amount"` SenderPubKey string `json:"sender_pubkey"` - OrgUuid string `json:"org_uuid"` + OrgUuid string `json:"org_uuid,omitempty"` + WorkspaceUuid string `json:"workspace_uuid,omitempty"` PaymentType PaymentType `json:"payment_type,omitempty"` Websocket_token string `json:"websocket_token,omitempty"` } @@ -596,12 +647,26 @@ type PaymentHistory struct { Status bool `json:"status"` } +type NewPaymentHistory struct { + ID uint `json:"id"` + Amount uint `json:"amount"` + BountyId uint `json:"bounty_id"` + PaymentType PaymentType `json:"payment_type"` + OrgUuid string `gorm:"-" json:"org_uuid"` + WorkspaceUuid string `json:"workspace_uuid,omitempty"` + SenderPubKey string `json:"sender_pubkey"` + ReceiverPubKey string `json:"receiver_pubkey"` + Created *time.Time `json:"created"` + Updated *time.Time `json:"updated"` + Status bool `json:"status"` +} + type PaymentHistoryData struct { - PaymentHistory - SenderName string `json:"sender_name"` - ReceiverName string `json:"receiver_name"` - SenderImg string `json:"sender_img"` - ReceiverImg string `json:"receiver_img"` + PaymentHistory NewPaymentHistory + SenderName string `json:"sender_name"` + ReceiverName string `json:"receiver_name"` + SenderImg string `json:"sender_img"` + ReceiverImg string `json:"receiver_img"` } type PaymentData struct { @@ -640,6 +705,19 @@ type InvoiceList struct { Updated *time.Time `json:"updated"` } +// Todo: Rename back to InvoiceList +type NewInvoiceList struct { + ID uint `json:"id"` + PaymentRequest string `json:"payment_request"` + Status bool `json:"status"` + Type InvoiceType `json:"type"` + OwnerPubkey string `json:"owner_pubkey"` + OrgUuid string `gorm:"-" json:"org_uuid"` + WorkspaceUuid string `json:"workspace_uuid"` + Created *time.Time `json:"created"` + Updated *time.Time `json:"updated"` +} + type UserInvoiceData struct { ID uint `json:"id"` Amount uint `json:"amount"` @@ -750,6 +828,22 @@ func (Bounty) TableName() string { return "bounty" } +func (NewBounty) TableName() string { + return "bounty" +} + +func (NewBountyBudget) TableName() string { + return "bounty_budgets" +} + +func (NewInvoiceList) TableName() string { + return "invoice_lists" +} + +func (NewPaymentHistory) TableName() string { + return "payment_histories" +} + func (ConnectionCodes) TableName() string { return "connectioncodes" } diff --git a/db/workspaces.go b/db/workspaces.go index 0619b38cc..d1e77b596 100644 --- a/db/workspaces.go +++ b/db/workspaces.go @@ -127,26 +127,26 @@ func (db database) AddBudgetHistory(budget BudgetHistory) BudgetHistory { return budget } -func (db database) CreateWorkspaceBudget(budget BountyBudget) BountyBudget { +func (db database) CreateWorkspaceBudget(budget NewBountyBudget) NewBountyBudget { db.db.Create(&budget) return budget } -func (db database) UpdateWorkspaceBudget(budget BountyBudget) BountyBudget { - db.db.Model(&BountyBudget{}).Where("workspace_uuid = ?", budget.OrgUuid).Updates(map[string]interface{}{ +func (db database) UpdateWorkspaceBudget(budget NewBountyBudget) NewBountyBudget { + db.db.Model(&NewBountyBudget{}).Where("workspace_uuid = ?", budget.OrgUuid).Updates(map[string]interface{}{ "total_budget": budget.TotalBudget, }) return budget } -func (db database) GetPaymentHistoryByCreated(created *time.Time, workspace_uuid string) PaymentHistory { - ms := PaymentHistory{} +func (db database) GetPaymentHistoryByCreated(created *time.Time, workspace_uuid string) NewPaymentHistory { + ms := NewPaymentHistory{} db.db.Where("created = ?", created).Where("workspace_uuid = ? ", workspace_uuid).Find(&ms) return ms } -func (db database) GetWorkspaceBudget(workspace_uuid string) BountyBudget { - ms := BountyBudget{} +func (db database) GetWorkspaceBudget(workspace_uuid string) NewBountyBudget { + ms := NewBountyBudget{} db.db.Where("workspace_uuid = ?", workspace_uuid).Find(&ms) return ms @@ -176,6 +176,7 @@ func (db database) GetWorkspaceStatusBudget(workspace_uuid string) StatusBudget statusBudget := StatusBudget{ OrgUuid: workspace_uuid, + WorkspaceUuid: workspace_uuid, CurrentBudget: orgBudget.TotalBudget, OpenBudget: openBudget, OpenCount: openCount, @@ -195,13 +196,13 @@ func (db database) GetWorkspaceBudgetHistory(workspace_uuid string) []BudgetHist return budgetHistory } -func (db database) AddAndUpdateBudget(invoice InvoiceList) PaymentHistory { +func (db database) AddAndUpdateBudget(invoice NewInvoiceList) NewPaymentHistory { created := invoice.Created - workspace_uuid := invoice.OrgUuid + workspace_uuid := invoice.WorkspaceUuid paymentHistory := db.GetPaymentHistoryByCreated(created, workspace_uuid) - if paymentHistory.OrgUuid != "" && paymentHistory.Amount != 0 { + if paymentHistory.WorkspaceUuid != "" && paymentHistory.Amount != 0 { paymentHistory.Status = true db.db.Where("created = ?", created).Where("workspace_uuid = ? ", workspace_uuid).Updates(paymentHistory) @@ -210,11 +211,11 @@ func (db database) AddAndUpdateBudget(invoice InvoiceList) PaymentHistory { if WorkspaceBudget.OrgUuid == "" { now := time.Now() - orgBudget := BountyBudget{ - OrgUuid: workspace_uuid, - TotalBudget: paymentHistory.Amount, - Created: &now, - Updated: &now, + orgBudget := NewBountyBudget{ + WorkspaceUuid: workspace_uuid, + TotalBudget: paymentHistory.Amount, + Created: &now, + Updated: &now, } db.CreateWorkspaceBudget(orgBudget) } else { @@ -233,14 +234,14 @@ func (db database) WithdrawBudget(sender_pubkey string, workspace_uuid string, a totalBudget := WorkspaceBudget.TotalBudget newBudget := totalBudget - amount - db.db.Model(&BountyBudget{}).Where("workspace_uuid = ?", workspace_uuid).Updates(map[string]interface{}{ + db.db.Model(&NewBountyBudget{}).Where("workspace_uuid = ?", workspace_uuid).Updates(map[string]interface{}{ "total_budget": newBudget, }) now := time.Now() - budgetHistory := PaymentHistory{ - OrgUuid: workspace_uuid, + budgetHistory := NewPaymentHistory{ + WorkspaceUuid: workspace_uuid, Amount: amount, Status: true, PaymentType: "withdraw", @@ -253,7 +254,7 @@ func (db database) WithdrawBudget(sender_pubkey string, workspace_uuid string, a db.AddPaymentHistory(budgetHistory) } -func (db database) AddPaymentHistory(payment PaymentHistory) PaymentHistory { +func (db database) AddPaymentHistory(payment NewPaymentHistory) NewPaymentHistory { db.db.Create(&payment) // get Workspace budget and subtract payment from total budget @@ -270,8 +271,8 @@ func (db database) AddPaymentHistory(payment PaymentHistory) PaymentHistory { return payment } -func (db database) GetPaymentHistory(workspace_uuid string, r *http.Request) []PaymentHistory { - payment := []PaymentHistory{} +func (db database) GetPaymentHistory(workspace_uuid string, r *http.Request) []NewPaymentHistory { + payment := []NewPaymentHistory{} offset, limit, _, _, _ := utils.GetPaginationParams(r) limitQuery := "" @@ -284,15 +285,15 @@ func (db database) GetPaymentHistory(workspace_uuid string, r *http.Request) []P return payment } -func (db database) GetWorkspaceInvoices(workspace_uuid string) []InvoiceList { - ms := []InvoiceList{} +func (db database) GetWorkspaceInvoices(workspace_uuid string) []NewInvoiceList { + ms := []NewInvoiceList{} db.db.Where("workspace_uuid = ?", workspace_uuid).Where("status", false).Find(&ms) return ms } func (db database) GetWorkspaceInvoicesCount(workspace_uuid string) int64 { var count int64 - ms := InvoiceList{} + ms := NewInvoiceList{} db.db.Model(&ms).Where("workspace_uuid = ?", workspace_uuid).Where("status", false).Count(&count) return count diff --git a/handlers/bounty.go b/handlers/bounty.go index 8115f5f3b..7306b3a01 100644 --- a/handlers/bounty.go +++ b/handlers/bounty.go @@ -23,7 +23,7 @@ type bountyHandler struct { httpClient HttpClient db db.Database getSocketConnections func(host string) (db.Client, error) - generateBountyResponse func(bounties []db.Bounty) []db.BountyResponse + generateBountyResponse func(bounties []db.NewBounty) []db.BountyResponse userHasAccess func(pubKeyFromAuth string, uuid string, role string) bool userHasManageBountyRoles func(pubKeyFromAuth string, uuid string) bool } @@ -182,7 +182,7 @@ func (h *bountyHandler) CreateOrEditBounty(w http.ResponseWriter, r *http.Reques ctx := r.Context() pubKeyFromAuth, _ := ctx.Value(auth.ContextKey).(string) - bounty := db.Bounty{} + bounty := db.NewBounty{} body, err := io.ReadAll(r.Body) r.Body.Close() @@ -195,6 +195,10 @@ func (h *bountyHandler) CreateOrEditBounty(w http.ResponseWriter, r *http.Reques now := time.Now() + if bounty.WorkspaceUuid == "" && bounty.OrgUuid != "" { + bounty.WorkspaceUuid = bounty.OrgUuid + } + //Check if bounty exists bounty.Updated = &now @@ -244,8 +248,8 @@ func (h *bountyHandler) CreateOrEditBounty(w http.ResponseWriter, r *http.Reques // trying to update // check if bounty belongs to user if pubKeyFromAuth != dbBounty.OwnerID { - if bounty.OrgUuid != "" { - hasBountyRoles := h.userHasManageBountyRoles(pubKeyFromAuth, bounty.OrgUuid) + if bounty.WorkspaceUuid != "" { + hasBountyRoles := h.userHasManageBountyRoles(pubKeyFromAuth, bounty.WorkspaceUuid) if !hasBountyRoles { msg := "You don't have a=the right permission ton update bounty" fmt.Println(msg) @@ -351,7 +355,7 @@ func UpdateCompletedStatus(w http.ResponseWriter, r *http.Request) { json.NewEncoder(w).Encode(bounty) } -func (h *bountyHandler) GenerateBountyResponse(bounties []db.Bounty) []db.BountyResponse { +func (h *bountyHandler) GenerateBountyResponse(bounties []db.NewBounty) []db.BountyResponse { var bountyResponse []db.BountyResponse for i := 0; i < len(bounties); i++ { @@ -359,10 +363,10 @@ func (h *bountyHandler) GenerateBountyResponse(bounties []db.Bounty) []db.Bounty owner := h.db.GetPersonByPubkey(bounty.OwnerID) assignee := h.db.GetPersonByPubkey(bounty.Assignee) - workspace := h.db.GetWorkspaceByUuid(bounty.OrgUuid) + workspace := h.db.GetWorkspaceByUuid(bounty.WorkspaceUuid) b := db.BountyResponse{ - Bounty: db.Bounty{ + Bounty: db.NewBounty{ ID: bounty.ID, OwnerID: bounty.OwnerID, Paid: bounty.Paid, @@ -385,7 +389,8 @@ func (h *bountyHandler) GenerateBountyResponse(bounties []db.Bounty) []db.Bounty OneSentenceSummary: bounty.OneSentenceSummary, EstimatedSessionLength: bounty.EstimatedSessionLength, EstimatedCompletionDate: bounty.EstimatedCompletionDate, - OrgUuid: bounty.OrgUuid, + OrgUuid: bounty.WorkspaceUuid, + WorkspaceUuid: bounty.WorkspaceUuid, Updated: bounty.Updated, CodingLanguages: bounty.CodingLanguages, Completed: bounty.Completed, @@ -465,6 +470,10 @@ func (h *bountyHandler) MakeBountyPayment(w http.ResponseWriter, r *http.Request bounty := h.db.GetBounty(id) amount := bounty.Price + if bounty.WorkspaceUuid == "" && bounty.OrgUuid != "" { + bounty.WorkspaceUuid = bounty.OrgUuid + } + if bounty.ID != id { w.WriteHeader(http.StatusNotFound) return @@ -479,7 +488,7 @@ func (h *bountyHandler) MakeBountyPayment(w http.ResponseWriter, r *http.Request // check if user is the admin of the workspace // or has a pay bounty role - hasRole := h.userHasAccess(pubKeyFromAuth, bounty.OrgUuid, db.PayBounty) + hasRole := h.userHasAccess(pubKeyFromAuth, bounty.WorkspaceUuid, db.PayBounty) if !hasRole { w.WriteHeader(http.StatusUnauthorized) json.NewEncoder(w).Encode("You don't have appropriate permissions to pay bounties") @@ -488,7 +497,7 @@ func (h *bountyHandler) MakeBountyPayment(w http.ResponseWriter, r *http.Request // check if the workspace bounty balance // is greater than the amount - orgBudget := h.db.GetWorkspaceBudget(bounty.OrgUuid) + orgBudget := h.db.GetWorkspaceBudget(bounty.WorkspaceUuid) if orgBudget.TotalBudget < amount { w.WriteHeader(http.StatusForbidden) json.NewEncoder(w).Encode("workspace budget is not enough to pay the amount") @@ -535,11 +544,11 @@ func (h *bountyHandler) MakeBountyPayment(w http.ResponseWriter, r *http.Request err = json.Unmarshal(body, &keysendRes) now := time.Now() - paymentHistory := db.PaymentHistory{ + paymentHistory := db.NewPaymentHistory{ Amount: amount, SenderPubKey: pubKeyFromAuth, ReceiverPubKey: assignee.OwnerPubKey, - OrgUuid: bounty.OrgUuid, + WorkspaceUuid: bounty.WorkspaceUuid, BountyId: id, Created: &now, Updated: &now, @@ -591,6 +600,8 @@ func (h *bountyHandler) BountyBudgetWithdraw(w http.ResponseWriter, r *http.Requ body, err := io.ReadAll(r.Body) r.Body.Close() + fmt.Println("WithdraW Request ===", request) + err = json.Unmarshal(body, &request) if err != nil { w.WriteHeader(http.StatusNotAcceptable) diff --git a/handlers/bounty_test.go b/handlers/bounty_test.go index f5ca869db..fb0750a20 100644 --- a/handlers/bounty_test.go +++ b/handlers/bounty_test.go @@ -106,15 +106,15 @@ func TestCreateOrEditBounty(t *testing.T) { rr := httptest.NewRecorder() handler := http.HandlerFunc(bHandler.CreateOrEditBounty) - existingBounty := db.Bounty{ - ID: 1, - Type: "coding", - Title: "first bounty", - Description: "first bounty description", - OrgUuid: "org-1", - Assignee: "user1", - } - mockDb.On("UpdateBountyBoolColumn", mock.AnythingOfType("db.Bounty"), "show").Return(existingBounty) + existingBounty := db.NewBounty{ + ID: 1, + Type: "coding", + Title: "first bounty", + Description: "first bounty description", + WorkspaceUuid: "work-1", + Assignee: "user1", + } + mockDb.On("UpdateBountyBoolColumn", mock.AnythingOfType("db.NewBounty"), "show").Return(existingBounty) mockDb.On("GetBounty", uint(1)).Return(existingBounty).Once() body := []byte(`{"id": 1, "type": "bounty_type", "title": "first bounty", "description": "my first bounty", "tribe": "random-value", "assignee": "john-doe", "owner_id": "second-user"}`) @@ -135,18 +135,18 @@ func TestCreateOrEditBounty(t *testing.T) { handler := http.HandlerFunc(bHandler.CreateOrEditBounty) bHandler.userHasManageBountyRoles = mockUserHasManageBountyRolesFalse - existingBounty := db.Bounty{ - ID: 1, - Type: "coding", - Title: "first bounty", - Description: "first bounty description", - OrgUuid: "org-1", - OwnerID: "second-user", + existingBounty := db.NewBounty{ + ID: 1, + Type: "coding", + Title: "first bounty", + Description: "first bounty description", + WorkspaceUuid: "work-1", + OwnerID: "second-user", } updatedBounty := existingBounty updatedBounty.Title = "first bounty updated" - mockDb.On("UpdateBountyBoolColumn", mock.AnythingOfType("db.Bounty"), "show").Return(existingBounty) - mockDb.On("UpdateBountyNullColumn", mock.AnythingOfType("db.Bounty"), "assignee").Return(existingBounty) + mockDb.On("UpdateBountyBoolColumn", mock.AnythingOfType("db.NewBounty"), "show").Return(existingBounty) + mockDb.On("UpdateBountyNullColumn", mock.AnythingOfType("db.NewBounty"), "assignee").Return(existingBounty) mockDb.On("GetBounty", uint(1)).Return(existingBounty).Once() body, _ := json.Marshal(updatedBounty) @@ -165,20 +165,20 @@ func TestCreateOrEditBounty(t *testing.T) { handler := http.HandlerFunc(bHandler.CreateOrEditBounty) bHandler.userHasManageBountyRoles = mockUserHasManageBountyRolesTrue - existingBounty := db.Bounty{ - ID: 1, - Type: "coding", - Title: "first bounty", - Description: "first bounty description", - OrgUuid: "org-1", - OwnerID: "second-user", + existingBounty := db.NewBounty{ + ID: 1, + Type: "coding", + Title: "first bounty", + Description: "first bounty description", + WorkspaceUuid: "work-1", + OwnerID: "second-user", } updatedBounty := existingBounty updatedBounty.Title = "first bounty updated" - mockDb.On("UpdateBountyBoolColumn", mock.AnythingOfType("db.Bounty"), "show").Return(existingBounty) - mockDb.On("UpdateBountyNullColumn", mock.AnythingOfType("db.Bounty"), "assignee").Return(existingBounty) + mockDb.On("UpdateBountyBoolColumn", mock.AnythingOfType("db.NewBounty"), "show").Return(existingBounty) + mockDb.On("UpdateBountyNullColumn", mock.AnythingOfType("db.NewBounty"), "assignee").Return(existingBounty) mockDb.On("GetBounty", uint(1)).Return(existingBounty).Once() - mockDb.On("CreateOrEditBounty", mock.AnythingOfType("db.Bounty")).Return(updatedBounty, nil).Once() + mockDb.On("CreateOrEditBounty", mock.AnythingOfType("db.NewBounty")).Return(updatedBounty, nil).Once() body, _ := json.Marshal(updatedBounty) req, err := http.NewRequestWithContext(ctx, http.MethodPost, "/", bytes.NewReader(body)) @@ -198,21 +198,21 @@ func TestCreateOrEditBounty(t *testing.T) { bHandler.userHasManageBountyRoles = mockUserHasManageBountyRolesTrue now := time.Now().UnixMilli() - existingBounty := db.Bounty{ - ID: 1, - Type: "coding", - Title: "first bounty", - Description: "first bounty description", - OrgUuid: "org-1", - OwnerID: "second-user", - Created: now, + existingBounty := db.NewBounty{ + ID: 1, + Type: "coding", + Title: "first bounty", + Description: "first bounty description", + WorkspaceUuid: "work-1", + OwnerID: "second-user", + Created: now, } updatedBounty := existingBounty updatedBounty.Title = "first bounty updated" - mockDb.On("UpdateBountyBoolColumn", mock.AnythingOfType("db.Bounty"), "show").Return(existingBounty) - mockDb.On("UpdateBountyNullColumn", mock.AnythingOfType("db.Bounty"), "assignee").Return(existingBounty) + mockDb.On("UpdateBountyBoolColumn", mock.AnythingOfType("db.NewBounty"), "show").Return(existingBounty) + mockDb.On("UpdateBountyNullColumn", mock.AnythingOfType("db.NewBounty"), "assignee").Return(existingBounty) mockDb.On("GetBounty", uint(1)).Return(existingBounty).Once() - mockDb.On("CreateOrEditBounty", mock.MatchedBy(func(b db.Bounty) bool { + mockDb.On("CreateOrEditBounty", mock.MatchedBy(func(b db.NewBounty) bool { return b.Created == now })).Return(updatedBounty, nil).Once() @@ -231,15 +231,15 @@ func TestCreateOrEditBounty(t *testing.T) { t.Run("should return error if failed to add new bounty", func(t *testing.T) { rr := httptest.NewRecorder() handler := http.HandlerFunc(bHandler.CreateOrEditBounty) - newBounty := db.Bounty{ - Type: "coding", - Title: "first bounty", - Description: "first bounty description", - OrgUuid: "org-1", - OwnerID: "test-key", + newBounty := db.NewBounty{ + Type: "coding", + Title: "first bounty", + Description: "first bounty description", + WorkspaceUuid: "org-1", + OwnerID: "test-key", } - mockDb.On("UpdateBountyNullColumn", mock.AnythingOfType("db.Bounty"), "assignee").Return(db.Bounty{Assignee: "test-key"}) - mockDb.On("CreateOrEditBounty", mock.AnythingOfType("db.Bounty")).Return(db.Bounty{}, errors.New("failed to add")).Once() + mockDb.On("UpdateBountyNullColumn", mock.AnythingOfType("db.NewBounty"), "assignee").Return(db.NewBounty{Assignee: "test-key"}) + mockDb.On("CreateOrEditBounty", mock.AnythingOfType("db.NewBounty")).Return(db.NewBounty{}, errors.New("failed to add")).Once() body, _ := json.Marshal(newBounty) req, err := http.NewRequestWithContext(ctx, http.MethodPost, "/", bytes.NewReader(body)) @@ -256,15 +256,15 @@ func TestCreateOrEditBounty(t *testing.T) { t.Run("add bounty if not present", func(t *testing.T) { rr := httptest.NewRecorder() handler := http.HandlerFunc(bHandler.CreateOrEditBounty) - newBounty := db.Bounty{ - Type: "coding", - Title: "first bounty", - Description: "first bounty description", - OrgUuid: "org-1", - OwnerID: "test-key", + newBounty := db.NewBounty{ + Type: "coding", + Title: "first bounty", + Description: "first bounty description", + WorkspaceUuid: "work-1", + OwnerID: "test-key", } - mockDb.On("UpdateBountyNullColumn", mock.AnythingOfType("db.Bounty"), "assignee").Return(db.Bounty{Assignee: "test-key"}) - mockDb.On("CreateOrEditBounty", mock.AnythingOfType("db.Bounty")).Return(newBounty, nil).Once() + mockDb.On("UpdateBountyNullColumn", mock.AnythingOfType("db.NewBounty"), "assignee").Return(db.Bounty{Assignee: "test-key"}) + mockDb.On("CreateOrEditBounty", mock.AnythingOfType("db.NewBounty")).Return(newBounty, nil).Once() body, _ := json.Marshal(newBounty) req, err := http.NewRequestWithContext(ctx, http.MethodPost, "/", bytes.NewReader(body)) @@ -493,7 +493,7 @@ func TestGetBountyByCreated(t *testing.T) { bHandler := NewBountyHandler(mockHttpClient, mockDb) t.Run("Should return bounty by its created value", func(t *testing.T) { - mockGenerateBountyResponse := func(bounties []db.Bounty) []db.BountyResponse { + mockGenerateBountyResponse := func(bounties []db.NewBounty) []db.BountyResponse { var bountyResponses []db.BountyResponse for _, bounty := range bounties { @@ -523,25 +523,26 @@ func TestGetBountyByCreated(t *testing.T) { rr := httptest.NewRecorder() handler := http.HandlerFunc(bHandler.GetBountyByCreated) - bounty := db.Bounty{ - ID: 1, - Type: "coding", - Title: "first bounty", - Description: "first bounty description", - OrgUuid: "org-1", - Assignee: "user1", - Created: 1707991475, - OwnerID: "owner-1", + bounty := db.NewBounty{ + ID: 1, + Type: "coding", + Title: "first bounty", + Description: "first bounty description", + OrgUuid: "org-1", + WorkspaceUuid: "work-1", + Assignee: "user1", + Created: 1707991475, + OwnerID: "owner-1", } createdStr := strconv.FormatInt(bounty.Created, 10) rctx := chi.NewRouteContext() rctx.URLParams.Add("created", "1707991475") req, _ := http.NewRequestWithContext(context.WithValue(context.Background(), chi.RouteCtxKey, rctx), http.MethodGet, "/created/1707991475", nil) - mockDb.On("GetBountyDataByCreated", createdStr).Return([]db.Bounty{bounty}, nil).Once() + mockDb.On("GetBountyDataByCreated", createdStr).Return([]db.NewBounty{bounty}, nil).Once() mockDb.On("GetPersonByPubkey", "owner-1").Return(db.Person{}).Once() mockDb.On("GetPersonByPubkey", "user1").Return(db.Person{}).Once() - mockDb.On("GetWorkspaceByUuid", "org-1").Return(db.Workspace{}).Once() + mockDb.On("GetWorkspaceByUuid", "work-1").Return(db.Workspace{}).Once() handler.ServeHTTP(rr, req) var returnedBounty []db.BountyResponse @@ -560,7 +561,7 @@ func TestGetBountyByCreated(t *testing.T) { rctx.URLParams.Add("created", createdStr) req, _ := http.NewRequestWithContext(context.WithValue(context.Background(), chi.RouteCtxKey, rctx), http.MethodGet, "/created/"+createdStr, nil) - mockDb.On("GetBountyDataByCreated", createdStr).Return([]db.Bounty{}, nil).Once() + mockDb.On("GetBountyDataByCreated", createdStr).Return([]db.NewBounty{}, nil).Once() handler.ServeHTTP(rr, req) assert.Equal(t, http.StatusNotFound, rr.Code, "Expected 404 Not Found for nonexistent bounty") @@ -577,15 +578,16 @@ func TestGetPersonAssignedBounties(t *testing.T) { t.Run("Should successfull Get Person Assigned Bounties", func(t *testing.T) { rr := httptest.NewRecorder() handler := http.HandlerFunc(bHandler.GetPersonAssignedBounties) - bounty := db.Bounty{ - ID: 1, - Type: "coding", - Title: "first bounty", - Description: "first bounty description", - OrgUuid: "org-1", - Assignee: "user1", - Created: 1707991475, - OwnerID: "owner-1", + bounty := db.NewBounty{ + ID: 1, + Type: "coding", + Title: "first bounty", + Description: "first bounty description", + OrgUuid: "org-1", + WorkspaceUuid: "work-1", + Assignee: "user1", + Created: 1707991475, + OwnerID: "owner-1", } rctx := chi.NewRouteContext() @@ -596,10 +598,10 @@ func TestGetPersonAssignedBounties(t *testing.T) { rctx.URLParams.Add("search", "") req, _ := http.NewRequestWithContext(context.WithValue(context.Background(), chi.RouteCtxKey, rctx), http.MethodGet, "/people/wanteds/assigned/clu80datu2rjujsmim40?sortBy=paid&page=1&limit=20&search=", nil) - mockDb.On("GetAssignedBounties", req).Return([]db.Bounty{bounty}, nil).Once() + mockDb.On("GetAssignedBounties", req).Return([]db.NewBounty{bounty}, nil).Once() mockDb.On("GetPersonByPubkey", "owner-1").Return(db.Person{}, nil).Once() mockDb.On("GetPersonByPubkey", "user1").Return(db.Person{}, nil).Once() - mockDb.On("GetWorkspaceByUuid", "org-1").Return(db.Workspace{}, nil).Once() + mockDb.On("GetWorkspaceByUuid", "work-1").Return(db.Workspace{}, nil).Once() handler.ServeHTTP(rr, req) var returnedBounty []db.BountyResponse @@ -617,7 +619,7 @@ func TestGetPersonCreatedBounties(t *testing.T) { bHandler := NewBountyHandler(mockHttpClient, mockDb) t.Run("should return bounties created by the user", func(t *testing.T) { - mockGenerateBountyResponse := func(bounties []db.Bounty) []db.BountyResponse { + mockGenerateBountyResponse := func(bounties []db.NewBounty) []db.BountyResponse { var bountyResponses []db.BountyResponse for _, bounty := range bounties { @@ -645,7 +647,7 @@ func TestGetPersonCreatedBounties(t *testing.T) { } bHandler.generateBountyResponse = mockGenerateBountyResponse - expectedBounties := []db.Bounty{ + expectedBounties := []db.NewBounty{ {ID: 1, OwnerID: "user1"}, {ID: 2, OwnerID: "user1"}, } @@ -680,12 +682,12 @@ func TestGetPersonCreatedBounties(t *testing.T) { }) t.Run("should not return bounties created by other users", func(t *testing.T) { - mockGenerateBountyResponse := func(bounties []db.Bounty) []db.BountyResponse { + mockGenerateBountyResponse := func(bounties []db.NewBounty) []db.BountyResponse { return []db.BountyResponse{} } bHandler.generateBountyResponse = mockGenerateBountyResponse - mockDb.On("GetCreatedBounties", mock.Anything).Return([]db.Bounty{}, nil).Once() + mockDb.On("GetCreatedBounties", mock.Anything).Return([]db.NewBounty{}, nil).Once() rr := httptest.NewRecorder() req, err := http.NewRequest("GET", "/people/wanteds/created/uuid", nil) @@ -709,7 +711,7 @@ func TestGetPersonCreatedBounties(t *testing.T) { }) t.Run("should filter bounties by status and apply pagination", func(t *testing.T) { - mockGenerateBountyResponse := func(bounties []db.Bounty) []db.BountyResponse { + mockGenerateBountyResponse := func(bounties []db.NewBounty) []db.BountyResponse { var bountyResponses []db.BountyResponse for _, bounty := range bounties { @@ -737,7 +739,7 @@ func TestGetPersonCreatedBounties(t *testing.T) { } bHandler.generateBountyResponse = mockGenerateBountyResponse - expectedBounties := []db.Bounty{ + expectedBounties := []db.NewBounty{ {ID: 1, OwnerID: "user1", Assignee: "assignee1"}, {ID: 2, OwnerID: "user1", Assignee: "assignee2", Paid: true}, {ID: 3, OwnerID: "user1", Assignee: "", Paid: true}, @@ -862,7 +864,7 @@ func TestGetBountyById(t *testing.T) { rr := httptest.NewRecorder() handler := http.HandlerFunc(bHandler.GetBountyById) - bounty := db.Bounty{ + bounty := db.NewBounty{ ID: 1, OwnerID: "owner123", Paid: false, @@ -877,7 +879,7 @@ func TestGetBountyById(t *testing.T) { Tribe: "development", Assignee: "user1", TicketUrl: "http://example.com/issues/1", - OrgUuid: "org-789", + WorkspaceUuid: "work-789", Description: "This bounty is for fixing a critical bug in the payment system that causes transactions to fail under certain conditions.", WantedType: "immediate", Deliverables: "A pull request with a fix, including tests", @@ -899,7 +901,7 @@ func TestGetBountyById(t *testing.T) { req, err := http.NewRequestWithContext(context.WithValue(context.Background(), chi.RouteCtxKey, rctx), http.MethodGet, "/bounty/1", nil) assert.NoError(t, err) - mockDb.On("GetBountyById", mock.Anything).Return([]db.Bounty{bounty}, nil).Once() + mockDb.On("GetBountyById", mock.Anything).Return([]db.NewBounty{bounty}, nil).Once() mockDb.On("GetPersonByPubkey", "owner123").Return(db.Person{}).Once() mockDb.On("GetPersonByPubkey", "user1").Return(db.Person{}).Once() mockDb.On("GetWorkspaceByUuid", "org-789").Return(db.Workspace{}).Once() @@ -936,7 +938,7 @@ func GetPersonAssigned(t *testing.T) { mockHttpClient := mocks.NewHttpClient(t) bHandler := NewBountyHandler(mockHttpClient, mockDb) t.Run("should return bounties assigned to the user", func(t *testing.T) { - mockGenerateBountyResponse := func(bounties []db.Bounty) []db.BountyResponse { + mockGenerateBountyResponse := func(bounties []db.NewBounty) []db.BountyResponse { var bountyResponses []db.BountyResponse for _, bounty := range bounties { @@ -964,7 +966,7 @@ func GetPersonAssigned(t *testing.T) { } bHandler.generateBountyResponse = mockGenerateBountyResponse - expectedBounties := []db.Bounty{ + expectedBounties := []db.NewBounty{ {ID: 1, Assignee: "user1"}, {ID: 2, Assignee: "user1"}, {ID: 3, OwnerID: "user2", Assignee: "user1"}, @@ -1001,12 +1003,12 @@ func GetPersonAssigned(t *testing.T) { }) t.Run("should not return bounties assigned to other users", func(t *testing.T) { - mockGenerateBountyResponse := func(bounties []db.Bounty) []db.BountyResponse { + mockGenerateBountyResponse := func(bounties []db.NewBounty) []db.BountyResponse { return []db.BountyResponse{} } bHandler.generateBountyResponse = mockGenerateBountyResponse - mockDb.On("GetAssignedBounties", mock.Anything).Return([]db.Bounty{}, nil).Once() + mockDb.On("GetAssignedBounties", mock.Anything).Return([]db.NewBounty{}, nil).Once() rr := httptest.NewRecorder() req, err := http.NewRequest("GET", "/wanteds/assigned/uuid", nil) @@ -1038,7 +1040,7 @@ func TestGetBountyIndexById(t *testing.T) { rr := httptest.NewRecorder() handler := http.HandlerFunc(bHandler.GetBountyIndexById) - bounty := db.Bounty{ + bounty := db.NewBounty{ ID: 1, } @@ -1088,15 +1090,16 @@ func TestGetAllBounties(t *testing.T) { t.Run("Should successfull All Bounties", func(t *testing.T) { rr := httptest.NewRecorder() handler := http.HandlerFunc(bHandler.GetAllBounties) - bounties := []db.Bounty{ + bounties := []db.NewBounty{ {ID: 1, - Type: "coding", - Title: "first bounty", - Description: "first bounty description", - OrgUuid: "org-1", - Assignee: "user1", - Created: 1707991475, - OwnerID: "owner-1", + Type: "coding", + Title: "first bounty", + Description: "first bounty description", + OrgUuid: "org-1", + WorkspaceUuid: "work-1", + Assignee: "user1", + Created: 1707991475, + OwnerID: "owner-1", }, } @@ -1171,11 +1174,12 @@ func TestMakeBountyPayment(t *testing.T) { var processingTimes []time.Time bountyID := uint(1) - bounty := db.Bounty{ - ID: bountyID, - OrgUuid: "org-1", - Assignee: "assignee-1", - Price: uint(1000), + bounty := db.NewBounty{ + ID: bountyID, + OrgUuid: "org-1", + WorkspaceUuid: "work-1", + Assignee: "assignee-1", + Price: uint(1000), } t.Run("mutex lock ensures sequential access", func(t *testing.T) { @@ -1228,12 +1232,13 @@ func TestMakeBountyPayment(t *testing.T) { t.Run("405 when trying to pay an already-paid bounty", func(t *testing.T) { mockDb.ExpectedCalls = nil - mockDb.On("GetBounty", mock.AnythingOfType("uint")).Return(db.Bounty{ - ID: 1, - Price: 1000, - OrgUuid: "org-1", - Assignee: "assignee-1", - Paid: true, + mockDb.On("GetBounty", mock.AnythingOfType("uint")).Return(db.NewBounty{ + ID: 1, + Price: 1000, + OrgUuid: "org-1", + WorkspaceUuid: "work-1", + Assignee: "assignee-1", + Paid: true, }, nil) r := chi.NewRouter() @@ -1254,12 +1259,13 @@ func TestMakeBountyPayment(t *testing.T) { t.Run("401 error if user not workspace admin or does not have PAY BOUNTY role", func(t *testing.T) { bHandler.userHasAccess = mockUserHasAccessFalse - mockDb.On("GetBounty", mock.AnythingOfType("uint")).Return(db.Bounty{ - ID: 1, - Price: 1000, - OrgUuid: "org-1", - Assignee: "assignee-1", - Paid: false, + mockDb.On("GetBounty", mock.AnythingOfType("uint")).Return(db.NewBounty{ + ID: 1, + Price: 1000, + OrgUuid: "org-1", + WorkspaceUuid: "work-1", + Assignee: "assignee-1", + Paid: false, }, nil) r := chi.NewRouter() @@ -1284,12 +1290,13 @@ func TestMakeBountyPayment(t *testing.T) { mockHttpClient := mocks.NewHttpClient(t) bHandler := NewBountyHandler(mockHttpClient, mockDb) bHandler.userHasAccess = mockUserHasAccessTrue - mockDb.On("GetBounty", mock.AnythingOfType("uint")).Return(db.Bounty{ - ID: 1, - Price: 1000, - OrgUuid: "org-1", - Assignee: "assignee-1", - Paid: false, + mockDb.On("GetBounty", mock.AnythingOfType("uint")).Return(db.NewBounty{ + ID: 1, + Price: 1000, + OrgUuid: "org-1", + WorkspaceUuid: "work-1", + Assignee: "assignee-1", + Paid: false, }, nil) mockDb.On("GetWorkspaceBudget", "org-1").Return(db.BountyBudget{ TotalBudget: 500, @@ -1316,9 +1323,10 @@ func TestMakeBountyPayment(t *testing.T) { bHandler.userHasAccess = mockUserHasAccessTrue now := time.Now() - expectedBounty := db.Bounty{ + expectedBounty := db.NewBounty{ ID: bountyID, OrgUuid: "org-1", + WorkspaceUuid: "work-1", Assignee: "assignee-1", Price: uint(1000), Paid: true, @@ -1330,8 +1338,8 @@ func TestMakeBountyPayment(t *testing.T) { mockDb.On("GetWorkspaceBudget", bounty.OrgUuid).Return(db.BountyBudget{TotalBudget: 2000}, nil) mockDb.On("GetPersonByPubkey", bounty.Assignee).Return(db.Person{OwnerPubKey: "assignee-1", OwnerRouteHint: "OwnerRouteHint"}, nil) mockDb.On("AddPaymentHistory", mock.AnythingOfType("db.PaymentHistory")).Return(db.PaymentHistory{ID: 1}) - mockDb.On("UpdateBounty", mock.AnythingOfType("db.Bounty")).Run(func(args mock.Arguments) { - updatedBounty := args.Get(0).(db.Bounty) + mockDb.On("UpdateBounty", mock.AnythingOfType("db.NewBounty")).Run(func(args mock.Arguments) { + updatedBounty := args.Get(0).(db.NewBounty) assert.True(t, updatedBounty.Paid) assert.NotNil(t, updatedBounty.PaidDate) assert.NotNil(t, updatedBounty.CompletionDate) @@ -1747,7 +1755,7 @@ func TestPollInvoice(t *testing.T) { mockDb.On("GetUserInvoiceData", "1").Return(db.UserInvoiceData{Amount: 1000, UserPubkey: "UserPubkey", RouteHint: "RouteHint", Created: 1234}) mockDb.On("GetInvoice", "1").Return(db.InvoiceList{Status: false}) mockDb.On("GetBountyByCreated", uint(1234)).Return(bounty, nil) - mockDb.On("UpdateBounty", mock.AnythingOfType("db.Bounty")).Run(func(args mock.Arguments) { + mockDb.On("UpdateBounty", mock.AnythingOfType("db.NewBounty")).Run(func(args mock.Arguments) { updatedBounty := args.Get(0).(db.Bounty) assert.True(t, updatedBounty.Paid) }).Return(expectedBounty, nil).Once() diff --git a/handlers/tribes.go b/handlers/tribes.go index 467feb60b..df66d6807 100644 --- a/handlers/tribes.go +++ b/handlers/tribes.go @@ -518,7 +518,7 @@ func GenerateInvoice(w http.ResponseWriter, r *http.Request) { paymentRequest := invoiceRes.Response.Invoice now := time.Now() - newInvoice := db.InvoiceList{ + newInvoice := db.NewInvoiceList{ PaymentRequest: paymentRequest, Type: db.InvoiceType(invoiceType), OwnerPubkey: owner_key, @@ -557,6 +557,10 @@ func (th *tribeHandler) GenerateBudgetInvoice(w http.ResponseWriter, r *http.Req return } + if invoice.WorkspaceUuid == "" && invoice.OrgUuid != "" { + invoice.WorkspaceUuid = invoice.OrgUuid + } + url := fmt.Sprintf("%s/invoices", config.RelayUrl) bodyData := fmt.Sprintf(`{"amount": %d, "memo": "%s"}`, invoice.Amount, "Budget Invoice") @@ -590,9 +594,9 @@ func (th *tribeHandler) GenerateBudgetInvoice(w http.ResponseWriter, r *http.Req } now := time.Now() - var paymentHistory = db.PaymentHistory{ + var paymentHistory = db.NewPaymentHistory{ Amount: invoice.Amount, - OrgUuid: invoice.OrgUuid, + WorkspaceUuid: invoice.WorkspaceUuid, PaymentType: invoice.PaymentType, SenderPubKey: invoice.SenderPubKey, ReceiverPubKey: "", @@ -602,11 +606,11 @@ func (th *tribeHandler) GenerateBudgetInvoice(w http.ResponseWriter, r *http.Req BountyId: 0, } - newInvoice := db.InvoiceList{ + newInvoice := db.NewInvoiceList{ PaymentRequest: invoiceRes.Response.Invoice, Type: db.InvoiceType("BUDGET"), OwnerPubkey: invoice.SenderPubKey, - OrgUuid: invoice.OrgUuid, + WorkspaceUuid: invoice.WorkspaceUuid, Created: &now, Updated: &now, Status: false, diff --git a/handlers/workspaces.go b/handlers/workspaces.go index 5dc7f54e2..01b310fa5 100644 --- a/handlers/workspaces.go +++ b/handlers/workspaces.go @@ -18,7 +18,7 @@ import ( type workspaceHandler struct { db db.Database - generateBountyHandler func(bounties []db.Bounty) []db.BountyResponse + generateBountyHandler func(bounties []db.NewBounty) []db.BountyResponse getLightningInvoice func(payment_request string) (db.InvoiceResult, db.InvoiceError) userHasAccess func(pubKeyFromAuth string, uuid string, role string) bool userHasManageBountyRoles func(pubKeyFromAuth string, uuid string) bool @@ -181,6 +181,10 @@ func CreateWorkspaceUser(w http.ResponseWriter, r *http.Request) { r.Body.Close() err = json.Unmarshal(body, &workspaceUser) + if workspaceUser.WorkspaceUuid == "" && workspaceUser.OrgUuid != "" { + workspaceUser.WorkspaceUuid = workspaceUser.OrgUuid + } + // get orgnanization workspace := db.DB.GetWorkspaceByUuid(workspaceUser.WorkspaceUuid) @@ -286,6 +290,10 @@ func DeleteWorkspaceUser(w http.ResponseWriter, r *http.Request) { r.Body.Close() err = json.Unmarshal(body, &workspaceUser) + if workspaceUser.WorkspaceUuid == "" && workspaceUser.OrgUuid != "" { + workspaceUser.WorkspaceUuid = workspaceUser.OrgUuid + } + if err != nil { fmt.Println(err) w.WriteHeader(http.StatusNotAcceptable) @@ -382,6 +390,11 @@ func AddUserRoles(w http.ResponseWriter, r *http.Request) { rolesMap := db.GetRolesMap() insertRoles := []db.WorkspaceUserRoles{} for _, role := range roles { + + if role.WorkspaceUuid == "" && role.OrgUuid != "" { + role.WorkspaceUuid = role.OrgUuid + } + _, ok := rolesMap[role.Role] // if any of the roles does not exists return an error if !ok { diff --git a/handlers/workspaces_test.go b/handlers/workspaces_test.go index e3cf75ed0..4447d4a47 100644 --- a/handlers/workspaces_test.go +++ b/handlers/workspaces_test.go @@ -354,7 +354,7 @@ func TestDeleteWorkspace(t *testing.T) { func TestGetWorkspaceBounties(t *testing.T) { ctx := context.WithValue(context.Background(), auth.ContextKey, "test-key") mockDb := mocks.NewDatabase(t) - mockGenerateBountyHandler := func(bounties []db.Bounty) []db.BountyResponse { + mockGenerateBountyHandler := func(bounties []db.NewBounty) []db.BountyResponse { return []db.BountyResponse{} // Mocked response } oHandler := NewWorkspaceHandler(mockDb) diff --git a/mocks/Database.go b/mocks/Database.go index abf970283..1de316131 100644 --- a/mocks/Database.go +++ b/mocks/Database.go @@ -26,18 +26,18 @@ func (_m *Database) EXPECT() *Database_Expecter { } // AddAndUpdateBudget provides a mock function with given fields: invoice -func (_m *Database) AddAndUpdateBudget(invoice db.InvoiceList) db.PaymentHistory { +func (_m *Database) AddAndUpdateBudget(invoice db.NewInvoiceList) db.NewPaymentHistory { ret := _m.Called(invoice) if len(ret) == 0 { panic("no return value specified for AddAndUpdateBudget") } - var r0 db.PaymentHistory - if rf, ok := ret.Get(0).(func(db.InvoiceList) db.PaymentHistory); ok { + var r0 db.NewPaymentHistory + if rf, ok := ret.Get(0).(func(db.NewInvoiceList) db.NewPaymentHistory); ok { r0 = rf(invoice) } else { - r0 = ret.Get(0).(db.PaymentHistory) + r0 = ret.Get(0).(db.NewPaymentHistory) } return r0 @@ -49,24 +49,24 @@ type Database_AddAndUpdateBudget_Call struct { } // AddAndUpdateBudget is a helper method to define mock.On call -// - invoice db.InvoiceList +// - invoice db.NewInvoiceList func (_e *Database_Expecter) AddAndUpdateBudget(invoice interface{}) *Database_AddAndUpdateBudget_Call { return &Database_AddAndUpdateBudget_Call{Call: _e.mock.On("AddAndUpdateBudget", invoice)} } -func (_c *Database_AddAndUpdateBudget_Call) Run(run func(invoice db.InvoiceList)) *Database_AddAndUpdateBudget_Call { +func (_c *Database_AddAndUpdateBudget_Call) Run(run func(invoice db.NewInvoiceList)) *Database_AddAndUpdateBudget_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(db.InvoiceList)) + run(args[0].(db.NewInvoiceList)) }) return _c } -func (_c *Database_AddAndUpdateBudget_Call) Return(_a0 db.PaymentHistory) *Database_AddAndUpdateBudget_Call { +func (_c *Database_AddAndUpdateBudget_Call) Return(_a0 db.NewPaymentHistory) *Database_AddAndUpdateBudget_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_AddAndUpdateBudget_Call) RunAndReturn(run func(db.InvoiceList) db.PaymentHistory) *Database_AddAndUpdateBudget_Call { +func (_c *Database_AddAndUpdateBudget_Call) RunAndReturn(run func(db.NewInvoiceList) db.NewPaymentHistory) *Database_AddAndUpdateBudget_Call { _c.Call.Return(run) return _c } @@ -174,18 +174,18 @@ func (_c *Database_AddBudgetHistory_Call) RunAndReturn(run func(db.BudgetHistory } // AddInvoice provides a mock function with given fields: invoice -func (_m *Database) AddInvoice(invoice db.InvoiceList) db.InvoiceList { +func (_m *Database) AddInvoice(invoice db.NewInvoiceList) db.NewInvoiceList { ret := _m.Called(invoice) if len(ret) == 0 { panic("no return value specified for AddInvoice") } - var r0 db.InvoiceList - if rf, ok := ret.Get(0).(func(db.InvoiceList) db.InvoiceList); ok { + var r0 db.NewInvoiceList + if rf, ok := ret.Get(0).(func(db.NewInvoiceList) db.NewInvoiceList); ok { r0 = rf(invoice) } else { - r0 = ret.Get(0).(db.InvoiceList) + r0 = ret.Get(0).(db.NewInvoiceList) } return r0 @@ -197,41 +197,41 @@ type Database_AddInvoice_Call struct { } // AddInvoice is a helper method to define mock.On call -// - invoice db.InvoiceList +// - invoice db.NewInvoiceList func (_e *Database_Expecter) AddInvoice(invoice interface{}) *Database_AddInvoice_Call { return &Database_AddInvoice_Call{Call: _e.mock.On("AddInvoice", invoice)} } -func (_c *Database_AddInvoice_Call) Run(run func(invoice db.InvoiceList)) *Database_AddInvoice_Call { +func (_c *Database_AddInvoice_Call) Run(run func(invoice db.NewInvoiceList)) *Database_AddInvoice_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(db.InvoiceList)) + run(args[0].(db.NewInvoiceList)) }) return _c } -func (_c *Database_AddInvoice_Call) Return(_a0 db.InvoiceList) *Database_AddInvoice_Call { +func (_c *Database_AddInvoice_Call) Return(_a0 db.NewInvoiceList) *Database_AddInvoice_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_AddInvoice_Call) RunAndReturn(run func(db.InvoiceList) db.InvoiceList) *Database_AddInvoice_Call { +func (_c *Database_AddInvoice_Call) RunAndReturn(run func(db.NewInvoiceList) db.NewInvoiceList) *Database_AddInvoice_Call { _c.Call.Return(run) return _c } // AddPaymentHistory provides a mock function with given fields: payment -func (_m *Database) AddPaymentHistory(payment db.PaymentHistory) db.PaymentHistory { +func (_m *Database) AddPaymentHistory(payment db.NewPaymentHistory) db.NewPaymentHistory { ret := _m.Called(payment) if len(ret) == 0 { panic("no return value specified for AddPaymentHistory") } - var r0 db.PaymentHistory - if rf, ok := ret.Get(0).(func(db.PaymentHistory) db.PaymentHistory); ok { + var r0 db.NewPaymentHistory + if rf, ok := ret.Get(0).(func(db.NewPaymentHistory) db.NewPaymentHistory); ok { r0 = rf(payment) } else { - r0 = ret.Get(0).(db.PaymentHistory) + r0 = ret.Get(0).(db.NewPaymentHistory) } return r0 @@ -243,24 +243,24 @@ type Database_AddPaymentHistory_Call struct { } // AddPaymentHistory is a helper method to define mock.On call -// - payment db.PaymentHistory +// - payment db.NewPaymentHistory func (_e *Database_Expecter) AddPaymentHistory(payment interface{}) *Database_AddPaymentHistory_Call { return &Database_AddPaymentHistory_Call{Call: _e.mock.On("AddPaymentHistory", payment)} } -func (_c *Database_AddPaymentHistory_Call) Run(run func(payment db.PaymentHistory)) *Database_AddPaymentHistory_Call { +func (_c *Database_AddPaymentHistory_Call) Run(run func(payment db.NewPaymentHistory)) *Database_AddPaymentHistory_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(db.PaymentHistory)) + run(args[0].(db.NewPaymentHistory)) }) return _c } -func (_c *Database_AddPaymentHistory_Call) Return(_a0 db.PaymentHistory) *Database_AddPaymentHistory_Call { +func (_c *Database_AddPaymentHistory_Call) Return(_a0 db.NewPaymentHistory) *Database_AddPaymentHistory_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_AddPaymentHistory_Call) RunAndReturn(run func(db.PaymentHistory) db.PaymentHistory) *Database_AddPaymentHistory_Call { +func (_c *Database_AddPaymentHistory_Call) RunAndReturn(run func(db.NewPaymentHistory) db.NewPaymentHistory) *Database_AddPaymentHistory_Call { _c.Call.Return(run) return _c } @@ -872,25 +872,25 @@ func (_c *Database_CreateOrEditBot_Call) RunAndReturn(run func(db.Bot) (db.Bot, } // CreateOrEditBounty provides a mock function with given fields: b -func (_m *Database) CreateOrEditBounty(b db.Bounty) (db.Bounty, error) { +func (_m *Database) CreateOrEditBounty(b db.NewBounty) (db.NewBounty, error) { ret := _m.Called(b) if len(ret) == 0 { panic("no return value specified for CreateOrEditBounty") } - var r0 db.Bounty + var r0 db.NewBounty var r1 error - if rf, ok := ret.Get(0).(func(db.Bounty) (db.Bounty, error)); ok { + if rf, ok := ret.Get(0).(func(db.NewBounty) (db.NewBounty, error)); ok { return rf(b) } - if rf, ok := ret.Get(0).(func(db.Bounty) db.Bounty); ok { + if rf, ok := ret.Get(0).(func(db.NewBounty) db.NewBounty); ok { r0 = rf(b) } else { - r0 = ret.Get(0).(db.Bounty) + r0 = ret.Get(0).(db.NewBounty) } - if rf, ok := ret.Get(1).(func(db.Bounty) error); ok { + if rf, ok := ret.Get(1).(func(db.NewBounty) error); ok { r1 = rf(b) } else { r1 = ret.Error(1) @@ -905,24 +905,24 @@ type Database_CreateOrEditBounty_Call struct { } // CreateOrEditBounty is a helper method to define mock.On call -// - b db.Bounty +// - b db.NewBounty func (_e *Database_Expecter) CreateOrEditBounty(b interface{}) *Database_CreateOrEditBounty_Call { return &Database_CreateOrEditBounty_Call{Call: _e.mock.On("CreateOrEditBounty", b)} } -func (_c *Database_CreateOrEditBounty_Call) Run(run func(b db.Bounty)) *Database_CreateOrEditBounty_Call { +func (_c *Database_CreateOrEditBounty_Call) Run(run func(b db.NewBounty)) *Database_CreateOrEditBounty_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(db.Bounty)) + run(args[0].(db.NewBounty)) }) return _c } -func (_c *Database_CreateOrEditBounty_Call) Return(_a0 db.Bounty, _a1 error) *Database_CreateOrEditBounty_Call { +func (_c *Database_CreateOrEditBounty_Call) Return(_a0 db.NewBounty, _a1 error) *Database_CreateOrEditBounty_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *Database_CreateOrEditBounty_Call) RunAndReturn(run func(db.Bounty) (db.Bounty, error)) *Database_CreateOrEditBounty_Call { +func (_c *Database_CreateOrEditBounty_Call) RunAndReturn(run func(db.NewBounty) (db.NewBounty, error)) *Database_CreateOrEditBounty_Call { _c.Call.Return(run) return _c } @@ -1146,18 +1146,18 @@ func (_c *Database_CreateUserRoles_Call) RunAndReturn(run func([]db.WorkspaceUse } // CreateWorkspaceBudget provides a mock function with given fields: budget -func (_m *Database) CreateWorkspaceBudget(budget db.BountyBudget) db.BountyBudget { +func (_m *Database) CreateWorkspaceBudget(budget db.NewBountyBudget) db.NewBountyBudget { ret := _m.Called(budget) if len(ret) == 0 { panic("no return value specified for CreateWorkspaceBudget") } - var r0 db.BountyBudget - if rf, ok := ret.Get(0).(func(db.BountyBudget) db.BountyBudget); ok { + var r0 db.NewBountyBudget + if rf, ok := ret.Get(0).(func(db.NewBountyBudget) db.NewBountyBudget); ok { r0 = rf(budget) } else { - r0 = ret.Get(0).(db.BountyBudget) + r0 = ret.Get(0).(db.NewBountyBudget) } return r0 @@ -1169,24 +1169,24 @@ type Database_CreateWorkspaceBudget_Call struct { } // CreateWorkspaceBudget is a helper method to define mock.On call -// - budget db.BountyBudget +// - budget db.NewBountyBudget func (_e *Database_Expecter) CreateWorkspaceBudget(budget interface{}) *Database_CreateWorkspaceBudget_Call { return &Database_CreateWorkspaceBudget_Call{Call: _e.mock.On("CreateWorkspaceBudget", budget)} } -func (_c *Database_CreateWorkspaceBudget_Call) Run(run func(budget db.BountyBudget)) *Database_CreateWorkspaceBudget_Call { +func (_c *Database_CreateWorkspaceBudget_Call) Run(run func(budget db.NewBountyBudget)) *Database_CreateWorkspaceBudget_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(db.BountyBudget)) + run(args[0].(db.NewBountyBudget)) }) return _c } -func (_c *Database_CreateWorkspaceBudget_Call) Return(_a0 db.BountyBudget) *Database_CreateWorkspaceBudget_Call { +func (_c *Database_CreateWorkspaceBudget_Call) Return(_a0 db.NewBountyBudget) *Database_CreateWorkspaceBudget_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_CreateWorkspaceBudget_Call) RunAndReturn(run func(db.BountyBudget) db.BountyBudget) *Database_CreateWorkspaceBudget_Call { +func (_c *Database_CreateWorkspaceBudget_Call) RunAndReturn(run func(db.NewBountyBudget) db.NewBountyBudget) *Database_CreateWorkspaceBudget_Call { _c.Call.Return(run) return _c } @@ -1434,19 +1434,19 @@ func (_c *Database_DeleteWorkspaceUser_Call) RunAndReturn(run func(db.WorkspaceU } // GetAllBounties provides a mock function with given fields: r -func (_m *Database) GetAllBounties(r *http.Request) []db.Bounty { +func (_m *Database) GetAllBounties(r *http.Request) []db.NewBounty { ret := _m.Called(r) if len(ret) == 0 { panic("no return value specified for GetAllBounties") } - var r0 []db.Bounty - if rf, ok := ret.Get(0).(func(*http.Request) []db.Bounty); ok { + var r0 []db.NewBounty + if rf, ok := ret.Get(0).(func(*http.Request) []db.NewBounty); ok { r0 = rf(r) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]db.Bounty) + r0 = ret.Get(0).([]db.NewBounty) } } @@ -1471,12 +1471,12 @@ func (_c *Database_GetAllBounties_Call) Run(run func(r *http.Request)) *Database return _c } -func (_c *Database_GetAllBounties_Call) Return(_a0 []db.Bounty) *Database_GetAllBounties_Call { +func (_c *Database_GetAllBounties_Call) Return(_a0 []db.NewBounty) *Database_GetAllBounties_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_GetAllBounties_Call) RunAndReturn(run func(*http.Request) []db.Bounty) *Database_GetAllBounties_Call { +func (_c *Database_GetAllBounties_Call) RunAndReturn(run func(*http.Request) []db.NewBounty) *Database_GetAllBounties_Call { _c.Call.Return(run) return _c } @@ -1577,23 +1577,23 @@ func (_c *Database_GetAllTribesByOwner_Call) RunAndReturn(run func(string) []db. } // GetAssignedBounties provides a mock function with given fields: r -func (_m *Database) GetAssignedBounties(r *http.Request) ([]db.Bounty, error) { +func (_m *Database) GetAssignedBounties(r *http.Request) ([]db.NewBounty, error) { ret := _m.Called(r) if len(ret) == 0 { panic("no return value specified for GetAssignedBounties") } - var r0 []db.Bounty + var r0 []db.NewBounty var r1 error - if rf, ok := ret.Get(0).(func(*http.Request) ([]db.Bounty, error)); ok { + if rf, ok := ret.Get(0).(func(*http.Request) ([]db.NewBounty, error)); ok { return rf(r) } - if rf, ok := ret.Get(0).(func(*http.Request) []db.Bounty); ok { + if rf, ok := ret.Get(0).(func(*http.Request) []db.NewBounty); ok { r0 = rf(r) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]db.Bounty) + r0 = ret.Get(0).([]db.NewBounty) } } @@ -1624,12 +1624,12 @@ func (_c *Database_GetAssignedBounties_Call) Run(run func(r *http.Request)) *Dat return _c } -func (_c *Database_GetAssignedBounties_Call) Return(_a0 []db.Bounty, _a1 error) *Database_GetAssignedBounties_Call { +func (_c *Database_GetAssignedBounties_Call) Return(_a0 []db.NewBounty, _a1 error) *Database_GetAssignedBounties_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *Database_GetAssignedBounties_Call) RunAndReturn(run func(*http.Request) ([]db.Bounty, error)) *Database_GetAssignedBounties_Call { +func (_c *Database_GetAssignedBounties_Call) RunAndReturn(run func(*http.Request) ([]db.NewBounty, error)) *Database_GetAssignedBounties_Call { _c.Call.Return(run) return _c } @@ -2013,18 +2013,18 @@ func (_c *Database_GetBountiesProviders_Call) RunAndReturn(run func(db.PaymentDa } // GetBounty provides a mock function with given fields: id -func (_m *Database) GetBounty(id uint) db.Bounty { +func (_m *Database) GetBounty(id uint) db.NewBounty { ret := _m.Called(id) if len(ret) == 0 { panic("no return value specified for GetBounty") } - var r0 db.Bounty - if rf, ok := ret.Get(0).(func(uint) db.Bounty); ok { + var r0 db.NewBounty + if rf, ok := ret.Get(0).(func(uint) db.NewBounty); ok { r0 = rf(id) } else { - r0 = ret.Get(0).(db.Bounty) + r0 = ret.Get(0).(db.NewBounty) } return r0 @@ -2048,33 +2048,33 @@ func (_c *Database_GetBounty_Call) Run(run func(id uint)) *Database_GetBounty_Ca return _c } -func (_c *Database_GetBounty_Call) Return(_a0 db.Bounty) *Database_GetBounty_Call { +func (_c *Database_GetBounty_Call) Return(_a0 db.NewBounty) *Database_GetBounty_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_GetBounty_Call) RunAndReturn(run func(uint) db.Bounty) *Database_GetBounty_Call { +func (_c *Database_GetBounty_Call) RunAndReturn(run func(uint) db.NewBounty) *Database_GetBounty_Call { _c.Call.Return(run) return _c } // GetBountyByCreated provides a mock function with given fields: created -func (_m *Database) GetBountyByCreated(created uint) (db.Bounty, error) { +func (_m *Database) GetBountyByCreated(created uint) (db.NewBounty, error) { ret := _m.Called(created) if len(ret) == 0 { panic("no return value specified for GetBountyByCreated") } - var r0 db.Bounty + var r0 db.NewBounty var r1 error - if rf, ok := ret.Get(0).(func(uint) (db.Bounty, error)); ok { + if rf, ok := ret.Get(0).(func(uint) (db.NewBounty, error)); ok { return rf(created) } - if rf, ok := ret.Get(0).(func(uint) db.Bounty); ok { + if rf, ok := ret.Get(0).(func(uint) db.NewBounty); ok { r0 = rf(created) } else { - r0 = ret.Get(0).(db.Bounty) + r0 = ret.Get(0).(db.NewBounty) } if rf, ok := ret.Get(1).(func(uint) error); ok { @@ -2104,34 +2104,34 @@ func (_c *Database_GetBountyByCreated_Call) Run(run func(created uint)) *Databas return _c } -func (_c *Database_GetBountyByCreated_Call) Return(_a0 db.Bounty, _a1 error) *Database_GetBountyByCreated_Call { +func (_c *Database_GetBountyByCreated_Call) Return(_a0 db.NewBounty, _a1 error) *Database_GetBountyByCreated_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *Database_GetBountyByCreated_Call) RunAndReturn(run func(uint) (db.Bounty, error)) *Database_GetBountyByCreated_Call { +func (_c *Database_GetBountyByCreated_Call) RunAndReturn(run func(uint) (db.NewBounty, error)) *Database_GetBountyByCreated_Call { _c.Call.Return(run) return _c } // GetBountyById provides a mock function with given fields: id -func (_m *Database) GetBountyById(id string) ([]db.Bounty, error) { +func (_m *Database) GetBountyById(id string) ([]db.NewBounty, error) { ret := _m.Called(id) if len(ret) == 0 { panic("no return value specified for GetBountyById") } - var r0 []db.Bounty + var r0 []db.NewBounty var r1 error - if rf, ok := ret.Get(0).(func(string) ([]db.Bounty, error)); ok { + if rf, ok := ret.Get(0).(func(string) ([]db.NewBounty, error)); ok { return rf(id) } - if rf, ok := ret.Get(0).(func(string) []db.Bounty); ok { + if rf, ok := ret.Get(0).(func(string) []db.NewBounty); ok { r0 = rf(id) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]db.Bounty) + r0 = ret.Get(0).([]db.NewBounty) } } @@ -2162,34 +2162,34 @@ func (_c *Database_GetBountyById_Call) Run(run func(id string)) *Database_GetBou return _c } -func (_c *Database_GetBountyById_Call) Return(_a0 []db.Bounty, _a1 error) *Database_GetBountyById_Call { +func (_c *Database_GetBountyById_Call) Return(_a0 []db.NewBounty, _a1 error) *Database_GetBountyById_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *Database_GetBountyById_Call) RunAndReturn(run func(string) ([]db.Bounty, error)) *Database_GetBountyById_Call { +func (_c *Database_GetBountyById_Call) RunAndReturn(run func(string) ([]db.NewBounty, error)) *Database_GetBountyById_Call { _c.Call.Return(run) return _c } // GetBountyDataByCreated provides a mock function with given fields: created -func (_m *Database) GetBountyDataByCreated(created string) ([]db.Bounty, error) { +func (_m *Database) GetBountyDataByCreated(created string) ([]db.NewBounty, error) { ret := _m.Called(created) if len(ret) == 0 { panic("no return value specified for GetBountyDataByCreated") } - var r0 []db.Bounty + var r0 []db.NewBounty var r1 error - if rf, ok := ret.Get(0).(func(string) ([]db.Bounty, error)); ok { + if rf, ok := ret.Get(0).(func(string) ([]db.NewBounty, error)); ok { return rf(created) } - if rf, ok := ret.Get(0).(func(string) []db.Bounty); ok { + if rf, ok := ret.Get(0).(func(string) []db.NewBounty); ok { r0 = rf(created) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]db.Bounty) + r0 = ret.Get(0).([]db.NewBounty) } } @@ -2220,12 +2220,12 @@ func (_c *Database_GetBountyDataByCreated_Call) Run(run func(created string)) *D return _c } -func (_c *Database_GetBountyDataByCreated_Call) Return(_a0 []db.Bounty, _a1 error) *Database_GetBountyDataByCreated_Call { +func (_c *Database_GetBountyDataByCreated_Call) Return(_a0 []db.NewBounty, _a1 error) *Database_GetBountyDataByCreated_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *Database_GetBountyDataByCreated_Call) RunAndReturn(run func(string) ([]db.Bounty, error)) *Database_GetBountyDataByCreated_Call { +func (_c *Database_GetBountyDataByCreated_Call) RunAndReturn(run func(string) ([]db.NewBounty, error)) *Database_GetBountyDataByCreated_Call { _c.Call.Return(run) return _c } @@ -2463,23 +2463,23 @@ func (_c *Database_GetConnectionCode_Call) RunAndReturn(run func() db.Connection } // GetCreatedBounties provides a mock function with given fields: r -func (_m *Database) GetCreatedBounties(r *http.Request) ([]db.Bounty, error) { +func (_m *Database) GetCreatedBounties(r *http.Request) ([]db.NewBounty, error) { ret := _m.Called(r) if len(ret) == 0 { panic("no return value specified for GetCreatedBounties") } - var r0 []db.Bounty + var r0 []db.NewBounty var r1 error - if rf, ok := ret.Get(0).(func(*http.Request) ([]db.Bounty, error)); ok { + if rf, ok := ret.Get(0).(func(*http.Request) ([]db.NewBounty, error)); ok { return rf(r) } - if rf, ok := ret.Get(0).(func(*http.Request) []db.Bounty); ok { + if rf, ok := ret.Get(0).(func(*http.Request) []db.NewBounty); ok { r0 = rf(r) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]db.Bounty) + r0 = ret.Get(0).([]db.NewBounty) } } @@ -2510,12 +2510,12 @@ func (_c *Database_GetCreatedBounties_Call) Run(run func(r *http.Request)) *Data return _c } -func (_c *Database_GetCreatedBounties_Call) Return(_a0 []db.Bounty, _a1 error) *Database_GetCreatedBounties_Call { +func (_c *Database_GetCreatedBounties_Call) Return(_a0 []db.NewBounty, _a1 error) *Database_GetCreatedBounties_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *Database_GetCreatedBounties_Call) RunAndReturn(run func(*http.Request) ([]db.Bounty, error)) *Database_GetCreatedBounties_Call { +func (_c *Database_GetCreatedBounties_Call) RunAndReturn(run func(*http.Request) ([]db.NewBounty, error)) *Database_GetCreatedBounties_Call { _c.Call.Return(run) return _c } @@ -2612,18 +2612,18 @@ func (_c *Database_GetFirstTribeByFeedURL_Call) RunAndReturn(run func(string) db } // GetInvoice provides a mock function with given fields: payment_request -func (_m *Database) GetInvoice(payment_request string) db.InvoiceList { +func (_m *Database) GetInvoice(payment_request string) db.NewInvoiceList { ret := _m.Called(payment_request) if len(ret) == 0 { panic("no return value specified for GetInvoice") } - var r0 db.InvoiceList - if rf, ok := ret.Get(0).(func(string) db.InvoiceList); ok { + var r0 db.NewInvoiceList + if rf, ok := ret.Get(0).(func(string) db.NewInvoiceList); ok { r0 = rf(payment_request) } else { - r0 = ret.Get(0).(db.InvoiceList) + r0 = ret.Get(0).(db.NewInvoiceList) } return r0 @@ -2647,12 +2647,12 @@ func (_c *Database_GetInvoice_Call) Run(run func(payment_request string)) *Datab return _c } -func (_c *Database_GetInvoice_Call) Return(_a0 db.InvoiceList) *Database_GetInvoice_Call { +func (_c *Database_GetInvoice_Call) Return(_a0 db.NewInvoiceList) *Database_GetInvoice_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_GetInvoice_Call) RunAndReturn(run func(string) db.InvoiceList) *Database_GetInvoice_Call { +func (_c *Database_GetInvoice_Call) RunAndReturn(run func(string) db.NewInvoiceList) *Database_GetInvoice_Call { _c.Call.Return(run) return _c } @@ -3227,19 +3227,19 @@ func (_c *Database_GetOpenGithubIssues_Call) RunAndReturn(run func(*http.Request } // GetPaymentHistory provides a mock function with given fields: workspace_uuid, r -func (_m *Database) GetPaymentHistory(workspace_uuid string, r *http.Request) []db.PaymentHistory { +func (_m *Database) GetPaymentHistory(workspace_uuid string, r *http.Request) []db.NewPaymentHistory { ret := _m.Called(workspace_uuid, r) if len(ret) == 0 { panic("no return value specified for GetPaymentHistory") } - var r0 []db.PaymentHistory - if rf, ok := ret.Get(0).(func(string, *http.Request) []db.PaymentHistory); ok { + var r0 []db.NewPaymentHistory + if rf, ok := ret.Get(0).(func(string, *http.Request) []db.NewPaymentHistory); ok { r0 = rf(workspace_uuid, r) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]db.PaymentHistory) + r0 = ret.Get(0).([]db.NewPaymentHistory) } } @@ -3265,29 +3265,29 @@ func (_c *Database_GetPaymentHistory_Call) Run(run func(workspace_uuid string, r return _c } -func (_c *Database_GetPaymentHistory_Call) Return(_a0 []db.PaymentHistory) *Database_GetPaymentHistory_Call { +func (_c *Database_GetPaymentHistory_Call) Return(_a0 []db.NewPaymentHistory) *Database_GetPaymentHistory_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_GetPaymentHistory_Call) RunAndReturn(run func(string, *http.Request) []db.PaymentHistory) *Database_GetPaymentHistory_Call { +func (_c *Database_GetPaymentHistory_Call) RunAndReturn(run func(string, *http.Request) []db.NewPaymentHistory) *Database_GetPaymentHistory_Call { _c.Call.Return(run) return _c } // GetPaymentHistoryByCreated provides a mock function with given fields: created, workspace_uuid -func (_m *Database) GetPaymentHistoryByCreated(created *time.Time, workspace_uuid string) db.PaymentHistory { +func (_m *Database) GetPaymentHistoryByCreated(created *time.Time, workspace_uuid string) db.NewPaymentHistory { ret := _m.Called(created, workspace_uuid) if len(ret) == 0 { panic("no return value specified for GetPaymentHistoryByCreated") } - var r0 db.PaymentHistory - if rf, ok := ret.Get(0).(func(*time.Time, string) db.PaymentHistory); ok { + var r0 db.NewPaymentHistory + if rf, ok := ret.Get(0).(func(*time.Time, string) db.NewPaymentHistory); ok { r0 = rf(created, workspace_uuid) } else { - r0 = ret.Get(0).(db.PaymentHistory) + r0 = ret.Get(0).(db.NewPaymentHistory) } return r0 @@ -3312,12 +3312,12 @@ func (_c *Database_GetPaymentHistoryByCreated_Call) Run(run func(created *time.T return _c } -func (_c *Database_GetPaymentHistoryByCreated_Call) Return(_a0 db.PaymentHistory) *Database_GetPaymentHistoryByCreated_Call { +func (_c *Database_GetPaymentHistoryByCreated_Call) Return(_a0 db.NewPaymentHistory) *Database_GetPaymentHistoryByCreated_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_GetPaymentHistoryByCreated_Call) RunAndReturn(run func(*time.Time, string) db.PaymentHistory) *Database_GetPaymentHistoryByCreated_Call { +func (_c *Database_GetPaymentHistoryByCreated_Call) RunAndReturn(run func(*time.Time, string) db.NewPaymentHistory) *Database_GetPaymentHistoryByCreated_Call { _c.Call.Return(run) return _c } @@ -4324,19 +4324,19 @@ func (_c *Database_GetUserInvoiceData_Call) RunAndReturn(run func(string) db.Use } // GetWorkspaceBounties provides a mock function with given fields: r, workspace_uuid -func (_m *Database) GetWorkspaceBounties(r *http.Request, workspace_uuid string) []db.Bounty { +func (_m *Database) GetWorkspaceBounties(r *http.Request, workspace_uuid string) []db.NewBounty { ret := _m.Called(r, workspace_uuid) if len(ret) == 0 { panic("no return value specified for GetWorkspaceBounties") } - var r0 []db.Bounty - if rf, ok := ret.Get(0).(func(*http.Request, string) []db.Bounty); ok { + var r0 []db.NewBounty + if rf, ok := ret.Get(0).(func(*http.Request, string) []db.NewBounty); ok { r0 = rf(r, workspace_uuid) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]db.Bounty) + r0 = ret.Get(0).([]db.NewBounty) } } @@ -4362,12 +4362,12 @@ func (_c *Database_GetWorkspaceBounties_Call) Run(run func(r *http.Request, work return _c } -func (_c *Database_GetWorkspaceBounties_Call) Return(_a0 []db.Bounty) *Database_GetWorkspaceBounties_Call { +func (_c *Database_GetWorkspaceBounties_Call) Return(_a0 []db.NewBounty) *Database_GetWorkspaceBounties_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_GetWorkspaceBounties_Call) RunAndReturn(run func(*http.Request, string) []db.Bounty) *Database_GetWorkspaceBounties_Call { +func (_c *Database_GetWorkspaceBounties_Call) RunAndReturn(run func(*http.Request, string) []db.NewBounty) *Database_GetWorkspaceBounties_Call { _c.Call.Return(run) return _c } @@ -4466,18 +4466,18 @@ func (_c *Database_GetWorkspaceBountyCount_Call) RunAndReturn(run func(string) i } // GetWorkspaceBudget provides a mock function with given fields: workspace_uuid -func (_m *Database) GetWorkspaceBudget(workspace_uuid string) db.BountyBudget { +func (_m *Database) GetWorkspaceBudget(workspace_uuid string) db.NewBountyBudget { ret := _m.Called(workspace_uuid) if len(ret) == 0 { panic("no return value specified for GetWorkspaceBudget") } - var r0 db.BountyBudget - if rf, ok := ret.Get(0).(func(string) db.BountyBudget); ok { + var r0 db.NewBountyBudget + if rf, ok := ret.Get(0).(func(string) db.NewBountyBudget); ok { r0 = rf(workspace_uuid) } else { - r0 = ret.Get(0).(db.BountyBudget) + r0 = ret.Get(0).(db.NewBountyBudget) } return r0 @@ -4501,12 +4501,12 @@ func (_c *Database_GetWorkspaceBudget_Call) Run(run func(workspace_uuid string)) return _c } -func (_c *Database_GetWorkspaceBudget_Call) Return(_a0 db.BountyBudget) *Database_GetWorkspaceBudget_Call { +func (_c *Database_GetWorkspaceBudget_Call) Return(_a0 db.NewBountyBudget) *Database_GetWorkspaceBudget_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_GetWorkspaceBudget_Call) RunAndReturn(run func(string) db.BountyBudget) *Database_GetWorkspaceBudget_Call { +func (_c *Database_GetWorkspaceBudget_Call) RunAndReturn(run func(string) db.NewBountyBudget) *Database_GetWorkspaceBudget_Call { _c.Call.Return(run) return _c } @@ -4652,19 +4652,19 @@ func (_c *Database_GetWorkspaceByUuid_Call) RunAndReturn(run func(string) db.Wor } // GetWorkspaceInvoices provides a mock function with given fields: workspace_uuid -func (_m *Database) GetWorkspaceInvoices(workspace_uuid string) []db.InvoiceList { +func (_m *Database) GetWorkspaceInvoices(workspace_uuid string) []db.NewInvoiceList { ret := _m.Called(workspace_uuid) if len(ret) == 0 { panic("no return value specified for GetWorkspaceInvoices") } - var r0 []db.InvoiceList - if rf, ok := ret.Get(0).(func(string) []db.InvoiceList); ok { + var r0 []db.NewInvoiceList + if rf, ok := ret.Get(0).(func(string) []db.NewInvoiceList); ok { r0 = rf(workspace_uuid) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]db.InvoiceList) + r0 = ret.Get(0).([]db.NewInvoiceList) } } @@ -4689,12 +4689,12 @@ func (_c *Database_GetWorkspaceInvoices_Call) Run(run func(workspace_uuid string return _c } -func (_c *Database_GetWorkspaceInvoices_Call) Return(_a0 []db.InvoiceList) *Database_GetWorkspaceInvoices_Call { +func (_c *Database_GetWorkspaceInvoices_Call) Return(_a0 []db.NewInvoiceList) *Database_GetWorkspaceInvoices_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_GetWorkspaceInvoices_Call) RunAndReturn(run func(string) []db.InvoiceList) *Database_GetWorkspaceInvoices_Call { +func (_c *Database_GetWorkspaceInvoices_Call) RunAndReturn(run func(string) []db.NewInvoiceList) *Database_GetWorkspaceInvoices_Call { _c.Call.Return(run) return _c } @@ -5642,25 +5642,25 @@ func (_c *Database_UpdateBot_Call) RunAndReturn(run func(string, map[string]inte } // UpdateBounty provides a mock function with given fields: b -func (_m *Database) UpdateBounty(b db.Bounty) (db.Bounty, error) { +func (_m *Database) UpdateBounty(b db.NewBounty) (db.NewBounty, error) { ret := _m.Called(b) if len(ret) == 0 { panic("no return value specified for UpdateBounty") } - var r0 db.Bounty + var r0 db.NewBounty var r1 error - if rf, ok := ret.Get(0).(func(db.Bounty) (db.Bounty, error)); ok { + if rf, ok := ret.Get(0).(func(db.NewBounty) (db.NewBounty, error)); ok { return rf(b) } - if rf, ok := ret.Get(0).(func(db.Bounty) db.Bounty); ok { + if rf, ok := ret.Get(0).(func(db.NewBounty) db.NewBounty); ok { r0 = rf(b) } else { - r0 = ret.Get(0).(db.Bounty) + r0 = ret.Get(0).(db.NewBounty) } - if rf, ok := ret.Get(1).(func(db.Bounty) error); ok { + if rf, ok := ret.Get(1).(func(db.NewBounty) error); ok { r1 = rf(b) } else { r1 = ret.Error(1) @@ -5675,41 +5675,41 @@ type Database_UpdateBounty_Call struct { } // UpdateBounty is a helper method to define mock.On call -// - b db.Bounty +// - b db.NewBounty func (_e *Database_Expecter) UpdateBounty(b interface{}) *Database_UpdateBounty_Call { return &Database_UpdateBounty_Call{Call: _e.mock.On("UpdateBounty", b)} } -func (_c *Database_UpdateBounty_Call) Run(run func(b db.Bounty)) *Database_UpdateBounty_Call { +func (_c *Database_UpdateBounty_Call) Run(run func(b db.NewBounty)) *Database_UpdateBounty_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(db.Bounty)) + run(args[0].(db.NewBounty)) }) return _c } -func (_c *Database_UpdateBounty_Call) Return(_a0 db.Bounty, _a1 error) *Database_UpdateBounty_Call { +func (_c *Database_UpdateBounty_Call) Return(_a0 db.NewBounty, _a1 error) *Database_UpdateBounty_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *Database_UpdateBounty_Call) RunAndReturn(run func(db.Bounty) (db.Bounty, error)) *Database_UpdateBounty_Call { +func (_c *Database_UpdateBounty_Call) RunAndReturn(run func(db.NewBounty) (db.NewBounty, error)) *Database_UpdateBounty_Call { _c.Call.Return(run) return _c } // UpdateBountyBoolColumn provides a mock function with given fields: b, column -func (_m *Database) UpdateBountyBoolColumn(b db.Bounty, column string) db.Bounty { +func (_m *Database) UpdateBountyBoolColumn(b db.NewBounty, column string) db.NewBounty { ret := _m.Called(b, column) if len(ret) == 0 { panic("no return value specified for UpdateBountyBoolColumn") } - var r0 db.Bounty - if rf, ok := ret.Get(0).(func(db.Bounty, string) db.Bounty); ok { + var r0 db.NewBounty + if rf, ok := ret.Get(0).(func(db.NewBounty, string) db.NewBounty); ok { r0 = rf(b, column) } else { - r0 = ret.Get(0).(db.Bounty) + r0 = ret.Get(0).(db.NewBounty) } return r0 @@ -5721,42 +5721,42 @@ type Database_UpdateBountyBoolColumn_Call struct { } // UpdateBountyBoolColumn is a helper method to define mock.On call -// - b db.Bounty +// - b db.NewBounty // - column string func (_e *Database_Expecter) UpdateBountyBoolColumn(b interface{}, column interface{}) *Database_UpdateBountyBoolColumn_Call { return &Database_UpdateBountyBoolColumn_Call{Call: _e.mock.On("UpdateBountyBoolColumn", b, column)} } -func (_c *Database_UpdateBountyBoolColumn_Call) Run(run func(b db.Bounty, column string)) *Database_UpdateBountyBoolColumn_Call { +func (_c *Database_UpdateBountyBoolColumn_Call) Run(run func(b db.NewBounty, column string)) *Database_UpdateBountyBoolColumn_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(db.Bounty), args[1].(string)) + run(args[0].(db.NewBounty), args[1].(string)) }) return _c } -func (_c *Database_UpdateBountyBoolColumn_Call) Return(_a0 db.Bounty) *Database_UpdateBountyBoolColumn_Call { +func (_c *Database_UpdateBountyBoolColumn_Call) Return(_a0 db.NewBounty) *Database_UpdateBountyBoolColumn_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_UpdateBountyBoolColumn_Call) RunAndReturn(run func(db.Bounty, string) db.Bounty) *Database_UpdateBountyBoolColumn_Call { +func (_c *Database_UpdateBountyBoolColumn_Call) RunAndReturn(run func(db.NewBounty, string) db.NewBounty) *Database_UpdateBountyBoolColumn_Call { _c.Call.Return(run) return _c } // UpdateBountyNullColumn provides a mock function with given fields: b, column -func (_m *Database) UpdateBountyNullColumn(b db.Bounty, column string) db.Bounty { +func (_m *Database) UpdateBountyNullColumn(b db.NewBounty, column string) db.NewBounty { ret := _m.Called(b, column) if len(ret) == 0 { panic("no return value specified for UpdateBountyNullColumn") } - var r0 db.Bounty - if rf, ok := ret.Get(0).(func(db.Bounty, string) db.Bounty); ok { + var r0 db.NewBounty + if rf, ok := ret.Get(0).(func(db.NewBounty, string) db.NewBounty); ok { r0 = rf(b, column) } else { - r0 = ret.Get(0).(db.Bounty) + r0 = ret.Get(0).(db.NewBounty) } return r0 @@ -5768,49 +5768,49 @@ type Database_UpdateBountyNullColumn_Call struct { } // UpdateBountyNullColumn is a helper method to define mock.On call -// - b db.Bounty +// - b db.NewBounty // - column string func (_e *Database_Expecter) UpdateBountyNullColumn(b interface{}, column interface{}) *Database_UpdateBountyNullColumn_Call { return &Database_UpdateBountyNullColumn_Call{Call: _e.mock.On("UpdateBountyNullColumn", b, column)} } -func (_c *Database_UpdateBountyNullColumn_Call) Run(run func(b db.Bounty, column string)) *Database_UpdateBountyNullColumn_Call { +func (_c *Database_UpdateBountyNullColumn_Call) Run(run func(b db.NewBounty, column string)) *Database_UpdateBountyNullColumn_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(db.Bounty), args[1].(string)) + run(args[0].(db.NewBounty), args[1].(string)) }) return _c } -func (_c *Database_UpdateBountyNullColumn_Call) Return(_a0 db.Bounty) *Database_UpdateBountyNullColumn_Call { +func (_c *Database_UpdateBountyNullColumn_Call) Return(_a0 db.NewBounty) *Database_UpdateBountyNullColumn_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_UpdateBountyNullColumn_Call) RunAndReturn(run func(db.Bounty, string) db.Bounty) *Database_UpdateBountyNullColumn_Call { +func (_c *Database_UpdateBountyNullColumn_Call) RunAndReturn(run func(db.NewBounty, string) db.NewBounty) *Database_UpdateBountyNullColumn_Call { _c.Call.Return(run) return _c } // UpdateBountyPayment provides a mock function with given fields: b -func (_m *Database) UpdateBountyPayment(b db.Bounty) (db.Bounty, error) { +func (_m *Database) UpdateBountyPayment(b db.NewBounty) (db.NewBounty, error) { ret := _m.Called(b) if len(ret) == 0 { panic("no return value specified for UpdateBountyPayment") } - var r0 db.Bounty + var r0 db.NewBounty var r1 error - if rf, ok := ret.Get(0).(func(db.Bounty) (db.Bounty, error)); ok { + if rf, ok := ret.Get(0).(func(db.NewBounty) (db.NewBounty, error)); ok { return rf(b) } - if rf, ok := ret.Get(0).(func(db.Bounty) db.Bounty); ok { + if rf, ok := ret.Get(0).(func(db.NewBounty) db.NewBounty); ok { r0 = rf(b) } else { - r0 = ret.Get(0).(db.Bounty) + r0 = ret.Get(0).(db.NewBounty) } - if rf, ok := ret.Get(1).(func(db.Bounty) error); ok { + if rf, ok := ret.Get(1).(func(db.NewBounty) error); ok { r1 = rf(b) } else { r1 = ret.Error(1) @@ -5825,24 +5825,24 @@ type Database_UpdateBountyPayment_Call struct { } // UpdateBountyPayment is a helper method to define mock.On call -// - b db.Bounty +// - b db.NewBounty func (_e *Database_Expecter) UpdateBountyPayment(b interface{}) *Database_UpdateBountyPayment_Call { return &Database_UpdateBountyPayment_Call{Call: _e.mock.On("UpdateBountyPayment", b)} } -func (_c *Database_UpdateBountyPayment_Call) Run(run func(b db.Bounty)) *Database_UpdateBountyPayment_Call { +func (_c *Database_UpdateBountyPayment_Call) Run(run func(b db.NewBounty)) *Database_UpdateBountyPayment_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(db.Bounty)) + run(args[0].(db.NewBounty)) }) return _c } -func (_c *Database_UpdateBountyPayment_Call) Return(_a0 db.Bounty, _a1 error) *Database_UpdateBountyPayment_Call { +func (_c *Database_UpdateBountyPayment_Call) Return(_a0 db.NewBounty, _a1 error) *Database_UpdateBountyPayment_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *Database_UpdateBountyPayment_Call) RunAndReturn(run func(db.Bounty) (db.Bounty, error)) *Database_UpdateBountyPayment_Call { +func (_c *Database_UpdateBountyPayment_Call) RunAndReturn(run func(db.NewBounty) (db.NewBounty, error)) *Database_UpdateBountyPayment_Call { _c.Call.Return(run) return _c } @@ -5963,18 +5963,18 @@ func (_c *Database_UpdateGithubIssues_Call) RunAndReturn(run func(uint, map[stri } // UpdateInvoice provides a mock function with given fields: payment_request -func (_m *Database) UpdateInvoice(payment_request string) db.InvoiceList { +func (_m *Database) UpdateInvoice(payment_request string) db.NewInvoiceList { ret := _m.Called(payment_request) if len(ret) == 0 { panic("no return value specified for UpdateInvoice") } - var r0 db.InvoiceList - if rf, ok := ret.Get(0).(func(string) db.InvoiceList); ok { + var r0 db.NewInvoiceList + if rf, ok := ret.Get(0).(func(string) db.NewInvoiceList); ok { r0 = rf(payment_request) } else { - r0 = ret.Get(0).(db.InvoiceList) + r0 = ret.Get(0).(db.NewInvoiceList) } return r0 @@ -5998,12 +5998,12 @@ func (_c *Database_UpdateInvoice_Call) Run(run func(payment_request string)) *Da return _c } -func (_c *Database_UpdateInvoice_Call) Return(_a0 db.InvoiceList) *Database_UpdateInvoice_Call { +func (_c *Database_UpdateInvoice_Call) Return(_a0 db.NewInvoiceList) *Database_UpdateInvoice_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_UpdateInvoice_Call) RunAndReturn(run func(string) db.InvoiceList) *Database_UpdateInvoice_Call { +func (_c *Database_UpdateInvoice_Call) RunAndReturn(run func(string) db.NewInvoiceList) *Database_UpdateInvoice_Call { _c.Call.Return(run) return _c } @@ -6219,18 +6219,18 @@ func (_c *Database_UpdateTwitterConfirmed_Call) RunAndReturn(run func(uint, bool } // UpdateWorkspaceBudget provides a mock function with given fields: budget -func (_m *Database) UpdateWorkspaceBudget(budget db.BountyBudget) db.BountyBudget { +func (_m *Database) UpdateWorkspaceBudget(budget db.NewBountyBudget) db.NewBountyBudget { ret := _m.Called(budget) if len(ret) == 0 { panic("no return value specified for UpdateWorkspaceBudget") } - var r0 db.BountyBudget - if rf, ok := ret.Get(0).(func(db.BountyBudget) db.BountyBudget); ok { + var r0 db.NewBountyBudget + if rf, ok := ret.Get(0).(func(db.NewBountyBudget) db.NewBountyBudget); ok { r0 = rf(budget) } else { - r0 = ret.Get(0).(db.BountyBudget) + r0 = ret.Get(0).(db.NewBountyBudget) } return r0 @@ -6242,24 +6242,24 @@ type Database_UpdateWorkspaceBudget_Call struct { } // UpdateWorkspaceBudget is a helper method to define mock.On call -// - budget db.BountyBudget +// - budget db.NewBountyBudget func (_e *Database_Expecter) UpdateWorkspaceBudget(budget interface{}) *Database_UpdateWorkspaceBudget_Call { return &Database_UpdateWorkspaceBudget_Call{Call: _e.mock.On("UpdateWorkspaceBudget", budget)} } -func (_c *Database_UpdateWorkspaceBudget_Call) Run(run func(budget db.BountyBudget)) *Database_UpdateWorkspaceBudget_Call { +func (_c *Database_UpdateWorkspaceBudget_Call) Run(run func(budget db.NewBountyBudget)) *Database_UpdateWorkspaceBudget_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(db.BountyBudget)) + run(args[0].(db.NewBountyBudget)) }) return _c } -func (_c *Database_UpdateWorkspaceBudget_Call) Return(_a0 db.BountyBudget) *Database_UpdateWorkspaceBudget_Call { +func (_c *Database_UpdateWorkspaceBudget_Call) Return(_a0 db.NewBountyBudget) *Database_UpdateWorkspaceBudget_Call { _c.Call.Return(_a0) return _c } -func (_c *Database_UpdateWorkspaceBudget_Call) RunAndReturn(run func(db.BountyBudget) db.BountyBudget) *Database_UpdateWorkspaceBudget_Call { +func (_c *Database_UpdateWorkspaceBudget_Call) RunAndReturn(run func(db.NewBountyBudget) db.NewBountyBudget) *Database_UpdateWorkspaceBudget_Call { _c.Call.Return(run) return _c } From ac293a57a1200e72e4d2dadf35b62989af536f6f Mon Sep 17 00:00:00 2001 From: elraphty Date: Wed, 24 Apr 2024 14:03:13 +0100 Subject: [PATCH 11/21] passed all unit tests --- db/db.go | 4 +- db/interface.go | 2 +- db/structs.go | 7 ++ handlers/bounty.go | 67 ++++++++++++++- handlers/bounty_test.go | 56 +++++++------ handlers/tribes_test.go | 23 +++--- handlers/workspaces_test.go | 158 ++++++++++++++++++------------------ mocks/Database.go | 14 ++-- routes/bounty.go | 1 + 9 files changed, 204 insertions(+), 128 deletions(-) diff --git a/db/db.go b/db/db.go index fffda8a02..d2af69fb5 100644 --- a/db/db.go +++ b/db/db.go @@ -1249,8 +1249,8 @@ func (db database) UpdateBountyBoolColumn(b NewBounty, column string) NewBounty return b } -func (db database) DeleteBounty(pubkey string, created string) (Bounty, error) { - m := Bounty{} +func (db database) DeleteBounty(pubkey string, created string) (NewBounty, error) { + m := NewBounty{} db.db.Where("owner_id", pubkey).Where("created", created).Delete(&m) return m, nil } diff --git a/db/interface.go b/db/interface.go index 0a2371294..e3cc95163 100644 --- a/db/interface.go +++ b/db/interface.go @@ -47,7 +47,7 @@ type Database interface { CreateOrEditBounty(b NewBounty) (NewBounty, error) UpdateBountyNullColumn(b NewBounty, column string) NewBounty UpdateBountyBoolColumn(b NewBounty, column string) NewBounty - DeleteBounty(pubkey string, created string) (Bounty, error) + DeleteBounty(pubkey string, created string) (NewBounty, error) GetBountyByCreated(created uint) (NewBounty, error) GetBounty(id uint) NewBounty UpdateBounty(b NewBounty) (NewBounty, error) diff --git a/db/structs.go b/db/structs.go index 7a34d2520..7f1bf8ea6 100644 --- a/db/structs.go +++ b/db/structs.go @@ -736,6 +736,13 @@ type WithdrawBudgetRequest struct { OrgUuid string `json:"org_uuid"` } +// change back to WithdrawBudgetReques +type NewWithdrawBudgetRequest struct { + PaymentRequest string `json:"payment_request"` + Websocket_token string `json:"websocket_token,omitempty"` + WorkspaceUuid string `json:"workspace_uuid"` +} + type PaymentDateRange struct { StartDate string `json:"start_date"` EndDate string `json:"end_date"` diff --git a/handlers/bounty.go b/handlers/bounty.go index 7306b3a01..1e8caedb6 100644 --- a/handlers/bounty.go +++ b/handlers/bounty.go @@ -600,8 +600,6 @@ func (h *bountyHandler) BountyBudgetWithdraw(w http.ResponseWriter, r *http.Requ body, err := io.ReadAll(r.Body) r.Body.Close() - fmt.Println("WithdraW Request ===", request) - err = json.Unmarshal(body, &request) if err != nil { w.WriteHeader(http.StatusNotAcceptable) @@ -649,6 +647,71 @@ func (h *bountyHandler) BountyBudgetWithdraw(w http.ResponseWriter, r *http.Requ m.Unlock() } +// Todo: change back to NewBountyBudgetWithdraw +func (h *bountyHandler) NewBountyBudgetWithdraw(w http.ResponseWriter, r *http.Request) { + var m sync.Mutex + m.Lock() + + ctx := r.Context() + pubKeyFromAuth, _ := ctx.Value(auth.ContextKey).(string) + + if pubKeyFromAuth == "" { + fmt.Println("no pubkey from auth") + w.WriteHeader(http.StatusUnauthorized) + return + } + + request := db.NewWithdrawBudgetRequest{} + body, err := io.ReadAll(r.Body) + r.Body.Close() + + err = json.Unmarshal(body, &request) + if err != nil { + w.WriteHeader(http.StatusNotAcceptable) + return + } + + // check if user is the admin of the workspace + // or has a withdraw bounty budget role + hasRole := h.userHasAccess(pubKeyFromAuth, request.WorkspaceUuid, db.WithdrawBudget) + if !hasRole { + w.WriteHeader(http.StatusUnauthorized) + errMsg := formatPayError("You don't have appropriate permissions to withdraw bounty budget") + json.NewEncoder(w).Encode(errMsg) + return + } + + amount := utils.GetInvoiceAmount(request.PaymentRequest) + + if err == nil && amount > 0 { + // check if the workspace bounty balance + // is greater than the amount + orgBudget := h.db.GetWorkspaceBudget(request.WorkspaceUuid) + if amount > orgBudget.TotalBudget { + w.WriteHeader(http.StatusForbidden) + errMsg := formatPayError("Workspace budget is not enough to withdraw the amount") + json.NewEncoder(w).Encode(errMsg) + return + } + paymentSuccess, paymentError := h.PayLightningInvoice(request.PaymentRequest) + if paymentSuccess.Success { + // withdraw amount from workspace budget + h.db.WithdrawBudget(pubKeyFromAuth, request.WorkspaceUuid, amount) + w.WriteHeader(http.StatusOK) + json.NewEncoder(w).Encode(paymentSuccess) + } else { + w.WriteHeader(http.StatusBadRequest) + json.NewEncoder(w).Encode(paymentError) + } + } else { + w.WriteHeader(http.StatusForbidden) + errMsg := formatPayError("Could not pay lightning invoice") + json.NewEncoder(w).Encode(errMsg) + } + + m.Unlock() +} + func formatPayError(errorMsg string) db.InvoicePayError { return db.InvoicePayError{ Success: false, diff --git a/handlers/bounty_test.go b/handlers/bounty_test.go index fb0750a20..bfed8dc93 100644 --- a/handlers/bounty_test.go +++ b/handlers/bounty_test.go @@ -261,6 +261,7 @@ func TestCreateOrEditBounty(t *testing.T) { Title: "first bounty", Description: "first bounty description", WorkspaceUuid: "work-1", + OrgUuid: "org-1", OwnerID: "test-key", } mockDb.On("UpdateBountyNullColumn", mock.AnythingOfType("db.NewBounty"), "assignee").Return(db.Bounty{Assignee: "test-key"}) @@ -446,7 +447,7 @@ func TestDeleteBounty(t *testing.T) { t.Run("should return error if failed to delete from db", func(t *testing.T) { rr := httptest.NewRecorder() handler := http.HandlerFunc(bHandler.DeleteBounty) - mockDb.On("DeleteBounty", "pub-key", "1111").Return(db.Bounty{}, errors.New("some-error")).Once() + mockDb.On("DeleteBounty", "pub-key", "1111").Return(db.NewBounty{}, errors.New("some-error")).Once() rctx := chi.NewRouteContext() rctx.URLParams.Add("pubkey", "pub-key") @@ -464,7 +465,7 @@ func TestDeleteBounty(t *testing.T) { t.Run("should successfully delete bounty from db", func(t *testing.T) { rr := httptest.NewRecorder() handler := http.HandlerFunc(bHandler.DeleteBounty) - existingBounty := db.Bounty{ + existingBounty := db.NewBounty{ OwnerID: "pub-key", Created: 1111, } @@ -479,7 +480,7 @@ func TestDeleteBounty(t *testing.T) { } handler.ServeHTTP(rr, req) - var returnedBounty db.Bounty + var returnedBounty db.NewBounty _ = json.Unmarshal(rr.Body.Bytes(), &returnedBounty) assert.Equal(t, http.StatusOK, rr.Code) assert.EqualValues(t, existingBounty, returnedBounty) @@ -879,6 +880,7 @@ func TestGetBountyById(t *testing.T) { Tribe: "development", Assignee: "user1", TicketUrl: "http://example.com/issues/1", + OrgUuid: "org-789", WorkspaceUuid: "work-789", Description: "This bounty is for fixing a critical bug in the payment system that causes transactions to fail under certain conditions.", WantedType: "immediate", @@ -904,7 +906,7 @@ func TestGetBountyById(t *testing.T) { mockDb.On("GetBountyById", mock.Anything).Return([]db.NewBounty{bounty}, nil).Once() mockDb.On("GetPersonByPubkey", "owner123").Return(db.Person{}).Once() mockDb.On("GetPersonByPubkey", "user1").Return(db.Person{}).Once() - mockDb.On("GetWorkspaceByUuid", "org-789").Return(db.Workspace{}).Once() + mockDb.On("GetWorkspaceByUuid", "work-789").Return(db.Workspace{}).Once() handler.ServeHTTP(rr, req) @@ -1298,7 +1300,7 @@ func TestMakeBountyPayment(t *testing.T) { Assignee: "assignee-1", Paid: false, }, nil) - mockDb.On("GetWorkspaceBudget", "org-1").Return(db.BountyBudget{ + mockDb.On("GetWorkspaceBudget", "work-1").Return(db.NewBountyBudget{ TotalBudget: 500, }, nil) @@ -1335,9 +1337,9 @@ func TestMakeBountyPayment(t *testing.T) { } mockDb.On("GetBounty", bountyID).Return(bounty, nil) - mockDb.On("GetWorkspaceBudget", bounty.OrgUuid).Return(db.BountyBudget{TotalBudget: 2000}, nil) + mockDb.On("GetWorkspaceBudget", bounty.WorkspaceUuid).Return(db.NewBountyBudget{TotalBudget: 2000}, nil) mockDb.On("GetPersonByPubkey", bounty.Assignee).Return(db.Person{OwnerPubKey: "assignee-1", OwnerRouteHint: "OwnerRouteHint"}, nil) - mockDb.On("AddPaymentHistory", mock.AnythingOfType("db.PaymentHistory")).Return(db.PaymentHistory{ID: 1}) + mockDb.On("AddPaymentHistory", mock.AnythingOfType("db.NewPaymentHistory")).Return(db.NewPaymentHistory{ID: 1}) mockDb.On("UpdateBounty", mock.AnythingOfType("db.NewBounty")).Run(func(args mock.Arguments) { updatedBounty := args.Get(0).(db.NewBounty) assert.True(t, updatedBounty.Paid) @@ -1384,7 +1386,7 @@ func TestMakeBountyPayment(t *testing.T) { bHandler2.userHasAccess = mockUserHasAccessTrue mockDb2.On("GetBounty", bountyID).Return(bounty, nil) - mockDb2.On("GetWorkspaceBudget", bounty.OrgUuid).Return(db.BountyBudget{TotalBudget: 2000}, nil) + mockDb2.On("GetWorkspaceBudget", bounty.WorkspaceUuid).Return(db.NewBountyBudget{TotalBudget: 2000}, nil) mockDb2.On("GetPersonByPubkey", bounty.Assignee).Return(db.Person{OwnerPubKey: "assignee-1", OwnerRouteHint: "OwnerRouteHint"}, nil) expectedUrl := fmt.Sprintf("%s/payment", config.RelayUrl) @@ -1484,7 +1486,7 @@ func TestBountyBudgetWithdraw(t *testing.T) { bHandler := NewBountyHandler(mockHttpClient, mockDb) bHandler.userHasAccess = mockUserHasAccessTrue - mockDb.On("GetWorkspaceBudget", "org-1").Return(db.BountyBudget{ + mockDb.On("GetWorkspaceBudget", "org-1").Return(db.NewBountyBudget{ TotalBudget: 500, }, nil) invoice := "lnbc15u1p3xnhl2pp5jptserfk3zk4qy42tlucycrfwxhydvlemu9pqr93tuzlv9cc7g3sdqsvfhkcap3xyhx7un8cqzpgxqzjcsp5f8c52y2stc300gl6s4xswtjpc37hrnnr3c9wvtgjfuvqmpm35evq9qyyssqy4lgd8tj637qcjp05rdpxxykjenthxftej7a2zzmwrmrl70fyj9hvj0rewhzj7jfyuwkwcg9g2jpwtk3wkjtwnkdks84hsnu8xps5vsq4gj5hs" @@ -1516,7 +1518,7 @@ func TestBountyBudgetWithdraw(t *testing.T) { paymentAmount := uint(1500) - mockDb.On("GetWorkspaceBudget", "org-1").Return(db.BountyBudget{ + mockDb.On("GetWorkspaceBudget", "org-1").Return(db.NewBountyBudget{ TotalBudget: 5000, }, nil) mockDb.On("WithdrawBudget", "valid-key", "org-1", paymentAmount).Return(nil) @@ -1553,7 +1555,7 @@ func TestBountyBudgetWithdraw(t *testing.T) { bHandler := NewBountyHandler(mockHttpClient, mockDb) bHandler.userHasAccess = mockUserHasAccessTrue - mockDb.On("GetWorkspaceBudget", "org-1").Return(db.BountyBudget{ + mockDb.On("GetWorkspaceBudget", "org-1").Return(db.NewBountyBudget{ TotalBudget: 5000, }, nil) mockHttpClient.On("Do", mock.AnythingOfType("*http.Request")).Return(&http.Response{ @@ -1602,7 +1604,7 @@ func TestBountyBudgetWithdraw(t *testing.T) { mockHttpClient.ExpectedCalls = nil mockHttpClient.Calls = nil - mockDb.On("GetWorkspaceBudget", "org-1").Return(db.BountyBudget{ + mockDb.On("GetWorkspaceBudget", "org-1").Return(db.NewBountyBudget{ TotalBudget: expectedFinalBudget, }, nil) mockDb.On("WithdrawBudget", "valid-key", "org-1", paymentAmount).Return(nil) @@ -1733,16 +1735,18 @@ func TestPollInvoice(t *testing.T) { }, nil).Once() bountyID := uint(1) - bounty := db.Bounty{ - ID: bountyID, - OrgUuid: "org-1", - Assignee: "assignee-1", - Price: uint(1000), + bounty := db.NewBounty{ + ID: bountyID, + WorkspaceUuid: "work-1", + OrgUuid: "org-1", + Assignee: "assignee-1", + Price: uint(1000), } now := time.Now() - expectedBounty := db.Bounty{ + expectedBounty := db.NewBounty{ ID: bountyID, + WorkspaceUuid: "work-1", OrgUuid: "org-1", Assignee: "assignee-1", Price: uint(1000), @@ -1751,15 +1755,15 @@ func TestPollInvoice(t *testing.T) { CompletionDate: &now, } - mockDb.On("GetInvoice", "1").Return(db.InvoiceList{Type: "KEYSEND"}) + mockDb.On("GetInvoice", "1").Return(db.NewInvoiceList{Type: "KEYSEND"}) mockDb.On("GetUserInvoiceData", "1").Return(db.UserInvoiceData{Amount: 1000, UserPubkey: "UserPubkey", RouteHint: "RouteHint", Created: 1234}) - mockDb.On("GetInvoice", "1").Return(db.InvoiceList{Status: false}) + mockDb.On("GetInvoice", "1").Return(db.NewInvoiceList{Status: false}) mockDb.On("GetBountyByCreated", uint(1234)).Return(bounty, nil) mockDb.On("UpdateBounty", mock.AnythingOfType("db.NewBounty")).Run(func(args mock.Arguments) { - updatedBounty := args.Get(0).(db.Bounty) + updatedBounty := args.Get(0).(db.NewBounty) assert.True(t, updatedBounty.Paid) }).Return(expectedBounty, nil).Once() - mockDb.On("UpdateInvoice", "1").Return(db.InvoiceList{}).Once() + mockDb.On("UpdateInvoice", "1").Return(db.NewInvoiceList{}).Once() expectedPaymentUrl := fmt.Sprintf("%s/payment", config.RelayUrl) expectedPaymentBody := `{"amount": 1000, "destination_key": "UserPubkey", "route_hint": "RouteHint", "text": "memotext added for notification"}` @@ -1804,11 +1808,11 @@ func TestPollInvoice(t *testing.T) { Body: r, }, nil).Once() - mockDb.On("GetInvoice", "1").Return(db.InvoiceList{Type: "BUDGET"}) + mockDb.On("GetInvoice", "1").Return(db.NewInvoiceList{Type: "BUDGET"}) mockDb.On("GetUserInvoiceData", "1").Return(db.UserInvoiceData{Amount: 1000, UserPubkey: "UserPubkey", RouteHint: "RouteHint", Created: 1234}) - mockDb.On("GetInvoice", "1").Return(db.InvoiceList{Status: false}) - mockDb.On("AddAndUpdateBudget", mock.Anything).Return(db.PaymentHistory{}) - mockDb.On("UpdateInvoice", "1").Return(db.InvoiceList{}).Once() + mockDb.On("GetInvoice", "1").Return(db.NewInvoiceList{Status: false}) + mockDb.On("AddAndUpdateBudget", mock.Anything).Return(db.NewPaymentHistory{}) + mockDb.On("UpdateInvoice", "1").Return(db.NewInvoiceList{}).Once() ro := chi.NewRouter() ro.Post("/poll/invoice/{paymentRequest}", bHandler.PollInvoice) diff --git a/handlers/tribes_test.go b/handlers/tribes_test.go index 8b1a6e96a..fabe3cf7e 100644 --- a/handlers/tribes_test.go +++ b/handlers/tribes_test.go @@ -4,12 +4,13 @@ import ( "bytes" "context" "encoding/json" - "github.com/stakwork/sphinx-tribes/config" "net/http" "net/http/httptest" "strings" "testing" + "github.com/stakwork/sphinx-tribes/config" + "github.com/go-chi/chi" "github.com/lib/pq" "github.com/stakwork/sphinx-tribes/auth" @@ -636,8 +637,8 @@ func TestGenerateBudgetInvoice(t *testing.T) { t.Run("Should mock a call to relay /invoices with the correct body", func(t *testing.T) { - mockDb.On("AddPaymentHistory", mock.AnythingOfType("db.PaymentHistory")).Return(db.PaymentHistory{}, nil) - mockDb.On("AddInvoice", mock.AnythingOfType("db.InvoiceList")).Return(db.InvoiceList{}, nil) + mockDb.On("AddPaymentHistory", mock.AnythingOfType("db.NewPaymentHistory")).Return(db.NewPaymentHistory{}, nil) + mockDb.On("AddInvoice", mock.AnythingOfType("db.NewInvoiceList")).Return(db.NewInvoiceList{}, nil) ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -672,8 +673,8 @@ func TestGenerateBudgetInvoice(t *testing.T) { userAmount := float64(1000) - mockDb.On("AddPaymentHistory", mock.AnythingOfType("db.PaymentHistory")).Return(db.PaymentHistory{}, nil) - mockDb.On("AddInvoice", mock.AnythingOfType("db.InvoiceList")).Return(db.InvoiceList{}, nil) + mockDb.On("AddPaymentHistory", mock.AnythingOfType("db.NewPaymentHistory")).Return(db.NewPaymentHistory{}, nil) + mockDb.On("AddInvoice", mock.AnythingOfType("db.NewInvoiceList")).Return(db.NewInvoiceList{}, nil) ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var body map[string]interface{} @@ -703,11 +704,11 @@ func TestGenerateBudgetInvoice(t *testing.T) { }) t.Run("Should add payments to the payment history and invoice to the invoice list upon successful relay call", func(t *testing.T) { - expectedPaymentHistory := db.PaymentHistory{Amount: userAmount} - expectedInvoice := db.InvoiceList{PaymentRequest: invoiceResponse.Response.Invoice} + expectedPaymentHistory := db.NewPaymentHistory{Amount: userAmount} + expectedInvoice := db.NewInvoiceList{PaymentRequest: invoiceResponse.Response.Invoice} - mockDb.On("AddPaymentHistory", mock.AnythingOfType("db.PaymentHistory")).Return(expectedPaymentHistory, nil) - mockDb.On("AddInvoice", mock.AnythingOfType("db.InvoiceList")).Return(expectedInvoice, nil) + mockDb.On("AddPaymentHistory", mock.AnythingOfType("db.NewPaymentHistory")).Return(expectedPaymentHistory, nil) + mockDb.On("AddInvoice", mock.AnythingOfType("db.NewInvoiceList")).Return(expectedInvoice, nil) ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) @@ -734,7 +735,7 @@ func TestGenerateBudgetInvoice(t *testing.T) { assert.True(t, response.Succcess, "Invoice generation should be successful") assert.Equal(t, "example_invoice", response.Response.Invoice, "The invoice in the response should match the mock") - mockDb.AssertCalled(t, "AddPaymentHistory", mock.AnythingOfType("db.PaymentHistory")) - mockDb.AssertCalled(t, "AddInvoice", mock.AnythingOfType("db.InvoiceList")) + mockDb.AssertCalled(t, "AddPaymentHistory", mock.AnythingOfType("db.NewPaymentHistory")) + mockDb.AssertCalled(t, "AddInvoice", mock.AnythingOfType("db.NewInvoiceList")) }) } diff --git a/handlers/workspaces_test.go b/handlers/workspaces_test.go index 4447d4a47..09f291a5a 100644 --- a/handlers/workspaces_test.go +++ b/handlers/workspaces_test.go @@ -101,7 +101,7 @@ func TestUnitCreateOrEditWorkspace(t *testing.T) { assert.Equal(t, http.StatusBadRequest, rr.Code) }) - t.Run("should trim spaces from organization name", func(t *testing.T) { + t.Run("should trim spaces from workspace name", func(t *testing.T) { rr := httptest.NewRecorder() handler := http.HandlerFunc(oHandler.CreateOrEditWorkspace) @@ -130,7 +130,7 @@ func TestUnitCreateOrEditWorkspace(t *testing.T) { assert.Equal(t, "Abdul", responseOrg.Name) }) - t.Run("should successfully add organization if request is valid", func(t *testing.T) { + t.Run("should successfully add workspace if request is valid", func(t *testing.T) { rr := httptest.NewRecorder() handler := http.HandlerFunc(oHandler.CreateOrEditWorkspace) @@ -184,13 +184,13 @@ func TestDeleteWorkspace(t *testing.T) { oHandler := NewWorkspaceHandler(mockDb) t.Run("should return error if not authorized", func(t *testing.T) { - orgUUID := "org-uuid" + workspaceUUID := "org-uuid" rr := httptest.NewRecorder() handler := http.HandlerFunc(oHandler.DeleteWorkspace) rctx := chi.NewRouteContext() - rctx.URLParams.Add("uuid", orgUUID) - req, err := http.NewRequestWithContext(context.WithValue(context.Background(), chi.RouteCtxKey, rctx), http.MethodDelete, "/delete/"+orgUUID, nil) + rctx.URLParams.Add("uuid", workspaceUUID) + req, err := http.NewRequestWithContext(context.WithValue(context.Background(), chi.RouteCtxKey, rctx), http.MethodDelete, "/delete/"+workspaceUUID, nil) if err != nil { t.Fatal(err) } @@ -200,21 +200,21 @@ func TestDeleteWorkspace(t *testing.T) { assert.Equal(t, http.StatusUnauthorized, rr.Code) }) - t.Run("should set organization fields to null and delete users on successful delete", func(t *testing.T) { - orgUUID := "org-uuid" + t.Run("should set workspace fields to null and delete users on successful delete", func(t *testing.T) { + workspaceUUID := "org-uuid" // Mock expected database interactions - mockDb.On("GetWorkspaceByUuid", orgUUID).Return(db.Workspace{OwnerPubKey: "test-key"}).Once() - mockDb.On("UpdateWorkspaceForDeletion", orgUUID).Return(nil).Once() - mockDb.On("DeleteAllUsersFromWorkspace", orgUUID).Return(nil).Once() - mockDb.On("ChangeWorkspaceDeleteStatus", orgUUID, true).Return(db.Workspace{Uuid: orgUUID, Deleted: true}).Once() + mockDb.On("GetWorkspaceByUuid", workspaceUUID).Return(db.Workspace{OwnerPubKey: "test-key"}).Once() + mockDb.On("UpdateWorkspaceForDeletion", workspaceUUID).Return(nil).Once() + mockDb.On("DeleteAllUsersFromWorkspace", workspaceUUID).Return(nil).Once() + mockDb.On("ChangeWorkspaceDeleteStatus", workspaceUUID, true).Return(db.Workspace{Uuid: workspaceUUID, Deleted: true}).Once() rr := httptest.NewRecorder() handler := http.HandlerFunc(oHandler.DeleteWorkspace) rctx := chi.NewRouteContext() - rctx.URLParams.Add("uuid", orgUUID) - req, err := http.NewRequestWithContext(context.WithValue(ctx, chi.RouteCtxKey, rctx), http.MethodDelete, "/delete/"+orgUUID, nil) + rctx.URLParams.Add("uuid", workspaceUUID) + req, err := http.NewRequestWithContext(context.WithValue(ctx, chi.RouteCtxKey, rctx), http.MethodDelete, "/delete/"+workspaceUUID, nil) if err != nil { t.Fatal(err) } @@ -226,18 +226,18 @@ func TestDeleteWorkspace(t *testing.T) { }) t.Run("should handle failures in database updates", func(t *testing.T) { - orgUUID := "org-uuid" + workspaceUUID := "org-uuid" // Mock database interactions with error - mockDb.On("GetWorkspaceByUuid", orgUUID).Return(db.Workspace{OwnerPubKey: "test-key"}).Once() - mockDb.On("UpdateWorkspaceForDeletion", orgUUID).Return(errors.New("update error")).Once() + mockDb.On("GetWorkspaceByUuid", workspaceUUID).Return(db.Workspace{OwnerPubKey: "test-key"}).Once() + mockDb.On("UpdateWorkspaceForDeletion", workspaceUUID).Return(errors.New("update error")).Once() rr := httptest.NewRecorder() handler := http.HandlerFunc(oHandler.DeleteWorkspace) rctx := chi.NewRouteContext() - rctx.URLParams.Add("uuid", orgUUID) - req, err := http.NewRequestWithContext(context.WithValue(ctx, chi.RouteCtxKey, rctx), http.MethodDelete, "/delete/"+orgUUID, nil) + rctx.URLParams.Add("uuid", workspaceUUID) + req, err := http.NewRequestWithContext(context.WithValue(ctx, chi.RouteCtxKey, rctx), http.MethodDelete, "/delete/"+workspaceUUID, nil) if err != nil { t.Fatal(err) } @@ -248,21 +248,21 @@ func TestDeleteWorkspace(t *testing.T) { mockDb.AssertExpectations(t) }) - t.Run("should set organization's deleted column to true", func(t *testing.T) { - orgUUID := "org-uuid" + t.Run("should set workspace's deleted column to true", func(t *testing.T) { + workspaceUUID := "org-uuid" // Mock the database interactions - mockDb.On("GetWorkspaceByUuid", orgUUID).Return(db.Workspace{OwnerPubKey: "test-key"}).Once() - mockDb.On("UpdateWorkspaceForDeletion", orgUUID).Return(nil).Once() - mockDb.On("DeleteAllUsersFromWorkspace", orgUUID).Return(nil).Once() - mockDb.On("ChangeWorkspaceDeleteStatus", orgUUID, true).Return(db.Workspace{Uuid: orgUUID, Deleted: true}).Once() + mockDb.On("GetWorkspaceByUuid", workspaceUUID).Return(db.Workspace{OwnerPubKey: "test-key"}).Once() + mockDb.On("UpdateWorkspaceForDeletion", workspaceUUID).Return(nil).Once() + mockDb.On("DeleteAllUsersFromWorkspace", workspaceUUID).Return(nil).Once() + mockDb.On("ChangeWorkspaceDeleteStatus", workspaceUUID, true).Return(db.Workspace{Uuid: workspaceUUID, Deleted: true}).Once() rr := httptest.NewRecorder() handler := http.HandlerFunc(oHandler.DeleteWorkspace) rctx := chi.NewRouteContext() - rctx.URLParams.Add("uuid", orgUUID) - req, err := http.NewRequestWithContext(context.WithValue(ctx, chi.RouteCtxKey, rctx), http.MethodDelete, "/delete/"+orgUUID, nil) + rctx.URLParams.Add("uuid", workspaceUUID) + req, err := http.NewRequestWithContext(context.WithValue(ctx, chi.RouteCtxKey, rctx), http.MethodDelete, "/delete/"+workspaceUUID, nil) if err != nil { t.Fatal(err) } @@ -284,27 +284,27 @@ func TestDeleteWorkspace(t *testing.T) { }) t.Run("should set Website, Github, and Description to empty strings", func(t *testing.T) { - orgUUID := "org-uuid" + workspaceUUID := "org-uuid" updatedOrg := db.Workspace{ - Uuid: orgUUID, + Uuid: workspaceUUID, OwnerPubKey: "test-key", Website: "", Github: "", Description: "", } - mockDb.On("GetWorkspaceByUuid", orgUUID).Return(db.Workspace{OwnerPubKey: "test-key"}).Once() - mockDb.On("UpdateWorkspaceForDeletion", orgUUID).Return(nil).Once() - mockDb.On("DeleteAllUsersFromWorkspace", orgUUID).Return(nil).Once() - mockDb.On("ChangeWorkspaceDeleteStatus", orgUUID, true).Return(updatedOrg).Once() + mockDb.On("GetWorkspaceByUuid", workspaceUUID).Return(db.Workspace{OwnerPubKey: "test-key"}).Once() + mockDb.On("UpdateWorkspaceForDeletion", workspaceUUID).Return(nil).Once() + mockDb.On("DeleteAllUsersFromWorkspace", workspaceUUID).Return(nil).Once() + mockDb.On("ChangeWorkspaceDeleteStatus", workspaceUUID, true).Return(updatedOrg).Once() rr := httptest.NewRecorder() handler := http.HandlerFunc(oHandler.DeleteWorkspace) rctx := chi.NewRouteContext() - rctx.URLParams.Add("uuid", orgUUID) - req, err := http.NewRequestWithContext(context.WithValue(ctx, chi.RouteCtxKey, rctx), http.MethodDelete, "/delete/"+orgUUID, nil) + rctx.URLParams.Add("uuid", workspaceUUID) + req, err := http.NewRequestWithContext(context.WithValue(ctx, chi.RouteCtxKey, rctx), http.MethodDelete, "/delete/"+workspaceUUID, nil) if err != nil { t.Fatal(err) } @@ -324,21 +324,21 @@ func TestDeleteWorkspace(t *testing.T) { mockDb.AssertExpectations(t) }) - t.Run("should delete all users from the organization", func(t *testing.T) { - orgUUID := "org-uuid" + t.Run("should delete all users from the workspace", func(t *testing.T) { + workspaceUUID := "org-uuid" // Setting up the expected behavior of the mock database - mockDb.On("GetWorkspaceByUuid", orgUUID).Return(db.Workspace{OwnerPubKey: "test-key"}).Once() - mockDb.On("UpdateWorkspaceForDeletion", orgUUID).Return(nil).Once() - mockDb.On("DeleteAllUsersFromWorkspace", orgUUID).Return(nil).Run(func(args mock.Arguments) {}).Once() - mockDb.On("ChangeWorkspaceDeleteStatus", orgUUID, true).Return(db.Workspace{Uuid: orgUUID, Deleted: true}).Once() + mockDb.On("GetWorkspaceByUuid", workspaceUUID).Return(db.Workspace{OwnerPubKey: "test-key"}).Once() + mockDb.On("UpdateWorkspaceForDeletion", workspaceUUID).Return(nil).Once() + mockDb.On("DeleteAllUsersFromWorkspace", workspaceUUID).Return(nil).Run(func(args mock.Arguments) {}).Once() + mockDb.On("ChangeWorkspaceDeleteStatus", workspaceUUID, true).Return(db.Workspace{Uuid: workspaceUUID, Deleted: true}).Once() rr := httptest.NewRecorder() handler := http.HandlerFunc(oHandler.DeleteWorkspace) rctx := chi.NewRouteContext() - rctx.URLParams.Add("uuid", orgUUID) - req, err := http.NewRequestWithContext(context.WithValue(ctx, chi.RouteCtxKey, rctx), http.MethodDelete, "/delete/"+orgUUID, nil) + rctx.URLParams.Add("uuid", workspaceUUID) + req, err := http.NewRequestWithContext(context.WithValue(ctx, chi.RouteCtxKey, rctx), http.MethodDelete, "/delete/"+workspaceUUID, nil) if err != nil { t.Fatal(err) } @@ -359,19 +359,19 @@ func TestGetWorkspaceBounties(t *testing.T) { } oHandler := NewWorkspaceHandler(mockDb) - t.Run("Should test that an organization's bounties can be listed without authentication", func(t *testing.T) { - orgUUID := "valid-uuid" + t.Run("Should test that a workspace's bounties can be listed without authentication", func(t *testing.T) { + workspaceUUID := "valid-uuid" oHandler.generateBountyHandler = mockGenerateBountyHandler - expectedBounties := []db.Bounty{{}, {}} // Mocked response - mockDb.On("GetWorkspaceBounties", mock.AnythingOfType("*http.Request"), orgUUID).Return(expectedBounties).Once() + expectedBounties := []db.NewBounty{{}, {}} // Mocked response + mockDb.On("GetWorkspaceBounties", mock.AnythingOfType("*http.Request"), workspaceUUID).Return(expectedBounties).Once() rr := httptest.NewRecorder() handler := http.HandlerFunc(oHandler.GetWorkspaceBounties) rctx := chi.NewRouteContext() - rctx.URLParams.Add("uuid", orgUUID) - req, err := http.NewRequestWithContext(context.WithValue(context.Background(), chi.RouteCtxKey, rctx), http.MethodGet, "/bounties/"+orgUUID, nil) + rctx.URLParams.Add("uuid", workspaceUUID) + req, err := http.NewRequestWithContext(context.WithValue(context.Background(), chi.RouteCtxKey, rctx), http.MethodGet, "/bounties/"+workspaceUUID, nil) if err != nil { t.Fatal(err) } @@ -381,17 +381,17 @@ func TestGetWorkspaceBounties(t *testing.T) { assert.Equal(t, http.StatusOK, rr.Code) }) - t.Run("should return empty array when wrong organization UUID is passed", func(t *testing.T) { - orgUUID := "wrong-uuid" + t.Run("should return empty array when wrong workspace UUID is passed", func(t *testing.T) { + workspaceUUID := "wrong-uuid" - mockDb.On("GetWorkspaceBounties", mock.AnythingOfType("*http.Request"), orgUUID).Return([]db.Bounty{}).Once() + mockDb.On("GetWorkspaceBounties", mock.AnythingOfType("*http.Request"), workspaceUUID).Return([]db.NewBounty{}).Once() rr := httptest.NewRecorder() handler := http.HandlerFunc(oHandler.GetWorkspaceBounties) rctx := chi.NewRouteContext() - rctx.URLParams.Add("uuid", orgUUID) - req, err := http.NewRequestWithContext(context.WithValue(ctx, chi.RouteCtxKey, rctx), http.MethodGet, "/bounties/"+orgUUID+"?limit=10&sortBy=created&search=test&page=1&resetPage=true", nil) + rctx.URLParams.Add("uuid", workspaceUUID) + req, err := http.NewRequestWithContext(context.WithValue(ctx, chi.RouteCtxKey, rctx), http.MethodGet, "/bounties/"+workspaceUUID+"?limit=10&sortBy=created&search=test&page=1&resetPage=true", nil) if err != nil { t.Fatal(err) } @@ -414,12 +414,12 @@ func TestGetWorkspaceBudget(t *testing.T) { } oHandler := NewWorkspaceHandler(mockDb) - t.Run("Should test that a 401 is returned when trying to view an organization's budget without a token", func(t *testing.T) { - orgUUID := "valid-uuid" + t.Run("Should test that a 401 is returned when trying to view an workspace's budget without a token", func(t *testing.T) { + workspaceUUID := "valid-uuid" rctx := chi.NewRouteContext() - rctx.URLParams.Add("uuid", orgUUID) - req, err := http.NewRequestWithContext(context.WithValue(context.Background(), chi.RouteCtxKey, rctx), http.MethodGet, "/budget/"+orgUUID, nil) + rctx.URLParams.Add("uuid", workspaceUUID) + req, err := http.NewRequestWithContext(context.WithValue(context.Background(), chi.RouteCtxKey, rctx), http.MethodGet, "/budget/"+workspaceUUID, nil) if err != nil { t.Fatal(err) } @@ -430,10 +430,10 @@ func TestGetWorkspaceBudget(t *testing.T) { assert.Equal(t, http.StatusUnauthorized, rr.Code) }) - t.Run("Should test that the right workspace budget is returned, if the user is the organization admin or has the ViewReport role", func(t *testing.T) { - orgUUID := "valid-uuid" + t.Run("Should test that the right workspace budget is returned, if the user is the workspace admin or has the ViewReport role", func(t *testing.T) { + workspaceUUID := "valid-uuid" statusBudget := db.StatusBudget{ - OrgUuid: orgUUID, + OrgUuid: workspaceUUID, CurrentBudget: 10000, OpenBudget: 1000, OpenCount: 10, @@ -444,11 +444,11 @@ func TestGetWorkspaceBudget(t *testing.T) { } oHandler.userHasAccess = mockUserHasAccess - mockDb.On("GetWorkspaceStatusBudget", orgUUID).Return(statusBudget).Once() + mockDb.On("GetWorkspaceStatusBudget", workspaceUUID).Return(statusBudget).Once() rctx := chi.NewRouteContext() - rctx.URLParams.Add("uuid", orgUUID) - req, err := http.NewRequestWithContext(context.WithValue(ctx, chi.RouteCtxKey, rctx), http.MethodGet, "/budget/"+orgUUID, nil) + rctx.URLParams.Add("uuid", workspaceUUID) + req, err := http.NewRequestWithContext(context.WithValue(ctx, chi.RouteCtxKey, rctx), http.MethodGet, "/budget/"+workspaceUUID, nil) if err != nil { t.Fatal(err) } @@ -473,8 +473,8 @@ func TestGetWorkspaceBudgetHistory(t *testing.T) { mockDb := mocks.NewDatabase(t) oHandler := NewWorkspaceHandler(mockDb) - t.Run("Should test that a 401 is returned when trying to view an organization's budget history without a token", func(t *testing.T) { - orgUUID := "valid-uuid" + t.Run("Should test that a 401 is returned when trying to view an workspace's budget history without a token", func(t *testing.T) { + workspaceUUID := "valid-uuid" mockUserHasAccess := func(pubKeyFromAuth string, uuid string, role string) bool { return false @@ -482,8 +482,8 @@ func TestGetWorkspaceBudgetHistory(t *testing.T) { oHandler.userHasAccess = mockUserHasAccess rctx := chi.NewRouteContext() - rctx.URLParams.Add("uuid", orgUUID) - req, err := http.NewRequestWithContext(context.WithValue(context.Background(), chi.RouteCtxKey, rctx), http.MethodGet, "/budget/history/"+orgUUID, nil) + rctx.URLParams.Add("uuid", workspaceUUID) + req, err := http.NewRequestWithContext(context.WithValue(context.Background(), chi.RouteCtxKey, rctx), http.MethodGet, "/budget/history/"+workspaceUUID, nil) if err != nil { t.Fatal(err) } @@ -494,11 +494,11 @@ func TestGetWorkspaceBudgetHistory(t *testing.T) { assert.Equal(t, http.StatusUnauthorized, rr.Code) }) - t.Run("Should test that the right budget history is returned, if the user is the organization admin or has the ViewReport role", func(t *testing.T) { - orgUUID := "valid-uuid" + t.Run("Should test that the right budget history is returned, if the user is the workspace admin or has the ViewReport role", func(t *testing.T) { + workspaceUUID := "valid-uuid" expectedBudgetHistory := []db.BudgetHistoryData{ - {BudgetHistory: db.BudgetHistory{ID: 1, OrgUuid: orgUUID, Created: nil, Updated: nil}, SenderName: "Sender1"}, - {BudgetHistory: db.BudgetHistory{ID: 2, OrgUuid: orgUUID, Created: nil, Updated: nil}, SenderName: "Sender2"}, + {BudgetHistory: db.BudgetHistory{ID: 1, OrgUuid: workspaceUUID, Created: nil, Updated: nil}, SenderName: "Sender1"}, + {BudgetHistory: db.BudgetHistory{ID: 2, OrgUuid: workspaceUUID, Created: nil, Updated: nil}, SenderName: "Sender2"}, } mockUserHasAccess := func(pubKeyFromAuth string, uuid string, role string) bool { @@ -506,11 +506,11 @@ func TestGetWorkspaceBudgetHistory(t *testing.T) { } oHandler.userHasAccess = mockUserHasAccess - mockDb.On("GetWorkspaceBudgetHistory", orgUUID).Return(expectedBudgetHistory).Once() + mockDb.On("GetWorkspaceBudgetHistory", workspaceUUID).Return(expectedBudgetHistory).Once() rctx := chi.NewRouteContext() - rctx.URLParams.Add("uuid", orgUUID) - req, err := http.NewRequestWithContext(context.WithValue(ctx, chi.RouteCtxKey, rctx), http.MethodGet, "/budget/history/"+orgUUID, nil) + rctx.URLParams.Add("uuid", workspaceUUID) + req, err := http.NewRequestWithContext(context.WithValue(ctx, chi.RouteCtxKey, rctx), http.MethodGet, "/budget/history/"+workspaceUUID, nil) if err != nil { t.Fatal(err) } @@ -535,15 +535,15 @@ func TestGetWorkspaceBountiesCount(t *testing.T) { mockDb := mocks.NewDatabase(t) oHandler := NewWorkspaceHandler(mockDb) - t.Run("should return the count of organization bounties", func(t *testing.T) { - orgUUID := "valid-uuid" + t.Run("should return the count of workspace bounties", func(t *testing.T) { + workspaceUUID := "valid-uuid" expectedCount := int64(5) - mockDb.On("GetWorkspaceBountiesCount", mock.AnythingOfType("*http.Request"), orgUUID).Return(expectedCount).Once() + mockDb.On("GetWorkspaceBountiesCount", mock.AnythingOfType("*http.Request"), workspaceUUID).Return(expectedCount).Once() rctx := chi.NewRouteContext() - rctx.URLParams.Add("uuid", orgUUID) - req, err := http.NewRequestWithContext(context.WithValue(ctx, chi.RouteCtxKey, rctx), http.MethodGet, "/bounties/"+orgUUID+"/count/", nil) + rctx.URLParams.Add("uuid", workspaceUUID) + req, err := http.NewRequestWithContext(context.WithValue(ctx, chi.RouteCtxKey, rctx), http.MethodGet, "/bounties/"+workspaceUUID+"/count/", nil) if err != nil { t.Fatal(err) } diff --git a/mocks/Database.go b/mocks/Database.go index 1de316131..784a2492a 100644 --- a/mocks/Database.go +++ b/mocks/Database.go @@ -1284,22 +1284,22 @@ func (_c *Database_DeleteAllUsersFromWorkspace_Call) RunAndReturn(run func(strin } // DeleteBounty provides a mock function with given fields: pubkey, created -func (_m *Database) DeleteBounty(pubkey string, created string) (db.Bounty, error) { +func (_m *Database) DeleteBounty(pubkey string, created string) (db.NewBounty, error) { ret := _m.Called(pubkey, created) if len(ret) == 0 { panic("no return value specified for DeleteBounty") } - var r0 db.Bounty + var r0 db.NewBounty var r1 error - if rf, ok := ret.Get(0).(func(string, string) (db.Bounty, error)); ok { + if rf, ok := ret.Get(0).(func(string, string) (db.NewBounty, error)); ok { return rf(pubkey, created) } - if rf, ok := ret.Get(0).(func(string, string) db.Bounty); ok { + if rf, ok := ret.Get(0).(func(string, string) db.NewBounty); ok { r0 = rf(pubkey, created) } else { - r0 = ret.Get(0).(db.Bounty) + r0 = ret.Get(0).(db.NewBounty) } if rf, ok := ret.Get(1).(func(string, string) error); ok { @@ -1330,12 +1330,12 @@ func (_c *Database_DeleteBounty_Call) Run(run func(pubkey string, created string return _c } -func (_c *Database_DeleteBounty_Call) Return(_a0 db.Bounty, _a1 error) *Database_DeleteBounty_Call { +func (_c *Database_DeleteBounty_Call) Return(_a0 db.NewBounty, _a1 error) *Database_DeleteBounty_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *Database_DeleteBounty_Call) RunAndReturn(run func(string, string) (db.Bounty, error)) *Database_DeleteBounty_Call { +func (_c *Database_DeleteBounty_Call) RunAndReturn(run func(string, string) (db.NewBounty, error)) *Database_DeleteBounty_Call { _c.Call.Return(run) return _c } diff --git a/routes/bounty.go b/routes/bounty.go index 6f743d479..a4a82ef9e 100644 --- a/routes/bounty.go +++ b/routes/bounty.go @@ -35,6 +35,7 @@ func BountyRoutes() chi.Router { r.Use(auth.PubKeyContext) r.Post("/pay/{id}", bountyHandler.MakeBountyPayment) r.Post("/budget/withdraw", bountyHandler.BountyBudgetWithdraw) + r.Post("/budget_workspace/withdraw", bountyHandler.NewBountyBudgetWithdraw) r.Post("/", bountyHandler.CreateOrEditBounty) r.Delete("/assignee", handlers.DeleteBountyAssignee) From 9ddf0a31a3644326d235a078c5ba115ea0d9db84 Mon Sep 17 00:00:00 2001 From: l Date: Thu, 18 Apr 2024 23:22:59 -0400 Subject: [PATCH 12/21] Include cypress tests --- cypress.config.js | 9 +++ cypress/e2e/features.cy.js | 19 +++++ cypress/fixtures/example.json | 5 ++ cypress/support/commands.js | 25 ++++++ cypress/support/e2e.js | 20 +++++ cypress/support/objects/objects.js | 118 +++++++++++++++++++++++++++++ 6 files changed, 196 insertions(+) create mode 100644 cypress.config.js create mode 100644 cypress/e2e/features.cy.js create mode 100644 cypress/fixtures/example.json create mode 100644 cypress/support/commands.js create mode 100644 cypress/support/e2e.js create mode 100644 cypress/support/objects/objects.js diff --git a/cypress.config.js b/cypress.config.js new file mode 100644 index 000000000..97f47c412 --- /dev/null +++ b/cypress.config.js @@ -0,0 +1,9 @@ +const { defineConfig } = require("cypress"); + +module.exports = defineConfig({ + e2e: { + setupNodeEvents(on, config) { + // implement node event listeners here + }, + }, +}); diff --git a/cypress/e2e/features.cy.js b/cypress/e2e/features.cy.js new file mode 100644 index 000000000..ea605b102 --- /dev/null +++ b/cypress/e2e/features.cy.js @@ -0,0 +1,19 @@ + + + +import '../support/objects/objects.js' + +describe('Create Workspace', () => { + it('passes', () => { + cy.request({ + method: 'POST', + url: `${hostname}/workspaces/`, + headers: { + 'x-user-token': `${user.authToken}` + }, + body: workspaces[0] + }).then((response) => { + id = response.body.response.id; + }) + }) +}); \ No newline at end of file diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json new file mode 100644 index 000000000..02e425437 --- /dev/null +++ b/cypress/fixtures/example.json @@ -0,0 +1,5 @@ +{ + "name": "Using fixtures to represent data", + "email": "hello@cypress.io", + "body": "Fixtures are a great way to mock data for responses to routes" +} diff --git a/cypress/support/commands.js b/cypress/support/commands.js new file mode 100644 index 000000000..66ea16ef0 --- /dev/null +++ b/cypress/support/commands.js @@ -0,0 +1,25 @@ +// *********************************************** +// This example commands.js shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +// Cypress.Commands.add('login', (email, password) => { ... }) +// +// +// -- This is a child command -- +// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This will overwrite an existing command -- +// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) \ No newline at end of file diff --git a/cypress/support/e2e.js b/cypress/support/e2e.js new file mode 100644 index 000000000..0e7290a13 --- /dev/null +++ b/cypress/support/e2e.js @@ -0,0 +1,20 @@ +// *********************************************************** +// This example support/e2e.js is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands' + +// Alternatively you can use CommonJS syntax: +// require('./commands') \ No newline at end of file diff --git a/cypress/support/objects/objects.js b/cypress/support/objects/objects.js new file mode 100644 index 000000000..028da0256 --- /dev/null +++ b/cypress/support/objects/objects.js @@ -0,0 +1,118 @@ + +let hostname = 'localhost:5555'; + +let user = { + pubkey: '', + authToken: '', + name: 'Alice' +}; + +let workspaces = [ + { + id: '29a999fc-0424-46d2-ac04-ffc3e0635928', + name: 'Sample Workspace 1', + owner_pub_key: user.pubkey, + img: 'IqQnBnAdrteW_QCeq_3Ss1_78_yBAz_rckG5F3NE9ms=', + mission: 'Access the largest pool of human cognition', + tactics:'Create a marketplace for providers and bounty hunters', + schematic_url: 'https://miro.com/app/board/uXjVNQOK7Zc=', + schematic_img: '1b281867-2c0e-481e-b508-1aab0e33ab50.jpg' + }, + { + id: 'e3e7396a-3308-48f4-acba-b3d3120b65f6', + name: 'Sample Workspace 2', + owner_pub_key: user.pubkey, + img: 'IqQnBnAdrteW_QCeq_3Ss1_78_yBAz_rckG5F3NE9ms=', + mission: 'Access the largest pool of human cognition', + tactics:'Create a marketplace for providers and bounty hunters', + schematic_url: 'https://miro.com/app/board/uXjVNQOK7Zc=', + schematic_img: '1b281867-2c0e-481e-b508-1aab0e33ab50.jpg' + }, + { + id: '18616ed4-2fda-4670-9550-dfa9356a3beb', + name: 'Sample Workspace 3', + owner_pub_key: user.pubkey, + img: 'IqQnBnAdrteW_QCeq_3Ss1_78_yBAz_rckG5F3NE9ms=', + mission: 'Access the largest pool of human cognition', + tactics:'Create a marketplace for providers and bounty hunters', + schematic_url: 'https://miro.com/app/board/uXjVNQOK7Zc=', + schematic_img: '1b281867-2c0e-481e-b508-1aab0e33ab50.jpg' + }]; + +let repositories = [ + { + name: 'frontend', + url: 'https://github.com/stakwork/sphinx-tribes-frontend' + }, + { + name: 'backend', + url: 'https://github.com/stakwork/sphinx-tribes' + } +]; + +let features = [ + { + name: 'Hive Process', + priority: 1, + brief: 'To follow a set of best practices in product development.
' + + 'Dividing complex features into small
steps makes it easier to ' + + 'track and the timing more certain.
A guided process would help ' + + 'a PM new to the hive process get the best results with the least mental ' + + 'load.
This feature is for a not se technical Product Manager.
' + + 'The hive process lets you get features out to production faster and with less risk.', + requirements: 'Modify workspaces endpoint to accomodate new fields.
' + + 'Create end points for features, user stories and phases', + architecture: 'Describe the architecture of the feature with the following sections:' + + '

Wireframes

Visual Schematics

Object Definition

' + + 'DB Schema Changes

UX

CI/CD

Changes

Endpoints

' + + 'Front

', + }, + { + name: 'AI Assited text fields', + priority: 2, + brief: 'An important struggle of a technical product manager is to find ' + + 'the right words to describe a business goal. The definition of ' + + 'things like \'product mission\' or \'tactics and objectives\' is ' + + ' the base from which every technical decition relays on.
' + + 'We are going to leverage AI to help the PM write better definitions.
' + + 'The fields that would benefit form AI assistance are: mission, tactics, ' + + 'feature brief and feature user stories', + requirements: 'Create a new page for a conversation format between the PM and the LLM
' + + 'Rely as much as possible on stakwork workflows
' + + 'Have history of previous definitions', + architecture: 'Describe the architecture of the feature with the following sections:' + + '

Wireframes

Visual Schematics

Object Definition

' + + 'DB Schema Changes

UX

CI/CD

Changes

Endpoints

' + + 'Front

', + }, + { + name: 'AI Assited relation between text fields', + priority: 2, + brief: 'A product and feature\'s various definition fields: mission, tactics, ' + + 'feature brief, user stories, requirements and architecture should have some ' + + 'relation between each other.
' + 'One way to do that is to leverage an LLM ' + + 'to discern the parts of the defintion that have a connection to other definitions.
' + + 'The UI will need to show the user how each definition is related to other defintions.', + requirements: 'Create a new process after a Feature text has changed. It should use the LLM to ' + + 'determine de relationship between parts of the text.', + architecture: 'Describe the architecture of the feature with the following sections:' + + '

Wireframes

Visual Schematics

Object Definition

' + + 'DB Schema Changes

UX

CI/CD

Changes

Endpoints

' + + 'Front

', + }, +]; + +let user_stories = [ + { id: 'f4c4c4b4-7a90-4a3a-b3e2-151d0feca9bf', description: ' As a {PM} I want to {make providers \"hive ready\"}, so I can {leverage the hive process ' }, + { id: '78f4b326-1841-449b-809a-a0947622db3e', description: ' As a {PM} I want to {CRUD Features}, so I can {use the system to manage my features} ' }, + { id: '5d353d23-3d27-4aa8-a9f7-04dcd5f4843c', description: ' As a {PM} I want to {follow best practices}, so I can {make more valuable features} ' }, + { id: '1a4e00f4-0e58-4e08-a1df-b623bc10f08d', description: ' As a {PM} I want to {save the architecture of the feature}, so I can {share it with people} ' }, + { id: 'eb6e4138-37e5-465d-934e-18e335abaa47', description: ' As a {PM} I want to {create phases}, so I can {divide the work in several deliverable stages} ' }, + { id: '35a5d8dd-240d-4ff0-a699-aa2fa2cfa32c', description: ' As a {PM} I want to {assign bounties to features}, so I can {group bounties together} ' }, +]; + +let phases = [ + { id: 'a96e3bff-e5c8-429e-bd65-911d619761aa', name: ' MVP ' }, + { id: '6de147ab-695c-45b1-81e7-2d1a5ba482ab', name: ' MVP ' }, + { id: '28541c4a-41de-447e-86d8-293583d1abc2', name: ' MVP ' }, +]; \ No newline at end of file From 0baebea08d64b30e68135912d420fe41808c3aa1 Mon Sep 17 00:00:00 2001 From: elraphty Date: Fri, 19 Apr 2024 14:12:43 +0100 Subject: [PATCH 13/21] added cypress configurations --- .gitignore | 2 + cypress/e2e/create_user.cy.ts | 23 +++++ cypress/e2e/features.cy.js | 19 ---- cypress/e2e/features.cy.ts | 14 +++ cypress/global.d.ts | 36 ++++++++ cypress/support/commands.js | 25 ------ cypress/support/commands.ts | 19 ++++ cypress/support/{e2e.js => e2e.ts} | 0 .../objects/{objects.js => objects.ts} | 88 +++++++++---------- cypress/tsconfig.json | 10 +++ handlers/people.go | 82 +++++++++++++++++ package.json | 23 +++++ routes/person.go | 5 ++ 13 files changed, 258 insertions(+), 88 deletions(-) create mode 100644 cypress/e2e/create_user.cy.ts delete mode 100644 cypress/e2e/features.cy.js create mode 100644 cypress/e2e/features.cy.ts create mode 100644 cypress/global.d.ts delete mode 100644 cypress/support/commands.js create mode 100644 cypress/support/commands.ts rename cypress/support/{e2e.js => e2e.ts} (100%) rename cypress/support/objects/{objects.js => objects.ts} (53%) create mode 100644 cypress/tsconfig.json create mode 100644 package.json diff --git a/.gitignore b/.gitignore index ea1fd36f2..2aa675c79 100644 --- a/.gitignore +++ b/.gitignore @@ -11,5 +11,7 @@ notes.md frontend/packrd/packed-packr.go .idea/ node_modules/ +node_modules +yarn.lock frontend/app/coverage \ No newline at end of file diff --git a/cypress/e2e/create_user.cy.ts b/cypress/e2e/create_user.cy.ts new file mode 100644 index 000000000..561881972 --- /dev/null +++ b/cypress/e2e/create_user.cy.ts @@ -0,0 +1,23 @@ +describe('Create User', () => { + it('it creates a user', () => { + const person: Cypress.Person = { + owner_pubkey: "test_pubkey", + owner_alias: "test_research", + unique_name: "test_unique_name", + description: "this is a test", + tags: [], + img: "", + unlisted: false, + deleted: false, + owner_route_hint: "", + owner_contact_key: "", + price_to_meet: 0, + twitter_confirmed: false, + referred_by: 0, + extras: {}, + github_issues: {} + } + + const user = cy.create_person(person) + }) +}); \ No newline at end of file diff --git a/cypress/e2e/features.cy.js b/cypress/e2e/features.cy.js deleted file mode 100644 index ea605b102..000000000 --- a/cypress/e2e/features.cy.js +++ /dev/null @@ -1,19 +0,0 @@ - - - -import '../support/objects/objects.js' - -describe('Create Workspace', () => { - it('passes', () => { - cy.request({ - method: 'POST', - url: `${hostname}/workspaces/`, - headers: { - 'x-user-token': `${user.authToken}` - }, - body: workspaces[0] - }).then((response) => { - id = response.body.response.id; - }) - }) -}); \ No newline at end of file diff --git a/cypress/e2e/features.cy.ts b/cypress/e2e/features.cy.ts new file mode 100644 index 000000000..214b1c069 --- /dev/null +++ b/cypress/e2e/features.cy.ts @@ -0,0 +1,14 @@ +// describe('Create Workspace', () => { +// it('passes', () => { +// cy.request({ +// method: 'POST', +// url: `${hostname}/workspaces/`, +// headers: { +// 'x-user-token': `${user.authToken}` +// }, +// body: workspaces[0] +// }).then((response) => { +// const id = response.body.response.id; +// }) +// }) +// }); \ No newline at end of file diff --git a/cypress/global.d.ts b/cypress/global.d.ts new file mode 100644 index 000000000..9e5eb8660 --- /dev/null +++ b/cypress/global.d.ts @@ -0,0 +1,36 @@ +declare namespace Cypress { + interface Chainable { + create_person(person: Person): CreatePersonResponse; + } + + type RandomObject = { [key: string]: string }; + + type CreatePersonResponse = { + jwt: string; + user: Person; + } + + type Person = { + id?: number; + uuid?: string; + owner_pubkey: string; + owner_alias: string; + unique_name: string; + description: string; + tags: String[] + img: string; + created?: number; + updated?: string; + unlisted: boolean; + deleted: boolean; + last_login?: number; + owner_route_hint: string; + owner_contact_key: string; + price_to_meet: number; + new_ticket_time?: number; + twitter_confirmed: boolean; + referred_by: number; + extras: RandomObject; + github_issues: RandomObject; + } +} diff --git a/cypress/support/commands.js b/cypress/support/commands.js deleted file mode 100644 index 66ea16ef0..000000000 --- a/cypress/support/commands.js +++ /dev/null @@ -1,25 +0,0 @@ -// *********************************************** -// This example commands.js shows you how to -// create various custom commands and overwrite -// existing commands. -// -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** -// -// -// -- This is a parent command -- -// Cypress.Commands.add('login', (email, password) => { ... }) -// -// -// -- This is a child command -- -// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) -// -// -// -- This is a dual command -- -// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) -// -// -// -- This will overwrite an existing command -- -// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) \ No newline at end of file diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts new file mode 100644 index 000000000..22087ba9b --- /dev/null +++ b/cypress/support/commands.ts @@ -0,0 +1,19 @@ +import dotenv from 'dotenv'; +dotenv.config(); + +import { HostName } from './objects/objects'; + +// @ts-check +// @ts-check +/// + +Cypress.Commands.add('create_person', (person: Cypress.Person) => { + cy.request({ + method: 'POST', + url: `http://${HostName}/person/test`, + headers: {}, + body: person + }).then(res => { + return res + }); +}); \ No newline at end of file diff --git a/cypress/support/e2e.js b/cypress/support/e2e.ts similarity index 100% rename from cypress/support/e2e.js rename to cypress/support/e2e.ts diff --git a/cypress/support/objects/objects.js b/cypress/support/objects/objects.ts similarity index 53% rename from cypress/support/objects/objects.js rename to cypress/support/objects/objects.ts index 028da0256..396302dc6 100644 --- a/cypress/support/objects/objects.js +++ b/cypress/support/objects/objects.ts @@ -1,45 +1,45 @@ -let hostname = 'localhost:5555'; +export const HostName = 'localhost:13000'; -let user = { +export const User = { pubkey: '', authToken: '', name: 'Alice' }; -let workspaces = [ +export const Workspaces = [ { id: '29a999fc-0424-46d2-ac04-ffc3e0635928', name: 'Sample Workspace 1', - owner_pub_key: user.pubkey, + owner_pub_key: User.pubkey, img: 'IqQnBnAdrteW_QCeq_3Ss1_78_yBAz_rckG5F3NE9ms=', mission: 'Access the largest pool of human cognition', - tactics:'Create a marketplace for providers and bounty hunters', + tactics: 'Create a marketplace for providers and bounty hunters', schematic_url: 'https://miro.com/app/board/uXjVNQOK7Zc=', schematic_img: '1b281867-2c0e-481e-b508-1aab0e33ab50.jpg' }, { id: 'e3e7396a-3308-48f4-acba-b3d3120b65f6', name: 'Sample Workspace 2', - owner_pub_key: user.pubkey, + owner_pub_key: User.pubkey, img: 'IqQnBnAdrteW_QCeq_3Ss1_78_yBAz_rckG5F3NE9ms=', mission: 'Access the largest pool of human cognition', - tactics:'Create a marketplace for providers and bounty hunters', + tactics: 'Create a marketplace for providers and bounty hunters', schematic_url: 'https://miro.com/app/board/uXjVNQOK7Zc=', schematic_img: '1b281867-2c0e-481e-b508-1aab0e33ab50.jpg' }, { id: '18616ed4-2fda-4670-9550-dfa9356a3beb', name: 'Sample Workspace 3', - owner_pub_key: user.pubkey, + owner_pub_key: User.pubkey, img: 'IqQnBnAdrteW_QCeq_3Ss1_78_yBAz_rckG5F3NE9ms=', mission: 'Access the largest pool of human cognition', - tactics:'Create a marketplace for providers and bounty hunters', + tactics: 'Create a marketplace for providers and bounty hunters', schematic_url: 'https://miro.com/app/board/uXjVNQOK7Zc=', schematic_img: '1b281867-2c0e-481e-b508-1aab0e33ab50.jpg' }]; -let repositories = [ +export const Repositories = [ { name: 'frontend', url: 'https://github.com/stakwork/sphinx-tribes-frontend' @@ -50,68 +50,68 @@ let repositories = [ } ]; -let features = [ +export const Features = [ { name: 'Hive Process', priority: 1, brief: 'To follow a set of best practices in product development.
' + - 'Dividing complex features into small
steps makes it easier to ' + - 'track and the timing more certain.
A guided process would help ' + - 'a PM new to the hive process get the best results with the least mental ' + - 'load.
This feature is for a not se technical Product Manager.
' + - 'The hive process lets you get features out to production faster and with less risk.', + 'Dividing complex features into small
steps makes it easier to ' + + 'track and the timing more certain.
A guided process would help ' + + 'a PM new to the hive process get the best results with the least mental ' + + 'load.
This feature is for a not se technical Product Manager.
' + + 'The hive process lets you get features out to production faster and with less risk.', requirements: 'Modify workspaces endpoint to accomodate new fields.
' + - 'Create end points for features, user stories and phases', + 'Create end points for features, user stories and phases', architecture: 'Describe the architecture of the feature with the following sections:' + - '

Wireframes

Visual Schematics

Object Definition

' + - 'DB Schema Changes

UX

CI/CD

Changes

Endpoints

' + - 'Front

', + '

Wireframes

Visual Schematics

Object Definition

' + + 'DB Schema Changes

UX

CI/CD

Changes

Endpoints

' + + 'Front

', }, { name: 'AI Assited text fields', priority: 2, brief: 'An important struggle of a technical product manager is to find ' + - 'the right words to describe a business goal. The definition of ' + - 'things like \'product mission\' or \'tactics and objectives\' is ' + - ' the base from which every technical decition relays on.
' + - 'We are going to leverage AI to help the PM write better definitions.
' + - 'The fields that would benefit form AI assistance are: mission, tactics, ' + - 'feature brief and feature user stories', + 'the right words to describe a business goal. The definition of ' + + 'things like \'product mission\' or \'tactics and objectives\' is ' + + ' the base from which every technical decition relays on.
' + + 'We are going to leverage AI to help the PM write better definitions.
' + + 'The fields that would benefit form AI assistance are: mission, tactics, ' + + 'feature brief and feature user stories', requirements: 'Create a new page for a conversation format between the PM and the LLM
' + - 'Rely as much as possible on stakwork workflows
' + - 'Have history of previous definitions', + 'Rely as much as possible on stakwork workflows
' + + 'Have history of previous definitions', architecture: 'Describe the architecture of the feature with the following sections:' + - '

Wireframes

Visual Schematics

Object Definition

' + - 'DB Schema Changes

UX

CI/CD

Changes

Endpoints

' + - 'Front

', + '

Wireframes

Visual Schematics

Object Definition

' + + 'DB Schema Changes

UX

CI/CD

Changes

Endpoints

' + + 'Front

', }, { name: 'AI Assited relation between text fields', priority: 2, brief: 'A product and feature\'s various definition fields: mission, tactics, ' + - 'feature brief, user stories, requirements and architecture should have some ' + - 'relation between each other.
' + 'One way to do that is to leverage an LLM ' + - 'to discern the parts of the defintion that have a connection to other definitions.
' + - 'The UI will need to show the user how each definition is related to other defintions.', + 'feature brief, user stories, requirements and architecture should have some ' + + 'relation between each other.
' + 'One way to do that is to leverage an LLM ' + + 'to discern the parts of the defintion that have a connection to other definitions.
' + + 'The UI will need to show the user how each definition is related to other defintions.', requirements: 'Create a new process after a Feature text has changed. It should use the LLM to ' + - 'determine de relationship between parts of the text.', + 'determine de relationship between parts of the text.', architecture: 'Describe the architecture of the feature with the following sections:' + - '

Wireframes

Visual Schematics

Object Definition

' + - 'DB Schema Changes

UX

CI/CD

Changes

Endpoints

' + - 'Front

', + '

Wireframes

Visual Schematics

Object Definition

' + + 'DB Schema Changes

UX

CI/CD

Changes

Endpoints

' + + 'Front

', }, ]; -let user_stories = [ +export const UserStories = [ { id: 'f4c4c4b4-7a90-4a3a-b3e2-151d0feca9bf', description: ' As a {PM} I want to {make providers \"hive ready\"}, so I can {leverage the hive process ' }, - { id: '78f4b326-1841-449b-809a-a0947622db3e', description: ' As a {PM} I want to {CRUD Features}, so I can {use the system to manage my features} ' }, + { id: '78f4b326-1841-449b-809a-a0947622db3e', description: ' As a {PM} I want to {CRUD Features}, so I can {use the system to manage my features} ' }, { id: '5d353d23-3d27-4aa8-a9f7-04dcd5f4843c', description: ' As a {PM} I want to {follow best practices}, so I can {make more valuable features} ' }, - { id: '1a4e00f4-0e58-4e08-a1df-b623bc10f08d', description: ' As a {PM} I want to {save the architecture of the feature}, so I can {share it with people} ' }, + { id: '1a4e00f4-0e58-4e08-a1df-b623bc10f08d', description: ' As a {PM} I want to {save the architecture of the feature}, so I can {share it with people} ' }, { id: 'eb6e4138-37e5-465d-934e-18e335abaa47', description: ' As a {PM} I want to {create phases}, so I can {divide the work in several deliverable stages} ' }, { id: '35a5d8dd-240d-4ff0-a699-aa2fa2cfa32c', description: ' As a {PM} I want to {assign bounties to features}, so I can {group bounties together} ' }, -]; +]; -let phases = [ +export const Phases = [ { id: 'a96e3bff-e5c8-429e-bd65-911d619761aa', name: ' MVP ' }, { id: '6de147ab-695c-45b1-81e7-2d1a5ba482ab', name: ' MVP ' }, { id: '28541c4a-41de-447e-86d8-293583d1abc2', name: ' MVP ' }, diff --git a/cypress/tsconfig.json b/cypress/tsconfig.json new file mode 100644 index 000000000..1b6425b80 --- /dev/null +++ b/cypress/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["es5", "dom"], + "types": ["cypress", "node"], + "resolveJsonModule": true, + "esModuleInterop": true + }, + "include": ["**/*.ts"] +} diff --git a/handlers/people.go b/handlers/people.go index 1bac21c1a..4fb3c06b4 100644 --- a/handlers/people.go +++ b/handlers/people.go @@ -117,6 +117,88 @@ func (ph *peopleHandler) CreateOrEditPerson(w http.ResponseWriter, r *http.Reque json.NewEncoder(w).Encode(p) } +func (ph *peopleHandler) CreateOrEditPersonForTest(w http.ResponseWriter, r *http.Request) { + person := db.Person{} + body, err := io.ReadAll(r.Body) + r.Body.Close() + err = json.Unmarshal(body, &person) + if err != nil { + fmt.Println(err) + w.WriteHeader(http.StatusNotAcceptable) + return + } + + now := time.Now() + + pubKeyFromAuth := person.OwnerPubKey + + if pubKeyFromAuth != person.OwnerPubKey { + fmt.Println(pubKeyFromAuth) + fmt.Println(person.OwnerPubKey) + fmt.Println("mismatched pubkey") + w.WriteHeader(http.StatusUnauthorized) + return + } + + existing := ph.db.GetPersonByPubkey(pubKeyFromAuth) + if existing.ID == 0 { + if person.ID != 0 { + // cant try to "edit" if not exists already + fmt.Println("cant edit non existing") + w.WriteHeader(http.StatusUnauthorized) + return + } + person.UniqueName, _ = ph.db.PersonUniqueNameFromName(person.OwnerAlias) + person.Created = &now + person.Uuid = xid.New().String() + + } else { // editing! needs ID + if person.ID == 0 { // can't create if already exists + fmt.Println("can't create, already existing") + w.WriteHeader(http.StatusUnauthorized) + return + } + if person.ID != existing.ID { // can't edit someone else's + fmt.Println("cant edit someone else") + w.WriteHeader(http.StatusUnauthorized) + return + } + } + + person.OwnerPubKey = pubKeyFromAuth + person.Updated = &now + + if person.NewTicketTime != 0 { + go ph.db.ProcessAlerts(person) + } + + b := new(bytes.Buffer) + decodeErr := json.NewEncoder(b).Encode(person.Extras) + + if decodeErr != nil { + log.Printf("Could not encode extras json data") + } + + p, err := ph.db.CreateOrEditPerson(person) + if err != nil { + w.WriteHeader(http.StatusBadRequest) + return + } + + responseData := make(map[string]interface{}) + tokenString, err := auth.EncodeJwt(person.OwnerPubKey) + + if err != nil { + fmt.Println("Cannot generate jwt token") + } + + responseData["jwt"] = tokenString + responseData["user"] = p + + w.WriteHeader(http.StatusOK) + json.NewEncoder(w).Encode(responseData) +} + func PersonIsAdmin(pk string) bool { adminPubkeys := os.Getenv("ADMIN_PUBKEYS") if adminPubkeys == "" { diff --git a/package.json b/package.json new file mode 100644 index 000000000..096537e09 --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "sphinx-tribes", + "version": "1.0.0", + "description": "![Tribes](https://github.com/stakwork/sphinx-tribes/raw/master/img/sphinx-tribes.png)", + "main": "cypress.config.js", + "directories": { + "doc": "docs" + }, + "scripts": { + "cypress:run": "npx cypress run" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "cypress": "^13.8.0", + "typescript": "^5.4.5" + }, + "dependencies": { + "@types/dotenv": "^8.2.0", + "dotenv": "^16.4.5" + } +} diff --git a/routes/person.go b/routes/person.go index 6a07d37df..67a8c2456 100644 --- a/routes/person.go +++ b/routes/person.go @@ -17,6 +17,11 @@ func PersonRoutes() chi.Router { r.Get("/uuid/{uuid}/assets", handlers.GetPersonAssetsByUuid) r.Get("/githubname/{github}", handlers.GetPersonByGithubName) }) + + r.Group(func(r chi.Router) { + r.Post("/test", peopleHandler.CreateOrEditPersonForTest) + }) + r.Group(func(r chi.Router) { r.Use(auth.PubKeyContext) From 6b0000bce50690348165ac21eb097276015c8567 Mon Sep 17 00:00:00 2001 From: l Date: Sat, 20 Apr 2024 12:27:42 -0400 Subject: [PATCH 14/21] set up cypress tests --- .vscode/launch.json | 11 + cypress/e2e/00_create_user.cy.ts | 8 + cypress/e2e/01_workspaces.cy.ts | 94 ++ cypress/e2e/create_user.cy.ts | 23 - cypress/e2e/features.cy.ts | 14 - cypress/global.d.ts | 6 +- cypress/plugins/index.js | 13 + cypress/support/commands.ts | 8 +- cypress/support/objects/objects.ts | 42 +- handlers/people.go | 17 +- handlers/workspaces.go | 36 +- package-lock.json | 2019 ++++++++++++++++++++++++++++ routes/person.go | 2 +- 13 files changed, 2209 insertions(+), 84 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 cypress/e2e/00_create_user.cy.ts create mode 100644 cypress/e2e/01_workspaces.cy.ts delete mode 100644 cypress/e2e/create_user.cy.ts delete mode 100644 cypress/e2e/features.cy.ts create mode 100644 cypress/plugins/index.js create mode 100644 package-lock.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..6857c8631 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "type": "chrome", + "request": "attach", + "name": "Attach to Chrome", + "port": 9222, + "urlFilter": "http://localhost:4200/*", + "webRoot": "${workspaceFolder}", + "configurations": [ + + ] + } \ No newline at end of file diff --git a/cypress/e2e/00_create_user.cy.ts b/cypress/e2e/00_create_user.cy.ts new file mode 100644 index 000000000..c085bac5d --- /dev/null +++ b/cypress/e2e/00_create_user.cy.ts @@ -0,0 +1,8 @@ +import { User } from '../support/objects/objects' + +describe('Create User', () => { + it('it creates a user', () => { + const response = cy.upsertlogin(User); + return response; + }) +}); \ No newline at end of file diff --git a/cypress/e2e/01_workspaces.cy.ts b/cypress/e2e/01_workspaces.cy.ts new file mode 100644 index 000000000..4fe8982c2 --- /dev/null +++ b/cypress/e2e/01_workspaces.cy.ts @@ -0,0 +1,94 @@ +import { User, HostName, Workspaces } from '../support/objects/objects'; + + +describe('Create Workspaces', () => { + it('passes', () => { + cy.upsertlogin(User).then(value => + { + //Create 3 Workspaces + cy.request({ + method: 'POST', + url: `${HostName}/workspaces/`, + headers: { 'x-jwt': `${ value }` }, + body: Workspaces[0] + }).its('body').should('have.property', 'name', Workspaces[0].name.trim()); + + cy.request({ + method: 'POST', + url: `${HostName}/workspaces/`, + headers: { 'x-jwt': `${ value }` }, + body: Workspaces[1] + }); + + cy.request({ + method: 'POST', + url: `${HostName}/workspaces/`, + headers: { 'x-jwt': `${ value }` }, + body: Workspaces[2] + }); + }) + }) +}) + +describe('Edit Mission', () => { + it('passes', () => { + cy.upsertlogin(User).then(value => + { + //Create 3 Workspaces + cy.request({ + method: 'POST', + url: `${HostName}/workspaces/mission`, + headers: { 'x-jwt': `${ value }` }, + body: { + uuid: Workspaces[0].uuid, + mission: 'This is a sample mission for workspace' + } + }).then((resp) => { + expect(resp.status).to.eq(200) + }) + + }) + }) +}) + +describe('Edit Tactics', () => { + it('passes', () => { + cy.upsertlogin(User).then(value => + { + //Create 3 Workspaces + cy.request({ + method: 'POST', + url: `${HostName}/workspaces/tactics`, + headers: { 'x-jwt': `${ value }` }, + body: { + uuid: Workspaces[0].uuid, + mission: 'This is a sample tactics and objectives for workspace' + } + }).then((resp) => { + expect(resp.status).to.eq(200) + }) + + }) + }) +}) + +describe('Edit Schematics Url', () => { + it('passes', () => { + cy.upsertlogin(User).then(value => + { + //Create 3 Workspaces + cy.request({ + method: 'POST', + url: `${HostName}/workspaces/schematicurl`, + headers: { 'x-jwt': `${ value }` }, + body: { + uuid: Workspaces[0].uuid, + mission: 'This is a sample schematic url for workspaces' + } + }).then((resp) => { + expect(resp.status).to.eq(200) + }) + + }) + }) +}) diff --git a/cypress/e2e/create_user.cy.ts b/cypress/e2e/create_user.cy.ts deleted file mode 100644 index 561881972..000000000 --- a/cypress/e2e/create_user.cy.ts +++ /dev/null @@ -1,23 +0,0 @@ -describe('Create User', () => { - it('it creates a user', () => { - const person: Cypress.Person = { - owner_pubkey: "test_pubkey", - owner_alias: "test_research", - unique_name: "test_unique_name", - description: "this is a test", - tags: [], - img: "", - unlisted: false, - deleted: false, - owner_route_hint: "", - owner_contact_key: "", - price_to_meet: 0, - twitter_confirmed: false, - referred_by: 0, - extras: {}, - github_issues: {} - } - - const user = cy.create_person(person) - }) -}); \ No newline at end of file diff --git a/cypress/e2e/features.cy.ts b/cypress/e2e/features.cy.ts deleted file mode 100644 index 214b1c069..000000000 --- a/cypress/e2e/features.cy.ts +++ /dev/null @@ -1,14 +0,0 @@ -// describe('Create Workspace', () => { -// it('passes', () => { -// cy.request({ -// method: 'POST', -// url: `${hostname}/workspaces/`, -// headers: { -// 'x-user-token': `${user.authToken}` -// }, -// body: workspaces[0] -// }).then((response) => { -// const id = response.body.response.id; -// }) -// }) -// }); \ No newline at end of file diff --git a/cypress/global.d.ts b/cypress/global.d.ts index 9e5eb8660..624849d07 100644 --- a/cypress/global.d.ts +++ b/cypress/global.d.ts @@ -1,13 +1,13 @@ declare namespace Cypress { interface Chainable { - create_person(person: Person): CreatePersonResponse; + upsertlogin(person: Person): Promise; } type RandomObject = { [key: string]: string }; - type CreatePersonResponse = { + type LoginResponse = { jwt: string; - user: Person; + //user: Person; } type Person = { diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js new file mode 100644 index 000000000..32393d430 --- /dev/null +++ b/cypress/plugins/index.js @@ -0,0 +1,13 @@ +module.exports = (on, config) => { + + on('before:browser:launch', (browser = {}, args) => { + + if (browser.name === 'chrome') { + args.push('--remote-debugging-port=9222') + + // whatever you return here becomes the new args + return args + } + + }) + } \ No newline at end of file diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index 22087ba9b..3ae601eba 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -7,13 +7,11 @@ import { HostName } from './objects/objects'; // @ts-check /// -Cypress.Commands.add('create_person', (person: Cypress.Person) => { +Cypress.Commands.add('upsertlogin', (person: Cypress.Person) => { cy.request({ method: 'POST', - url: `http://${HostName}/person/test`, + url: `http://${HostName}/person/upsertlogin`, headers: {}, body: person - }).then(res => { - return res - }); + }).then((response) => response.body); }); \ No newline at end of file diff --git a/cypress/support/objects/objects.ts b/cypress/support/objects/objects.ts index 396302dc6..04b14497e 100644 --- a/cypress/support/objects/objects.ts +++ b/cypress/support/objects/objects.ts @@ -1,17 +1,31 @@ -export const HostName = 'localhost:13000'; +export const HostName = 'localhost:5005'; -export const User = { - pubkey: '', - authToken: '', - name: 'Alice' -}; + +export var User: Cypress.Person = { + owner_pubkey: "test_pubkey", + owner_alias: "Alice", + unique_name: "Alice", + description: "this is a test", + tags: [], + img: "", + unlisted: false, + deleted: false, + owner_route_hint: "", + owner_contact_key: "", + price_to_meet: 0, + twitter_confirmed: false, + referred_by: 0, + extras: {}, + github_issues: {} +} export const Workspaces = [ { - id: '29a999fc-0424-46d2-ac04-ffc3e0635928', - name: 'Sample Workspace 1', - owner_pub_key: User.pubkey, + id: 0, + uuid: 'cohob00n1e4808utqel0', + name: ' Sample Workspace 1 ', + owner_pubkey: User.owner_pubkey, img: 'IqQnBnAdrteW_QCeq_3Ss1_78_yBAz_rckG5F3NE9ms=', mission: 'Access the largest pool of human cognition', tactics: 'Create a marketplace for providers and bounty hunters', @@ -19,9 +33,10 @@ export const Workspaces = [ schematic_img: '1b281867-2c0e-481e-b508-1aab0e33ab50.jpg' }, { - id: 'e3e7396a-3308-48f4-acba-b3d3120b65f6', + id: 0, + uuid: 'cohob3on1e4808utqelg', name: 'Sample Workspace 2', - owner_pub_key: User.pubkey, + owner_pubkey: User.owner_pubkey, img: 'IqQnBnAdrteW_QCeq_3Ss1_78_yBAz_rckG5F3NE9ms=', mission: 'Access the largest pool of human cognition', tactics: 'Create a marketplace for providers and bounty hunters', @@ -29,9 +44,10 @@ export const Workspaces = [ schematic_img: '1b281867-2c0e-481e-b508-1aab0e33ab50.jpg' }, { - id: '18616ed4-2fda-4670-9550-dfa9356a3beb', + id: 0, + uuid: 'cohob80n1e4808utqem0', name: 'Sample Workspace 3', - owner_pub_key: User.pubkey, + owner_pubkey: User.owner_pubkey, img: 'IqQnBnAdrteW_QCeq_3Ss1_78_yBAz_rckG5F3NE9ms=', mission: 'Access the largest pool of human cognition', tactics: 'Create a marketplace for providers and bounty hunters', diff --git a/handlers/people.go b/handlers/people.go index 4fb3c06b4..7f42fdc36 100644 --- a/handlers/people.go +++ b/handlers/people.go @@ -117,7 +117,7 @@ func (ph *peopleHandler) CreateOrEditPerson(w http.ResponseWriter, r *http.Reque json.NewEncoder(w).Encode(p) } -func (ph *peopleHandler) CreateOrEditPersonForTest(w http.ResponseWriter, r *http.Request) { +func (ph *peopleHandler) UpsertLogin(w http.ResponseWriter, r *http.Request) { person := db.Person{} body, err := io.ReadAll(r.Body) r.Body.Close() @@ -153,13 +153,11 @@ func (ph *peopleHandler) CreateOrEditPersonForTest(w http.ResponseWriter, r *htt person.Uuid = xid.New().String() } else { // editing! needs ID - if person.ID == 0 { // can't create if already exists - fmt.Println("can't create, already existing") - w.WriteHeader(http.StatusUnauthorized) - return + if person.ID == 0 { + person.ID = existing.ID } if person.ID != existing.ID { // can't edit someone else's - fmt.Println("cant edit someone else") + fmt.Println("can't edit someone else") w.WriteHeader(http.StatusUnauthorized) return } @@ -180,6 +178,8 @@ func (ph *peopleHandler) CreateOrEditPersonForTest(w http.ResponseWriter, r *htt } p, err := ph.db.CreateOrEditPerson(person) + _ = p + if err != nil { w.WriteHeader(http.StatusBadRequest) return @@ -193,10 +193,11 @@ func (ph *peopleHandler) CreateOrEditPersonForTest(w http.ResponseWriter, r *htt } responseData["jwt"] = tokenString - responseData["user"] = p + //responseData["user"] = p w.WriteHeader(http.StatusOK) - json.NewEncoder(w).Encode(responseData) + w.Write([]byte(tokenString)) + //json.NewEncoder(w).Encode(responseData) } func PersonIsAdmin(pk string) bool { diff --git a/handlers/workspaces.go b/handlers/workspaces.go index 01b310fa5..6ad121f5f 100644 --- a/handlers/workspaces.go +++ b/handlers/workspaces.go @@ -111,32 +111,34 @@ func (oh *workspaceHandler) CreateOrEditWorkspace(w http.ResponseWriter, r *http name := workspace.Name - // check if the workspace name already exists - orgName := oh.db.GetWorkspaceByName(name) + // check if the organization name already exists + workspace_same_name := oh.db.GetWorkspaceByName(name) - if orgName.Name == name { + if workspace_same_name.Name == name && workspace_same_name.Uuid != workspace.Uuid { w.WriteHeader(http.StatusUnauthorized) - json.NewEncoder(w).Encode("Workspace name already exists") + json.NewEncoder(w).Encode("Workspace name already exists - " + name + " " + workspace.Uuid + " | " + workspace_same_name.Uuid) return } else { workspace.Created = &now workspace.Updated = &now - workspace.Uuid = xid.New().String() + if len(workspace.Uuid) == 0 { + workspace.Uuid = xid.New().String() + } workspace.Name = name } } else { - if workspace.ID == 0 { - // can't create that already exists - fmt.Println("can't create existing workspace") - w.WriteHeader(http.StatusUnauthorized) - return - } - - if workspace.ID != existing.ID { // can't edit someone else's - fmt.Println("cant edit another workspace") - w.WriteHeader(http.StatusUnauthorized) - return - } + // if workspace.ID == 0 { + // // can't create that already exists + // fmt.Println("can't create existing organization") + // w.WriteHeader(http.StatusUnauthorized) + // return + // } + + // if workspace.ID != existing.ID { // can't edit someone else's + // fmt.Println("cant edit another organization") + // w.WriteHeader(http.StatusUnauthorized) + // return + // } } p, err := oh.db.CreateOrEditWorkspace(workspace) diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..e5a43a510 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2019 @@ +{ + "name": "sphinx-tribes", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "sphinx-tribes", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@types/dotenv": "^8.2.0", + "dotenv": "^16.4.5" + }, + "devDependencies": { + "cypress": "^13.8.0", + "typescript": "^5.4.5" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cypress/request": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz", + "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "http-signature": "~1.3.6", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "6.10.4", + "safe-buffer": "^5.1.2", + "tough-cookie": "^4.1.3", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "dependencies": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + } + }, + "node_modules/@cypress/xvfb/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@types/dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@types/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-ylSC9GhfRH7m1EUXBXofhgx4lUWmFeQDINW5oLuS+gxWdfUeW4zJdeVTYVkexEW+e2VUvlZR2kGnGGipAWR7kw==", + "deprecated": "This is a stub types definition. dotenv provides its own type definitions, so you do not need this installed.", + "dependencies": { + "dotenv": "*" + } + }, + "node_modules/@types/node": { + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "dev": true, + "optional": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true + }, + "node_modules/@types/sizzle": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz", + "integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==", + "dev": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/cachedir": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", + "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.4.tgz", + "integrity": "sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cypress": { + "version": "13.8.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.8.0.tgz", + "integrity": "sha512-Qau//mtrwEGOU9cn2YjavECKyDUwBh8J2tit+y9s1wsv6C3BX+rlv6I9afmQnL8PmEEzJ6be7nppMHacFzZkTw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@cypress/request": "^3.0.0", + "@cypress/xvfb": "^1.2.4", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.7.1", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.1", + "commander": "^6.2.1", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.4", + "enquirer": "^2.3.6", + "eventemitter2": "6.4.7", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-ci": "^3.0.1", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.8", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "process": "^0.11.10", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "semver": "^7.5.3", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + }, + "bin": { + "cypress": "bin/cypress" + }, + "engines": { + "node": "^16.0.0 || ^18.0.0 || >=20.0.0" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eventemitter2": { + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", + "dev": true + }, + "node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "dependencies": { + "async": "^3.2.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "node_modules/lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", + "dev": true, + "engines": { + "node": "> 0.8" + } + }, + "node_modules/listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", + "dev": true + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", + "dev": true + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", + "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", + "dev": true, + "dependencies": { + "throttleit": "^1.0.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rfdc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "dev": true + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/throttleit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz", + "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "optional": true + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/routes/person.go b/routes/person.go index 67a8c2456..3202cb8b1 100644 --- a/routes/person.go +++ b/routes/person.go @@ -19,7 +19,7 @@ func PersonRoutes() chi.Router { }) r.Group(func(r chi.Router) { - r.Post("/test", peopleHandler.CreateOrEditPersonForTest) + r.Post("/upsertlogin", peopleHandler.UpsertLogin) }) r.Group(func(r chi.Router) { From ba26419740ec43e81c8e4954cfb5153c946ae080 Mon Sep 17 00:00:00 2001 From: elraphty Date: Sun, 21 Apr 2024 22:22:05 +0100 Subject: [PATCH 15/21] pulled from branch --- auth/auth.go | 16 ++++++++++++++++ handlers/people.go | 17 ++--------------- routes/person.go | 3 ++- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/auth/auth.go b/auth/auth.go index cd4db11e8..8bfa5345f 100644 --- a/auth/auth.go +++ b/auth/auth.go @@ -167,6 +167,22 @@ func ConnectionCodeContext(next http.Handler) http.Handler { }) } +// CypressContext allows testing for cypress +func CypressContext(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + + if IsFreePass() { + ctx := context.WithValue(r.Context(), ContextKey, token) + next.ServeHTTP(w, r.WithContext(ctx)) + } else { + fmt.Println("Endpoint is for testing only : test endpoint") + http.Error(w, http.StatusText(401), 401) + return + } + }) +} + func AdminCheck(pubkey string) bool { for _, val := range config.SuperAdmins { if val == pubkey { diff --git a/handlers/people.go b/handlers/people.go index 7f42fdc36..19d11cac4 100644 --- a/handlers/people.go +++ b/handlers/people.go @@ -132,14 +132,6 @@ func (ph *peopleHandler) UpsertLogin(w http.ResponseWriter, r *http.Request) { pubKeyFromAuth := person.OwnerPubKey - if pubKeyFromAuth != person.OwnerPubKey { - fmt.Println(pubKeyFromAuth) - fmt.Println(person.OwnerPubKey) - fmt.Println("mismatched pubkey") - w.WriteHeader(http.StatusUnauthorized) - return - } - existing := ph.db.GetPersonByPubkey(pubKeyFromAuth) if existing.ID == 0 { if person.ID != 0 { @@ -153,11 +145,8 @@ func (ph *peopleHandler) UpsertLogin(w http.ResponseWriter, r *http.Request) { person.Uuid = xid.New().String() } else { // editing! needs ID - if person.ID == 0 { - person.ID = existing.ID - } - if person.ID != existing.ID { // can't edit someone else's - fmt.Println("can't edit someone else") + if person.ID != 0 && person.ID != existing.ID { // can't edit someone else's + fmt.Println("cant edit someone else") w.WriteHeader(http.StatusUnauthorized) return } @@ -193,11 +182,9 @@ func (ph *peopleHandler) UpsertLogin(w http.ResponseWriter, r *http.Request) { } responseData["jwt"] = tokenString - //responseData["user"] = p w.WriteHeader(http.StatusOK) w.Write([]byte(tokenString)) - //json.NewEncoder(w).Encode(responseData) } func PersonIsAdmin(pk string) bool { diff --git a/routes/person.go b/routes/person.go index 3202cb8b1..4b9a15ec3 100644 --- a/routes/person.go +++ b/routes/person.go @@ -19,7 +19,8 @@ func PersonRoutes() chi.Router { }) r.Group(func(r chi.Router) { - r.Post("/upsertlogin", peopleHandler.UpsertLogin) + r.Use(auth.CypressContext) + r.Post("/test", peopleHandler.UpsertLogin) }) r.Group(func(r chi.Router) { From 61a08b885492a7e3d769fe2c49b60c8a3cc846e0 Mon Sep 17 00:00:00 2001 From: elraphty Date: Sun, 21 Apr 2024 22:39:06 +0100 Subject: [PATCH 16/21] fixed cypress test not passing and added auth --- .gitignore | 3 ++- auth/auth.go | 4 +--- cypress/e2e/01_workspaces.cy.ts | 36 +++++++++++++++------------------ routes/person.go | 2 +- 4 files changed, 20 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index 2aa675c79..e3c2f4d2c 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,5 @@ node_modules/ node_modules yarn.lock -frontend/app/coverage \ No newline at end of file +frontend/app/coverage +cypress/screenshots \ No newline at end of file diff --git a/auth/auth.go b/auth/auth.go index 8bfa5345f..7a80df7fc 100644 --- a/auth/auth.go +++ b/auth/auth.go @@ -170,10 +170,8 @@ func ConnectionCodeContext(next http.Handler) http.Handler { // CypressContext allows testing for cypress func CypressContext(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - if IsFreePass() { - ctx := context.WithValue(r.Context(), ContextKey, token) + ctx := context.WithValue(r.Context(), ContextKey, "") next.ServeHTTP(w, r.WithContext(ctx)) } else { fmt.Println("Endpoint is for testing only : test endpoint") diff --git a/cypress/e2e/01_workspaces.cy.ts b/cypress/e2e/01_workspaces.cy.ts index 4fe8982c2..08861aaa6 100644 --- a/cypress/e2e/01_workspaces.cy.ts +++ b/cypress/e2e/01_workspaces.cy.ts @@ -3,27 +3,26 @@ import { User, HostName, Workspaces } from '../support/objects/objects'; describe('Create Workspaces', () => { it('passes', () => { - cy.upsertlogin(User).then(value => - { + cy.upsertlogin(User).then(value => { //Create 3 Workspaces cy.request({ method: 'POST', url: `${HostName}/workspaces/`, - headers: { 'x-jwt': `${ value }` }, + headers: { 'x-jwt': `${value}` }, body: Workspaces[0] }).its('body').should('have.property', 'name', Workspaces[0].name.trim()); cy.request({ method: 'POST', url: `${HostName}/workspaces/`, - headers: { 'x-jwt': `${ value }` }, + headers: { 'x-jwt': `${value}` }, body: Workspaces[1] }); cy.request({ method: 'POST', url: `${HostName}/workspaces/`, - headers: { 'x-jwt': `${ value }` }, + headers: { 'x-jwt': `${value}` }, body: Workspaces[2] }); }) @@ -32,17 +31,16 @@ describe('Create Workspaces', () => { describe('Edit Mission', () => { it('passes', () => { - cy.upsertlogin(User).then(value => - { + cy.upsertlogin(User).then(value => { //Create 3 Workspaces cy.request({ method: 'POST', url: `${HostName}/workspaces/mission`, - headers: { 'x-jwt': `${ value }` }, - body: { + headers: { 'x-jwt': `${value}` }, + body: { uuid: Workspaces[0].uuid, mission: 'This is a sample mission for workspace' - } + } }).then((resp) => { expect(resp.status).to.eq(200) }) @@ -53,17 +51,16 @@ describe('Edit Mission', () => { describe('Edit Tactics', () => { it('passes', () => { - cy.upsertlogin(User).then(value => - { + cy.upsertlogin(User).then(value => { //Create 3 Workspaces cy.request({ method: 'POST', url: `${HostName}/workspaces/tactics`, - headers: { 'x-jwt': `${ value }` }, - body: { + headers: { 'x-jwt': `${value}` }, + body: { uuid: Workspaces[0].uuid, mission: 'This is a sample tactics and objectives for workspace' - } + } }).then((resp) => { expect(resp.status).to.eq(200) }) @@ -74,17 +71,16 @@ describe('Edit Tactics', () => { describe('Edit Schematics Url', () => { it('passes', () => { - cy.upsertlogin(User).then(value => - { + cy.upsertlogin(User).then(value => { //Create 3 Workspaces cy.request({ method: 'POST', url: `${HostName}/workspaces/schematicurl`, - headers: { 'x-jwt': `${ value }` }, - body: { + headers: { 'x-jwt': `${value}` }, + body: { uuid: Workspaces[0].uuid, mission: 'This is a sample schematic url for workspaces' - } + } }).then((resp) => { expect(resp.status).to.eq(200) }) diff --git a/routes/person.go b/routes/person.go index 4b9a15ec3..f60fb6f21 100644 --- a/routes/person.go +++ b/routes/person.go @@ -20,7 +20,7 @@ func PersonRoutes() chi.Router { r.Group(func(r chi.Router) { r.Use(auth.CypressContext) - r.Post("/test", peopleHandler.UpsertLogin) + r.Post("/upsertlogin", peopleHandler.UpsertLogin) }) r.Group(func(r chi.Router) { From 4aeae8825e3fb0a1e32e40783484f42d2c898023 Mon Sep 17 00:00:00 2001 From: Abdul Wahab Date: Fri, 26 Apr 2024 07:51:23 +0500 Subject: [PATCH 17/21] Pull Master and Check Cypress tests --- .github/workflows/docker-build-on-master.yml | 2 +- .github/workflows/frontend-e2e.yml | 2 +- .github/workflows/prjob_tests.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docker-build-on-master.yml b/.github/workflows/docker-build-on-master.yml index df0cb0219..6ce8b4cde 100644 --- a/.github/workflows/docker-build-on-master.yml +++ b/.github/workflows/docker-build-on-master.yml @@ -4,7 +4,7 @@ env: on: push: - branch: + branches: - master jobs: diff --git a/.github/workflows/frontend-e2e.yml b/.github/workflows/frontend-e2e.yml index d284d6a53..36675e00b 100644 --- a/.github/workflows/frontend-e2e.yml +++ b/.github/workflows/frontend-e2e.yml @@ -2,7 +2,7 @@ name: Cypress Frontend E2E tests on: pull_request: branches: - - master + - "*" jobs: cypress-run: diff --git a/.github/workflows/prjob_tests.yml b/.github/workflows/prjob_tests.yml index 810e6a84e..38a579912 100644 --- a/.github/workflows/prjob_tests.yml +++ b/.github/workflows/prjob_tests.yml @@ -2,7 +2,7 @@ name: Tests on: pull_request: branches: - - master + - "*" jobs: test-go: name: Go From 2dd3bb68ccfb19b935929bac7ec945da3f832aaa Mon Sep 17 00:00:00 2001 From: Abdul Wahab Date: Fri, 26 Apr 2024 09:47:12 +0500 Subject: [PATCH 18/21] Added workspaces endpoints --- cypress/e2e/01_workspaces.cy.ts | 3 ++ db/structs.go | 31 +++++++++++--------- handlers/workspaces.go | 51 +++++++++++++++++++++++++++++++++ routes/workspaces.go | 4 +++ 4 files changed, 75 insertions(+), 14 deletions(-) diff --git a/cypress/e2e/01_workspaces.cy.ts b/cypress/e2e/01_workspaces.cy.ts index 08861aaa6..2e41d95e6 100644 --- a/cypress/e2e/01_workspaces.cy.ts +++ b/cypress/e2e/01_workspaces.cy.ts @@ -39,6 +39,7 @@ describe('Edit Mission', () => { headers: { 'x-jwt': `${value}` }, body: { uuid: Workspaces[0].uuid, + owner_pubkey: Workspaces[0].owner_pubkey, mission: 'This is a sample mission for workspace' } }).then((resp) => { @@ -59,6 +60,7 @@ describe('Edit Tactics', () => { headers: { 'x-jwt': `${value}` }, body: { uuid: Workspaces[0].uuid, + owner_pubkey: Workspaces[0].owner_pubkey, mission: 'This is a sample tactics and objectives for workspace' } }).then((resp) => { @@ -79,6 +81,7 @@ describe('Edit Schematics Url', () => { headers: { 'x-jwt': `${value}` }, body: { uuid: Workspaces[0].uuid, + owner_pubkey: Workspaces[0].owner_pubkey, mission: 'This is a sample schematic url for workspaces' } }).then((resp) => { diff --git a/db/structs.go b/db/structs.go index 7f1bf8ea6..0b06d36a7 100644 --- a/db/structs.go +++ b/db/structs.go @@ -495,20 +495,23 @@ type Organization struct { } type Workspace struct { - ID uint `json:"id"` - Uuid string `json:"uuid"` - Name string `gorm:"unique;not null" json:"name"` - OwnerPubKey string `json:"owner_pubkey"` - Img string `json:"img"` - Created *time.Time `json:"created"` - Updated *time.Time `json:"updated"` - Show bool `json:"show"` - Deleted bool `gorm:"default:false" json:"deleted"` - BountyCount int64 `json:"bounty_count,omitempty"` - Budget uint `json:"budget,omitempty"` - Website string `json:"website" validate:"omitempty,uri"` - Github string `json:"github" validate:"omitempty,uri"` - Description string `json:"description" validate:"omitempty,lte=120"` + ID uint `json:"id"` + Uuid string `json:"uuid"` + Name string `gorm:"unique;not null" json:"name"` + OwnerPubKey string `json:"owner_pubkey"` + Img string `json:"img"` + Created *time.Time `json:"created"` + Updated *time.Time `json:"updated"` + Show bool `json:"show"` + Deleted bool `gorm:"default:false" json:"deleted"` + BountyCount int64 `json:"bounty_count,omitempty"` + Budget uint `json:"budget,omitempty"` + Website string `json:"website" validate:"omitempty,uri"` + Github string `json:"github" validate:"omitempty,uri"` + Description string `json:"description" validate:"omitempty,lte=120"` + Mission string `json:"mission"` + Tactics string `json:"tactics"` + SchematicUrl string `json:"schematic_url"` } type WorkspaceShort struct { diff --git a/handlers/workspaces.go b/handlers/workspaces.go index 6ad121f5f..0b152c96d 100644 --- a/handlers/workspaces.go +++ b/handlers/workspaces.go @@ -744,3 +744,54 @@ func (oh *workspaceHandler) DeleteWorkspace(w http.ResponseWriter, r *http.Reque w.WriteHeader(http.StatusOK) json.NewEncoder(w).Encode(workspace) } + +func (oh *workspaceHandler) UpdateWorkspace(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + pubKeyFromAuth, _ := ctx.Value(auth.ContextKey).(string) + if pubKeyFromAuth == "" { + fmt.Println("no pubkey from auth") + w.WriteHeader(http.StatusUnauthorized) + return + } + + workspace := db.Workspace{} + body, _ := io.ReadAll(r.Body) + r.Body.Close() + err := json.Unmarshal(body, &workspace) + + if err != nil { + fmt.Println(err) + w.WriteHeader(http.StatusNotAcceptable) + return + } + + if pubKeyFromAuth != workspace.OwnerPubKey { + hasRole := db.UserHasAccess(pubKeyFromAuth, workspace.Uuid, db.EditOrg) + if !hasRole { + fmt.Println(pubKeyFromAuth) + fmt.Println(workspace.OwnerPubKey) + fmt.Println("mismatched pubkey") + w.WriteHeader(http.StatusUnauthorized) + json.NewEncoder(w).Encode("Don't have access to Edit workspace") + return + } + } + + // Validate struct data + err = db.Validate.Struct(workspace) + if err != nil { + w.WriteHeader(http.StatusBadRequest) + msg := fmt.Sprintf("Error: did not pass validation test : %s", err) + json.NewEncoder(w).Encode(msg) + return + } + + p, err := oh.db.CreateOrEditWorkspace(workspace) + if err != nil { + w.WriteHeader(http.StatusBadRequest) + return + } + + w.WriteHeader(http.StatusOK) + json.NewEncoder(w).Encode(p) +} diff --git a/routes/workspaces.go b/routes/workspaces.go index 54b740c9f..2ac1cfd08 100644 --- a/routes/workspaces.go +++ b/routes/workspaces.go @@ -38,6 +38,10 @@ func WorkspaceRoutes() chi.Router { r.Get("/poll/invoices/{uuid}", workspaceHandlers.PollBudgetInvoices) r.Get("/invoices/count/{uuid}", handlers.GetInvoicesCount) r.Delete("/delete/{uuid}", workspaceHandlers.DeleteWorkspace) + + r.Post("/mission", workspaceHandlers.UpdateWorkspace) + r.Post("/tactics", workspaceHandlers.UpdateWorkspace) + r.Post("/schematicurl", workspaceHandlers.UpdateWorkspace) }) return r } From e29ba25eedfb02696517106edbd0e5abc36b0599 Mon Sep 17 00:00:00 2001 From: Abdul Wahab Date: Fri, 26 Apr 2024 09:57:48 +0500 Subject: [PATCH 19/21] Set Mission, Tactics and SchematicUrl as an optional --- db/structs.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/db/structs.go b/db/structs.go index 0b06d36a7..5be2739e4 100644 --- a/db/structs.go +++ b/db/structs.go @@ -509,9 +509,9 @@ type Workspace struct { Website string `json:"website" validate:"omitempty,uri"` Github string `json:"github" validate:"omitempty,uri"` Description string `json:"description" validate:"omitempty,lte=120"` - Mission string `json:"mission"` - Tactics string `json:"tactics"` - SchematicUrl string `json:"schematic_url"` + Mission *string `json:"mission,omitempty"` + Tactics *string `json:"tactics,omitempty"` + SchematicUrl *string `json:"schematic_url,omitempty"` } type WorkspaceShort struct { From 89f068667a9226d1d7ceda0231e28be3ff37b85b Mon Sep 17 00:00:00 2001 From: Abdul Wahab Date: Fri, 26 Apr 2024 10:15:13 +0500 Subject: [PATCH 20/21] Removed Mission, Tactics and SchematicUrl --- db/structs.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/db/structs.go b/db/structs.go index 5be2739e4..d229b6bb3 100644 --- a/db/structs.go +++ b/db/structs.go @@ -509,9 +509,6 @@ type Workspace struct { Website string `json:"website" validate:"omitempty,uri"` Github string `json:"github" validate:"omitempty,uri"` Description string `json:"description" validate:"omitempty,lte=120"` - Mission *string `json:"mission,omitempty"` - Tactics *string `json:"tactics,omitempty"` - SchematicUrl *string `json:"schematic_url,omitempty"` } type WorkspaceShort struct { From 5b05e247dae07c7739672be314cbdd8aefd2b425 Mon Sep 17 00:00:00 2001 From: Abdul Wahab Date: Fri, 26 Apr 2024 11:27:01 +0500 Subject: [PATCH 21/21] Added Mission, Tactics and SchematicUrl --- db/structs.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/db/structs.go b/db/structs.go index d229b6bb3..369c465bf 100644 --- a/db/structs.go +++ b/db/structs.go @@ -492,6 +492,9 @@ type Organization struct { Website string `json:"website" validate:"omitempty,uri"` Github string `json:"github" validate:"omitempty,uri"` Description string `json:"description" validate:"omitempty,lte=120"` + Mission *string `json:"mission,omitempty"` + Tactics *string `json:"tactics,omitempty"` + SchematicUrl *string `json:"schematic_url,omitempty"` } type Workspace struct { @@ -509,6 +512,9 @@ type Workspace struct { Website string `json:"website" validate:"omitempty,uri"` Github string `json:"github" validate:"omitempty,uri"` Description string `json:"description" validate:"omitempty,lte=120"` + Mission *string `json:"mission,omitempty"` + Tactics *string `json:"tactics,omitempty"` + SchematicUrl *string `json:"schematic_url,omitempty"` } type WorkspaceShort struct {