Use a like store to abstract some things.
Provisional conversations.
This commit is contained in:
parent
084f1bbeca
commit
9c19fc92ca
|
@ -0,0 +1,61 @@
|
||||||
|
package common
|
||||||
|
|
||||||
|
import "database/sql"
|
||||||
|
import "github.com/Azareal/Gosora/query_gen"
|
||||||
|
|
||||||
|
/*
|
||||||
|
conversations
|
||||||
|
conversations_posts
|
||||||
|
*/
|
||||||
|
|
||||||
|
type Conversation struct {
|
||||||
|
ID int
|
||||||
|
Participants string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (co *Conversation) Create() (int, error) {
|
||||||
|
return 0, sql.ErrNoRows
|
||||||
|
}
|
||||||
|
|
||||||
|
type ConversationPost struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
type ConversationStore interface {
|
||||||
|
Get(id int) (*Conversation, error)
|
||||||
|
Delete(id int) error
|
||||||
|
Count() (count int)
|
||||||
|
}
|
||||||
|
|
||||||
|
type DefaultConversationStore struct {
|
||||||
|
get *sql.Stmt
|
||||||
|
delete *sql.Stmt
|
||||||
|
count *sql.Stmt
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDefaultConversationStore(acc *qgen.Accumulator) (*DefaultConversationStore, error) {
|
||||||
|
return &DefaultConversationStore{
|
||||||
|
get: acc.Select("conversations").Columns("participants").Where("cid = ?").Prepare(),
|
||||||
|
delete: acc.Delete("conversations").Where("cid = ?").Prepare(),
|
||||||
|
count: acc.Count("conversations").Prepare(),
|
||||||
|
}, acc.FirstError()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *DefaultConversationStore) Get(id int) (*Conversation, error) {
|
||||||
|
convo := &Conversation{ID:id}
|
||||||
|
err := s.get.QueryRow(id).Scan(&convo.Participants)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *DefaultConversationStore) Delete(id int) error {
|
||||||
|
_, err := s.delete.Exec(id)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Count returns the total number of topics on these forums
|
||||||
|
func (s *DefaultConversationStore) Count() (count int) {
|
||||||
|
err := s.count.QueryRow().Scan(&count)
|
||||||
|
if err != nil {
|
||||||
|
LogError(err)
|
||||||
|
}
|
||||||
|
return count
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
package common
|
||||||
|
|
||||||
|
import "database/sql"
|
||||||
|
import "github.com/Azareal/Gosora/query_gen"
|
||||||
|
|
||||||
|
var Likes LikeStore
|
||||||
|
|
||||||
|
type LikeStore interface {
|
||||||
|
BulkExists(ids []int, sentBy int, targetType string) ([]int, error)
|
||||||
|
Count() (count int)
|
||||||
|
}
|
||||||
|
|
||||||
|
type DefaultLikeStore struct {
|
||||||
|
count *sql.Stmt
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDefaultLikeStore(acc *qgen.Accumulator) (*DefaultLikeStore, error) {
|
||||||
|
return &DefaultLikeStore{
|
||||||
|
count: acc.Count("likes").Prepare(),
|
||||||
|
}, acc.FirstError()
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Write a test for this
|
||||||
|
func (s *DefaultLikeStore) BulkExists(ids []int, sentBy int, targetType string) (eids []int, err error) {
|
||||||
|
rows, err := qgen.NewAcc().Select("likes").Columns("targetItem").Where("sentBy = ? AND targetType = ?").In("targetItem", ids).Query(sentBy,targetType)
|
||||||
|
if err == sql.ErrNoRows {
|
||||||
|
return nil, nil
|
||||||
|
} else if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
|
||||||
|
var id int
|
||||||
|
for rows.Next() {
|
||||||
|
err = rows.Scan(&id)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
eids = append(eids,id)
|
||||||
|
}
|
||||||
|
err = rows.Err()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return eids, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Write a test for this
|
||||||
|
// Count returns the total number of likes globally
|
||||||
|
func (s *DefaultLikeStore) Count() (count int) {
|
||||||
|
err := s.count.QueryRow().Scan(&count)
|
||||||
|
if err != nil {
|
||||||
|
LogError(err)
|
||||||
|
}
|
||||||
|
return count
|
||||||
|
}
|
|
@ -592,25 +592,13 @@ func (topic *TopicUser) Replies(offset int, pFrag int, user *User) (rlist []*Rep
|
||||||
|
|
||||||
// TODO: Add a config setting to disable the liked query for a burst of extra speed
|
// TODO: Add a config setting to disable the liked query for a burst of extra speed
|
||||||
if user.Liked > 0 && len(likedQueryList) > 1 /*&& user.LastLiked <= time.Now()*/ {
|
if user.Liked > 0 && len(likedQueryList) > 1 /*&& user.LastLiked <= time.Now()*/ {
|
||||||
// TODO: Abstract this
|
eids, err := Likes.BulkExists(likedQueryList[1:], user.ID, "replies")
|
||||||
rows, err := qgen.NewAcc().Select("likes").Columns("targetItem").Where("sentBy = ? AND targetType = 'replies'").In("targetItem", likedQueryList[1:]).Query(user.ID)
|
|
||||||
if err != nil && err != sql.ErrNoRows {
|
|
||||||
return nil, "", err
|
|
||||||
}
|
|
||||||
defer rows.Close()
|
|
||||||
|
|
||||||
var likeRid int
|
|
||||||
for rows.Next() {
|
|
||||||
err := rows.Scan(&likeRid)
|
|
||||||
if err != nil {
|
|
||||||
return nil, "", err
|
|
||||||
}
|
|
||||||
rlist[likedMap[likeRid]].Liked = true
|
|
||||||
}
|
|
||||||
err = rows.Err()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, "", err
|
return nil, "", err
|
||||||
}
|
}
|
||||||
|
for _, eid := range eids {
|
||||||
|
rlist[likedMap[eid]].Liked = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if user.Perms.EditReply && len(attachQueryList) > 0 {
|
if user.Perms.EditReply && len(attachQueryList) > 0 {
|
||||||
|
|
4
main.go
4
main.go
|
@ -128,6 +128,10 @@ func storeInit() (err error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.WithStack(err)
|
return errors.WithStack(err)
|
||||||
}
|
}
|
||||||
|
c.Likes, err = c.NewDefaultLikeStore(acc)
|
||||||
|
if err != nil {
|
||||||
|
return errors.WithStack(err)
|
||||||
|
}
|
||||||
|
|
||||||
err = phrases.InitPhrases(c.Site.Language)
|
err = phrases.InitPhrases(c.Site.Language)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -65,11 +65,6 @@ func Debug(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
|
||||||
var count = func(tbl string) (int, error) {
|
var count = func(tbl string) (int, error) {
|
||||||
return qgen.NewAcc().Count(tbl).Total()
|
return qgen.NewAcc().Count(tbl).Total()
|
||||||
}
|
}
|
||||||
// TODO: Implement a LikeStore and call Count on that instead
|
|
||||||
likes, err := count("likes")
|
|
||||||
if err != nil {
|
|
||||||
return c.InternalError(err,w,r)
|
|
||||||
}
|
|
||||||
// TODO: Call Count on an attachment store
|
// TODO: Call Count on an attachment store
|
||||||
attachs, err := count("attachments")
|
attachs, err := count("attachments")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -130,7 +125,7 @@ func Debug(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return c.InternalError(err,w,r)
|
return c.InternalError(err,w,r)
|
||||||
}
|
}
|
||||||
debugDatabase := c.DebugPageDatabase{c.Topics.Count(),c.Users.Count(),c.Rstore.Count(),c.Prstore.Count(),c.Activity.Count(),likes,attachs,polls,loginLogs,regLogs,modLogs,adminLogs,views,viewsAgents,viewsForums,viewsLangs,viewsReferrers,viewsSystems,postChunks,topicChunks}
|
debugDatabase := c.DebugPageDatabase{c.Topics.Count(),c.Users.Count(),c.Rstore.Count(),c.Prstore.Count(),c.Activity.Count(),c.Likes.Count(),attachs,polls,loginLogs,regLogs,modLogs,adminLogs,views,viewsAgents,viewsForums,viewsLangs,viewsReferrers,viewsSystems,postChunks,topicChunks}
|
||||||
|
|
||||||
staticSize, err := c.DirSize("./public/")
|
staticSize, err := c.DirSize("./public/")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Reference in New Issue