mirror of
https://github.com/kataras/iris.git
synced 2025-03-13 10:14:14 +01:00
126 lines
2.8 KiB
Go
126 lines
2.8 KiB
Go
package user
|
|
|
|
const (
|
|
pathMyProfile = "/user/me"
|
|
pathRegister = "/user/register"
|
|
)
|
|
|
|
// Controller is responsible to handle the following requests:
|
|
// GET /user/register
|
|
// POST /user/register
|
|
// GET /user/login
|
|
// POST /user/login
|
|
// GET /user/me
|
|
// GET /user/{id:long} | long is a new param type, it's the int64.
|
|
// All HTTP Methods /user/logout
|
|
type Controller struct {
|
|
AuthController
|
|
}
|
|
|
|
// GetRegister handles GET:/user/register.
|
|
func (c *Controller) GetRegister() {
|
|
if c.isLoggedIn() {
|
|
c.logout()
|
|
return
|
|
}
|
|
|
|
c.Data["Title"] = "User Registration"
|
|
c.Tmpl = pathRegister + ".html"
|
|
}
|
|
|
|
// PostRegister handles POST:/user/register.
|
|
func (c *Controller) PostRegister() {
|
|
// we can either use the `c.Ctx.ReadForm` or read values one by one.
|
|
var (
|
|
firstname = c.Ctx.FormValue("firstname")
|
|
username = c.Ctx.FormValue("username")
|
|
password = c.Ctx.FormValue("password")
|
|
)
|
|
|
|
user, err := c.createOrUpdate(firstname, username, password)
|
|
if err != nil {
|
|
c.fireError(err)
|
|
return
|
|
}
|
|
|
|
// setting a session value was never easier.
|
|
c.Session.Set(sessionIDKey, user.ID)
|
|
// succeed, nothing more to do here, just redirect to the /user/me.
|
|
c.Path = pathMyProfile
|
|
}
|
|
|
|
// GetLogin handles GET:/user/login.
|
|
func (c *Controller) GetLogin() {
|
|
if c.isLoggedIn() {
|
|
c.logout()
|
|
return
|
|
}
|
|
c.Data["Title"] = "User Login"
|
|
c.Tmpl = PathLogin + ".html"
|
|
}
|
|
|
|
// PostLogin handles POST:/user/login.
|
|
func (c *Controller) PostLogin() {
|
|
var (
|
|
username = c.Ctx.FormValue("username")
|
|
password = c.Ctx.FormValue("password")
|
|
)
|
|
|
|
user, err := c.verify(username, password)
|
|
if err != nil {
|
|
c.fireError(err)
|
|
return
|
|
}
|
|
|
|
c.Session.Set(sessionIDKey, user.ID)
|
|
c.Path = pathMyProfile
|
|
}
|
|
|
|
// AnyLogout handles any method on path /user/logout.
|
|
func (c *Controller) AnyLogout() {
|
|
c.logout()
|
|
}
|
|
|
|
// GetMe handles GET:/user/me.
|
|
func (c *Controller) GetMe() {
|
|
id, err := c.Session.GetInt64(sessionIDKey)
|
|
if err != nil || id <= 0 {
|
|
// when not already logged in.
|
|
c.Path = PathLogin
|
|
return
|
|
}
|
|
|
|
u, found := c.Source.GetByID(id)
|
|
if !found {
|
|
// if the session exists but for some reason the user doesn't exist in the "database"
|
|
// then logout him and redirect to the register page.
|
|
c.logout()
|
|
return
|
|
}
|
|
|
|
// set the model and render the view template.
|
|
c.User = u
|
|
c.Data["Title"] = "Profile of " + u.Username
|
|
c.Tmpl = pathMyProfile + ".html"
|
|
}
|
|
|
|
func (c *Controller) renderNotFound(id int64) {
|
|
c.Status = 404
|
|
c.Data["Title"] = "User Not Found"
|
|
c.Data["ID"] = id
|
|
c.Tmpl = "user/notfound.html"
|
|
}
|
|
|
|
// GetBy handles GET:/user/{id:long},
|
|
// i.e http://localhost:8080/user/1
|
|
func (c *Controller) GetBy(userID int64) {
|
|
// we have /user/{id}
|
|
// fetch and render user json.
|
|
if user, found := c.Source.GetByID(userID); !found {
|
|
// not user found with that ID.
|
|
c.renderNotFound(userID)
|
|
} else {
|
|
c.Ctx.JSON(user)
|
|
}
|
|
}
|