Beispiel #1
0
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())
}
Beispiel #2
0
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
}
Beispiel #3
0
// Home выводит нужную главную страницу в зависимости от статуса авторизации
// пользователя. Авторизованные пользователи попадают на страницу
// со своими списками дел, остальные на страницу входа.
func Home(c *gin.Context) {
	if _, ok := user.FromContext(c); ok {
		todos.Index(c)
	} else {
		users.LoginForm(c)
	}
}
Beispiel #4
0
func assertAccess(c *gin.Context) bool {
	u, ok := user.FromContext(c)
	if !ok || !u.Admin() {
		ctl.Render403(c)
		return false
	}
	return true
}
Beispiel #5
0
// Destroy удаляет текущего пользователя и перенаправляет на главную.
// POST /user/destroy
func Destroy(c *gin.Context) {
	us, ok := user.FromContext(c)
	if ok {
		us.Destroy()
		ctl.Redirect(c, "/")
	}
	ctl.Redirect(c, "/")
}
Beispiel #6
0
// 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)
}
Beispiel #7
0
// 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,
	})
}
Beispiel #8
0
// 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, "/")
}
Beispiel #9
0
// 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, "/")
}
Beispiel #10
0
// 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())
}
Beispiel #11
0
// 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())
}
Beispiel #12
0
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
}
Beispiel #13
0
// 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,
	})
}