From 325c842230f58767fc1a845284242d836bb74571 Mon Sep 17 00:00:00 2001 From: Braeden Sowinski Date: Mon, 7 Feb 2022 14:12:32 -0800 Subject: [PATCH] update/better-logic --- controllers/authController.go | 58 ++++++++++++++++++++++------------- models/adminModel.go | 7 +++++ models/studentModel.go | 17 ++++++++-- models/teacherModel.go | 3 +- 4 files changed, 59 insertions(+), 26 deletions(-) diff --git a/controllers/authController.go b/controllers/authController.go index 8fb4c7f..653df2d 100644 --- a/controllers/authController.go +++ b/controllers/authController.go @@ -39,8 +39,7 @@ func AuthAdmin(c *fiber.Ctx) bool { claims := token.Claims.(*jwt.StandardClaims) - var admin models.Admin - findErr := adminCollection.FindOne(context.TODO(), bson.M{"aid": claims.Issuer}).Decode(&admin) + findErr := adminCollection.FindOne(context.TODO(), bson.M{"aid": claims.Issuer}) if findErr != nil { return false } @@ -60,8 +59,7 @@ func AuthStudent(c *fiber.Ctx) (verified bool, sid string) { claims := token.Claims.(*jwt.StandardClaims) - var student models.Admin - findErr := adminCollection.FindOne(context.TODO(), bson.M{"sid": claims.Issuer}).Decode(&student) + findErr := studentCollection.FindOne(context.TODO(), bson.M{"sid": claims.Issuer}) if findErr != nil { return false, "" } @@ -70,7 +68,7 @@ func AuthStudent(c *fiber.Ctx) (verified bool, sid string) { } func Enroll(c *fiber.Ctx) error { - var data map[string]string + var data map[string]interface{} ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) if err := c.BodyParser(&data); err != nil { @@ -92,7 +90,7 @@ func Enroll(c *fiber.Ctx) error { } // Check minimum enroll field requirements are met - if data["firstname"] == "" || data["lastname"] == "" || data["age"] == "" || data["gradelevel"] == "" || data["dob"] == "" || data["email"] == "" { + if data["firstname"] == "" || data["lastname"] == "" || data["age"] == "" || data["gradelevel"] == "" || data["dob"] == "" || data["email"] == "" || data["province"] == "" || data["city"] == "" || data["address"] == "" || data["postal"] == "" { cancel() return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "success": false, @@ -101,22 +99,31 @@ func Enroll(c *fiber.Ctx) error { } var student models.Student - student.PersonalData.FirstName = data["firstname"] - student.PersonalData.MiddleName = data["middlename"] - student.PersonalData.LastName = data["lastname"] - student.PersonalData.Age, _ = strconv.Atoi(data["age"]) - student.SchoolData.GradeLevel, _ = strconv.Atoi(data["gradelevel"]) - student.PersonalData.DOB = data["dob"] - student.PersonalData.Email = data["email"] - student.PersonalData.Province = data["province"] - student.PersonalData.City = data["city"] - student.PersonalData.Address = data["address"] - student.PersonalData.Postal = data["postal"] + student.PersonalData.FirstName = data["firstname"].(string) + student.PersonalData.MiddleName = data["middlename"].(string) + student.PersonalData.LastName = data["lastname"].(string) + student.PersonalData.Age = data["age"].(int) + student.SchoolData.GradeLevel = data["gradelevel"].(int) + student.PersonalData.DOB = data["dob"].(string) + student.PersonalData.Email = data["email"].(string) + student.PersonalData.Province = data["province"].(string) + student.PersonalData.City = data["city"].(string) + student.PersonalData.Address = data["address"].(string) + student.PersonalData.Postal = data["postal"].(string) student.PersonalData.Contacts = []string{} student.SchoolData.YOG = ((12 - student.SchoolData.GradeLevel) + time.Now().Year()) + 1 - student.AccountData.SchoolEmail = student.GenerateSchoolEmail() + var schoolEmail string = "" + offset := 0 + for { + schoolEmail = student.GenerateSchoolEmail(offset, schoolEmail) + if student.EmailExists(schoolEmail) == true { + break + } + offset++ + } + student.AccountData.SchoolEmail = schoolEmail // Disable login block student.AccountData.AccountDisabled = false @@ -176,7 +183,7 @@ func Enroll(c *fiber.Ctx) error { } func RegisterTeacher(c *fiber.Ctx) error { - var data map[string]string + var data map[string]interface{} ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) if err := c.BodyParser(&data); err != nil { @@ -207,9 +214,14 @@ func RegisterTeacher(c *fiber.Ctx) error { } var teacher models.Teacher - teacher.FirstName = data["firstname"] - teacher.LastName = data["lastname"] - teacher.Email = data["email"] + teacher.FirstName = data["firstname"].(string) + teacher.MiddleName = data["middlename"].(string) + teacher.LastName = data["lastname"].(string) + teacher.Email = data["email"].(string) + teacher.Province = data["province"].(string) + teacher.City = data["city"].(string) + teacher.Postal = data["postal"].(string) + teacher.DOB = data["postal"].(string) teacher.SchoolEmail = teacher.GenerateSchoolEmail() @@ -303,6 +315,8 @@ func CreateAdmin(c *fiber.Ctx) error { admin.LastName = data["lastname"] admin.Email = data["email"] + admin.SchoolEmail = admin.GenerateSchoolEmail() + tempPass := admin.GeneratePassword(12, 1, 1, 1) admin.Password = admin.HashPassword(tempPass) admin.TempPassword = true diff --git a/models/adminModel.go b/models/adminModel.go index 135712e..87b9773 100644 --- a/models/adminModel.go +++ b/models/adminModel.go @@ -16,6 +16,7 @@ type Admin struct { FirstName string `json:"firstname" validate:"required"` LastName string `json:"lastname" validate:"required"` Email string `json:"email" validate:"required"` + SchoolEmail string `json:"schoolemail"` Password string `json:"-" validate:"min=10,max=32"` TempPassword bool `json:"temppassword"` AID string `json:"aid"` @@ -23,6 +24,12 @@ type Admin struct { Updated_at time.Time `json:"updated_at"` } +func (a *Admin) GenerateSchoolEmail() string { + var email string = strings.ToLower(a.LastName) + "_" + strings.ToLower(string(a.FirstName[0])) + "@surreyschools.ca" + // Add check to see if email already exists + return email +} + func (s *Admin) HashPassword(password string) string { hash, _ := bcrypt.GenerateFromPassword([]byte(password), 14) return string(hash) diff --git a/models/studentModel.go b/models/studentModel.go index 263989d..862a966 100644 --- a/models/studentModel.go +++ b/models/studentModel.go @@ -1,6 +1,7 @@ package models import ( + "context" "math/rand" "school-management/database" "strings" @@ -9,11 +10,13 @@ import ( "golang.org/x/crypto/bcrypt" + "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" ) var lockerCollection *mongo.Collection = database.OpenCollection(database.Client, "lockers") +var studentCollection *mongo.Collection = database.OpenCollection(database.Client, "students") type Student struct { ID primitive.ObjectID `bson:"_id"` @@ -56,9 +59,19 @@ func (s *Student) HashPassword(password string) string { return string(hash) } -func (s *Student) GenerateSchoolEmail() string { +func (s *Student) EmailExists(email string) bool { + findErr := studentCollection.FindOne(context.TODO(), bson.M{"schooldata.schoolemail": email}) + if findErr != nil { + return false + } + return true +} + +func (s *Student) GenerateSchoolEmail(offset int, lastEmail string) string { var email string = strings.ToLower(string(s.PersonalData.FirstName[0])) + "." + strings.ToLower(s.PersonalData.LastName) + "@surreyschools.ca" - // Add check to see if email already exists + if offset > 0 { + email = lastEmail[:offset] + string(s.PersonalData.FirstName[offset]) + lastEmail[offset:] + } return email } diff --git a/models/teacherModel.go b/models/teacherModel.go index c948285..faac569 100644 --- a/models/teacherModel.go +++ b/models/teacherModel.go @@ -45,8 +45,7 @@ func (t *Teacher) HashPassword(password string) string { } func (t *Teacher) GenerateSchoolEmail() string { - var email string = strings.ToLower(string(t.FirstName[0])) + "_" + strings.ToLower(t.LastName) + "@surreyschools.ca" - // Add check to see if email already exists + var email string = strings.ToLower(t.LastName) + "_" + strings.ToLower(string(t.FirstName[0])) + "@surreyschools.ca" return email }