From 6b8bfedb9b3328c0ae99ce20c196d3055dedee78 Mon Sep 17 00:00:00 2001 From: heimoshuiyu Date: Mon, 13 Dec 2021 04:17:00 +0800 Subject: [PATCH] Add: insert review --- pkg/api/api.go | 2 ++ pkg/api/handle_error.go | 1 + pkg/api/handle_review.go | 42 ++++++++++++++++++++++++++++++++ pkg/api/handle_user.go | 19 +++++++++++++++ pkg/database/method_review.go | 10 ++++++++ pkg/database/sql_stmt.go | 20 ++++++++++++--- pkg/database/struct.go | 13 +++++++++- web/src/App.js | 5 ++++ web/src/component/FileInfo.js | 7 ++++++ web/src/component/ReviewPage.js | 43 +++++++++++++++++++++++++++++++++ 10 files changed, 157 insertions(+), 5 deletions(-) create mode 100644 pkg/api/handle_review.go create mode 100644 pkg/database/method_review.go create mode 100644 web/src/component/ReviewPage.js diff --git a/pkg/api/api.go b/pkg/api/api.go index 3012d9d..6e1c457 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -92,6 +92,8 @@ func NewAPI(config Config) (*API, error) { apiMux.HandleFunc("/delete_tag_on_file", api.HandleDeleteTagOnFile) // folder apiMux.HandleFunc("/update_foldername", api.HandleUpdateFoldername) + // review + apiMux.HandleFunc("/insert_review", api.HandleInsertReview) // below needs token apiMux.HandleFunc("/walk", api.HandleWalk) apiMux.HandleFunc("/reset", api.HandleReset) diff --git a/pkg/api/handle_error.go b/pkg/api/handle_error.go index dad0e28..cdc0363 100644 --- a/pkg/api/handle_error.go +++ b/pkg/api/handle_error.go @@ -11,6 +11,7 @@ var ( ErrNotLoggedIn = errors.New("not logged in") ErrNotAdmin = errors.New("not admin") ErrEmpty = errors.New("Empty field detected, please fill in all fields") + ErrAnonymous = errors.New("Anonymous user detected, please login") ) type Error struct { diff --git a/pkg/api/handle_review.go b/pkg/api/handle_review.go new file mode 100644 index 0000000..d0c506d --- /dev/null +++ b/pkg/api/handle_review.go @@ -0,0 +1,42 @@ +package api + +import ( + "net/http" + "msw-open-music/pkg/database" + "encoding/json" + "time" +) + +// review.FileId, review.Content +func (api *API) HandleInsertReview(w http.ResponseWriter, r *http.Request) { + review := &database.Review{} + + err := json.NewDecoder(r.Body).Decode(review) + if err != nil { + api.HandleError(w, r, err) + return + } + + // check not anonymous + err = api.CheckNotAnonymous(w, r) + if err != nil { + api.HandleError(w, r, err) + return + } + + review.UserId, err = api.GetUserID(w, r) + if err != nil { + api.HandleError(w, r, err) + return + } + + review.CreatedAt = time.Now().Unix() + + err = api.Db.InsertReview(review) + if err != nil { + api.HandleError(w, r, err) + return + } + + api.HandleOK(w, r) +} diff --git a/pkg/api/handle_user.go b/pkg/api/handle_user.go index f272cde..1bb54ff 100644 --- a/pkg/api/handle_user.go +++ b/pkg/api/handle_user.go @@ -165,6 +165,25 @@ func (api *API) CheckAdmin(w http.ResponseWriter, r *http.Request) error { return nil } +func (api *API) CheckNotAnonymous(w http.ResponseWriter, r *http.Request) error { + session, _ := api.store.Get(r, api.defaultSessionName) + userId, ok := session.Values["userId"] + if !ok { + return ErrNotLoggedIn + } + + user, err := api.Db.GetUserById(userId.(int64)) + if err != nil { + return err + } + + if user.Role == database.RoleAnonymous { + return ErrAnonymous + } + + return nil +} + func (api *API) GetUserID(w http.ResponseWriter, r *http.Request) (int64, error) { session, _ := api.store.Get(r, api.defaultSessionName) userId, ok := session.Values["userId"] diff --git a/pkg/database/method_review.go b/pkg/database/method_review.go new file mode 100644 index 0000000..e8ce405 --- /dev/null +++ b/pkg/database/method_review.go @@ -0,0 +1,10 @@ +package database + +func (database *Database) InsertReview(review *Review) error { + _, err := database.stmt.insertReview.Exec( + review.UserId, + review.FileId, + review.CreatedAt, + review.Content) + return err +} diff --git a/pkg/database/sql_stmt.go b/pkg/database/sql_stmt.go index b348954..d132666 100644 --- a/pkg/database/sql_stmt.go +++ b/pkg/database/sql_stmt.go @@ -71,10 +71,12 @@ var initLikesTableQuery = `CREATE TABLE IF NOT EXISTS likes ( var initReviewsTableQuery = `CREATE TABLE IF NOT EXISTS reviews ( id INTEGER PRIMARY KEY, user_id INTEGER NOT NULL, - time INTEGER NOT NULL, - modified_time INTEGER DEFAULT 0, - review TEXT NOT NULL, - FOREIGN KEY (user_id) REFERENCES users(id) + file_id INTEGER NOT NULL, + created_at INTEGER NOT NULL, + updated_at INTEGER NOT NULL DEFAULT 0, + content TEXT NOT NULL, + FOREIGN KEY (user_id) REFERENCES users(id), + FOREIGN KEY (file_id) REFERENCES files(id) );` var initPlaybacksTableQuery = `CREATE TABLE IF NOT EXISTS playbacks ( @@ -202,6 +204,9 @@ var deleteTagOnFileQuery = `DELETE FROM file_has_tag WHERE tag_id = ? AND file_i var updateFoldernameQuery = `UPDATE folders SET foldername = ? WHERE id = ?;` +var insertReviewQuery = `INSERT INTO reviews (user_id, file_id, created_at, content) +VALUES (?, ?, ?, ?);` + type Stmt struct { initFilesTable *sql.Stmt initFoldersTable *sql.Stmt @@ -242,6 +247,7 @@ type Stmt struct { getTagsOnFile *sql.Stmt deleteTagOnFile *sql.Stmt updateFoldername *sql.Stmt + insertReview *sql.Stmt } func NewPreparedStatement(sqlConn *sql.DB) (*Stmt, error) { @@ -546,5 +552,11 @@ func NewPreparedStatement(sqlConn *sql.DB) (*Stmt, error) { return nil, err } + // init insertReview + stmt.insertReview, err = sqlConn.Prepare(insertReviewQuery) + if err != nil { + return nil, err + } + return stmt, err } diff --git a/pkg/database/struct.go b/pkg/database/struct.go index f7d7c92..343b597 100644 --- a/pkg/database/struct.go +++ b/pkg/database/struct.go @@ -33,7 +33,18 @@ type Tag struct { Name string `json:"name"` Description string `json:"description"` CreatedByUserId int64 `json:"created_by_user_id"` - CreatedByUser *User `json:"created_by_user"` + CreatedByUser *User `json:"created_by_user"` +} + +type Review struct { + ID int64 `json:"id"` + FileId int64 `json:"file_id"` + File *File `json:"file"` + UserId int64 `json:"user_id"` + User *User `json:"user"` + CreatedAt int64 `json:"created_at"` + UpdatedAt int64 `json:"updated_at"` + Content string `json:"content"` } var ( diff --git a/web/src/App.js b/web/src/App.js index 89fe287..cfd12b9 100644 --- a/web/src/App.js +++ b/web/src/App.js @@ -14,6 +14,7 @@ import Tags from "./component/Tags"; import EditTag from "./component/EditTag"; import AudioPlayer from "./component/AudioPlayer"; import UserStatus from "./component/UserStatus"; +import ReviewPage from "./component/ReviewPage"; import { useState } from "react"; function App() { @@ -90,6 +91,10 @@ function App() { path="/files/:id/share" element={} /> + } + />