package database import ( "fmt" "time" "github.com/prometheus/common/log" ) const ( daysExpireSubmission = 30 ) type Submission struct { ID int `sql:"type:serial"` SubmissionID string `sql:"type:varchar(16)"` Filename string Status string Comment string LastModified time.Time UserID int `sql:"type:integer,unique"` User *User BookID string `sql:"type:varchar(16),unique"` Book *Book } 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.Insert(&submission) 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). Column("Book"). Where("submission_id = ?", submissionID). Select() return } func (db *pgDB) GetUserSubmissions(userName string) (submission []Submission, err error) { err = db.sql.Model(&submission). Column("Book", "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 OR book_id in (SELECT id FROM books WHERE active is true)"). Where("last_modified < CURRENT_TIMESTAMP - interval ?", fmt.Sprintf("%d days", daysExpireSubmission)). Delete() if err != nil { log.Error("Error deleting submissions: ", err) } } } func extractID(book *Book) interface{} { if book == nil { return nil } return book.ID }