127 lines
3.1 KiB
Go
127 lines
3.1 KiB
Go
package database
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/prometheus/common/log"
|
|
)
|
|
|
|
const (
|
|
daysExpireSubmission = 30
|
|
)
|
|
|
|
type Submission struct {
|
|
ID int `pg:"type:serial"`
|
|
SubmissionID string `pg:"type:varchar(16)"`
|
|
Filename string
|
|
Status string
|
|
Comment string
|
|
LastModified time.Time
|
|
UserID int `pg:"type:integer,unique"`
|
|
User *User `pg:"rel:has-one"`
|
|
BookID string `pg:"type:varchar(16),unique"`
|
|
Book *Book `pg:"rel:has-one"`
|
|
}
|
|
|
|
func (db *pgDB) AddSubmission(submission Submission, userName string) (id int, err error) {
|
|
if userName != "" {
|
|
user, err := db.getUser(userName)
|
|
if err == nil {
|
|
submission.UserID = user.ID
|
|
}
|
|
}
|
|
submission.LastModified = time.Now()
|
|
_, err = db.sql.Model(&submission).Insert()
|
|
return submission.ID, err
|
|
}
|
|
|
|
func (db *pgDB) UpdateSubmission(id int, status string, book *Book) error {
|
|
_, err := db.sql.Model(&Submission{}).
|
|
Set("status = ?", status).
|
|
Set("book_id = ?", extractID(book)).
|
|
Set("last_modified = CURRENT_TIMESTAMP").
|
|
Where("id = ?", id).
|
|
Update()
|
|
return err
|
|
}
|
|
|
|
func (db *pgDB) UpdateSubmissionByBook(bookID string, status string, book *Book) error {
|
|
_, err := db.sql.Model(&Submission{}).
|
|
Set("status = ?", status).
|
|
Set("book_id = ?", extractID(book)).
|
|
Set("last_modified = CURRENT_TIMESTAMP").
|
|
Where("book_id = ?", bookID).
|
|
Update()
|
|
return err
|
|
}
|
|
|
|
func (db *pgDB) UpdateSubmissionComment(submissionID, bookID, comment string) error {
|
|
_, err := db.sql.Model(&Submission{}).
|
|
Set("comment = ?", comment).
|
|
Where("submission_id = ?", submissionID).
|
|
Where("book_id = ?", bookID).
|
|
Update()
|
|
return err
|
|
}
|
|
|
|
func (db *pgDB) GetComment(bookID string) (string, error) {
|
|
var submission Submission
|
|
err := db.sql.Model(&submission).
|
|
Where("book_id = ?", bookID).
|
|
Select()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return submission.Comment, nil
|
|
}
|
|
|
|
func (db *pgDB) GetSubmission(submissionID string) (submission []Submission, err error) {
|
|
err = db.sql.Model(&submission).
|
|
Relation("Book").
|
|
Where("submission_id = ?", submissionID).
|
|
Select()
|
|
return
|
|
}
|
|
|
|
func (db *pgDB) GetUserSubmissions(userName string) (submission []Submission, err error) {
|
|
err = db.sql.Model(&submission).
|
|
Relation("Book").
|
|
Relation("User").
|
|
Where("username = ?", userName).
|
|
Order("last_modified DESC").
|
|
Select()
|
|
return
|
|
}
|
|
|
|
func (db *pgDB) submissionsCleaner() {
|
|
periodicity := 60 * time.Minute
|
|
|
|
for true {
|
|
time.Sleep(periodicity)
|
|
_, err := db.sql.Model(&Submission{}).
|
|
Where("book_id is null").
|
|
Where("last_modified < CURRENT_TIMESTAMP - interval ?", fmt.Sprintf("%d days", daysExpireSubmission)).
|
|
Delete()
|
|
if err != nil {
|
|
log.Error("Error deleting null submissions: ", err)
|
|
}
|
|
|
|
_, err = db.sql.Model(&Submission{}).
|
|
TableExpr(`books`).
|
|
Where("book_id = books.id").
|
|
Where("books.active is true").
|
|
Where("last_modified < CURRENT_TIMESTAMP - interval ?", fmt.Sprintf("%d days", daysExpireSubmission)).
|
|
Delete()
|
|
if err != nil {
|
|
log.Error("Error deleting approved submissions: ", err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func extractID(book *Book) interface{} {
|
|
if book == nil {
|
|
return nil
|
|
}
|
|
return book.ID
|
|
}
|