Add custom drive item
This commit is contained in:
parent
b5cee37ad7
commit
c2f6a87e69
290
src/pkg/services/m365/custom/drive.go
Normal file
290
src/pkg/services/m365/custom/drive.go
Normal file
@ -0,0 +1,290 @@
|
|||||||
|
// Disable revive linter since any structs in this file will expose the same
|
||||||
|
// funcs as the original structs in the msgraph-sdk-go package, which do not
|
||||||
|
// follow some of the golint rules.
|
||||||
|
//
|
||||||
|
//nolint:revive
|
||||||
|
package custom
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/microsoftgraph/msgraph-sdk-go/models"
|
||||||
|
|
||||||
|
"github.com/alcionai/corso/src/internal/common/ptr"
|
||||||
|
"github.com/alcionai/corso/src/internal/common/str"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TODO(pandeyabs): Remove this duplicate
|
||||||
|
// downloadUrlKeys is used to find the download URL in a DriveItem response.
|
||||||
|
var downloadURLKeys = []string{
|
||||||
|
"@microsoft.graph.downloadUrl",
|
||||||
|
"@content.downloadUrl",
|
||||||
|
}
|
||||||
|
|
||||||
|
// Replica of models.DriveItemable
|
||||||
|
type LiteDriveItemable interface {
|
||||||
|
GetId() *string
|
||||||
|
GetName() *string
|
||||||
|
GetSize() *int64
|
||||||
|
// TODO(pandeyabs): replace with any
|
||||||
|
GetFolder() interface{}
|
||||||
|
GetPackageEscaped() interface{}
|
||||||
|
GetShared() interface{}
|
||||||
|
GetMalware() interface{}
|
||||||
|
GetDeleted() interface{}
|
||||||
|
GetRoot() interface{}
|
||||||
|
GetFile() fileItemable
|
||||||
|
GetParentReference() parentReferenceable
|
||||||
|
SetParentReference(parentReferenceable)
|
||||||
|
GetCreatedBy() itemIdentitySetable
|
||||||
|
GetCreatedDateTime() *time.Time
|
||||||
|
GetLastModifiedDateTime() *time.Time
|
||||||
|
GetAdditionalData() map[string]interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ LiteDriveItemable = &driveItem{}
|
||||||
|
|
||||||
|
type driveItem struct {
|
||||||
|
id string
|
||||||
|
name string
|
||||||
|
size int64
|
||||||
|
folder interface{}
|
||||||
|
pkg interface{}
|
||||||
|
shared interface{}
|
||||||
|
malware interface{}
|
||||||
|
deleted interface{}
|
||||||
|
root interface{}
|
||||||
|
file fileItemable
|
||||||
|
parentRef parentReferenceable
|
||||||
|
createdBy itemIdentitySetable
|
||||||
|
createdDateTime time.Time
|
||||||
|
lastModifiedDateTime time.Time
|
||||||
|
additionalData map[string]interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// nolint
|
||||||
|
func (c *driveItem) GetId() *string {
|
||||||
|
return &c.id
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *driveItem) GetName() *string {
|
||||||
|
return &c.name
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *driveItem) GetSize() *int64 {
|
||||||
|
return &c.size
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *driveItem) GetFolder() interface{} {
|
||||||
|
return c.folder
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *driveItem) GetPackageEscaped() interface{} {
|
||||||
|
return c.pkg
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *driveItem) GetShared() interface{} {
|
||||||
|
return c.shared
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *driveItem) GetMalware() interface{} {
|
||||||
|
return c.malware
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *driveItem) GetDeleted() interface{} {
|
||||||
|
return c.deleted
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *driveItem) GetRoot() interface{} {
|
||||||
|
return c.root
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *driveItem) GetFile() fileItemable {
|
||||||
|
return c.file
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *driveItem) GetParentReference() parentReferenceable {
|
||||||
|
return c.parentRef
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(pandeyabs): Should we only support GETs?
|
||||||
|
func (c *driveItem) SetParentReference(parent parentReferenceable) {
|
||||||
|
c.parentRef = parent
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *driveItem) GetCreatedBy() itemIdentitySetable {
|
||||||
|
return c.createdBy
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *driveItem) GetCreatedDateTime() *time.Time {
|
||||||
|
return &c.createdDateTime
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *driveItem) GetLastModifiedDateTime() *time.Time {
|
||||||
|
return &c.lastModifiedDateTime
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *driveItem) GetAdditionalData() map[string]interface{} {
|
||||||
|
return c.additionalData
|
||||||
|
}
|
||||||
|
|
||||||
|
type (
|
||||||
|
fileItemable interface {
|
||||||
|
GetMimeType() *string
|
||||||
|
}
|
||||||
|
parentReferenceable interface {
|
||||||
|
GetPath() *string
|
||||||
|
GetId() *string
|
||||||
|
GetName() *string
|
||||||
|
GetDriveId() *string
|
||||||
|
}
|
||||||
|
itemIdentitySetable interface {
|
||||||
|
GetUser() itemUserable
|
||||||
|
}
|
||||||
|
itemUserable interface {
|
||||||
|
GetAdditionalData() map[string]interface{}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// Concrete implementations
|
||||||
|
|
||||||
|
var _ fileItemable = &fileItem{}
|
||||||
|
|
||||||
|
type fileItem struct {
|
||||||
|
mimeType string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *fileItem) GetMimeType() *string {
|
||||||
|
return &f.mimeType
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ parentReferenceable = &parentRef{}
|
||||||
|
|
||||||
|
type parentRef struct {
|
||||||
|
path string
|
||||||
|
id string
|
||||||
|
name string
|
||||||
|
driveID string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pr *parentRef) GetPath() *string {
|
||||||
|
return &pr.path
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pr *parentRef) GetId() *string {
|
||||||
|
return &pr.id
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pr *parentRef) GetName() *string {
|
||||||
|
return &pr.name
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pr *parentRef) GetDriveId() *string {
|
||||||
|
return &pr.driveID
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ itemIdentitySetable = &itemIdentitySet{}
|
||||||
|
|
||||||
|
type itemIdentitySet struct {
|
||||||
|
user itemUserable
|
||||||
|
}
|
||||||
|
|
||||||
|
func (iis *itemIdentitySet) GetUser() itemUserable {
|
||||||
|
return iis.user
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ itemUserable = &itemUser{}
|
||||||
|
|
||||||
|
type itemUser struct {
|
||||||
|
additionalData map[string]interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (iu *itemUser) GetAdditionalData() map[string]interface{} {
|
||||||
|
return iu.additionalData
|
||||||
|
}
|
||||||
|
|
||||||
|
func ToLiteDriveItemable(item models.DriveItemable) LiteDriveItemable {
|
||||||
|
cdi := &driveItem{
|
||||||
|
id: strings.Clone(ptr.Val(item.GetId())),
|
||||||
|
name: strings.Clone(ptr.Val(item.GetName())),
|
||||||
|
size: ptr.Val(item.GetSize()),
|
||||||
|
createdDateTime: ptr.Val(item.GetCreatedDateTime()),
|
||||||
|
lastModifiedDateTime: ptr.Val(item.GetLastModifiedDateTime()),
|
||||||
|
}
|
||||||
|
|
||||||
|
if item.GetFolder() != nil {
|
||||||
|
cdi.folder = &struct{}{}
|
||||||
|
} else if item.GetFile() != nil {
|
||||||
|
cdi.file = &fileItem{
|
||||||
|
mimeType: strings.Clone(ptr.Val(item.GetFile().GetMimeType())),
|
||||||
|
}
|
||||||
|
} else if item.GetPackageEscaped() != nil {
|
||||||
|
cdi.pkg = &struct{}{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if item.GetParentReference() != nil {
|
||||||
|
cdi.parentRef = &parentRef{
|
||||||
|
id: strings.Clone(ptr.Val(item.GetParentReference().GetId())),
|
||||||
|
path: strings.Clone(ptr.Val(item.GetParentReference().GetPath())),
|
||||||
|
name: strings.Clone(ptr.Val(item.GetParentReference().GetName())),
|
||||||
|
driveID: strings.Clone(ptr.Val(item.GetParentReference().GetDriveId())),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if item.GetShared() != nil {
|
||||||
|
cdi.shared = &struct{}{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if item.GetMalware() != nil {
|
||||||
|
cdi.malware = &struct{}{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if item.GetDeleted() != nil {
|
||||||
|
cdi.deleted = &struct{}{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if item.GetRoot() != nil {
|
||||||
|
cdi.root = &struct{}{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if item.GetCreatedBy() != nil && item.GetCreatedBy().GetUser() != nil {
|
||||||
|
additionalData := item.GetCreatedBy().GetUser().GetAdditionalData()
|
||||||
|
ad := make(map[string]interface{})
|
||||||
|
|
||||||
|
var s string
|
||||||
|
|
||||||
|
ed, ok := additionalData["email"]
|
||||||
|
if ok {
|
||||||
|
s = strings.Clone(ptr.Val(ed.(*string)))
|
||||||
|
ad["email"] = &s
|
||||||
|
} else if ed, ok = additionalData["displayName"]; ok {
|
||||||
|
s = strings.Clone(ptr.Val(ed.(*string)))
|
||||||
|
ad["displayName"] = &s
|
||||||
|
}
|
||||||
|
|
||||||
|
cdi.createdBy = &itemIdentitySet{
|
||||||
|
user: &itemUser{
|
||||||
|
additionalData: ad,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hacky way to cache the download url. Thats all we use from additional data
|
||||||
|
// Otherwise, we'll hold a reference to the underlying store which will consume
|
||||||
|
// lot more memory.
|
||||||
|
if item.GetFile() != nil {
|
||||||
|
ad := make(map[string]interface{})
|
||||||
|
|
||||||
|
for _, key := range downloadURLKeys {
|
||||||
|
if v, err := str.AnyValueToString(key, item.GetAdditionalData()); err == nil {
|
||||||
|
ad[key] = strings.Clone(v)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cdi.additionalData = ad
|
||||||
|
}
|
||||||
|
|
||||||
|
return cdi
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user