Be able to list users submisions

- Closes: #45
This commit is contained in:
Las Zenow 2019-03-05 19:54:21 +00:00
parent 4903f722b5
commit 60379ba1ef
10 changed files with 143 additions and 9 deletions

View file

@ -31,11 +31,12 @@ type DB interface {
IncDownloads(ID string) error
GetDownloadCounter(ID string) (int, error)
GetFrontPage() FrontPage
AddSubmission(submission Submission) (id int, err error)
AddSubmission(submission Submission, userName string) (id int, err error)
UpdateSubmission(id int, status string, book *Book) error
UpdateSubmissionByBook(bookID string, status string, book *Book) error
UpdateSubmissionComment(submissionID, bookID, comment string) error
GetSubmission(submissionID string) (submission []Submission, err error)
GetUserSubmissions(userName string) (submission []Submission, err error)
GetComment(bookID string) (string, error)
BookLister
@ -228,12 +229,17 @@ CREATE INDEX IF NOT EXISTS visits_book_id_idx on visits(book_id);
-- Submissions indexes
CREATE INDEX IF NOT EXISTS submissions_id_idx on submissions(submission_id);
CREATE INDEX IF NOT EXISTS submissions_book_idx on submissions(book_id);
CREATE INDEX IF NOT EXISTS submissions_user_idx on submissions(user_id);
-- Submissions constraint
ALTER TABLE ONLY submissions
DROP CONSTRAINT IF EXISTS submissions_book_id_fkey;
ALTER TABLE ONLY submissions
ADD CONSTRAINT submissions_book_id_fkey FOREIGN KEY (book_id) REFERENCES books(id) ON DELETE SET NULL;
ALTER TABLE ONLY submissions
DROP CONSTRAINT IF EXISTS submissions_user_id_fkey;
ALTER TABLE ONLY submissions
ADD CONSTRAINT submissions_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL;
-- BookLists indexes
CREATE INDEX IF NOT EXISTS book_lists_list_id_idx on book_lists(list_id);

View file

@ -101,7 +101,7 @@ func (db *roDB) GetFrontPage() FrontPage {
return db.db.GetFrontPage()
}
func (db *roDB) AddSubmission(submission Submission) (id int, err error) {
func (db *roDB) AddSubmission(submission Submission, userName string) (id int, err error) {
return 0, errors.New("RO database")
}
@ -125,6 +125,10 @@ func (db *roDB) GetSubmission(submissionID string) (submission []Submission, err
return db.db.GetSubmission(submissionID)
}
func (db *roDB) GetUserSubmissions(userName string) (submission []Submission, err error) {
return db.db.GetUserSubmissions(userName)
}
func (db *roDB) NewBookList(listID, title, username string, description []string) error {
return errors.New("RO database")
}

View file

@ -1,16 +1,26 @@
package database
// TODO: clean up old submissions
type Submission struct {
ID int `sql:"type:serial"`
SubmissionID string `sql:"type:varchar(16)"`
Filename string
Status string
Comment string
UserID int `sql:"type:integer,unique"`
User *User
BookID string `sql:"type:varchar(16),unique"`
Book *Book
}
func (db *pgDB) AddSubmission(submission Submission) (id int, err error) {
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
}
}
err = db.sql.Insert(&submission)
return submission.ID, err
}
@ -61,6 +71,15 @@ func (db *pgDB) GetSubmission(submissionID string) (submission []Submission, err
return
}
func (db *pgDB) GetUserSubmissions(userName string) (submission []Submission, err error) {
err = db.sql.Model(&submission).
Column("Book", "User").
Where("username = ?", userName).
Order("id DESC").
Select()
return
}
func extractID(book *Book) interface{} {
if book == nil {
return nil

View file

@ -193,6 +193,7 @@ func InitRouter(db database.DB, sg *StatsGatherer, assetsPath string) http.Handl
r.HandleFunc("/upload/", sg.Gather(uploadHandler)).Methods("GET")
r.HandleFunc("/upload/", sg.Gather(uploadPostHandler)).Methods("POST")
r.HandleFunc("/submission/", sg.Gather(userSubmissionsHandler))
r.HandleFunc("/submission/{submissionID:"+idPattern+"}", sg.Gather(submissionHandler))
r.HandleFunc("/submission/{submissionID:"+idPattern+"}/comment/{id:"+idPattern+"}", sg.Gather(submissionCommentHandler)).Methods("POST")
r.HandleFunc("/submission/{submissionID:"+idPattern+"}/edit/{id:"+idPattern+"}", sg.Gather(editHandler))

View file

@ -102,11 +102,11 @@ func uploadPostHandler(h handler) {
log.Error("Can not open uploaded file ", f.Filename, ": ", err)
h.sess.Notify("Upload problem!", "There was a problem with book "+f.Filename, "error")
submission.Status = "It was not possible to read the book"
h.db.AddSubmission(submission)
h.db.AddSubmission(submission, h.sess.User)
continue
}
id, err := h.db.AddSubmission(submission)
id, err := h.db.AddSubmission(submission, h.sess.User)
if err != nil {
log.Error("Can add submission to db for ", f.Filename, ": ", err)
}

View file

@ -112,6 +112,29 @@ func settingsHandler(h handler) {
h.load("settings", data)
}
func userSubmissionsHandler(h handler) {
if h.sess.User == "" {
notFound(h)
return
}
var data submissionsData
data.S = GetStatus(h)
data.S.Title = "Submissions"
var err error
data.Submissions, err = h.db.GetUserSubmissions(h.sess.User)
if err != nil {
log.Warn("Can't get submissions for user ", h.sess.User, ": ", err)
}
h.load("submissions", data)
}
type submissionsData struct {
S Status
Submissions []database.Submission
}
func userAdminHandler(h handler) {
if !h.sess.IsAdmin() {
notFound(h)