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}