aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorr <r@freesoftwareextremist.com>2021-01-16 09:10:02 +0000
committerr <r@freesoftwareextremist.com>2021-01-16 09:49:15 +0000
commit91f68ccfb391ee53bfc36f4877ca8d8f63c8faf2 (patch)
tree1e1511a2d80840a68e81ad0a666bd8c2a7e105e4
parent384179e518c8d01a126e716a3f80a9543683e593 (diff)
downloadbloat-91f68ccfb391ee53bfc36f4877ca8d8f63c8faf2.tar.gz
bloat-91f68ccfb391ee53bfc36f4877ca8d8f63c8faf2.zip
Add follow request support
-rw-r--r--service/service.go20
-rw-r--r--service/transport.go22
-rw-r--r--templates/notification.tmpl29
-rw-r--r--templates/requestlist.tmpl34
-rw-r--r--templates/user.tmpl13
5 files changed, 114 insertions, 4 deletions
diff --git a/service/service.go b/service/service.go
index db44e10..088bcf4 100644
--- a/service/service.go
+++ b/service/service.go
@@ -486,6 +486,18 @@ func (s *service) UserPage(c *client, id string, pageType string,
nextLink = fmt.Sprintf("/user/%s/likes?max_id=%s",
id, pg.MaxID)
}
+ case "requests":
+ if !isCurrent {
+ return errInvalidArgument
+ }
+ users, err = c.GetFollowRequests(ctx, &pg)
+ if err != nil {
+ return
+ }
+ if len(users) == 20 && len(pg.MaxID) > 0 {
+ nextLink = fmt.Sprintf("/user/%s/requests?max_id=%s",
+ id, pg.MaxID)
+ }
default:
return errInvalidArgument
}
@@ -817,6 +829,14 @@ func (s *service) UnFollow(c *client, id string) (err error) {
return
}
+func (s *service) Accept(c *client, id string) (err error) {
+ return c.FollowRequestAuthorize(ctx, id)
+}
+
+func (s *service) Reject(c *client, id string) (err error) {
+ return c.FollowRequestReject(ctx, id)
+}
+
func (s *service) Mute(c *client, id string) (err error) {
_, err = c.AccountMute(ctx, id)
return
diff --git a/service/transport.go b/service/transport.go
index 80ad7f1..7ba52a4 100644
--- a/service/transport.go
+++ b/service/transport.go
@@ -403,6 +403,26 @@ func NewHandler(s *service, logger *log.Logger, staticDir string) http.Handler {
return nil
}, CSRF, HTML)
+ accept := handle(func(c *client) error {
+ id, _ := mux.Vars(c.Req)["id"]
+ err := s.Accept(c, id)
+ if err != nil {
+ return err
+ }
+ redirect(c, c.Req.Header.Get("Referer"))
+ return nil
+ }, CSRF, HTML)
+
+ reject := handle(func(c *client) error {
+ id, _ := mux.Vars(c.Req)["id"]
+ err := s.Reject(c, id)
+ if err != nil {
+ return err
+ }
+ redirect(c, c.Req.Header.Get("Referer"))
+ return nil
+ }, CSRF, HTML)
+
mute := handle(func(c *client) error {
id, _ := mux.Vars(c.Req)["id"]
err := s.Mute(c, id)
@@ -634,6 +654,8 @@ func NewHandler(s *service, logger *log.Logger, staticDir string) http.Handler {
r.HandleFunc("/vote/{id}", vote).Methods(http.MethodPost)
r.HandleFunc("/follow/{id}", follow).Methods(http.MethodPost)
r.HandleFunc("/unfollow/{id}", unfollow).Methods(http.MethodPost)
+ r.HandleFunc("/accept/{id}", accept).Methods(http.MethodPost)
+ r.HandleFunc("/reject/{id}", reject).Methods(http.MethodPost)
r.HandleFunc("/mute/{id}", mute).Methods(http.MethodPost)
r.HandleFunc("/unmute/{id}", unMute).Methods(http.MethodPost)
r.HandleFunc("/block/{id}", block).Methods(http.MethodPost)
diff --git a/templates/notification.tmpl b/templates/notification.tmpl
index 3977aa7..5563425 100644
--- a/templates/notification.tmpl
+++ b/templates/notification.tmpl
@@ -38,6 +38,35 @@
</div>
</div>
+ {{else if eq .Type "follow_request"}}
+ <div class="notification-follow-container">
+ <div class="status-profile-img-container">
+ <a class="img-link" href="/user/{{.Account.ID}}">
+ <img class="status-profile-img" src="{{.Account.AvatarStatic}}" title="@{{.Account.Acct}}" alt="profile-avatar" height="48" />
+ </a>
+ </div>
+ <div class="notification-follow">
+ <div class="notification-info-text">
+ <bdi class="status-dname"> {{EmojiFilter .Account.DisplayName .Account.Emojis}} </bdi>
+ <span class="notification-text"> wants to follow you -
+ <time datetime="{{FormatTimeRFC3339 .CreatedAt}}" title="{{FormatTimeRFC822 .CreatedAt}}">{{TimeSince .CreatedAt}}</time>
+ </span>
+ </div>
+ <div>
+ <a href="/user/{{.Account.ID}}"> <span class="status-uname"> @{{.Account.Acct}} </span> </a>
+ </div>
+ <form class="d-inline" action="/accept/{{.Account.ID}}" method="post" target="_self">
+ <input type="hidden" name="csrf_token" value="{{$.Ctx.CSRFToken}}">
+ <input type="submit" value="accept" class="btn-link">
+ </form>
+ -
+ <form class="d-inline" action="/reject/{{.Account.ID}}" method="post" target="_self">
+ <input type="hidden" name="csrf_token" value="{{$.Ctx.CSRFToken}}">
+ <input type="submit" value="reject" class="btn-link">
+ </form>
+ </div>
+ </div>
+
{{else if eq .Type "mention"}}
{{template "status" (WithContext .Status $.Ctx)}}
diff --git a/templates/requestlist.tmpl b/templates/requestlist.tmpl
new file mode 100644
index 0000000..232b56d
--- /dev/null
+++ b/templates/requestlist.tmpl
@@ -0,0 +1,34 @@
+{{with .Data}}
+<div>
+ {{range .}}
+ <div class="user-list-item">
+ <div class="user-list-profile-img">
+ <a class="img-link" href="/user/{{.ID}}">
+ <img class="status-profile-img" src="{{.AvatarStatic}}" title="@{{.Acct}}" alt="avatar" height="48" />
+ </a>
+ </div>
+ <div class="user-list-name">
+ <div>
+ <div class="status-dname"> {{EmojiFilter .DisplayName .Emojis}} </div>
+ <a class="img-link" href="/user/{{.ID}}">
+ <div class="status-uname"> @{{.Acct}} </div>
+ </a>
+ </div>
+ <form class="d-inline" action="/accept/{{.ID}}" method="post" target="_self">
+ <input type="hidden" name="csrf_token" value="{{$.Ctx.CSRFToken}}">
+ <input type="submit" value="accept" class="btn-link">
+ </form>
+ -
+ <form class="d-inline" action="/reject/{{.ID}}" method="post" target="_self">
+ <input type="hidden" name="csrf_token" value="{{$.Ctx.CSRFToken}}">
+ <input type="submit" value="reject" class="btn-link">
+ </form>
+ </div>
+ </div>
+ {{else}}
+ <div class="no-data-found">No data found</div>
+ {{end}}
+</div>
+{{else}}
+<div class="no-data-found">No data found</div>
+{{end}}
diff --git a/templates/user.tmpl b/templates/user.tmpl
index b3461c6..5ef411a 100644
--- a/templates/user.tmpl
+++ b/templates/user.tmpl
@@ -99,10 +99,11 @@
</div>
{{if .IsCurrent}}
<div>
- <a href="/user/{{.User.ID}}/bookmarks"> bookmarks </a> -
- <a href="/user/{{.User.ID}}/likes"> likes </a> -
- <a href="/user/{{.User.ID}}/mutes"> mutes </a> -
- <a href="/user/{{.User.ID}}/blocks"> blocks </a>
+ <a href="/user/{{.User.ID}}/bookmarks"> bookmarks </a>
+ - <a href="/user/{{.User.ID}}/likes"> likes </a>
+ - <a href="/user/{{.User.ID}}/mutes"> mutes </a>
+ - <a href="/user/{{.User.ID}}/blocks"> blocks </a>
+ {{if .User.Locked}}- <a href="/user/{{.User.ID}}/requests"> requests </a>{{end}}
</div>
{{end}}
<div>
@@ -162,6 +163,10 @@
{{else if eq .Type "blocks"}}
<div class="page-title"> Blocks </div>
{{template "userlist.tmpl" (WithContext .Users $.Ctx)}}
+
+{{else if eq .Type "requests"}}
+<div class="page-title"> Follow requests </div>
+{{template "requestlist.tmpl" (WithContext .Users $.Ctx)}}
{{end}}
<div class="pagination">