|
|
|
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,
|
|
|
|
})
|
|
|
|
}
|