diff --git a/internal/cron/cron.go b/internal/cron/cron.go index 84886a2..c8b7895 100644 --- a/internal/cron/cron.go +++ b/internal/cron/cron.go @@ -120,7 +120,7 @@ func createJob(frequency int) (*gocron.Job, error) { continue } - files, fileErr := fileRequest.GetAllFiles() + files, fileErr := fileRequest.GetRootFiles() if fileErr != nil { notifications.NotificationChannel <- notifications.Notification{Title: "Sync", Content: "Unable to retrieve files"} logs.WarningLogger.Println(fileErr) diff --git a/pkg/api/files.go b/pkg/api/files.go index 37dbcdd..78b2666 100644 --- a/pkg/api/files.go +++ b/pkg/api/files.go @@ -7,7 +7,6 @@ import ( "net/http" "os" "path/filepath" - "strings" "time" "github.com/beebeeoii/lominus/internal/file" @@ -39,18 +38,20 @@ const FILE_URL_ENDPOINT = "https://luminus.nus.edu.sg/v2/api/files/%s/file?popul const DOWNLOAD_URL_ENDPOINT = "https://luminus.nus.edu.sg/v2/api/files/file/%s/downloadurl" // GetAllFolders returns a slice of Folder objects from a DocumentRequest. -// Ensure DocumentRequest mode is GET_FOLDERS (0). +// It will only return folders in the current folder. +// Nested folders will not be returned. +// Ensure that DocumentRequest mode is GET_ALL_FOLDERS (0). // Find out more about DocumentRequests under request.go. func (req DocumentRequest) GetAllFolders() ([]Folder, error) { - folder := []Folder{} - if req.Mode != GET_FOLDERS { - return folder, errors.New("mode mismatched: ensure DocumentRequest mode is GET_FOLDERS (0)") + folders := []Folder{} + if req.Mode != GET_ALL_FOLDERS { + return folders, errors.New("mode mismatched: ensure DocumentRequest mode is GET_ALL_FOLDERS (0)") } rawResponse := RawResponse{} err := req.Request.GetRawResponse(&rawResponse) if err != nil { - return folder, err + return folders, err } for _, content := range rawResponse.Data { @@ -60,17 +61,18 @@ func (req DocumentRequest) GetAllFolders() ([]Folder, error) { Name: file.CleanseFolderFileName(content["name"].(string)), Downloadable: content["isActive"].(bool) && !content["allowUpload"].(bool), // downloadable = active folder + does not allow uploads HasSubFolder: int(content["subFolderCount"].(float64)) > 0, - Ancestors: []string{strings.TrimSpace(req.Module.ModuleCode)}, + Ancestors: append(req.Folder.Ancestors, req.Folder.Name), } - folder = append(folder, newFolder) + folders = append(folders, newFolder) } } - return folder, nil + return folders, nil } -// Deprecated - build DocumentRequest with a Folder instead of a module instead, and call getRootFiles() directly. -// GetAllFiles returns a slice of File objects that are in a Folder using a DocumentRequest. -// Ensure DocumentRequest mode is GET_ALL_FILES (1). +// GetAllFiles returns a slice of File objects that are in a Folder from a DocumentRequest. +// It will only return files in the current folder. +// To return nested files, use GetRootFiles() instead. +// Ensure that DocumentRequest mode is GET_ALL_FILES (1). // Find out more about DocumentRequests under request.go. func (req DocumentRequest) GetAllFiles() ([]File, error) { files := []File{} @@ -78,33 +80,39 @@ func (req DocumentRequest) GetAllFiles() ([]File, error) { return files, errors.New("mode mismatched: ensure DocumentRequest mode is GET_ALL_FILES (1)") } - rootFilesReq, rootFilesBuildErr := BuildDocumentRequest(Folder{ - Id: req.Module.Id, - Name: req.Module.ModuleCode, - Downloadable: true, - Ancestors: []string{strings.TrimSpace(req.Module.ModuleCode)}, - HasSubFolder: true, - }, GET_FILES) - if rootFilesBuildErr != nil { - return files, rootFilesBuildErr - } - - baseFiles, err := rootFilesReq.getRootFiles() + rawResponse := RawResponse{} + err := req.Request.GetRawResponse(&rawResponse) if err != nil { return files, err } - files = append(files, baseFiles...) + + for _, content := range rawResponse.Data { + lastUpdated, timeParseErr := time.Parse(time.RFC3339, content["lastUpdatedDate"].(string)) + + if timeParseErr != nil { + return files, timeParseErr + } + + file := File{ + Id: content["id"].(string), + Name: file.CleanseFolderFileName(content["name"].(string)), + LastUpdated: lastUpdated, + Ancestors: append(req.Folder.Ancestors, req.Folder.Name), + } + files = append(files, file) + } return files, nil } -// getRootFiles returns a slice of File objects and nested File objects that are in a Folder or nested Folder from a DocumentRequest. -// Ensure DocumentRequest mode is GET_FILES (3). +// GetRootFiles returns a slice of File objects and nested File objects that are in a Folder from a DocumentRequest. +// It will traverse all nested folders and return all nested files. +// Ensure that DocumentRequest mode is GET_ALL_FILES (1). // Find out more about DocumentRequests under request.go. -func (req DocumentRequest) getRootFiles() ([]File, error) { +func (req DocumentRequest) GetRootFiles() ([]File, error) { files := []File{} - if req.Mode != GET_FILES { - return files, errors.New("mode mismatched: ensure DocumentRequest mode is GET_FILES (3)") + if req.Mode != GET_ALL_FILES { + return files, errors.New("mode mismatched: ensure DocumentRequest mode is GET_ALL_FILES (1)") } if !req.Folder.Downloadable { @@ -112,7 +120,7 @@ func (req DocumentRequest) getRootFiles() ([]File, error) { } if req.Folder.HasSubFolder { - subFolderReq, subFolderReqBuildErr := BuildDocumentRequest(req.Folder, GET_FOLDERS) + subFolderReq, subFolderReqBuildErr := BuildDocumentRequest(req.Folder, GET_ALL_FOLDERS) if subFolderReqBuildErr != nil { return files, subFolderReqBuildErr } @@ -123,14 +131,12 @@ func (req DocumentRequest) getRootFiles() ([]File, error) { } for _, subFolder := range subFolders { - subFolder.Ancestors = append(subFolder.Ancestors, req.Folder.Ancestors...) - subFolder.Ancestors = append(subFolder.Ancestors, strings.TrimSpace(subFolder.Name)) - rootFilesReq, rootFilesBuildErr := BuildDocumentRequest(subFolder, GET_FILES) + rootFilesReq, rootFilesBuildErr := BuildDocumentRequest(subFolder, GET_ALL_FILES) if rootFilesBuildErr != nil { return files, rootFilesBuildErr } - subFiles, err := rootFilesReq.getRootFiles() + subFiles, err := rootFilesReq.GetRootFiles() if err != nil { return files, err } @@ -139,32 +145,18 @@ func (req DocumentRequest) getRootFiles() ([]File, error) { } } - rawResponse := RawResponse{} - err := req.Request.GetRawResponse(&rawResponse) + subFiles, err := req.GetAllFiles() if err != nil { return files, err } - for _, content := range rawResponse.Data { - lastUpdated, timeParseErr := time.Parse(time.RFC3339, content["lastUpdatedDate"].(string)) - - if timeParseErr != nil { - return files, timeParseErr - } - newFile := File{ - Id: content["id"].(string), - Name: file.CleanseFolderFileName(content["name"].(string)), - LastUpdated: lastUpdated, - Ancestors: req.Folder.Ancestors, - } - files = append(files, newFile) - } + files = append(files, subFiles...) return files, nil } -// Download downloads the specified file in a DocumentRequest into local storage. -// Ensure DocumentRequest mode is DOWNLOAD_FILE (2). +// Download downloads the specified File in a DocumentRequest into local storage. +// Ensure that DocumentRequest mode is DOWNLOAD_FILE (2). // Find out more about DocumentRequests under request.go. func (req DocumentRequest) Download(filePath string) error { if req.Mode != DOWNLOAD_FILE { diff --git a/pkg/api/request.go b/pkg/api/request.go index 522d100..648c1b1 100644 --- a/pkg/api/request.go +++ b/pkg/api/request.go @@ -37,10 +37,9 @@ type ModuleRequest struct { } const ( - GET_FOLDERS = 0 - GET_ALL_FILES = 1 - DOWNLOAD_FILE = 2 - GET_FILES = 3 + GET_ALL_FOLDERS = 0 + GET_ALL_FILES = 1 + DOWNLOAD_FILE = 2 ) const USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0" @@ -101,18 +100,16 @@ func BuildDocumentRequest(builder interface{}, mode int) (DocumentRequest, error var urlEndpoint string switch mode { - case GET_FOLDERS: + case GET_ALL_FOLDERS: urlEndpoint = FOLDER_URL_ENDPOINT case GET_ALL_FILES: - urlEndpoint = FOLDER_URL_ENDPOINT + urlEndpoint = FILE_URL_ENDPOINT case DOWNLOAD_FILE: _, isFile := builder.(File) if !isFile { return DocumentRequest{}, errors.New("invalid arguments: DocumentRequest must be built using File to download") } urlEndpoint = DOWNLOAD_URL_ENDPOINT - case GET_FILES: - urlEndpoint = FILE_URL_ENDPOINT default: return DocumentRequest{}, errors.New("invalid arguments: mode provided is not a valid mode") } @@ -120,7 +117,13 @@ func BuildDocumentRequest(builder interface{}, mode int) (DocumentRequest, error switch builder := builder.(type) { case Module: return DocumentRequest{ - Module: builder, + Folder: Folder{ + Id: builder.Id, + Name: builder.ModuleCode, + Downloadable: true, + Ancestors: []string{}, + HasSubFolder: true, + }, Request: Request{ Url: fmt.Sprintf(urlEndpoint, builder.Id), JwtToken: jwtToken,