backend support record playback history

This commit is contained in:
2022-11-04 18:39:24 +08:00
parent 3b90ad56d6
commit 61391ff2a5
6 changed files with 98 additions and 19 deletions

View File

@@ -71,7 +71,7 @@ func NewAPI(config commonconfig.Config) (*API, error) {
// user
apiMux.HandleFunc("/login", api.HandleLogin)
apiMux.HandleFunc("/register", api.HandleRegister)
apiMux.HandleFunc("/logout", api.LoginAsAnonymous)
apiMux.HandleFunc("/logout", api.HandleLoginAsAnonymous)
apiMux.HandleFunc("/get_user_info", api.HandleGetUserInfo)
apiMux.HandleFunc("/get_users", api.HandleGetUsers)
apiMux.HandleFunc("/update_user_active", api.HandleUpdateUserActive)
@@ -95,6 +95,8 @@ func NewAPI(config commonconfig.Config) (*API, error) {
apiMux.HandleFunc("/update_review", api.HandleUpdateReview)
apiMux.HandleFunc("/delete_review", api.HandleDeleteReview)
apiMux.HandleFunc("/get_reviews_by_user", api.HandleGetReviewsByUser)
// statistic
apiMux.HandleFunc("/record_playback", api.HandleRecordPlayback)
// database
apiMux.HandleFunc("/walk", api.HandleWalk)
apiMux.HandleFunc("/reset", api.HandleReset)

44
pkg/api/handle_stat.go Normal file
View File

@@ -0,0 +1,44 @@
package api
import (
"encoding/json"
"msw-open-music/pkg/database"
"net/http"
"time"
)
type RecordPlaybackRequest struct {
Playback database.Playback `json:"playback"`
}
func (api *API) HandleRecordPlayback(w http.ResponseWriter, r *http.Request) {
recordPlaybackRequest := &RecordPlaybackRequest{}
err := json.NewDecoder(r.Body).Decode(recordPlaybackRequest)
if err != nil {
api.HandleError(w, r, err)
return
}
recordPlaybackRequest.Playback.Time = time.Now()
recordPlaybackRequest.Playback.UserID, err = api.GetUserID(w, r)
if err != nil {
if err == ErrNotLoggedIn {
user, err := api.Db.LoginAsAnonymous()
if err != nil {
api.HandleError(w, r, err)
return
}
recordPlaybackRequest.Playback.UserID = user.ID
} else {
api.HandleError(w, r, err)
return
}
}
err = api.Db.RecordPlayback(recordPlaybackRequest.Playback)
if err != nil {
api.HandleError(w, r, err)
return
}
api.HandleOK(w, r)
}

View File

@@ -17,23 +17,8 @@ type LoginResponse struct {
User *database.User `json:"user"`
}
func (api *API) LoginAsAnonymous(w http.ResponseWriter, r *http.Request) {
user, err := api.Db.LoginAsAnonymous()
if err != nil {
api.HandleError(w, r, err)
return
}
session, _ := api.store.Get(r, api.defaultSessionName)
// save session
session.Values["userId"] = user.ID
err = session.Save(r, w)
if err != nil {
api.HandleError(w, r, err)
return
}
func (api *API) HandleLoginAsAnonymous(w http.ResponseWriter, r *http.Request) {
user, err := api.LoginAsAnonymous(w, r)
resp := &LoginResponse{
User: user,
}
@@ -45,6 +30,25 @@ func (api *API) LoginAsAnonymous(w http.ResponseWriter, r *http.Request) {
}
}
func (api *API) LoginAsAnonymous(w http.ResponseWriter, r *http.Request) (*database.User, error) {
user, err := api.Db.LoginAsAnonymous()
if err != nil {
return nil, err
}
session, _ := api.store.Get(r, api.defaultSessionName)
// save session
session.Values["userId"] = user.ID
err = session.Save(r, w)
if err != nil {
return nil, err
}
// return user
return user, nil
}
func (api *API) HandleLogin(w http.ResponseWriter, r *http.Request) {
var user *database.User
var err error

View File

@@ -0,0 +1,7 @@
package database
func (database *Database) RecordPlayback(playback Playback) error {
_, err := database.stmt.recordPlaybackStmt.Exec(
playback.UserID, playback.FileID, playback.Time, playback.Method, playback.Duration)
return err
}

View File

@@ -2,6 +2,7 @@ package database
import (
"database/sql"
"log"
)
var initFilesTableQuery = `CREATE TABLE IF NOT EXISTS files (
@@ -87,7 +88,8 @@ var initPlaybacksTableQuery = `CREATE TABLE IF NOT EXISTS playbacks (
user_id INTEGER NOT NULL,
file_id INTEGER NOT NULL,
time INTEGER NOT NULL,
mothod INTEGER NOT NULL,
method INTEGER NOT NULL,
duration INTEGER NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (file_id) REFERENCES files(id)
);`
@@ -285,6 +287,8 @@ var updateFilenameQuery = `UPDATE files SET filename = ? WHERE id = ?;`
var resetFilenameQuery = `UPDATE files SET filename = realname WHERE id = ?;`
var recordPlaybackQuery = `INSERT INTO playbacks (user_id, file_id, time, method, duration) VALUES ($1, $2, $3, $4, $5);`
type Stmt struct {
initFilesTable *sql.Stmt
initFoldersTable *sql.Stmt
@@ -345,6 +349,7 @@ type Stmt struct {
deleteFileReferenceInReviews *sql.Stmt
updateFilename *sql.Stmt
resetFilename *sql.Stmt
recordPlaybackStmt *sql.Stmt
}
func NewPreparedStatement(sqlConn *sql.DB) (*Stmt, error) {
@@ -772,5 +777,12 @@ func NewPreparedStatement(sqlConn *sql.DB) (*Stmt, error) {
return nil, err
}
stmt.recordPlaybackStmt, err = sqlConn.Prepare(recordPlaybackQuery)
if err != nil {
return nil, err
}
log.Println("Init statements finished")
return stmt, err
}

View File

@@ -2,6 +2,7 @@ package database
import (
"path/filepath"
"time"
)
type File struct {
@@ -58,6 +59,15 @@ type Feedback struct {
Time int64 `json:"time"`
}
type Playback struct {
ID int64 `json:"id"`
UserID int64 `json:"user_id"`
FileID int64 `json:"file_id"`
Time time.Time `json:"time"`
Method int64 `json:"method"`
Duration time.Duration `json:"Duration"`
}
var (
RoleAnonymous = int64(0)
RoleAdmin = int64(1)