Enroll Student and Register Teacher api done

This commit is contained in:
SowinskiBraeden committed 2021-10-05 21:23:36 -07:00
1 parent f8d006fe8b
commit 0a678badb3
6 files changed
+334 -31

No files matched your search

+144 -16
View File
@@ -1,21 +1,23 @@
package controllers package controllers
import ( import (
"school-management/database"
"school-management/models" "school-management/models"
"time"
"strconv" "strconv"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
) )
type Test struct { type ErrorStruct struct {
a string Error string
b int
} }
func (t *Test) getA() string { var teacherCollection *mongo.Collection = database.OpenCollection(database.Client, "teachers")
return t.a var studentCollection *mongo.Collection = database.OpenCollection(database.Client, "students")
}
func Enroll(c *fiber.Ctx) error { func Enroll(c *fiber.Ctx) error {
var data map[string]string var data map[string]string
@@ -24,19 +26,145 @@ func Enroll(c *fiber.Ctx) error {
return err return err
} }
// Check minimum enroll field requirements are met
if data["firstname"] == "" || data["lastname"] == "" || data["age"] == "" || data["gradelevel"] == "" || data["dob"] == "" || data["email"] == "" {
return c.Status(400).JSON(ErrorStruct{Error: "missing required fields"})
}
// Get age and grade level and convert to int // Get age and grade level and convert to int
intAge, _ := strconv.Atoi(data["age"]) intAge, _ := strconv.Atoi(data["age"])
intGradeLevel, _ := strconv.Atoi(data["gradelevel"]) intGradeLevel, _ := strconv.Atoi(data["gradelevel"])
student := models.Student{ student := models.Student{}
FirstName: data["firstname"], student.FirstName = data["firstname"]
LastName: data["lastname"], student.MiddleName = data["middlename"]
Age: intAge, student.LastName = data["lastname"]
GradeLevel: intGradeLevel, student.Age = intAge
DOB: data["dob"], student.GradeLevel = intGradeLevel
} student.DOB = data["dob"]
student.Password = student.HashPassword(data["password"]) student.Email = data["email"]
student.Email = student.GenerateSchoolEmail() student.Province = data["province"]
student.City = data["city"]
student.Address = data["address"]
student.Postal = data["postal"]
return c.JSON(student) student.YOG = ((12 - student.GradeLevel) + time.Now().Year()) + 1
student.SchoolEmail = student.GenerateSchoolEmail()
tempPass := student.GeneratePassword(12, 1, 1, 1)
student.Password = student.HashPassword(tempPass)
student.TempPassword = true
// Send student personal email temp password
student.Created_at, _ = time.Parse(time.RFC3339, time.Now().Format(time.RFC3339))
student.Updated_at, _ = time.Parse(time.RFC3339, time.Now().Format(time.RFC3339))
student.ID = primitive.NewObjectID()
result, insertErr := studentCollection.InsertOne(c.Context(), student)
if insertErr != nil {
return c.Status(500).JSON(ErrorStruct{Error: "the student could not be inserted"})
}
return c.Status(201).JSON(result)
}
func RegisterTeacher(c *fiber.Ctx) error {
var data map[string]string
if err := c.BodyParser(&data); err != nil {
return err
}
// Check minimum register teacher field requirements are met
if data["firstname"] == "" || data["lastname"] == "" || data["dob"] == "" || data["email"] == "" {
return c.Status(400).JSON(ErrorStruct{Error: "missing required fields"})
}
teacher := models.Teacher{}
teacher.FirstName = data["firstname"]
teacher.LastName = data["lastname"]
teacher.Email = data["email"]
teacher.SchoolEmail = teacher.GenerateSchoolEmail()
tempPass := teacher.GeneratePassword(12, 1, 1, 1)
teacher.Password = teacher.HashPassword(tempPass)
teacher.TempPassword = true
// Send teacher personal email temp password
teacher.Created_at, _ = time.Parse(time.RFC3339, time.Now().Format(time.RFC3339))
teacher.Updated_at, _ = time.Parse(time.RFC3339, time.Now().Format(time.RFC3339))
teacher.ID = primitive.NewObjectID()
result, insertErr := teacherCollection.InsertOne(c.Context(), teacher)
if insertErr != nil {
return c.Status(500).JSON(ErrorStruct{Error: "the teacher could not be inserted"})
}
return c.Status(201).JSON(result)
}
func UpdateStudentName(c *fiber.Ctx) error {
return c.JSON("status:ok")
}
func UpdateStudentGradeLevel(c *fiber.Ctx) error {
return c.JSON("status:ok")
}
func UpdateStudentHomeroom(c *fiber.Ctx) error {
return c.JSON("status:ok")
}
func UpdateStudentPassword(c *fiber.Ctx) error {
return c.JSON("status:ok")
}
func UpdateStudentLocker(c *fiber.Ctx) error {
return c.JSON("status:ok")
}
func UpdateStudentAddress(c *fiber.Ctx) error {
return c.JSON("status:ok")
}
func UpdateStudentYOG(c *fiber.Ctx) error {
return c.JSON("status:ok")
}
func UpdateStudentContacts(c *fiber.Ctx) error {
return c.JSON("status:ok")
}
func UpdateStudentPhoto(c *fiber.Ctx) error {
return c.JSON("status:ok")
}
func UpdateStudentEmail(c *fiber.Ctx) error {
return c.JSON("status:ok")
}
func UpdateTeacherHomeroom(c *fiber.Ctx) error {
return c.JSON("status:ok")
}
func UpdateTeacherPassword(c *fiber.Ctx) error {
return c.JSON("status:ok")
}
func UpdateTeacherAddress(c *fiber.Ctx) error {
return c.JSON("status:ok")
}
func UpdateTeacherPhoto(c *fiber.Ctx) error {
return c.JSON("status:ok")
}
func UpdateTeacherEmail(c *fiber.Ctx) error {
return c.JSON("status:ok")
}
func UpdateTeacherName(c *fiber.Ctx) error {
return c.JSON("status:ok")
} }
+1 -2
View File
@@ -9,8 +9,7 @@ import (
"go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo"
) )
var client *mongo.Client = database.DBinstance() var studentCollection *mongo.Collection = database.OpenCollection(database.Client, "students")
var studentCollection *mongo.Collection = database.OpenCollection(client, "students")
func main() { func main() {
app := fiber.New() app := fiber.New()
+3 -3
View File
@@ -12,11 +12,11 @@ type Contact struct {
MiddleName string `json:"middlename"` MiddleName string `json:"middlename"`
LastName string `json:"lastname" validate:"required"` LastName string `json:"lastname" validate:"required"`
Address string `json:"address" validate:"required"` Address string `json:"address" validate:"required"`
Phone string `json:"phone" validate:"required"` HomePhone string `json:"homephone" validate:"required"`
SecondaryPhone string `json:"secondaryphone"` WorkPhone string `json:"workphone"`
Email string `json:"email" validate:"required"` Email string `json:"email" validate:"required"`
Relation string `json:"relation" validate:"required"` Relation string `json:"relation" validate:"required"`
PrimaryContact bool `json:"primaraycontact" validate:"required"` Priotrity int `json:"priority" validate:"required"`
Created_at time.Time `json:"created_at"` Created_at time.Time `json:"created_at"`
Updated_at time.Time `json:"updated_at"` Updated_at time.Time `json:"updated_at"`
} }
+75 -7
View File
@@ -1,8 +1,10 @@
package models package models
import ( import (
"math/rand"
"strings" "strings"
"time" "time"
"unicode"
"golang.org/x/crypto/bcrypt" "golang.org/x/crypto/bcrypt"
@@ -17,16 +19,18 @@ type Student struct {
Age int `json:"age" validate:"required"` Age int `json:"age" validate:"required"`
GradeLevel int `json:"gradelevel" validate:"required"` GradeLevel int `json:"gradelevel" validate:"required"`
Email string `json:"email" validate:"required"` Email string `json:"email" validate:"required"`
Password []byte `json:"password" validate:"required,min=8,max=32"` SchoolEmail string `json:"schoolemail"`
Password string `json:"password" validate:"min=10,max=32"`
TempPassword bool `json:"temppassword"`
SID string `json:"sid"` // Student ID SID string `json:"sid"` // Student ID
PED string `json:"ped"` // Personal Education Number PEN string `json:"ped"` // Personal Education Number
Homeroom string `json:"homeroom"` Homeroom string `json:"homeroom"`
Locker string `json:"locker"` Locker string `json:"locker"`
YOG string `json:"yog"` // Year of Graduation YOG int `json:"yog"` // Year of Graduation
Address string `json:"address"` Address string `json:"address"`
City string `json:"city"` City string `json:"city"`
Province string `json:"province"` Province string `json:"province"`
PC string `json:"pc"` // Postal Code Postal string `json:"pc"` // Postal Code
DOB string `json:"dob" validate:"required"` DOB string `json:"dob" validate:"required"`
Photo string `json:"photo"` Photo string `json:"photo"`
Contacts []Contact `json:"contacts"` Contacts []Contact `json:"contacts"`
@@ -34,9 +38,9 @@ type Student struct {
Updated_at time.Time `json:"updated_at"` Updated_at time.Time `json:"updated_at"`
} }
func (s *Student) HashPassword(password string) []byte { func (s *Student) HashPassword(password string) string {
hashPass, _ := bcrypt.GenerateFromPassword([]byte(password), 14) hash, _ := bcrypt.GenerateFromPassword([]byte(password), 14)
return hashPass return string(hash)
} }
func (s *Student) GenerateSchoolEmail() string { func (s *Student) GenerateSchoolEmail() string {
@@ -44,3 +48,67 @@ func (s *Student) GenerateSchoolEmail() string {
// Add check to see if email already exists // Add check to see if email already exists
return email return email
} }
func (s *Student) ComparePasswords(password string) bool {
err := bcrypt.CompareHashAndPassword([]byte(s.Password), []byte(password))
if err != nil {
return false
}
return true
}
func (s *Student) CheckPasswordStrength(password string) bool {
var hasUpper bool = true
for _, r := range password {
if !unicode.IsUpper(r) && unicode.IsLetter(r) {
hasUpper = false
}
}
var hasLower bool = true
for _, r := range password {
if !unicode.IsLower(r) && unicode.IsLetter(r) {
hasLower = false
}
}
if strings.ContainsAny(password, specialCharSet) && hasLower && hasUpper {
return true
} else {
return false
}
}
func (s *Student) GeneratePassword(passwordLength, minSpecialChar, minNum, minUpperCase int) string {
var password strings.Builder
//Set special character
for i := 0; i < minSpecialChar; i++ {
random := rand.Intn(len(specialCharSet))
password.WriteString(string(specialCharSet[random]))
}
//Set numeric
for i := 0; i < minNum; i++ {
random := rand.Intn(len(numberSet))
password.WriteString(string(numberSet[random]))
}
//Set uppercase
for i := 0; i < minUpperCase; i++ {
random := rand.Intn(len(upperCharSet))
password.WriteString(string(upperCharSet[random]))
}
remainingLength := passwordLength - minSpecialChar - minNum - minUpperCase
for i := 0; i < remainingLength; i++ {
random := rand.Intn(len(allCharSet))
password.WriteString(string(allCharSet[random]))
}
inRune := []rune(password.String())
rand.Shuffle(len(inRune), func(i, j int) {
inRune[i], inRune[j] = inRune[j], inRune[i]
})
return string(inRune)
}
+91 -2
View File
@@ -1,9 +1,21 @@
package models package models
import ( import (
"math/rand"
"strings"
"time" "time"
"unicode"
"go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/bson/primitive"
"golang.org/x/crypto/bcrypt"
)
var (
lowerCharSet = "abcdedfghijklmnopqrst"
upperCharSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
specialCharSet = "!@#$%&*?,.`~"
numberSet = "0123456789"
allCharSet = lowerCharSet + upperCharSet + specialCharSet + numberSet
) )
type Teacher struct { type Teacher struct {
@@ -12,15 +24,92 @@ type Teacher struct {
MiddleName string `json:"middlename"` MiddleName string `json:"middlename"`
LastName string `json:"lastname" validate:"required"` LastName string `json:"lastname" validate:"required"`
Email string `json:"email" validate:"required"` Email string `json:"email" validate:"required"`
Password string `json:"password" validate:"required"` SchoolEmail string `json:"schoolemail"`
Password string `json:"password" validate:"min=10,max=32"`
TempPassword bool `json:"temppassword"`
TID string `json:"tid"` // Teacher ID TID string `json:"tid"` // Teacher ID
Homeroom string `json:"homeroom"` Homeroom string `json:"homeroom"`
Address string `json:"address"` Address string `json:"address"`
City string `json:"city"` City string `json:"city"`
Province string `json:"province"` Province string `json:"province"`
PC string `json:"pc"` // Postal Code Postal string `json:"pc"` // Postal Code
DOB string `json:"dob" validate:"required"` DOB string `json:"dob" validate:"required"`
Photo string `json:"string"` Photo string `json:"string"`
Created_at time.Time `json:"created_at"` Created_at time.Time `json:"created_at"`
Updated_at time.Time `json:"updated_at"` Updated_at time.Time `json:"updated_at"`
} }
func (t *Teacher) HashPassword(password string) string {
hash, _ := bcrypt.GenerateFromPassword([]byte(password), 14)
return string(hash)
}
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
return email
}
func (t *Teacher) ComparePasswords(password string) bool {
err := bcrypt.CompareHashAndPassword([]byte(t.Password), []byte(password))
if err != nil {
return false
}
return true
}
func (t *Teacher) CheckPasswordStrength(password string) bool {
var hasUpper bool = true
for _, r := range password {
if !unicode.IsUpper(r) && unicode.IsLetter(r) {
hasUpper = false
}
}
var hasLower bool = true
for _, r := range password {
if !unicode.IsLower(r) && unicode.IsLetter(r) {
hasLower = false
}
}
if strings.ContainsAny(password, specialCharSet) && hasLower && hasUpper {
return true
} else {
return false
}
}
func (t *Teacher) GeneratePassword(passwordLength, minSpecialChar, minNum, minUpperCase int) string {
var password strings.Builder
//Set special character
for i := 0; i < minSpecialChar; i++ {
random := rand.Intn(len(specialCharSet))
password.WriteString(string(specialCharSet[random]))
}
//Set numeric
for i := 0; i < minNum; i++ {
random := rand.Intn(len(numberSet))
password.WriteString(string(numberSet[random]))
}
//Set uppercase
for i := 0; i < minUpperCase; i++ {
random := rand.Intn(len(upperCharSet))
password.WriteString(string(upperCharSet[random]))
}
remainingLength := passwordLength - minSpecialChar - minNum - minUpperCase
for i := 0; i < remainingLength; i++ {
random := rand.Intn(len(allCharSet))
password.WriteString(string(allCharSet[random]))
}
inRune := []rune(password.String())
rand.Shuffle(len(inRune), func(i, j int) {
inRune[i], inRune[j] = inRune[j], inRune[i]
})
return string(inRune)
}
+20 -1
View File
@@ -12,5 +12,24 @@ type Person struct {
} }
func Setup(app *fiber.App) { func Setup(app *fiber.App) {
app.Post("/api/enroll", controllers.Enroll) // API Handling
app.Post("/api/student/enroll", controllers.Enroll)
app.Post("/api/student/updateName", controllers.UpdateStudentName)
app.Post("/api/student/updateGradeLevel", controllers.UpdateStudentGradeLevel)
app.Post("/api/student/updateHomeroom", controllers.UpdateStudentHomeroom)
app.Post("/api/student/updateLocker", controllers.UpdateStudentLocker)
app.Post("/api/studnet/updateYOG", controllers.UpdateStudentYOG)
app.Post("/api/studnet/updateContacts", controllers.UpdateStudentContacts)
app.Post("/api/student/updatePassword", controllers.UpdateStudentPassword)
app.Post("/api/student/updateAddress", controllers.UpdateStudentAddress)
app.Post("/api/student/updatePhoto", controllers.UpdateStudentPhoto)
app.Post("/api/student/updateEmail", controllers.UpdateStudentEmail)
app.Post("/api/teacher/register", controllers.RegisterTeacher)
app.Post("/api/teacher/updatePassword", controllers.UpdateTeacherPassword)
app.Post("/api/teacher/updateAddress", controllers.UpdateTeacherAddress)
app.Post("/api/teacher/updatePhoto", controllers.UpdateTeacherPhoto)
app.Post("/api/teacher/updateName", controllers.UpdateTeacherName)
app.Post("/api/teacher/updateHomeroom", controllers.UpdateTeacherHomeroom)
app.Post("/api/teacher/updateEmail", controllers.UpdateTeacherEmail)
} }