ikurotime / gitgud

public
main / internal/interface/web/repo_handler.go
2.1 KB · Go Raw
 1package web
 2
 3import (
 4	"errors"
 5	"net/http"
 6	"strings"
 7
 8	"github.com/go-chi/chi"
 9
10	"gitgud/internal/app"
11	"gitgud/internal/domain"
12	"gitgud/internal/interface/web/templates"
13)
14
15func (h *Handlers) explore(w http.ResponseWriter, r *http.Request) {
16	repos, err := h.repos.ListPublic(r.Context())
17	if err != nil {
18		h.writeError(w, r, err)
19		return
20	}
21	render(w, r, http.StatusOK, templates.Explore(currentUser(r.Context()), repos))
22}
23
24func (h *Handlers) showNewRepo(w http.ResponseWriter, r *http.Request) {
25	render(w, r, http.StatusOK, templates.NewRepo(currentUser(r.Context()), "", "", false, ""))
26}
27
28func (h *Handlers) createRepo(w http.ResponseWriter, r *http.Request) {
29	user := currentUser(r.Context())
30	name := r.FormValue("name")
31	description := r.FormValue("description")
32	private := r.FormValue("private") != ""
33
34	repo, err := h.repos.CreateRepo(r.Context(), user, name, description, private)
35	if err != nil {
36		status := http.StatusBadRequest
37		msg := "could not create repository"
38		switch {
39		case errors.Is(err, domain.ErrConflict):
40			status = http.StatusConflict
41			msg = "a repository with that name already exists"
42		case errors.Is(err, domain.ErrValidation):
43			msg = strings.TrimSuffix(err.Error(), ": "+domain.ErrValidation.Error())
44		}
45		render(w, r, status, templates.NewRepo(user, name, description, private, msg))
46		return
47	}
48
49	h.flash(r, "Repository created.")
50	http.Redirect(w, r, "/"+repo.OwnerName+"/"+repo.Name, http.StatusSeeOther)
51}
52
53func (h *Handlers) profile(w http.ResponseWriter, r *http.Request) {
54	viewer := currentUser(r.Context())
55	ownerName := chi.URLParam(r, "owner")
56
57	owner, err := h.users.ByUsername(r.Context(), ownerName)
58	if err != nil {
59		h.notFound(w, r)
60		return
61	}
62
63	repos, err := h.repos.ListByOwner(r.Context(), owner.ID)
64	if err != nil {
65		h.writeError(w, r, err)
66		return
67	}
68
69	visible := repos[:0]
70	for _, repo := range repos {
71		if app.CanView(repo, viewer) == nil {
72			visible = append(visible, repo)
73		}
74	}
75	render(w, r, http.StatusOK, templates.Profile(viewer, owner.Username, visible))
76}
77
78func (h *Handlers) notFound(w http.ResponseWriter, r *http.Request) {
79	render(w, r, http.StatusNotFound, templates.NotFound(currentUser(r.Context())))
80}