// Copyright 2023 The casbin Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package object import ( "fmt" urllib "net/url" "strings" "github.com/casibase/casibase/storage" ) func (store *Store) createPathIfNotExisted(tokens []string, size int64, url string, lastModifiedTime string, isLeaf bool) { currentFile := store.FileTree for i, token := range tokens { if currentFile.Children == nil { currentFile.Children = []*File{} } if currentFile.ChildrenMap == nil { currentFile.ChildrenMap = map[string]*File{} } tmpFile, ok := currentFile.ChildrenMap[token] if ok { currentFile = tmpFile continue } isLeafTmp := false if i == len(tokens)-1 { isLeafTmp = isLeaf } key := strings.Join(tokens[:i+1], "/") newFile := &File{ Key: key, Title: token, IsLeaf: isLeafTmp, Url: url, Children: []*File{}, ChildrenMap: map[string]*File{}, } if i == len(tokens)-1 { newFile.Size = size newFile.CreatedTime = lastModifiedTime if token == "_hidden.ini" { continue } } else if i == len(tokens)-2 { if tokens[len(tokens)-1] == "_hidden.ini" { newFile.CreatedTime = lastModifiedTime } } currentFile.Children = append(currentFile.Children, newFile) currentFile.ChildrenMap[token] = newFile currentFile = newFile } } func isObjectLeaf(object *storage.Object) bool { isLeaf := true if object.Key[len(object.Key)-1] == '/' { isLeaf = false } return isLeaf } func (store *Store) Populate(origin string) error { storageProviderObj, err := store.GetStorageProviderObj() if err != nil { return err } objects, err := storageProviderObj.ListObjects("") if err != nil { return err } if store.FileTree == nil { store.FileTree = &File{ Key: "/", Title: store.DisplayName, CreatedTime: store.CreatedTime, IsLeaf: false, Url: "", Children: []*File{}, ChildrenMap: map[string]*File{}, } } sortedObjects := []*storage.Object{} for _, object := range objects { if strings.HasSuffix(object.Key, "/_hidden.ini") { sortedObjects = append(sortedObjects, object) } } for _, object := range objects { if !strings.HasSuffix(object.Key, "/_hidden.ini") { sortedObjects = append(sortedObjects, object) } } for _, object := range sortedObjects { lastModifiedTime := object.LastModified isLeaf := isObjectLeaf(object) size := object.Size url := object.Url if !strings.HasPrefix(url, "http://") && !strings.HasPrefix(url, "https://") { url, _ = urllib.JoinPath(origin, object.Url) } tokens := strings.Split(strings.Trim(object.Key, "/"), "/") store.createPathIfNotExisted(tokens, size, url, lastModifiedTime, isLeaf) // fmt.Printf("%s, %d, %v\n", object.Key, object.Size, object.LastModified) } return nil } func (store *Store) GetVideoData() ([]string, error) { storageProviderObj, err := store.GetStorageProviderObj() if err != nil { return nil, err } objects, err := storageProviderObj.ListObjects("2023/视频附件") if err != nil { return nil, err } res := []string{} for _, object := range objects { if strings.HasSuffix(object.Key, "/_hidden.ini") { continue } url := fmt.Sprintf("%s/%s", store.StorageProvider, object.Key) res = append(res, url) } return res, nil }