kuvia2/account.go

237 lines
5.8 KiB
Go

package main
import (
"fmt"
"github.com/flamego/captcha"
"github.com/flamego/flamego"
"github.com/flamego/session"
"github.com/flamego/template"
"github.com/rs/zerolog/log"
"golang.org/x/crypto/bcrypt"
"image"
user2 "kuvia/pkg/user"
"net/http"
"regexp"
"time"
)
type User struct {
Id int
Username string
Password string
Name *string
AboutMe *string `db:"aboutme"`
Location *string
Webpage *string
Image *string
}
func loginForm(t template.Template, data template.Data, s session.Session, captcha captcha.Captcha, c flamego.Context) {
fmt.Println(s.Get("user_id"))
if s.Get("user_id") != nil {
c.Redirect("/", http.StatusTemporaryRedirect)
return
}
data["CaptchaHTML"] = captcha.HTML()
t.HTML(http.StatusOK, "login")
}
func registerForm(t template.Template, data template.Data, s session.Session, captcha captcha.Captcha, c flamego.Context) {
if s.Get("user_id") != nil {
c.Redirect("/", http.StatusTemporaryRedirect)
return
}
data["CaptchaHTML"] = captcha.HTML()
t.HTML(http.StatusOK, "register")
}
func register(t template.Template, data template.Data, s session.Session, captcha captcha.Captcha, c flamego.Context) {
if s.Get("user_id") != nil {
c.Redirect("/", http.StatusTemporaryRedirect)
return
}
username := c.Request().FormValue("username")
password := c.Request().FormValue("password")
//validate username
var re = regexp.MustCompile(`^[a-z0-9]{8,25}$`)
if re.Match([]byte(username)) == false {
data["msg"] = "Username just contains lower letters and numbers"
data["CaptchaHTML"] = captcha.HTML()
t.HTML(http.StatusOK, "register")
return
}
if len(password) < 8 {
data["msg"] = "Password too short"
data["CaptchaHTML"] = captcha.HTML()
t.HTML(http.StatusOK, "register")
return
}
//ca := c.Param("captcha")
if captcha.ValidText(c.Request().FormValue("captcha")) == false {
data["msg"] = "Please enter valide captcha code"
data["CaptchaHTML"] = captcha.HTML()
t.HTML(http.StatusOK, "register")
return
}
//Check username exists
usernameIsFree, err := user2.CheckUsernameIsFree(sqlConnection, username)
if err != nil || usernameIsFree == false {
data["msg"] = "Username is taken, choose another one"
data["CaptchaHTML"] = captcha.HTML()
t.HTML(http.StatusOK, "register")
return
}
id, err := user2.Register(sqlConnection, username, password)
if err != nil {
panic(err)
}
fmt.Println(id)
c.ResponseWriter().Write([]byte("OK"))
}
func logout(s session.Session, c flamego.Context) {
s.Flush()
c.Redirect("/login", http.StatusTemporaryRedirect)
}
func login(t template.Template, data template.Data, s session.Session, captcha captcha.Captcha, c flamego.Context) {
if s.Get("user_id") != nil {
c.Redirect("/", http.StatusTemporaryRedirect)
return
}
username := c.Request().FormValue("username")
password := c.Request().FormValue("password")
/*if captcha.ValidText(c.Request().FormValue("captcha")) == false {
data["msg"] = "Please enter valide captcha code"
data["CaptchaHTML"] = captcha.HTML()
t.HTML(http.StatusOK, "login")
return
}*/
user, err := user2.GetUserByUsername(sqlConnection, username)
if err != nil {
data["msg"] = err.Error()
data["CaptchaHTML"] = captcha.HTML()
t.HTML(http.StatusOK, "login")
return
}
err = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password))
if err != nil {
data["msg"] = "Wrong Password"
data["CaptchaHTML"] = captcha.HTML()
t.HTML(http.StatusOK, "login")
return
}
s.Set("user_id", user.Id)
c.Redirect("/", http.StatusTemporaryRedirect)
}
func profile(t template.Template, data template.Data, s session.Session, c flamego.Context) {
if s.Get("user_id") == nil {
c.Redirect("/", http.StatusTemporaryRedirect)
return
}
user, err := user2.GetUserById(sqlConnection, s.Get("user_id").(int))
if err != nil {
panic(err)
}
data["user"] = user
t.HTML(http.StatusOK, "settings_profile")
}
func profileUpdate(t template.Template, data template.Data, s session.Session, c flamego.Context) {
user, err := user2.GetUserById(sqlConnection, s.Get("user_id").(int))
if err != nil {
panic(err)
}
user.Name = c.Request().FormValue("name")
user.AboutMe = c.Request().FormValue("aboutme")
user.Location = c.Request().FormValue("location")
user.Webpage = c.Request().FormValue("webpage")
err = user2.UpdateUser(sqlConnection, user)
if err != nil{
panic(err)
}
data["msg"] = "Profil updated"
data["link"] = "/settings/profile"
t.HTML(200, "message")
}
func profileImage(t template.Template, data template.Data, s session.Session, c flamego.Context) {
if s.Get("user_id") == nil {
c.Redirect("/", http.StatusTemporaryRedirect)
return
}
user, err := user2.GetUserById(sqlConnection, s.Get("user_id").(int))
if err != nil {
panic(err)
}
data["user"] = user
t.HTML(http.StatusOK, "settings_image")
}
func profileImageChange(s session.Session, c flamego.Context) {
log.Debug().Msg("Change Profile Image")
c.Request().ParseMultipartForm(9001)
user, err := user2.GetUserById(sqlConnection, s.Get("user_id").(int))
if err != nil {
panic(err)
}
//Upload Croped Image
file, _, err := c.Request().FormFile("cropImage")
if err != nil {
panic(err)
}
defer file.Close()
cropedImage, _ , err := image.Decode(file)
if err != nil {
panic(err)
}
path := fmt.Sprintf("/user/%v/profilepic/%v-%v", user.Id, time.Now().UnixNano(), "crop.png")
uploadImageToS3(cropedImage, path)
//Upload Original Image
fileOrginal, fileHeaderOrginal, err := c.Request().FormFile("orginal")
if err != nil {
panic(err)
}
defer fileOrginal.Close()
orignalImage, _ , err := image.Decode(fileOrginal)
if err != nil {
panic(err)
}
pathOrignal := fmt.Sprintf("/user/%v/profilepic/%v-orginal-%v", user.Id, time.Now().UnixNano(), fileHeaderOrginal.Filename)
uploadImageToS3(orignalImage, pathOrignal)
user.Image = path
err = user2.UpdateUser(sqlConnection, user)
if err != nil {
panic(err)
}
}