From 842f3e8c201f4f1d7cc792f28d93d13e67e30921 Mon Sep 17 00:00:00 2001 From: Michael Quigley Date: Mon, 9 Dec 2024 11:46:13 -0500 Subject: [PATCH] roughed in store implementation for organizations and memberships (#537) --- controller/store/frontend.go | 1 - controller/store/organization.go | 36 +++++++++++++++++ controller/store/organizationMember.go | 54 ++++++++++++++++++++++++++ 3 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 controller/store/organization.go create mode 100644 controller/store/organizationMember.go diff --git a/controller/store/frontend.go b/controller/store/frontend.go index d4b55faf..8086b468 100644 --- a/controller/store/frontend.go +++ b/controller/store/frontend.go @@ -135,7 +135,6 @@ func (str *Store) UpdateFrontend(fe *Frontend, tx *sqlx.Tx) error { } func (str *Store) DeleteFrontend(id int, tx *sqlx.Tx) error { - stmt, err := tx.Prepare("update frontends set updated_at = current_timestamp, deleted = true where id = $1") if err != nil { return errors.Wrap(err, "error preparing frontends delete statement") diff --git a/controller/store/organization.go b/controller/store/organization.go new file mode 100644 index 00000000..98dda7b0 --- /dev/null +++ b/controller/store/organization.go @@ -0,0 +1,36 @@ +package store + +import ( + "github.com/jmoiron/sqlx" + "github.com/pkg/errors" +) + +type Organization struct { + Model + Token string + Description string +} + +func (str *Store) CreateOrganization(org *Organization, trx *sqlx.Tx) (int, error) { + stmt, err := trx.Prepare("insert into organizations (token, description) values ($1, $2) returning id") + if err != nil { + return 0, errors.Wrap(err, "error preparing organizations insert statement") + } + var id int + if err := stmt.QueryRow(org.Token, org.Description).Scan(&id); err != nil { + return 0, errors.Wrap(err, "error executing organizations insert statement") + } + return id, nil +} + +func (str *Store) DeleteOrganization(id int, trx *sqlx.Tx) error { + stmt, err := trx.Prepare("update organizations set updated_at = current_timestamp, deleted = true where id = $1") + if err != nil { + return errors.Wrap(err, "error preparing organizations delete statement") + } + _, err = stmt.Exec(id) + if err != nil { + return errors.Wrap(err, "error executing organizations delete statement") + } + return nil +} diff --git a/controller/store/organizationMember.go b/controller/store/organizationMember.go new file mode 100644 index 00000000..f61896ea --- /dev/null +++ b/controller/store/organizationMember.go @@ -0,0 +1,54 @@ +package store + +import ( + "github.com/jmoiron/sqlx" + "github.com/pkg/errors" +) + +func (str *Store) AddAccountToOrganization(acctId, orgId int, trx *sqlx.Tx) error { + stmt, err := trx.Prepare("insert into organization_members (organization_id, account_id) values ($1, $2)") + if err != nil { + return errors.Wrap(err, "error preparing organization_members insert statement") + } + _, err = stmt.Exec(acctId, orgId) + if err != nil { + return errors.Wrap(err, "error executing organization_members insert statement") + } + return nil +} + +func (str *Store) IsAccountInOrganization(acctId, orgId int, trx *sqlx.Tx) (bool, error) { + stmt, err := trx.Prepare("select count(0) from organization_members where organization_id = $1 and account_id = $2") + if err != nil { + return false, errors.Wrap(err, "error preparing organization_members count statement") + } + var count int + if err := stmt.QueryRow(acctId, orgId).Scan(&count); err != nil { + return false, errors.Wrap(err, "error executing organization_members count statement") + } + return count > 0, nil +} + +func (str *Store) IsAccountAdminOfOrganization(acctId, orgId int, trx *sqlx.Tx) (bool, error) { + stmt, err := trx.Prepare("select count(0) from organization_members where organization_id = $1 and account_id = $2 and admin") + if err != nil { + return false, errors.Wrap(err, "error preparing organization_members count statement") + } + var count int + if err := stmt.QueryRow(acctId, orgId).Scan(&count); err != nil { + return false, errors.Wrap(err, "error executing organization_members count statement") + } + return count > 0, nil +} + +func (str *Store) RemoveAccountFromOrganization(acctId, orgId int, trx *sqlx.Tx) error { + stmt, err := trx.Prepare("delete from organization_members where organization_id = $1 and account_id = $2") + if err != nil { + return errors.Wrap(err, "error preparing organization_members delete statement") + } + _, err = stmt.Exec(acctId, orgId) + if err != nil { + return errors.Wrap(err, "error executing organization_members delete statement") + } + return nil +}