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  }