func TestMain(m *testing.M) { hf := func(c *gin.Context) { Register(c) cu, ok = user.FromContext(c) } regServer = apptesting.NewServer(hf) hf = func(c *gin.Context) { Login(c) cu, ok = user.FromContext(c) } loginServer = apptesting.NewServer(hf) hf = func(c *gin.Context) { Logout(c) cu, ok = user.FromContext(c) } logoutServer = apptesting.NewServer(hf) hf = func(c *gin.Context) { Destroy(c) cu, ok = user.FromContext(c) } desServer = apptesting.NewServer(hf) os.Exit(m.Run()) }
func gettask(c *gin.Context) (*todo.Todo, *todolist.TodoList, bool) { u, ok := user.FromContext(c) if !ok { ctl.Render403(c) return nil, nil, false } id, err := strconv.Atoi(c.Param("id")) if err != nil { ctl.Render404(c) return nil, nil, false } td, ok := todo.Find(uint(id)) if !ok { ctl.Render404(c) return nil, nil, false } l, ok := todolist.Find(td.TodoListID) if !ok { ctl.Render500(c) return nil, nil, false } if u.ID != l.UserID { ctl.Render403(c) return nil, nil, false } return td, l, true }
// Home выводит нужную главную страницу в зависимости от статуса авторизации // пользователя. Авторизованные пользователи попадают на страницу // со своими списками дел, остальные на страницу входа. func Home(c *gin.Context) { if _, ok := user.FromContext(c); ok { todos.Index(c) } else { users.LoginForm(c) } }
func assertAccess(c *gin.Context) bool { u, ok := user.FromContext(c) if !ok || !u.Admin() { ctl.Render403(c) return false } return true }
// Destroy удаляет текущего пользователя и перенаправляет на главную. // POST /user/destroy func Destroy(c *gin.Context) { us, ok := user.FromContext(c) if ok { us.Destroy() ctl.Redirect(c, "/") } ctl.Redirect(c, "/") }
// RenderHTML отвечает на запрос кодом 200 и выполненным шаблоном. func RenderHTML(c *gin.Context, template string, data gin.H) { u, ok := user.FromContext(c) if data == nil { data = gin.H{} } data["LoggedIn"] = ok if ok { data["CurrentUser"] = u } c.HTML(http.StatusOK, template, data) }
// ShowList выводит страницу списка дел, на которой отображается его заголовок // и содержание. // GET /list/:id func ShowList(c *gin.Context) { l, ok := getlist(c) if !ok { return } u, _ := user.FromContext(c) u.LoadLists() l.LoadTodos() ctl.RenderHTML(c, "todos_show.tmpl", gin.H{ "List": l, "Lists": u.Lists, }) }
// Login выполняет вход, используя параметры POST-запроса // name и password. // Пользователей, уже выполнивших вход, она перенаправляет на главную, // не перезаписывая сессию. // POST /login func Login(c *gin.Context) { _, ok := user.FromContext(c) if ok { ctl.Redirect(c, "/") return } name := c.PostForm("name") pas := c.PostForm("password") _, ok = user.Login(c, name, pas) if !ok { ctl.RenderHTML(c, "login.tmpl", gin.H{"Errors": []string{"Ошибка авторизации"}}) return } ctl.Redirect(c, "/") }
// Register регистрирует нового пользователя, используя параметры POST-запроса // name и password, и выполняет вход под его именем. // Пользователей, уже выполнивших вход, она перенаправляет на главную, // не перезаписывая сессию. // POST /register func Register(c *gin.Context) { _, ok := user.FromContext(c) if ok { ctl.Redirect(c, "/") return } name := c.PostForm("name") pas := c.PostForm("password") us, errs := user.Register(name, pas) if errs != nil { ctl.RenderHTML(c, "register.tmpl", gin.H{"Errors": errs}) return } us.AutoLogin(c) ctl.Redirect(c, "/") }
// CreateList создает новый список дел с заголовком из POST-параметра title // и перенаправляет на страницу этого списка. // POST /list-create func CreateList(c *gin.Context) { u, ok := user.FromContext(c) if !ok { ctl.Render403(c) return } l := todolist.New(c.PostForm("title")) l.UserID = u.ID err := l.Save() if err != nil { u.LoadLists() ctl.RenderHTML(c, "todos_index.tmpl", gin.H{ "Lists": u.Lists, "AlertError": err.Error(), }) return } ctl.Redirect(c, l.Path()) }
// CreateTask создает новое задание в списке с текстом // из POST-параметра label и перенаправляет на страницу списка. // POST /list/:id/add func CreateTask(c *gin.Context) { l, ok := getlist(c) if !ok { return } err := l.Add(c.PostForm("label")) if err != nil { u, _ := user.FromContext(c) u.LoadLists() l.LoadTodos() ctl.RenderHTML(c, "todos_show.tmpl", gin.H{ "List": l, "AlertError": err.Error(), "Lists": u.Lists, }) return } ctl.Redirect(c, l.Path()) }
func getlist(c *gin.Context) (*todolist.TodoList, bool) { u, ok := user.FromContext(c) if !ok { ctl.Render403(c) return nil, false } id, err := strconv.Atoi(c.Param("id")) if err != nil { ctl.Render404(c) return nil, false } l, ok := todolist.Find(uint(id)) if !ok { ctl.Render404(c) return nil, false } if l.UserID != u.ID { ctl.Render403(c) return nil, false } return l, true }
// Index выводит страницу со всеми списками дел текущего пользователя. // Если пользователь незалогинен, перенаправляет на главную. // GET / func Index(c *gin.Context) { u, ok := user.FromContext(c) if !ok { ctl.Redirect(c, "/") return } u.LoadLists() // Примеры заголовков списков, для вставки // в плейсхолдер поля ввода заголовка. pholders := []string{ "Список покупок", "Дела на завтра", "Что посмотреть", "Задание на дом", } ph := pholders[rand.Intn(len(pholders))] ctl.RenderHTML(c, "todos_index.tmpl", gin.H{ "Lists": u.Lists, "TitlePlaceholder": ph, }) }