backend support record playback history
This commit is contained in:
@@ -71,7 +71,7 @@ func NewAPI(config commonconfig.Config) (*API, error) {
|
|||||||
// user
|
// user
|
||||||
apiMux.HandleFunc("/login", api.HandleLogin)
|
apiMux.HandleFunc("/login", api.HandleLogin)
|
||||||
apiMux.HandleFunc("/register", api.HandleRegister)
|
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_user_info", api.HandleGetUserInfo)
|
||||||
apiMux.HandleFunc("/get_users", api.HandleGetUsers)
|
apiMux.HandleFunc("/get_users", api.HandleGetUsers)
|
||||||
apiMux.HandleFunc("/update_user_active", api.HandleUpdateUserActive)
|
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("/update_review", api.HandleUpdateReview)
|
||||||
apiMux.HandleFunc("/delete_review", api.HandleDeleteReview)
|
apiMux.HandleFunc("/delete_review", api.HandleDeleteReview)
|
||||||
apiMux.HandleFunc("/get_reviews_by_user", api.HandleGetReviewsByUser)
|
apiMux.HandleFunc("/get_reviews_by_user", api.HandleGetReviewsByUser)
|
||||||
|
// statistic
|
||||||
|
apiMux.HandleFunc("/record_playback", api.HandleRecordPlayback)
|
||||||
// database
|
// database
|
||||||
apiMux.HandleFunc("/walk", api.HandleWalk)
|
apiMux.HandleFunc("/walk", api.HandleWalk)
|
||||||
apiMux.HandleFunc("/reset", api.HandleReset)
|
apiMux.HandleFunc("/reset", api.HandleReset)
|
||||||
|
|||||||
44
pkg/api/handle_stat.go
Normal file
44
pkg/api/handle_stat.go
Normal 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)
|
||||||
|
}
|
||||||
@@ -17,23 +17,8 @@ type LoginResponse struct {
|
|||||||
User *database.User `json:"user"`
|
User *database.User `json:"user"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (api *API) LoginAsAnonymous(w http.ResponseWriter, r *http.Request) {
|
func (api *API) HandleLoginAsAnonymous(w http.ResponseWriter, r *http.Request) {
|
||||||
user, err := api.Db.LoginAsAnonymous()
|
user, err := api.LoginAsAnonymous(w, r)
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
resp := &LoginResponse{
|
resp := &LoginResponse{
|
||||||
User: user,
|
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) {
|
func (api *API) HandleLogin(w http.ResponseWriter, r *http.Request) {
|
||||||
var user *database.User
|
var user *database.User
|
||||||
var err error
|
var err error
|
||||||
|
|||||||
7
pkg/database/method_playback.go
Normal file
7
pkg/database/method_playback.go
Normal 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
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@ package database
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
|
"log"
|
||||||
)
|
)
|
||||||
|
|
||||||
var initFilesTableQuery = `CREATE TABLE IF NOT EXISTS files (
|
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,
|
user_id INTEGER NOT NULL,
|
||||||
file_id INTEGER NOT NULL,
|
file_id INTEGER NOT NULL,
|
||||||
time 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 (user_id) REFERENCES users(id),
|
||||||
FOREIGN KEY (file_id) REFERENCES files(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 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 {
|
type Stmt struct {
|
||||||
initFilesTable *sql.Stmt
|
initFilesTable *sql.Stmt
|
||||||
initFoldersTable *sql.Stmt
|
initFoldersTable *sql.Stmt
|
||||||
@@ -345,6 +349,7 @@ type Stmt struct {
|
|||||||
deleteFileReferenceInReviews *sql.Stmt
|
deleteFileReferenceInReviews *sql.Stmt
|
||||||
updateFilename *sql.Stmt
|
updateFilename *sql.Stmt
|
||||||
resetFilename *sql.Stmt
|
resetFilename *sql.Stmt
|
||||||
|
recordPlaybackStmt *sql.Stmt
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewPreparedStatement(sqlConn *sql.DB) (*Stmt, error) {
|
func NewPreparedStatement(sqlConn *sql.DB) (*Stmt, error) {
|
||||||
@@ -772,5 +777,12 @@ func NewPreparedStatement(sqlConn *sql.DB) (*Stmt, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stmt.recordPlaybackStmt, err = sqlConn.Prepare(recordPlaybackQuery)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Println("Init statements finished")
|
||||||
|
|
||||||
return stmt, err
|
return stmt, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package database
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
type File struct {
|
type File struct {
|
||||||
@@ -58,6 +59,15 @@ type Feedback struct {
|
|||||||
Time int64 `json:"time"`
|
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 (
|
var (
|
||||||
RoleAnonymous = int64(0)
|
RoleAnonymous = int64(0)
|
||||||
RoleAdmin = int64(1)
|
RoleAdmin = int64(1)
|
||||||
|
|||||||
Reference in New Issue
Block a user