diff --git a/internal/pkg/api/api.go b/internal/pkg/api/api.go index d23f45c..40eca92 100644 --- a/internal/pkg/api/api.go +++ b/internal/pkg/api/api.go @@ -64,6 +64,22 @@ type GetFilesInFolderResponse struct { Files *[]database.File `json:"files"` } +type GetRandomFilesResponse struct { + Files *[]database.File `json:"files"` +} + +func (api *API) HandleGetRandomFiles(w http.ResponseWriter, r *http.Request) { + files, err := api.Db.GetRandomFiles(10); + if err != nil { + api.HandleError(w, r, err) + return + } + getRandomFilesResponse := &GetRandomFilesResponse{ + Files: &files, + } + json.NewEncoder(w).Encode(getRandomFilesResponse) +} + func (api *API) HandleGetFilesInFolder(w http.ResponseWriter, r *http.Request) { getFilesInFolderRequest := &GetFilesInFolderRequest{ Folder_id: -1, @@ -358,6 +374,7 @@ func NewAPI(dbName string, Addr string) (*API, error) { apiMux.HandleFunc("/search_files", api.HandleSearchFiles) apiMux.HandleFunc("/search_folders", api.HandleSearchFolders) apiMux.HandleFunc("/get_files_in_folder", api.HandleGetFilesInFolder) + apiMux.HandleFunc("/get_random_files", api.HandleGetRandomFiles) // below needs token apiMux.HandleFunc("/walk", api.HandleWalk) apiMux.HandleFunc("/reset", api.HandleReset) diff --git a/internal/pkg/database/database.go b/internal/pkg/database/database.go index bee82dd..15a581e 100644 --- a/internal/pkg/database/database.go +++ b/internal/pkg/database/database.go @@ -31,6 +31,7 @@ var dropFolderQuery = `DROP TABLE folders;` var getFileQuery = `SELECT files.id, files.folder_id, files.filename, folders.foldername, files.filesize FROM files JOIN folders ON files.folder_id = folders.id WHERE files.id = ? LIMIT 1;` var searchFoldersQuery = `SELECT id, folder, foldername FROM folders WHERE foldername LIKE ? LIMIT ? OFFSET ?;` var getFilesInFolderQuery = `SELECT id, filename, filesize FROM files WHERE folder_id = ? LIMIT ? OFFSET ?;` +var getRandomFilesQuery = `SELECT files.id, files.folder_id, files.filename, folders.foldername, files.filesize FROM files JOIN folders on files.folder_id = folders.id ORDER BY RANDOM() LIMIT ?;` type Database struct { sqlConn *sql.DB @@ -50,6 +51,7 @@ type Stmt struct { getFile *sql.Stmt searchFolders *sql.Stmt getFilesInFolder *sql.Stmt + getRandomFiles *sql.Stmt } type File struct { @@ -68,6 +70,26 @@ type Folder struct { Foldername string `json:"foldername"` } +func (database *Database) GetRandomFiles(limit int64) ([]File, error) { + rows, err := database.stmt.getRandomFiles.Query(limit) + if err != nil { + return nil, err + } + defer rows.Close() + files := make([]File, 0) + for rows.Next() { + file := File{ + Db: database, + } + err = rows.Scan(&file.ID, &file.Folder_id, &file.Filename, &file.Foldername, &file.Filesize) + if err != nil { + return nil, err + } + files = append(files, file) + } + return files, nil +} + func (database *Database) GetFilesInFolder(folder_id int64, limit int64, offset int64) ([]File, error) { rows, err := database.stmt.getFilesInFolder.Query(folder_id, limit, offset) if err != nil { @@ -352,6 +374,12 @@ func NewPreparedStatement(sqlConn *sql.DB) (*Stmt, error) { return nil, err } + // init getRandomFiles + stmt.getRandomFiles, err = sqlConn.Prepare(getRandomFilesQuery) + if err != nil { + return nil, err + } + return stmt, err }