Add the avility to edit metadata and delete books after submission
This commit is contained in:
parent
de58f0251e
commit
8d126fbe7a
7 changed files with 93 additions and 48 deletions
28
lib/admin.go
28
lib/admin.go
|
@ -17,14 +17,15 @@ const (
|
|||
)
|
||||
|
||||
func deleteHandler(h handler) {
|
||||
if !h.sess.IsModerator() {
|
||||
ids := strings.Split(mux.Vars(h.r)["ids"], "/")
|
||||
submissionID := mux.Vars(h.r)["submissionID"]
|
||||
if !h.sess.IsModerator() && !h.booksInSubmission(ids, submissionID) {
|
||||
notFound(h)
|
||||
return
|
||||
}
|
||||
|
||||
var titles []string
|
||||
var isNew bool
|
||||
ids := strings.Split(mux.Vars(h.r)["ids"], "/")
|
||||
for _, id := range ids {
|
||||
if id == "" {
|
||||
continue
|
||||
|
@ -50,16 +51,25 @@ func deleteHandler(h handler) {
|
|||
h.sess.Notify("Removed books!", "The books "+strings.Join(titles, ", ")+" are completly removed", "success")
|
||||
}
|
||||
h.sess.Save(h.w, h.r)
|
||||
if isNew {
|
||||
if submissionID != "" {
|
||||
http.Redirect(h.w, h.r, "/submission/"+submissionID, http.StatusFound)
|
||||
} else if isNew {
|
||||
http.Redirect(h.w, h.r, h.r.Referer(), http.StatusFound)
|
||||
} else {
|
||||
http.Redirect(h.w, h.r, "/", http.StatusFound)
|
||||
}
|
||||
}
|
||||
|
||||
type editData struct {
|
||||
S Status
|
||||
Book database.Book
|
||||
SubmissionID string
|
||||
}
|
||||
|
||||
func editHandler(h handler) {
|
||||
id := mux.Vars(h.r)["id"]
|
||||
if !h.sess.IsModerator() {
|
||||
submissionID := mux.Vars(h.r)["submissionID"]
|
||||
if !h.sess.IsModerator() && !h.booksInSubmission([]string{id}, submissionID) {
|
||||
notFound(h)
|
||||
return
|
||||
}
|
||||
|
@ -69,9 +79,10 @@ func editHandler(h handler) {
|
|||
return
|
||||
}
|
||||
|
||||
var data bookData
|
||||
var data editData
|
||||
data.Book = book
|
||||
data.S = GetStatus(h)
|
||||
data.SubmissionID = submissionID
|
||||
author := ""
|
||||
if len(book.Authors) > 0 {
|
||||
author = " by " + book.Authors[0]
|
||||
|
@ -93,7 +104,8 @@ func cleanEmptyStr(s []string) []string {
|
|||
func saveHandler(h handler) {
|
||||
// XXX: check for errors (ISBN, length(lang), ...)
|
||||
id := mux.Vars(h.r)["id"]
|
||||
if !h.sess.IsModerator() {
|
||||
submissionID := mux.Vars(h.r)["submissionID"]
|
||||
if !h.sess.IsModerator() && !h.booksInSubmission([]string{id}, submissionID) {
|
||||
notFound(h)
|
||||
return
|
||||
}
|
||||
|
@ -123,7 +135,9 @@ func saveHandler(h handler) {
|
|||
}
|
||||
|
||||
h.sess.Save(h.w, h.r)
|
||||
if h.db.IsBookActive(id) {
|
||||
if submissionID != "" {
|
||||
http.Redirect(h.w, h.r, "/submission/"+submissionID, http.StatusFound)
|
||||
} else if h.db.IsBookActive(id) {
|
||||
http.Redirect(h.w, h.r, "/book/"+id, http.StatusFound)
|
||||
} else {
|
||||
// XXX: I can't use a referer here :(
|
||||
|
|
24
lib/stats.go
24
lib/stats.go
|
@ -50,6 +50,30 @@ func (h handler) load(tmpl string, data interface{}) {
|
|||
}
|
||||
}
|
||||
|
||||
func (h handler) booksInSubmission(bookIDs []string, submissionID string) bool {
|
||||
submissions, err := h.db.GetSubmission(submissionID)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
for _, bookID := range bookIDs {
|
||||
if bookID == "" {
|
||||
continue
|
||||
}
|
||||
|
||||
found := false
|
||||
for _, s := range submissions {
|
||||
if s.BookID == bookID && !s.Book.Active {
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
type StatsGatherer struct {
|
||||
db database.DB
|
||||
store storage.Store
|
||||
|
|
|
@ -167,9 +167,14 @@ func InitRouter(db database.DB, sg *StatsGatherer, assetsPath string) http.Handl
|
|||
|
||||
r.HandleFunc("/book/{id:"+idPattern+"}", sg.Gather(bookHandler))
|
||||
r.HandleFunc("/search/", sg.Gather(searchHandler))
|
||||
|
||||
r.HandleFunc("/upload/", sg.Gather(uploadHandler)).Methods("GET")
|
||||
r.HandleFunc("/upload/", sg.Gather(uploadPostHandler)).Methods("POST")
|
||||
r.HandleFunc("/submission/{id:"+idPattern+"}", sg.Gather(submissionHandler))
|
||||
r.HandleFunc("/submission/{submissionID:"+idPattern+"}", sg.Gather(submissionHandler))
|
||||
r.HandleFunc("/submission/{submissionID:"+idPattern+"}/edit/{id:"+idPattern+"}", sg.Gather(editHandler))
|
||||
r.HandleFunc("/submission/{submissionID:"+idPattern+"}/save/{id:"+idPattern+"}", sg.Gather(saveHandler)).Methods("POST")
|
||||
r.HandleFunc("/submission/{submissionID:"+idPattern+"}/delete/{ids:(?:"+idPattern+"/)+}", sg.Gather(deleteHandler))
|
||||
|
||||
r.HandleFunc("/read/{id:"+idPattern+"}", sg.Gather(readStartHandler))
|
||||
r.HandleFunc("/read/{id:"+idPattern+"}/{file:.*}", sg.Gather(readHandler))
|
||||
r.HandleFunc("/content/{id:"+idPattern+"}/{file:.*}", sg.Gather(contentHandler))
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
package trantor
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
log "github.com/cihub/seelog"
|
||||
|
||||
"crypto/rand"
|
||||
|
@ -110,32 +112,23 @@ func uploadPostHandler(h handler) {
|
|||
}
|
||||
uploadChannel <- uploadRequest{file, f, id}
|
||||
}
|
||||
_uploadHandler(h, submissionID)
|
||||
http.Redirect(h.w, h.r, "/submission/"+submissionID, http.StatusFound)
|
||||
}
|
||||
|
||||
func uploadHandler(h handler) {
|
||||
_uploadHandler(h, "")
|
||||
}
|
||||
|
||||
func _uploadHandler(h handler, submissionID string) {
|
||||
var data uploadData
|
||||
data.SubmissionID = submissionID
|
||||
var data struct{ S Status }
|
||||
data.S = GetStatus(h)
|
||||
data.S.Title = "Upload -- " + data.S.Title
|
||||
data.S.Upload = true
|
||||
h.load("upload", data)
|
||||
}
|
||||
|
||||
type uploadData struct {
|
||||
S Status
|
||||
SubmissionID string
|
||||
}
|
||||
|
||||
func submissionHandler(h handler) {
|
||||
var data submissionData
|
||||
var err error
|
||||
|
||||
submissionID := mux.Vars(h.r)["id"]
|
||||
submissionID := mux.Vars(h.r)["submissionID"]
|
||||
data.SubmissionID = submissionID
|
||||
data.Submissions, err = h.db.GetSubmission(submissionID)
|
||||
if err != nil {
|
||||
log.Error("Can get submission ", submissionID, ": ", err)
|
||||
|
@ -146,8 +139,9 @@ func submissionHandler(h handler) {
|
|||
}
|
||||
|
||||
type submissionData struct {
|
||||
S Status
|
||||
Submissions []database.Submission
|
||||
S Status
|
||||
SubmissionID string
|
||||
Submissions []database.Submission
|
||||
}
|
||||
|
||||
func genID() string {
|
||||
|
|
Reference in a new issue