Add status deletion
authorr <r@freesoftwareextremist.com>
Sun, 2 Feb 2020 08:30:40 +0000 (08:30 +0000)
committerr <r@freesoftwareextremist.com>
Sun, 2 Feb 2020 08:30:40 +0000 (08:30 +0000)
model/session.go
renderer/model.go
service/auth.go
service/logging.go
service/service.go
service/transport.go
templates/status.tmpl

index 10fca6fb5f5fb949d714d5d1c73367864d52493f..c18225c1b72e7738345b37cf714e3ea3570b1f4a 100644 (file)
@@ -10,6 +10,7 @@ var (
 
 type Session struct {
        ID             string   `json:"id"`
+       UserID         string   `json:"user_id"`
        InstanceDomain string   `json:"instance_domain"`
        AccessToken    string   `json:"access_token"`
        CSRFToken      string   `json:"csrf_token"`
index d4bf7d55957de3d0f10b74513bed8cc82e38d7fa..4ff73c3e30a898cad89c07c9c8decf2bcd680a03 100644 (file)
@@ -11,6 +11,7 @@ type Context struct {
        ThreadInNewTab bool
        DarkMode       bool
        CSRFToken      string
+       UserID         string
 }
 
 type HeaderData struct {
index afb324a2720d09a9c33e3b38bf34be76adfe081f..dac03380be7e1cb2c8e6b62b70c335c0335fe60e 100644 (file)
@@ -167,18 +167,19 @@ func (s *as) NewSession(ctx context.Context, instance string) (redirectUrl strin
 }
 
 func (s *as) Signin(ctx context.Context, c *model.Client, sessionID string,
-       code string) (token string, err error) {
+       code string) (token string, userID string, err error) {
        err = s.authenticateClient(ctx, c)
        if err != nil {
                return
        }
 
-       token, err = s.Service.Signin(ctx, c, c.Session.ID, code)
+       token, userID, err = s.Service.Signin(ctx, c, c.Session.ID, code)
        if err != nil {
                return
        }
 
        c.Session.AccessToken = token
+       c.Session.UserID = userID
        err = s.sessionRepo.Add(c.Session)
        if err != nil {
                return
@@ -308,3 +309,15 @@ func (s *as) UnMuteConversation(ctx context.Context, c *model.Client, id string)
        }
        return s.Service.UnMuteConversation(ctx, c, id)
 }
+
+func (s *as) Delete(ctx context.Context, c *model.Client, id string) (err error) {
+       err = s.authenticateClient(ctx, c)
+       if err != nil {
+               return
+       }
+       err = checkCSRF(ctx, c)
+       if err != nil {
+               return
+       }
+       return s.Service.Delete(ctx, c, id)
+}
index f26abaf8330190cf2dae2ac36368fc651f195320..86aa1cb56c534a1437da63fec52c5ed5c01f63b3 100644 (file)
@@ -138,7 +138,7 @@ func (s *ls) NewSession(ctx context.Context, instance string) (redirectUrl strin
 }
 
 func (s *ls) Signin(ctx context.Context, c *model.Client, sessionID string,
-       code string) (token string, err error) {
+       code string) (token string, userID string, err error) {
        defer func(begin time.Time) {
                s.logger.Printf("method=%v, session_id=%v, took=%v, err=%v\n",
                        "Signin", sessionID, time.Since(begin), err)
@@ -228,3 +228,11 @@ func (s *ls) UnMuteConversation(ctx context.Context, c *model.Client, id string)
        }(time.Now())
        return s.Service.UnMuteConversation(ctx, c, id)
 }
+
+func (s *ls) Delete(ctx context.Context, c *model.Client, id string) (err error) {
+       defer func(begin time.Time) {
+               s.logger.Printf("method=%v, id=%v, took=%v, err=%v\n",
+                       "Delete", id, time.Since(begin), err)
+       }(time.Now())
+       return s.Service.Delete(ctx, c, id)
+}
index 043191b62a6533682e70ffd2713423db05368040..c9511f9d604ae60065a66e5181e450852cf63f22 100644 (file)
@@ -34,7 +34,8 @@ type Service interface {
        ServeUserSearchPage(ctx context.Context, c *model.Client, id string, q string, offset int) (err error)
        ServeSettingsPage(ctx context.Context, c *model.Client) (err error)
        NewSession(ctx context.Context, instance string) (redirectUrl string, sessionID string, err error)
-       Signin(ctx context.Context, c *model.Client, sessionID string, code string) (token string, err error)
+       Signin(ctx context.Context, c *model.Client, sessionID string, 
+               code string) (token string, userID string, err error)
        Post(ctx context.Context, c *model.Client, content string, replyToID string, format string,
                visibility string, isNSFW bool, files []*multipart.FileHeader) (id string, err error)
        Like(ctx context.Context, c *model.Client, id string) (count int64, err error)
@@ -46,6 +47,7 @@ type Service interface {
        SaveSettings(ctx context.Context, c *model.Client, settings *model.Settings) (err error)
        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)
 }
 
 type service struct {
@@ -95,6 +97,7 @@ func getRendererContext(c *model.Client) *renderer.Context {
                FluorideMode:   settings.FluorideMode,
                DarkMode:       settings.DarkMode,
                CSRFToken:      session.CSRFToken,
+               UserID:         session.UserID,
        }
 }
 
@@ -741,7 +744,7 @@ func (svc *service) NewSession(ctx context.Context, instance string) (
 }
 
 func (svc *service) Signin(ctx context.Context, c *model.Client,
-       sessionID string, code string) (token string, err error) {
+       sessionID string, code string) (token string, userID string, err error) {
 
        if len(code) < 1 {
                err = errInvalidArgument
@@ -754,6 +757,12 @@ func (svc *service) Signin(ctx context.Context, c *model.Client,
        }
        token = c.GetAccessToken(ctx)
 
+       u, err := c.GetAccountCurrentUser(ctx)
+       if err != nil {
+               return
+       }
+       userID = u.ID
+
        return
 }
 
@@ -851,14 +860,19 @@ func (svc *service) SaveSettings(ctx context.Context, c *model.Client,
        return svc.sessionRepo.Add(session)
 }
 
-func (svc *service) MuteConversation(ctx context.Context, c *model.Client, 
+func (svc *service) MuteConversation(ctx context.Context, c *model.Client,
        id string) (err error) {
        _, err = c.MuteConversation(ctx, id)
        return
 }
 
-func (svc *service) UnMuteConversation(ctx context.Context, c *model.Client, 
+func (svc *service) UnMuteConversation(ctx context.Context, c *model.Client,
        id string) (err error) {
        _, err = c.UnmuteConversation(ctx, id)
        return
 }
+
+func (svc *service) Delete(ctx context.Context, c *model.Client,
+       id string) (err error) {
+       return c.DeleteStatus(ctx, id)
+}
index cc864e79adc3d5408a86df0f4f72cd0e625ccc49..631674884b2f8bbceb98ef539e34094f64fc3671 100644 (file)
@@ -290,7 +290,7 @@ func NewHandler(s Service, staticDir string) http.Handler {
                ctx := newCtxWithSesion(req)
                token := req.URL.Query().Get("code")
 
-               _, err := s.Signin(ctx, c, "", token)
+               _, _, err := s.Signin(ctx, c, "", token)
                if err != nil {
                        w.WriteHeader(http.StatusInternalServerError)
                        s.ServeErrorPage(ctx, c, err)
@@ -513,6 +513,22 @@ func NewHandler(s Service, staticDir string) http.Handler {
                w.WriteHeader(http.StatusFound)
        }
 
+       delete := func(w http.ResponseWriter, req *http.Request) {
+               c := newClient(w)
+               ctx := newCtxWithSesionCSRF(req, req.FormValue("csrf_token"))
+               id, _ := mux.Vars(req)["id"]
+
+               err := s.Delete(ctx, c, id)
+               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{
@@ -622,6 +638,7 @@ func NewHandler(s Service, staticDir string) http.Handler {
        r.HandleFunc("/settings", settings).Methods(http.MethodPost)
        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("/signout", signout).Methods(http.MethodGet)
        r.HandleFunc("/fluoride/like/{id}", fLike).Methods(http.MethodPost)
        r.HandleFunc("/fluoride/unlike/{id}", fUnlike).Methods(http.MethodPost)
index 1ea475e59b9b3d1da74a8b2487654d689f903195..75b399b0941543deddac14356c5554ab3dbe8c19 100644 (file)
                                                        <input type="submit" value="mute" class="btn-link more-link" title="mute">
                                                </form>
                                                {{end}}
+                                               {{if eq $.Ctx.UserID .Account.ID}}
+                                               <form action="/delete/{{.ID}}" method="post">
+                                                       <input type="hidden" name="csrf_token" value="{{$.Ctx.CSRFToken}}">
+                                                       <input type="submit" value="delete" class="btn-link more-link" title="delete">
+                                               </form>
+                                               {{end}}
                                        </div>
                                </div>
                        </div>