github.com/hellofresh/janus@v0.0.0-20230925145208-ce8de8183c67/pkg/plugin/organization/cassandra_repository.go (about) 1 package organization 2 3 import ( 4 "encoding/json" 5 "github.com/hellofresh/janus/cassandra/wrapper" 6 "github.com/hellofresh/janus/pkg/plugin/basic/encrypt" 7 log "github.com/sirupsen/logrus" 8 ) 9 10 // Repository represents an user repository 11 type Repository interface { 12 FindAll() ([]*Organization, error) 13 FindByUsername(username string) (*Organization, error) 14 FindOrganization(organization string) (*OrganizationConfig, error) 15 Add(organization *Organization) error 16 AddOrganization(organization *OrganizationConfig) error 17 Remove(username string) error 18 } 19 20 // CassandraRepository represents a cassandra repository 21 type CassandraRepository struct { 22 session wrapper.Holder 23 hash encrypt.Hash 24 } 25 26 func NewCassandraRepository(session wrapper.Holder) (*CassandraRepository, error) { 27 log.Debugf("getting new organization cassandra repo") 28 return &CassandraRepository{session: session}, nil 29 } 30 31 // FindAll fetches all the basic user definitions available 32 func (r *CassandraRepository) FindAll() ([]*Organization, error) { 33 log.Debugf("finding all users servers") 34 35 var results []*Organization 36 37 iter := r.session.GetSession().Query("SELECT username, organization, password FROM organization").Iter() 38 39 var username string 40 var comp string 41 var pass string 42 43 err := iter.ScanAndClose(func() bool { 44 var organization Organization 45 organization.Username = username 46 organization.Organization = comp 47 organization.Password = pass 48 results = append(results, &organization) 49 return true 50 }, &username, &comp, &pass) 51 52 if err != nil { 53 log.Errorf("error getting all organization users: %v", err) 54 } 55 return results, err 56 57 } 58 59 // FindByUsername find an user by username 60 // returns ErrUserNotFound when a user is not found. 61 func (r *CassandraRepository) FindByUsername(username string) (*Organization, error) { 62 log.Debugf("finding: %s", username) 63 64 var organization Organization 65 66 err := r.session.GetSession().Query( 67 "SELECT username, organization, password "+ 68 "FROM organization "+ 69 "WHERE username = ?", 70 username).Scan(&organization.Username, &organization.Organization, &organization.Password) 71 72 if err != nil { 73 if err.Error() == "not found" { 74 log.Debugf("organization not found") 75 err = ErrUserNotFound 76 } 77 log.Errorf("error selecting organization user %s: %v", username, err) 78 } else { 79 log.Debugf("successfully found organization user %s", username) 80 } 81 82 return &organization, err 83 } 84 85 // FindByUsername find an user by username 86 // returns ErrUserNotFound when a user is not found. 87 func (r *CassandraRepository) FindOrganization(organization string) (*OrganizationConfig, error) { 88 log.Debugf("finding: %s", organization) 89 90 var organizationConfig OrganizationConfig 91 var bOrgConfig []byte 92 93 err := r.session.GetSession().Query( 94 "SELECT organization, priority, content_per_day, config "+ 95 "FROM organization_config "+ 96 "WHERE organization = ?", 97 organization).Scan( 98 &organizationConfig.Organization, 99 &organizationConfig.Priority, 100 &organizationConfig.ContentPerDay, 101 &bOrgConfig) 102 103 if err != nil { 104 if err.Error() == "not found" { 105 log.Debugf("organization not found") 106 err = ErrUserNotFound 107 } 108 log.Errorf("error selecting organization %s: %v", organization, err) 109 return &organizationConfig, err 110 } else { 111 log.Debugf("successfully found organization %s", organization) 112 } 113 114 err = json.Unmarshal(bOrgConfig, &organizationConfig.Config) 115 if err != nil { 116 log.Errorf("error unmarshalling config: %v", err) 117 } 118 119 return &organizationConfig, err 120 } 121 122 // Add adds an user to the repository 123 func (r *CassandraRepository) Add(organization *Organization) error { 124 log.Debugf("adding: %s", organization.Username) 125 126 hash, err := r.hash.Generate(organization.Password) 127 if err != nil { 128 log.Errorf("error hashing password: %v", err) 129 return err 130 } 131 132 err = r.session.GetSession().Query( 133 "UPDATE organization "+ 134 "SET organization = ?, "+ 135 "password = ? "+ 136 "WHERE username = ?", 137 organization.Organization, hash, organization.Username).Exec() 138 139 if err != nil { 140 log.Errorf("error saving organization user %s: %v", organization.Username, err) 141 } else { 142 log.Debugf("successfully saved organization user %s", organization.Username) 143 } 144 145 return err 146 } 147 148 // AddOrganization adds an organization to the repository 149 func (r *CassandraRepository) AddOrganization(organization *OrganizationConfig) error { 150 log.Debugf("adding: %s", organization.Organization) 151 152 bOrgConfig, err := json.Marshal(organization.Config) 153 if err != nil { 154 log.Errorf("error marshaling config %s: %v", organization.Config, err) 155 } 156 157 err = r.session.GetSession().Query( 158 "UPDATE organization_config "+ 159 "SET priority = ?, "+ 160 "content_per_day = ?, "+ 161 "config = ? "+ 162 "WHERE organization = ?", 163 organization.Priority, organization.ContentPerDay, bOrgConfig, organization.Organization).Exec() 164 165 if err != nil { 166 log.Errorf("error saving organization %s: %v", organization.Organization, err) 167 } else { 168 log.Debugf("successfully saved organization organization %s", organization.Organization) 169 } 170 171 return err 172 } 173 174 // Remove an user from the repository 175 func (r *CassandraRepository) Remove(username string) error { 176 log.Debugf("removing: %s", username) 177 178 err := r.session.GetSession().Query( 179 "DELETE FROM organization WHERE username = ?", username).Exec() 180 181 if err != nil { 182 log.Errorf("error removing organization user %s: %v", username, err) 183 } else { 184 log.Debugf("successfully removed organization user %s", username) 185 } 186 187 return err 188 }