You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
239 lines
4.3 KiB
239 lines
4.3 KiB
package controllers |
|
|
|
import ( |
|
"net/http" |
|
"os" |
|
"time" |
|
"tugas1/initializers" |
|
"tugas1/models" |
|
|
|
"github.com/gin-gonic/gin" |
|
"github.com/golang-jwt/jwt/v4" |
|
"golang.org/x/crypto/bcrypt" |
|
) |
|
|
|
func PostsCreate(c *gin.Context) { |
|
// Get dataoff req body |
|
var body struct { |
|
Name string |
|
Email string |
|
Password string |
|
Gender string |
|
Address string |
|
Tempat string |
|
TLahir string |
|
} |
|
|
|
c.Bind((&body)) |
|
|
|
// Create a post |
|
post := models.Post{Name: body.Name, Email: body.Email, Password: body.Password, Gender: body.Gender, |
|
Address: body.Address, Tempat: body.Tempat, TLahir: body.TLahir} |
|
|
|
result := initializers.DB.Create(&post) |
|
|
|
if result.Error != nil { |
|
c.Status(400) |
|
return |
|
} |
|
|
|
// Return it |
|
c.JSON(200, gin.H{ |
|
"post": post, |
|
}) |
|
} |
|
|
|
func PostsIndex(c *gin.Context) { |
|
// Get the posts |
|
var posts []models.Post |
|
initializers.DB.Find(&posts) |
|
|
|
// Respond with them |
|
c.JSON(200, gin.H{ |
|
"posts": posts, |
|
}) |
|
} |
|
|
|
func PostsShow(c *gin.Context) { |
|
// Get id off url |
|
id := c.Param("id") |
|
|
|
// Get the posts |
|
var post models.Post |
|
initializers.DB.First(&post, id) |
|
|
|
// Respond with them |
|
c.JSON(200, gin.H{ |
|
"post": post, |
|
}) |
|
} |
|
|
|
func PostsUpdate(c *gin.Context) { |
|
// Get the id off the url |
|
id := c.Param("id") |
|
|
|
// Get the data off req body |
|
var body struct { |
|
Name string |
|
Email string |
|
Password string |
|
Gender string |
|
Address string |
|
Tempat string |
|
TLahir string |
|
} |
|
|
|
c.Bind(&body) |
|
|
|
// Find the post were updating |
|
var post models.Post |
|
initializers.DB.First(&post, id) |
|
|
|
// Updated it |
|
initializers.DB.Model(&post).Updates(models.Post{ |
|
Name: body.Name, |
|
Email: body.Email, |
|
Password: body.Password, |
|
Gender: body.Gender, |
|
Address: body.Address, |
|
Tempat: body.Tempat, |
|
TLahir: body.TLahir, |
|
}) |
|
|
|
// Respond with it |
|
c.JSON(200, gin.H{ |
|
"post": post, |
|
}) |
|
} |
|
|
|
func PostsDelete(c *gin.Context) { |
|
// Get the id off the url |
|
id := c.Param("id") |
|
|
|
// Delete the posts |
|
initializers.DB.Delete(&models.Post{}, id) |
|
|
|
// Respond |
|
c.Status(200) |
|
} |
|
|
|
func SignUp(c *gin.Context) { |
|
// Get the email/pass of req body |
|
var body struct { |
|
Name string |
|
Email string |
|
Password string |
|
Gender string |
|
Address string |
|
Tempat string |
|
TLahir string |
|
} |
|
|
|
if c.Bind(&body) != nil { |
|
c.JSON(http.StatusBadRequest, gin.H{ |
|
"error": "Failed to read body", |
|
}) |
|
|
|
return |
|
} |
|
|
|
// Hash the password |
|
hash, err := bcrypt.GenerateFromPassword([]byte(body.Password), 10) |
|
|
|
if err != nil { |
|
c.JSON(http.StatusBadRequest, gin.H{ |
|
"error": "Failed to hash password", |
|
}) |
|
|
|
return |
|
} |
|
|
|
// Create the user |
|
user := models.Post{Name: body.Name, Email: body.Email, Password: string(hash), Gender: body.Gender, |
|
Address: body.Address, Tempat: body.Tempat, TLahir: body.TLahir} |
|
result := initializers.DB.Create(&user) |
|
|
|
if result.Error != nil { |
|
c.JSON(http.StatusBadRequest, gin.H{ |
|
"error": "Failed to create user", |
|
}) |
|
|
|
return |
|
} |
|
|
|
// Respond |
|
c.JSON(http.StatusOK, gin.H{}) |
|
} |
|
|
|
func Login(c *gin.Context) { |
|
// Get the email and password for req body |
|
var body struct { |
|
Name string |
|
Email string |
|
Password string |
|
Gender string |
|
Address string |
|
Tempat string |
|
TLahir string |
|
} |
|
|
|
if c.Bind(&body) != nil { |
|
c.JSON(http.StatusBadRequest, gin.H{ |
|
"error": "Failed to read body", |
|
}) |
|
|
|
return |
|
} |
|
// Look up requested user |
|
var user models.Post |
|
initializers.DB.First(&user, "email = ?", body.Email) |
|
|
|
if user.ID == 0 { |
|
c.JSON(http.StatusBadRequest, gin.H{ |
|
"error": "Invalid email", |
|
}) |
|
|
|
return |
|
} |
|
// Compare sent in password with saved user password hash |
|
err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(body.Password)) |
|
|
|
if err != nil { |
|
c.JSON(http.StatusBadRequest, gin.H{ |
|
"error": "Invalid password", |
|
}) |
|
|
|
return |
|
} |
|
|
|
// Generate a jwt token |
|
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ |
|
"sub": user.ID, |
|
"exp": time.Now().Add(time.Hour * 24 * 30).Unix(), |
|
}) |
|
|
|
// Sign and get the complete encoded token as a string using the secret |
|
tokenString, err := token.SignedString([]byte(os.Getenv("SECRET"))) |
|
|
|
if err != nil { |
|
c.JSON(http.StatusBadRequest, gin.H{ |
|
"error": "Failed to create token", |
|
}) |
|
|
|
return |
|
} |
|
|
|
// Send it back |
|
c.SetSameSite(http.SameSiteLaxMode) |
|
c.SetCookie("Authorization", tokenString, 3600*24*30, "", "", false, true) |
|
|
|
c.JSON(http.StatusOK, gin.H{}) |
|
} |
|
|
|
func Validate(c *gin.Context) { |
|
user, _ := c.Get("user") |
|
|
|
c.JSON(http.StatusOK, gin.H{ |
|
"message": user, |
|
}) |
|
}
|
|
|