diff --git a/pkg/api/api.go b/pkg/api/api.go index 5f63a6e..f948f5f 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -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) diff --git a/pkg/api/handle_stat.go b/pkg/api/handle_stat.go new file mode 100644 index 0000000..2699404 --- /dev/null +++ b/pkg/api/handle_stat.go @@ -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) +} diff --git a/pkg/api/handle_user.go b/pkg/api/handle_user.go index 9f0afb1..c9d4ea3 100644 --- a/pkg/api/handle_user.go +++ b/pkg/api/handle_user.go @@ -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 diff --git a/pkg/database/method_playback.go b/pkg/database/method_playback.go new file mode 100644 index 0000000..3a8a503 --- /dev/null +++ b/pkg/database/method_playback.go @@ -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 +} diff --git a/pkg/database/sql_stmt.go b/pkg/database/sql_stmt.go index e297eaf..f2abf68 100644 --- a/pkg/database/sql_stmt.go +++ b/pkg/database/sql_stmt.go @@ -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 } diff --git a/pkg/database/struct.go b/pkg/database/struct.go index 35d6423..ad86a32 100644 --- a/pkg/database/struct.go +++ b/pkg/database/struct.go @@ -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)