fix deleting like alerts when unliking a reply

immediately delete alerts via websockets when a topic or reply is unliked

Add AidsByParams method to ActivityStream.
This commit is contained in:
Azareal 2020-02-01 16:56:04 +10:00
parent b38df9773b
commit 2e8c6e6fb6
4 changed files with 45 additions and 10 deletions

View File

@ -14,6 +14,7 @@ type ActivityStream interface {
Delete(id int) error Delete(id int) error
DeleteByParams(event string, targetID int, targetType string) error DeleteByParams(event string, targetID int, targetType string) error
DeleteByParamsExtra(event string, targetID int, targetType, extra string) error DeleteByParamsExtra(event string, targetID int, targetType, extra string) error
AidsByParams(event string, elementID int, elementType string) (aids []int, err error)
AidsByParamsExtra(event string, elementID int, elementType, extra string) (aids []int, err error) AidsByParamsExtra(event string, elementID int, elementType, extra string) (aids []int, err error)
Count() (count int) Count() (count int)
} }
@ -24,6 +25,7 @@ type DefaultActivityStream struct {
delete *sql.Stmt delete *sql.Stmt
deleteByParams *sql.Stmt deleteByParams *sql.Stmt
deleteByParamsExtra *sql.Stmt deleteByParamsExtra *sql.Stmt
aidsByParams *sql.Stmt
aidsByParamsExtra *sql.Stmt aidsByParamsExtra *sql.Stmt
count *sql.Stmt count *sql.Stmt
} }
@ -36,6 +38,7 @@ func NewDefaultActivityStream(acc *qgen.Accumulator) (*DefaultActivityStream, er
delete: acc.Delete(as).Where("asid=?").Prepare(), delete: acc.Delete(as).Where("asid=?").Prepare(),
deleteByParams: acc.Delete(as).Where("event=? AND elementID=? AND elementType=?").Prepare(), deleteByParams: acc.Delete(as).Where("event=? AND elementID=? AND elementType=?").Prepare(),
deleteByParamsExtra: acc.Delete(as).Where("event=? AND elementID=? AND elementType=? AND extra=?").Prepare(), deleteByParamsExtra: acc.Delete(as).Where("event=? AND elementID=? AND elementType=? AND extra=?").Prepare(),
aidsByParams: acc.Select(as).Columns("asid").Where("event=? AND elementID=? AND elementType=?").Prepare(),
aidsByParamsExtra: acc.Select(as).Columns("asid").Where("event=? AND elementID=? AND elementType=? AND extra=?").Prepare(), aidsByParamsExtra: acc.Select(as).Columns("asid").Where("event=? AND elementID=? AND elementType=? AND extra=?").Prepare(),
count: acc.Count(as).Prepare(), count: acc.Count(as).Prepare(),
}, acc.FirstError() }, acc.FirstError()
@ -71,6 +74,22 @@ func (s *DefaultActivityStream) DeleteByParamsExtra(event string, elementID int,
return err return err
} }
func (s *DefaultActivityStream) AidsByParams(event string, elementID int, elementType string) (aids []int, err error) {
rows, err := s.aidsByParams.Query(event, elementID, elementType)
if err != nil {
return nil, err
}
defer rows.Close()
for rows.Next() {
var aid int
if err := rows.Scan(&aid); err != nil {
return nil, err
}
aids = append(aids, aid)
}
return aids, rows.Err()
}
func (s *DefaultActivityStream) AidsByParamsExtra(event string, elementID int, elementType, extra string) (aids []int, err error) { func (s *DefaultActivityStream) AidsByParamsExtra(event string, elementID int, elementType, extra string) (aids []int, err error) {
rows, err := s.aidsByParamsExtra.Query(event, elementID, elementType, extra) rows, err := s.aidsByParamsExtra.Query(event, elementID, elementType, extra)
if err != nil { if err != nil {

View File

@ -7,7 +7,7 @@ import (
"strings" "strings"
"sync/atomic" "sync/atomic"
"github.com/Azareal/Gosora/query_gen" qgen "github.com/Azareal/Gosora/query_gen"
) )
var SettingBox atomic.Value // An atomic value pointing to a SettingBox var SettingBox atomic.Value // An atomic value pointing to a SettingBox
@ -16,7 +16,7 @@ var SettingBox atomic.Value // An atomic value pointing to a SettingBox
type SettingMap map[string]interface{} type SettingMap map[string]interface{}
type SettingStore interface { type SettingStore interface {
ParseSetting(sname string, scontent string, stype string, sconstraint string) string ParseSetting(sname, scontent, stype, sconstraint string) string
BypassGet(name string) (*Setting, error) BypassGet(name string) (*Setting, error)
BypassGetAll(name string) ([]*Setting, error) BypassGetAll(name string) ([]*Setting, error)
} }
@ -47,9 +47,9 @@ func init() {
DbInits.Add(func(acc *qgen.Accumulator) error { DbInits.Add(func(acc *qgen.Accumulator) error {
s := "settings" s := "settings"
settingStmts = SettingStmts{ settingStmts = SettingStmts{
getAll: acc.Select(s).Columns("name, content, type, constraints").Prepare(), getAll: acc.Select(s).Columns("name,content,type,constraints").Prepare(),
get: acc.Select(s).Columns("content, type, constraints").Where("name = ?").Prepare(), get: acc.Select(s).Columns("content,type,constraints").Where("name=?").Prepare(),
update: acc.Update(s).Set("content = ?").Where("name = ?").Prepare(), update: acc.Update(s).Set("content=?").Where("name=?").Prepare(),
} }
return acc.FirstError() return acc.FirstError()
}) })
@ -80,7 +80,7 @@ func LoadSettings() error {
} }
// TODO: Add better support for HTML attributes (html-attribute). E.g. Meta descriptions. // TODO: Add better support for HTML attributes (html-attribute). E.g. Meta descriptions.
func (sBox SettingMap) ParseSetting(sname string, scontent string, stype string, constraint string) (err error) { func (sBox SettingMap) ParseSetting(sname, scontent, stype, constraint string) (err error) {
ssBox := map[string]interface{}(sBox) ssBox := map[string]interface{}(sBox)
switch stype { switch stype {
case "bool": case "bool":
@ -146,7 +146,7 @@ func (sBox SettingMap) BypassGetAll() (settingList []*Setting, err error) {
return settingList, rows.Err() return settingList, rows.Err()
} }
func (sBox SettingMap) Update(name string, content string) RouteError { func (sBox SettingMap) Update(name, content string) RouteError {
s, err := sBox.BypassGet(name) s, err := sBox.BypassGet(name)
if err == ErrNoRows { if err == ErrNoRows {
return FromError(err) return FromError(err)

View File

@ -566,8 +566,16 @@ func ReplyUnlikeSubmit(w http.ResponseWriter, r *http.Request, user c.User, srid
if err != nil { if err != nil {
return c.InternalErrorJSQ(err, w, r, js) return c.InternalErrorJSQ(err, w, r, js)
} }
// TODO: Push dismiss-event alerts to the users.
err = c.Activity.DeleteByParams("like", topic.ID, "reply") // TODO: Better coupling between the two params queries
aids, err := c.Activity.AidsByParams("like", reply.ID, "post")
if err != nil {
return c.InternalErrorJSQ(err, w, r, js)
}
for _, aid := range aids {
c.DismissAlert(reply.CreatedBy, aid)
}
err = c.Activity.DeleteByParams("like", reply.ID, "post")
if err != nil { if err != nil {
return c.InternalErrorJSQ(err, w, r, js) return c.InternalErrorJSQ(err, w, r, js)
} }

View File

@ -993,7 +993,15 @@ func UnlikeTopicSubmit(w http.ResponseWriter, r *http.Request, user c.User, stid
if err != nil { if err != nil {
return c.InternalErrorJSQ(err, w, r, js) return c.InternalErrorJSQ(err, w, r, js)
} }
// TODO: Push dismiss-event alerts to the users.
// TODO: Better coupling between the two params queries
aids, err := c.Activity.AidsByParams("like", topic.ID, "topic")
if err != nil {
return c.InternalErrorJSQ(err, w, r, js)
}
for _, aid := range aids {
c.DismissAlert(topic.CreatedBy, aid)
}
err = c.Activity.DeleteByParams("like", topic.ID, "topic") err = c.Activity.DeleteByParams("like", topic.ID, "topic")
if err != nil { if err != nil {
return c.InternalErrorJSQ(err, w, r, js) return c.InternalErrorJSQ(err, w, r, js)