aboutsummaryrefslogtreecommitdiff
path: root/service
diff options
context:
space:
mode:
authorr <r@freesoftwareextremist.com>2020-02-18 22:15:37 +0000
committerr <r@freesoftwareextremist.com>2020-02-18 22:15:37 +0000
commitfe31d4197b66cced9ca84779fac4fe69242d844b (patch)
tree775e8e76eddb3e86d4515369b9615d3c3a5bc762 /service
parent39a3bb7f3566ca0b7020d10abd5d5815096b49cb (diff)
downloadbloat-fe31d4197b66cced9ca84779fac4fe69242d844b.tar.gz
bloat-fe31d4197b66cced9ca84779fac4fe69242d844b.zip
Add frame based navigation
Diffstat (limited to 'service')
-rw-r--r--service/auth.go29
-rw-r--r--service/logging.go25
-rw-r--r--service/service.go189
-rw-r--r--service/transport.go65
4 files changed, 175 insertions, 133 deletions
diff --git a/service/auth.go b/service/auth.go
index 4c5b38b..9e6f709 100644
--- a/service/auth.go
+++ b/service/auth.go
@@ -68,6 +68,22 @@ func (s *as) ServeSigninPage(ctx context.Context, c *model.Client) (err error) {
return s.Service.ServeSigninPage(ctx, c)
}
+func (s *as) ServeRootPage(ctx context.Context, c *model.Client) (err error) {
+ err = s.authenticateClient(ctx, c)
+ if err != nil {
+ return
+ }
+ return s.Service.ServeRootPage(ctx, c)
+}
+
+func (s *as) ServeNavPage(ctx context.Context, c *model.Client) (err error) {
+ err = s.authenticateClient(ctx, c)
+ if err != nil {
+ return
+ }
+ return s.Service.ServeNavPage(ctx, c)
+}
+
func (s *as) ServeTimelinePage(ctx context.Context, c *model.Client, tType string,
maxID string, minID string) (err error) {
err = s.authenticateClient(ctx, c)
@@ -382,3 +398,16 @@ func (s *as) Delete(ctx context.Context, c *model.Client, id string) (err error)
}
return s.Service.Delete(ctx, c, id)
}
+
+func (s *as) ReadNotifications(ctx context.Context, c *model.Client,
+ maxID string) (err error) {
+ err = s.authenticateClient(ctx, c)
+ if err != nil {
+ return
+ }
+ err = checkCSRF(ctx, c)
+ if err != nil {
+ return
+ }
+ return s.Service.ReadNotifications(ctx, c, maxID)
+}
diff --git a/service/logging.go b/service/logging.go
index 055dadd..795f329 100644
--- a/service/logging.go
+++ b/service/logging.go
@@ -34,6 +34,22 @@ func (s *ls) ServeSigninPage(ctx context.Context, c *model.Client) (err error) {
return s.Service.ServeSigninPage(ctx, c)
}
+func (s *ls) ServeRootPage(ctx context.Context, c *model.Client) (err error) {
+ defer func(begin time.Time) {
+ s.logger.Printf("method=%v, took=%v, err=%v\n",
+ "ServeRootPage", time.Since(begin), err)
+ }(time.Now())
+ return s.Service.ServeRootPage(ctx, c)
+}
+
+func (s *ls) ServeNavPage(ctx context.Context, c *model.Client) (err error) {
+ defer func(begin time.Time) {
+ s.logger.Printf("method=%v, took=%v, err=%v\n",
+ "ServeNavPage", time.Since(begin), err)
+ }(time.Now())
+ return s.Service.ServeNavPage(ctx, c)
+}
+
func (s *ls) ServeTimelinePage(ctx context.Context, c *model.Client, tType string,
maxID string, minID string) (err error) {
defer func(begin time.Time) {
@@ -276,3 +292,12 @@ func (s *ls) Delete(ctx context.Context, c *model.Client, id string) (err error)
}(time.Now())
return s.Service.Delete(ctx, c, id)
}
+
+func (s *ls) ReadNotifications(ctx context.Context, c *model.Client,
+ maxID string) (err error) {
+ defer func(begin time.Time) {
+ s.logger.Printf("method=%v, max_id=%v, took=%v, err=%v\n",
+ "ReadNotifications", maxID, time.Since(begin), err)
+ }(time.Now())
+ return s.Service.ReadNotifications(ctx, c, maxID)
+}
diff --git a/service/service.go b/service/service.go
index ecd0d3f..9e01509 100644
--- a/service/service.go
+++ b/service/service.go
@@ -21,6 +21,8 @@ var (
type Service interface {
ServeErrorPage(ctx context.Context, c *model.Client, err error)
ServeSigninPage(ctx context.Context, c *model.Client) (err error)
+ ServeRootPage(ctx context.Context, c *model.Client) (err error)
+ ServeNavPage(ctx context.Context, c *model.Client) (err error)
ServeTimelinePage(ctx context.Context, c *model.Client, tType string, maxID string, minID string) (err error)
ServeThreadPage(ctx context.Context, c *model.Client, id string, reply bool) (err error)
ServeLikedByPage(ctx context.Context, c *model.Client, id string) (err error)
@@ -53,6 +55,7 @@ type Service interface {
MuteConversation(ctx context.Context, c *model.Client, id string) (err error)
UnMuteConversation(ctx context.Context, c *model.Client, id string) (err error)
Delete(ctx context.Context, c *model.Client, id string) (err error)
+ ReadNotifications(ctx context.Context, c *model.Client, maxID string) (err error)
}
type service struct {
@@ -126,45 +129,14 @@ func addToReplyMap(m map[string][]mastodon.ReplyInfo, key interface{},
}
func (svc *service) getCommonData(ctx context.Context, c *model.Client,
- title string) (data *renderer.CommonData, err error) {
-
- data = new(renderer.CommonData)
- data.HeaderData = &renderer.HeaderData{
- Title: title + " - " + svc.clientName,
- NotificationCount: 0,
- CustomCSS: svc.customCSS,
- }
-
- if c == nil || !c.Session.IsLoggedIn() {
- return
- }
-
- notifications, err := c.GetNotifications(ctx, nil)
- if err != nil {
- return nil, err
- }
-
- var notificationCount int
- for i := range notifications {
- if notifications[i].Pleroma != nil &&
- !notifications[i].Pleroma.IsSeen {
- notificationCount++
- }
- }
-
- u, err := c.GetAccountCurrentUser(ctx)
- if err != nil {
- return nil, err
+ title string) (data *renderer.CommonData) {
+ data = &renderer.CommonData{
+ Title: title + " - " + svc.clientName,
+ CustomCSS: svc.customCSS,
}
-
- data.NavbarData = &renderer.NavbarData{
- User: u,
- NotificationCount: notificationCount,
+ if c != nil && c.Session.IsLoggedIn() {
+ data.CSRFToken = c.Session.CSRFToken
}
-
- data.HeaderData.NotificationCount = notificationCount
- data.HeaderData.CSRFToken = c.Session.CSRFToken
-
return
}
@@ -174,11 +146,7 @@ func (svc *service) ServeErrorPage(ctx context.Context, c *model.Client, err err
errStr = err.Error()
}
- commonData, err := svc.getCommonData(ctx, nil, "error")
- if err != nil {
- return
- }
-
+ commonData := svc.getCommonData(ctx, nil, "error")
data := &renderer.ErrorData{
CommonData: commonData,
Error: errStr,
@@ -191,11 +159,7 @@ func (svc *service) ServeErrorPage(ctx context.Context, c *model.Client, err err
func (svc *service) ServeSigninPage(ctx context.Context, c *model.Client) (
err error) {
- commonData, err := svc.getCommonData(ctx, nil, "signin")
- if err != nil {
- return
- }
-
+ commonData := svc.getCommonData(ctx, nil, "signin")
data := &renderer.SigninData{
CommonData: commonData,
}
@@ -204,6 +168,37 @@ func (svc *service) ServeSigninPage(ctx context.Context, c *model.Client) (
return svc.renderer.RenderSigninPage(rCtx, c.Writer, data)
}
+func (svc *service) ServeRootPage(ctx context.Context, c *model.Client) (err error) {
+ data := &renderer.RootData{
+ Title: svc.clientName,
+ }
+
+ rCtx := getRendererContext(c)
+ return svc.renderer.RenderRootPage(rCtx, c.Writer, data)
+}
+
+func (svc *service) ServeNavPage(ctx context.Context, c *model.Client) (err error) {
+ u, err := c.GetAccountCurrentUser(ctx)
+ if err != nil {
+ return
+ }
+
+ postContext := model.PostContext{
+ DefaultVisibility: c.Session.Settings.DefaultVisibility,
+ Formats: svc.postFormats,
+ }
+
+ commonData := svc.getCommonData(ctx, c, "Nav")
+ data := &renderer.NavData{
+ User: u,
+ CommonData: commonData,
+ PostContext: postContext,
+ }
+
+ rCtx := getRendererContext(c)
+ return svc.renderer.RenderNavPage(rCtx, c.Writer, data)
+}
+
func (svc *service) ServeTimelinePage(ctx context.Context, c *model.Client,
tType string, maxID string, minID string) (err error) {
@@ -269,23 +264,13 @@ func (svc *service) ServeTimelinePage(ctx context.Context, c *model.Client,
nextLink = fmt.Sprintf("/timeline/%s?max_id=%s", tType, pg.MaxID)
}
- postContext := model.PostContext{
- DefaultVisibility: c.Session.Settings.DefaultVisibility,
- Formats: svc.postFormats,
- }
-
- commonData, err := svc.getCommonData(ctx, c, tType+" timeline ")
- if err != nil {
- return
- }
-
+ commonData := svc.getCommonData(ctx, c, tType+" timeline ")
data := &renderer.TimelineData{
- Title: title,
- Statuses: statuses,
- NextLink: nextLink,
- PrevLink: prevLink,
- PostContext: postContext,
- CommonData: commonData,
+ Title: title,
+ Statuses: statuses,
+ NextLink: nextLink,
+ PrevLink: prevLink,
+ CommonData: commonData,
}
rCtx := getRendererContext(c)
@@ -356,11 +341,7 @@ func (svc *service) ServeThreadPage(ctx context.Context, c *model.Client,
addToReplyMap(replies, statuses[i].InReplyToID, statuses[i].ID, i+1)
}
- commonData, err := svc.getCommonData(ctx, c, "post by "+status.Account.DisplayName)
- if err != nil {
- return
- }
-
+ commonData := svc.getCommonData(ctx, c, "post by "+status.Account.DisplayName)
data := &renderer.ThreadData{
Statuses: statuses,
PostContext: postContext,
@@ -380,11 +361,7 @@ func (svc *service) ServeLikedByPage(ctx context.Context, c *model.Client,
return
}
- commonData, err := svc.getCommonData(ctx, c, "likes")
- if err != nil {
- return
- }
-
+ commonData := svc.getCommonData(ctx, c, "likes")
data := &renderer.LikedByData{
CommonData: commonData,
Users: likers,
@@ -402,11 +379,7 @@ func (svc *service) ServeRetweetedByPage(ctx context.Context, c *model.Client,
return
}
- commonData, err := svc.getCommonData(ctx, c, "retweets")
- if err != nil {
- return
- }
-
+ commonData := svc.getCommonData(ctx, c, "retweets")
data := &renderer.RetweetedByData{
CommonData: commonData,
Users: retweeters,
@@ -421,6 +394,7 @@ func (svc *service) ServeNotificationPage(ctx context.Context, c *model.Client,
var nextLink string
var unreadCount int
+ var readID string
var pg = mastodon.Pagination{
MaxID: maxID,
MinID: minID,
@@ -439,23 +413,19 @@ func (svc *service) ServeNotificationPage(ctx context.Context, c *model.Client,
}
if unreadCount > 0 {
- err := c.ReadNotifications(ctx, notifications[0].ID)
- if err != nil {
- return err
- }
+ readID = notifications[0].ID
}
- if len(pg.MaxID) > 0 {
+ if len(notifications) == 20 && len(pg.MaxID) > 0 {
nextLink = "/notifications?max_id=" + pg.MaxID
}
- commonData, err := svc.getCommonData(ctx, c, "notifications")
- if err != nil {
- return
- }
-
+ commonData := svc.getCommonData(ctx, c, "notifications")
+ commonData.AutoRefresh = c.Session.Settings.AutoRefreshNotifications
data := &renderer.NotificationData{
Notifications: notifications,
+ UnreadCount: unreadCount,
+ ReadID: readID,
NextLink: nextLink,
CommonData: commonData,
}
@@ -521,14 +491,10 @@ func (svc *service) ServeUserPage(ctx context.Context, c *model.Client,
return errInvalidArgument
}
- commonData, err := svc.getCommonData(ctx, c, user.DisplayName)
- if err != nil {
- return
- }
-
+ commonData := svc.getCommonData(ctx, c, user.DisplayName)
data := &renderer.UserData{
User: user,
- IsCurrent: commonData.IsCurrentUser(user.ID),
+ IsCurrent: c.Session.UserID == user.ID,
Type: pageType,
Users: users,
Statuses: statuses,
@@ -564,11 +530,7 @@ func (svc *service) ServeUserSearchPage(ctx context.Context, c *model.Client,
title += " \"" + q + "\""
}
- commonData, err := svc.getCommonData(ctx, c, title)
- if err != nil {
- return
- }
-
+ commonData := svc.getCommonData(ctx, c, title)
data := &renderer.UserSearchData{
CommonData: commonData,
User: user,
@@ -582,11 +544,7 @@ func (svc *service) ServeUserSearchPage(ctx context.Context, c *model.Client,
}
func (svc *service) ServeAboutPage(ctx context.Context, c *model.Client) (err error) {
- commonData, err := svc.getCommonData(ctx, c, "about")
- if err != nil {
- return
- }
-
+ commonData := svc.getCommonData(ctx, c, "about")
data := &renderer.AboutData{
CommonData: commonData,
}
@@ -596,16 +554,12 @@ func (svc *service) ServeAboutPage(ctx context.Context, c *model.Client) (err er
}
func (svc *service) ServeEmojiPage(ctx context.Context, c *model.Client) (err error) {
- commonData, err := svc.getCommonData(ctx, c, "emojis")
- if err != nil {
- return
- }
-
emojis, err := c.GetInstanceEmojis(ctx)
if err != nil {
return
}
+ commonData := svc.getCommonData(ctx, c, "emojis")
data := &renderer.EmojiData{
Emojis: emojis,
CommonData: commonData,
@@ -636,11 +590,7 @@ func (svc *service) ServeSearchPage(ctx context.Context, c *model.Client,
title += " \"" + q + "\""
}
- commonData, err := svc.getCommonData(ctx, c, title)
- if err != nil {
- return
- }
-
+ commonData := svc.getCommonData(ctx, c, title)
data := &renderer.SearchData{
CommonData: commonData,
Q: q,
@@ -655,11 +605,7 @@ func (svc *service) ServeSearchPage(ctx context.Context, c *model.Client,
}
func (svc *service) ServeSettingsPage(ctx context.Context, c *model.Client) (err error) {
- commonData, err := svc.getCommonData(ctx, c, "settings")
- if err != nil {
- return
- }
-
+ commonData := svc.getCommonData(ctx, c, "settings")
data := &renderer.SettingsData{
CommonData: commonData,
Settings: &c.Session.Settings,
@@ -911,3 +857,8 @@ func (svc *service) Delete(ctx context.Context, c *model.Client,
id string) (err error) {
return c.DeleteStatus(ctx, id)
}
+
+func (svc *service) ReadNotifications(ctx context.Context, c *model.Client,
+ maxID string) (err error) {
+ return c.ReadNotifications(ctx, maxID)
+}
diff --git a/service/transport.go b/service/transport.go
index 5ce0e56..48e2ee2 100644
--- a/service/transport.go
+++ b/service/transport.go
@@ -64,14 +64,30 @@ func NewHandler(s Service, staticDir string) http.Handler {
rootPage := func(w http.ResponseWriter, req *http.Request) {
sessionID, _ := req.Cookie("session_id")
-
- location := "/signin"
if sessionID != nil && len(sessionID.Value) > 0 {
- location = "/timeline/home"
+ c := newClient(w)
+ ctx := newCtxWithSesion(req)
+ err := s.ServeRootPage(ctx, c)
+ if err != nil {
+ w.WriteHeader(http.StatusInternalServerError)
+ s.ServeErrorPage(ctx, c, err)
+ return
+ }
+ } else {
+ w.Header().Add("Location", "/signin")
+ w.WriteHeader(http.StatusFound)
}
+ }
- w.Header().Add("Location", location)
- w.WriteHeader(http.StatusFound)
+ navPage := func(w http.ResponseWriter, req *http.Request) {
+ c := newClient(w)
+ ctx := newCtxWithSesion(req)
+ err := s.ServeNavPage(ctx, c)
+ if err != nil {
+ w.WriteHeader(http.StatusInternalServerError)
+ s.ServeErrorPage(ctx, c, err)
+ return
+ }
}
signinPage := func(w http.ResponseWriter, req *http.Request) {
@@ -297,7 +313,7 @@ func NewHandler(s Service, staticDir string) http.Handler {
return
}
- w.Header().Add("Location", "/timeline/home")
+ w.Header().Add("Location", "/")
w.WriteHeader(http.StatusFound)
}
@@ -326,7 +342,7 @@ func NewHandler(s Service, staticDir string) http.Handler {
return
}
- location := "/timeline/home" + "#status-" + id
+ location := req.Header.Get("Referer")
if len(replyToID) > 0 {
location = "/thread/" + replyToID + "#status-" + id
}
@@ -540,16 +556,18 @@ func NewHandler(s Service, staticDir string) http.Handler {
copyScope := req.FormValue("copy_scope") == "true"
threadInNewTab := req.FormValue("thread_in_new_tab") == "true"
maskNSFW := req.FormValue("mask_nsfw") == "true"
+ arn := req.FormValue("auto_refresh_notifications") == "true"
fluorideMode := req.FormValue("fluoride_mode") == "true"
darkMode := req.FormValue("dark_mode") == "true"
settings := &model.Settings{
- DefaultVisibility: visibility,
- CopyScope: copyScope,
- ThreadInNewTab: threadInNewTab,
- MaskNSFW: maskNSFW,
- FluorideMode: fluorideMode,
- DarkMode: darkMode,
+ DefaultVisibility: visibility,
+ CopyScope: copyScope,
+ ThreadInNewTab: threadInNewTab,
+ MaskNSFW: maskNSFW,
+ AutoRefreshNotifications: arn,
+ FluorideMode: fluorideMode,
+ DarkMode: darkMode,
}
err := s.SaveSettings(ctx, c, settings)
@@ -559,7 +577,7 @@ func NewHandler(s Service, staticDir string) http.Handler {
return
}
- w.Header().Add("Location", req.Header.Get("Referer"))
+ w.Header().Add("Location", "/")
w.WriteHeader(http.StatusFound)
}
@@ -611,6 +629,22 @@ func NewHandler(s Service, staticDir string) http.Handler {
w.WriteHeader(http.StatusFound)
}
+ readNotifications := func(w http.ResponseWriter, req *http.Request) {
+ c := newClient(w)
+ ctx := newCtxWithSesionCSRF(req, req.FormValue("csrf_token"))
+ maxID := req.URL.Query().Get("max_id")
+
+ err := s.ReadNotifications(ctx, c, maxID)
+ if err != nil {
+ w.WriteHeader(http.StatusInternalServerError)
+ s.ServeErrorPage(ctx, c, err)
+ return
+ }
+
+ w.Header().Add("Location", req.Header.Get("Referer"))
+ w.WriteHeader(http.StatusFound)
+ }
+
signout := func(w http.ResponseWriter, req *http.Request) {
// TODO remove session from database
http.SetCookie(w, &http.Cookie{
@@ -694,7 +728,9 @@ func NewHandler(s Service, staticDir string) http.Handler {
}
r.HandleFunc("/", rootPage).Methods(http.MethodGet)
+ r.HandleFunc("/nav", navPage).Methods(http.MethodGet)
r.HandleFunc("/signin", signinPage).Methods(http.MethodGet)
+ r.HandleFunc("//{type}", timelinePage).Methods(http.MethodGet)
r.HandleFunc("/timeline/{type}", timelinePage).Methods(http.MethodGet)
r.HandleFunc("/timeline", timelineOldPage).Methods(http.MethodGet)
r.HandleFunc("/thread/{id}", threadPage).Methods(http.MethodGet)
@@ -726,6 +762,7 @@ func NewHandler(s Service, staticDir string) http.Handler {
r.HandleFunc("/muteconv/{id}", muteConversation).Methods(http.MethodPost)
r.HandleFunc("/unmuteconv/{id}", unMuteConversation).Methods(http.MethodPost)
r.HandleFunc("/delete/{id}", delete).Methods(http.MethodPost)
+ r.HandleFunc("/notifications/read", readNotifications).Methods(http.MethodPost)
r.HandleFunc("/signout", signout).Methods(http.MethodGet)
r.HandleFunc("/fluoride/like/{id}", fLike).Methods(http.MethodPost)
r.HandleFunc("/fluoride/unlike/{id}", fUnlike).Methods(http.MethodPost)