Noah
aa8d719fc4
* Add ability to (un)subscribe from comment threads on Forums and Photos. * Creating a forum post, replying to a post or adding a comment to a photo automatically subscribes you to be notified when somebody else adds a comment to the thing later. * At the top of each comment thread is a link to disable or re-enable your subscription. You can join a subscription without even needing to comment. If you click to disable notifications, they stay disabled even if you add another comment later.
82 lines
2.3 KiB
Go
82 lines
2.3 KiB
Go
package models
|
|
|
|
import (
|
|
"time"
|
|
|
|
"code.nonshy.com/nonshy/website/pkg/log"
|
|
)
|
|
|
|
// Subscription table - for notifications. You comment on someone's post, you get subscribed
|
|
// to other comments added to the post (unless you opt off).
|
|
type Subscription struct {
|
|
ID uint64 `gorm:"primaryKey"`
|
|
UserID uint64 `gorm:"index"` // who it belongs to
|
|
Subscribed bool `gorm:"index"`
|
|
TableName string // on which of your tables (photos, comments, ...)
|
|
TableID uint64
|
|
CreatedAt time.Time
|
|
UpdatedAt time.Time
|
|
}
|
|
|
|
// GetSubscription looks for an existing subscription or returns error if not found.
|
|
func GetSubscription(user *User, tableName string, tableID uint64) (*Subscription, error) {
|
|
var s *Subscription
|
|
result := DB.Model(s).Where(
|
|
"user_id = ? AND table_name = ? AND table_id = ?",
|
|
user.ID, tableName, tableID,
|
|
).First(&s)
|
|
return s, result.Error
|
|
}
|
|
|
|
// GetSubscribers returns all of the UserIDs that are subscribed to a thread.
|
|
func GetSubscribers(tableName string, tableID uint64) []uint64 {
|
|
var userIDs = []uint64{}
|
|
result := DB.Table(
|
|
"subscriptions",
|
|
).Select(
|
|
"user_id",
|
|
).Where(
|
|
"table_name = ? AND table_id = ? AND subscribed IS TRUE",
|
|
tableName, tableID,
|
|
).Scan(&userIDs)
|
|
|
|
if result.Error != nil {
|
|
log.Error("GetSubscribers(%s, %d): couldn't get user IDs: %s", tableName, tableID)
|
|
}
|
|
|
|
return userIDs
|
|
}
|
|
|
|
// IsSubscribed checks whether a user is currently subscribed (and notified) to a thing.
|
|
// Returns whether the row exists, and whether the user is to be notified (false if opted out).
|
|
func IsSubscribed(user *User, tableName string, tableID uint64) (exists bool, notified bool) {
|
|
if sub, err := GetSubscription(user, tableName, tableID); err != nil {
|
|
return false, false
|
|
} else {
|
|
return true, sub.Subscribed
|
|
}
|
|
}
|
|
|
|
// SubscribeTo creates a subscription to a thing (comment thread) to be notified of future activity on.
|
|
func SubscribeTo(user *User, tableName string, tableID uint64) (*Subscription, error) {
|
|
// Is there already a subscription row?
|
|
if sub, err := GetSubscription(user, tableName, tableID); err == nil {
|
|
return sub, err
|
|
}
|
|
|
|
// Create the default subscription.
|
|
sub := &Subscription{
|
|
UserID: user.ID,
|
|
Subscribed: true,
|
|
TableName: tableName,
|
|
TableID: tableID,
|
|
}
|
|
result := DB.Create(sub)
|
|
return sub, result.Error
|
|
}
|
|
|
|
// Save a subscription.
|
|
func (n *Subscription) Save() error {
|
|
return DB.Save(n).Error
|
|
}
|