Skip to content

Commit

Permalink
code cleanup for document requests
Browse files Browse the repository at this point in the history
  • Loading branch information
beebeeoii committed Jan 8, 2022
1 parent 715e5ab commit 2a91edb
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 63 deletions.
2 changes: 1 addition & 1 deletion internal/cron/cron.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
98 changes: 45 additions & 53 deletions pkg/api/files.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (
"net/http"
"os"
"path/filepath"
"strings"
"time"

"github.com/beebeeoii/lominus/internal/file"
Expand Down Expand Up @@ -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 {
Expand All @@ -60,59 +61,66 @@ 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{}
if req.Mode != GET_ALL_FILES {
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 {
return files, nil
}

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
}
Expand All @@ -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
}
Expand All @@ -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 {
Expand Down
21 changes: 12 additions & 9 deletions pkg/api/request.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -101,26 +100,30 @@ 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")
}

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,
Expand Down

0 comments on commit 2a91edb

Please sign in to comment.