website/pkg/models/feedback.go

90 lines
1.9 KiB
Go

package models
import (
"strings"
"time"
"code.nonshy.com/nonshy/website/pkg/log"
)
// Feedback table for Contact Us & Reporting to admins.
type Feedback struct {
ID uint64 `gorm:"primaryKey"`
UserID uint64 `gorm:"index"` // if logged-in user posted this
Acknowledged bool `gorm:"index"` // admin dashboard "read" status
Intent string
Subject string
Message string
TableName string
TableID uint64
ReplyTo string // logged-out user may leave their email for reply
CreatedAt time.Time
UpdatedAt time.Time
}
// GetFeedback by ID.
func GetFeedback(id uint64) (*Feedback, error) {
m := &Feedback{}
result := DB.First(&m, id)
return m, result.Error
}
// CountUnreadFeedback gets the count of unacknowledged feedback for admins.
func CountUnreadFeedback() int64 {
query := DB.Where(
"acknowledged = ?",
false,
)
var count int64
result := query.Model(&Feedback{}).Count(&count)
if result.Error != nil {
log.Error("models.CountUnreadFeedback: %s", result.Error)
}
return count
}
// PaginateFeedback
func PaginateFeedback(acknowledged bool, intent string, pager *Pagination) ([]*Feedback, error) {
var (
fb = []*Feedback{}
wheres = []string{}
placeholders = []interface{}{}
)
wheres = append(wheres, "acknowledged = ?")
placeholders = append(placeholders, acknowledged)
if intent != "" {
wheres = append(wheres, "intent = ?")
placeholders = append(placeholders, intent)
}
query := DB.Where(
strings.Join(wheres, " AND "),
placeholders...,
).Order(
pager.Sort,
)
query.Model(&Feedback{}).Count(&pager.Total)
result := query.Offset(
pager.GetOffset(),
).Limit(pager.PerPage).Find(&fb)
return fb, result.Error
}
// CreateFeedback saves a new Feedback row to the DB.
func CreateFeedback(fb *Feedback) error {
result := DB.Create(fb)
return result.Error
}
// Save Feedback.
func (fb *Feedback) Save() error {
result := DB.Save(fb)
return result.Error
}