Skip to content

Commit

Permalink
Added email and company to user
Browse files Browse the repository at this point in the history
  • Loading branch information
camba1 committed May 31, 2020
1 parent 75fb0c0 commit c3ae8ee
Show file tree
Hide file tree
Showing 7 changed files with 401 additions and 103 deletions.
5 changes: 5 additions & 0 deletions user/client/userClient.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ func CreateUser(srvClient pb.UserSrvService) (*pb.User, error) {
ValidThru: validThru,
Active: true,
Pwd: "1234",
Email: "[email protected]",
Company: "Tiny",
}

//if serverAddress != "" {
Expand Down Expand Up @@ -57,6 +59,8 @@ func UpdateUser(srvClient pb.UserSrvService, user *pb.User) (*pb.User, error) {
user.ValidThru = validThru
user.Active = false
user.Pwd = "5678"
user.Email = "[email protected]"
user.Company = "Tiny"

//if serverAddress != "" {
//outUser, err = srvClient.UpdateUser(context.Background(), user, client.WithAddress(serverAddress))
Expand Down Expand Up @@ -120,6 +124,7 @@ func GetUsers(srvClient pb.UserSrvService) (*pb.Users, error) {
Fisrtname: "Super",
Lastname: "Duck",
ValidDate: searchDate,
Email: "[email protected]",
}

var outUsers *pb.Users
Expand Down
365 changes: 268 additions & 97 deletions user/proto/user.pb.go

Large diffs are not rendered by default.

34 changes: 34 additions & 0 deletions user/proto/user.pb.micro.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions user/proto/user.proto
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import "google/protobuf/timestamp.proto";
service userSrv {
rpc GetUserById(SearchId) returns (user) {}
rpc GetUsers(SearchParams) returns (users) {}
rpc GetUsersByEmail(SearchString) returns (users) {}
rpc CreateUser(user) returns (user) {}
rpc UpdateUser(user) returns (user) {}
rpc DeleteUser(SearchId) returns (affectedCount) {}
Expand All @@ -18,6 +19,7 @@ service userSrv {
rpc AfterCreateUser(user) returns (AfterFuncErr) {}
rpc AfterUpdateUser(user) returns (AfterFuncErr) {}
rpc AfterDeleteUser(user) returns (AfterFuncErr) {}
rpc Auth(user) returns (Token) {}
}


Expand All @@ -43,6 +45,13 @@ message SearchParams {
string fisrtname = 2;
string lastname = 3;
google.protobuf.Timestamp validDate = 5;
string email =9;
string company =10;
string pwd =11;
}

message SearchString {
string value = 1;
}

message SearchId {
Expand All @@ -59,4 +68,9 @@ message validationErr {

message AfterFuncErr {
repeated string failureDesc = 1;
}

message Token {
string token = 1;
bool valid = 2;
}
68 changes: 64 additions & 4 deletions user/server/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ func (u *User) GetUserById(ctx context.Context, searchId *pb.SearchId, outUser *
&outUser.Active,
&outUser.Pwd,
&outUser.Name,
&outUser.Email,
&outUser.Company,
)

if err != nil {
Expand All @@ -65,14 +67,11 @@ func (u *User) GetUsers(ctx context.Context, searchParms *pb.SearchParams, users

_ = ctx

sqlStatement := statements.SqlSelectAll.String()
sqlWhereClause, values, err2 := u.buildSearchWhereClause(searchParms)
values, sqlStatement, err2 := u.getSQLForSearch(searchParms)
if err2 != nil {
return err2
}

sqlStatement += sqlWhereClause

//log.Printf("sql: %s\n values: %v", sqlStatement, values)

rows, err := conn.Query(context.Background(), sqlStatement, values...)
Expand All @@ -96,6 +95,8 @@ func (u *User) GetUsers(ctx context.Context, searchParms *pb.SearchParams, users
&user.Active,
&user.Pwd,
&user.Name,
&user.Email,
&user.Company,
)
if err != nil {
log.Printf(userErr.SelectScanError(err))
Expand All @@ -114,6 +115,17 @@ func (u *User) GetUsers(ctx context.Context, searchParms *pb.SearchParams, users
return nil
}

func (u *User) getSQLForSearch(searchParms *pb.SearchParams) ([]interface{}, string, error) {
sql := statements.SqlSelectAll.String()
sqlWhereClause, values, err := u.buildSearchWhereClause(searchParms)
if err != nil {
return nil, "", err
}

sqlStatement := fmt.Sprintf(sql, sqlWhereClause, statements.MaxRowsToFetch)
return values, sqlStatement, nil
}

//buildSearchWhereClause: Builds a sql string to be used as the where clause in a sql statement. It also returns an interface
//slice with the values to be used as replacements in the sql statement. Currently only handles equality constraints, except
//for the date lookup which is done as a contains clause
Expand All @@ -137,6 +149,16 @@ func (u *User) buildSearchWhereClause(searchParms *pb.SearchParams) (string, []i
values = append(values, searchParms.GetLastname())
i++
}
if searchParms.GetEmail() != "" {
sqlWhereClause += fmt.Sprintf(" AND appuser.email = $%d", i)
values = append(values, searchParms.GetEmail())
i++
}
if searchParms.GetCompany() != "" {
sqlWhereClause += fmt.Sprintf(" AND appuser.company = $%d", i)
values = append(values, searchParms.GetCompany())
i++
}
if searchParms.GetValidDate() != nil {
convertedDates, err := globalUtils.TimeStampPPBToTime(searchParms.GetValidDate())
if err != nil {
Expand Down Expand Up @@ -173,6 +195,8 @@ func (u *User) CreateUser(ctx context.Context, inUser *pb.User, outUser *pb.User
validThru,
inUser.GetActive(),
inUser.GetPwd(),
inUser.GetEmail(),
inUser.GetCompany(),
).
Scan(
&outUser.Id,
Expand All @@ -183,6 +207,8 @@ func (u *User) CreateUser(ctx context.Context, inUser *pb.User, outUser *pb.User
&outUser.Active,
&outUser.Pwd,
&outUser.Name,
&outUser.Email,
&outUser.Company,
)

if errIns != nil {
Expand Down Expand Up @@ -225,6 +251,8 @@ func (u *User) UpdateUser(ctx context.Context, inUser *pb.User, outUser *pb.User
validThru,
inUser.GetActive(),
inUser.GetPwd(),
inUser.GetEmail(),
inUser.GetCompany(),
inUser.GetId(),
).Scan(
&outUser.Id,
Expand All @@ -235,6 +263,8 @@ func (u *User) UpdateUser(ctx context.Context, inUser *pb.User, outUser *pb.User
&outUser.Active,
&outUser.Pwd,
&outUser.Name,
&outUser.Email,
&outUser.Company,
)
if err != nil {
log.Printf(userErr.UpdateError(err))
Expand Down Expand Up @@ -283,3 +313,33 @@ func (u *User) DeleteUser(ctx context.Context, searchid *pb.SearchId, affectedCo

return nil
}

func (u *User) Auth(ctx context.Context, user *pb.User, token *pb.Token) error {
_ = ctx

searchParams := pb.SearchParams{
Email: user.Email,
Pwd: user.Pwd,
}
outUsers := pb.Users{}
if err := u.GetUsers(ctx, &searchParams, &outUsers); err != nil {
return err
}

// TODO: Change this
token.Token = "CHANGEME"
token.Valid = false

return nil
}

func (u *User) GetUsersByEmail(ctx context.Context, searchString *pb.SearchString, outUsers *pb.Users) error {
searchParams := pb.SearchParams{
Email: searchString.Value,
}
err := u.GetUsers(ctx, &searchParams, outUsers)
if err != nil {
return err
}
return nil
}
6 changes: 4 additions & 2 deletions user/server/handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,13 @@ func TestUser_buildSearchWhereClause(t *testing.T) {
sqlFullSearch := sqlEmptyWhereClause + " AND appuser.id = $1 AND appuser.firstname = $2 AND appuser.lastname = $3 AND appuser.validfrom <= $4 AND appuser.validthru >= $4"
sqlOnlyDateSearch := sqlEmptyWhereClause + " AND appuser.validfrom <= $1 AND appuser.validthru >= $1"
sqlOnlyFirstNameSearch := sqlEmptyWhereClause + " AND appuser.firstname = $1"
sqlTestSearch := sqlEmptyWhereClause + " AND appuser.id = $1 AND appuser.firstname = $2 AND appuser.lastname = $3 AND appuser.validfrom <= $4 AND appuser.validthru >= $4"
sqlTestSearch := sqlEmptyWhereClause + " AND appuser.id = $1 AND appuser.firstname = $2 AND appuser.lastname = $3 AND appuser.email = $4 AND appuser.company = $5 AND appuser.validfrom <= $6 AND appuser.validthru >= $6"

var intEmptySearch []interface{}
intFullSearch := []interface{}{int64(1), "Super", "Duck", convertedDates[0]}
intOnlyDateSearch := []interface{}{convertedDates[0]}
intOnlyFirstNameSearch := []interface{}{"Super"}
intTestSearch := []interface{}{int64(1234), "Incredible", "Green Guy", convertedDates[0]}
intTestSearch := []interface{}{int64(1234), "Incredible", "Green Guy", "[email protected]", "igg & Associates", convertedDates[0]}

emptySearch := pb.SearchParams{}
fullSearch := pb.SearchParams{
Expand All @@ -43,6 +43,8 @@ func TestUser_buildSearchWhereClause(t *testing.T) {
Fisrtname: "Incredible",
Lastname: "Green Guy",
ValidDate: dtForSearch,
Email: "[email protected]",
Company: "igg & Associates",
}

tests := []struct {
Expand Down
12 changes: 12 additions & 0 deletions user/server/statements/errorstatements.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ type UserErr string
var errTxtEn = map[string]UserErr{
"internalError": "Internal error. Error: %v\n",
"insertError": "Unable to create user. Error: %v\n",
"insertDupEmail": "Email address already exists in the system\v",
"updateError": "Unable to update user. Error: %v \n",
"updateDupEmail": "This email address is already associated with another user in the system\v",
"deleteError": "Unable to delete user %v. Error: %v\n",
"deleteRowNotFoundError": "row with id %d not found. Unable to delete the row",
"selectReadError": "Unable to get rows from the DB. Error: %v \n",
Expand All @@ -29,7 +31,9 @@ var errTxtEn = map[string]UserErr{
var errTxtES = map[string]UserErr{
"internalError": "Error interno. Error: %v\n",
"insertError": "No se pudo crear el usuario. Error: %v\n",
"insertDupEmail": "Correo electornico ya existe en la base de datos\v",
"updateError": "No se pudo actualizar el usuario. Error: %v \n",
"updateDupEmail": "Este correo electornico ya esta associado con un usuario en el systema\v",
"deleteError": "No se pudo borrar el usuario %v. Error: %v\n",
"deleteRowNotFoundError": "usuario %d no se pudo encontrar. No se pudo borrar el usuario",
"selectReadError": "No su pudo leer datos de la base de datos. Error: %v \n",
Expand Down Expand Up @@ -88,3 +92,11 @@ func (ge *UserErr) SelectRowReadError(err error) string {
func (ge *UserErr) DelUserActive() string {
return fmt.Sprintf(ge.getSqlTxt("delUserActive", language))
}

func (ge *UserErr) UpdateDupEmail() string {
return fmt.Sprintf(ge.getSqlTxt("updateDupEmail", language))
}

func (ge *UserErr) InsertDupEmail() string {
return fmt.Sprintf(ge.getSqlTxt("insertDupEmail", language))
}

0 comments on commit c3ae8ee

Please sign in to comment.