seems like a lot of code, but this is 95% boilerplate additions copied from groups collections packages, with a find-replace for names. Some noteworthy differences: * teamsChats does not handle metadata, so all metadata, delta, and previous path handling was removed * teamsChats does not produce tombstones * chats are never deleted, so no "removed" items are tracked * all chats gets stored at the prefix root, so no "containers" are iterated, and therefore only one collection is ever produced. This means that, overall, while the boilerplate here is still the same, it's much reduced compared to similar packages. --- #### Does this PR need a docs update or release note? - [x] ⛔ No #### Type of change - [x] 🌻 Feature #### Issue(s) * #5062 #### Test Plan - [x] ⚡ Unit test - [x] 💚 E2E
102 lines
2.2 KiB
Go
102 lines
2.2 KiB
Go
package utils
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/alcionai/clues"
|
|
"github.com/spf13/cobra"
|
|
|
|
"github.com/alcionai/corso/src/cli/flags"
|
|
"github.com/alcionai/corso/src/pkg/selectors"
|
|
)
|
|
|
|
type TeamsChatsOpts struct {
|
|
Users []string
|
|
|
|
ExportCfg ExportCfgOpts
|
|
|
|
Populated flags.PopulatedFlags
|
|
}
|
|
|
|
func TeamsChatsAllowedCategories() map[string]struct{} {
|
|
return map[string]struct{}{
|
|
flags.DataChats: {},
|
|
}
|
|
}
|
|
|
|
func AddTeamsChatsCategories(sel *selectors.TeamsChatsBackup, cats []string) *selectors.TeamsChatsBackup {
|
|
if len(cats) == 0 {
|
|
sel.Include(sel.AllData())
|
|
}
|
|
|
|
for _, d := range cats {
|
|
switch d {
|
|
case flags.DataChats:
|
|
sel.Include(sel.Chats(selectors.Any()))
|
|
}
|
|
}
|
|
|
|
return sel
|
|
}
|
|
|
|
func MakeTeamsChatsOpts(cmd *cobra.Command) TeamsChatsOpts {
|
|
return TeamsChatsOpts{
|
|
Users: flags.UserFV,
|
|
|
|
ExportCfg: makeExportCfgOpts(cmd),
|
|
|
|
// populated contains the list of flags that appear in the
|
|
// command, according to pflags. Use this to differentiate
|
|
// between an "empty" and a "missing" value.
|
|
Populated: flags.GetPopulatedFlags(cmd),
|
|
}
|
|
}
|
|
|
|
// ValidateTeamsChatsRestoreFlags checks common flags for correctness and interdependencies
|
|
func ValidateTeamsChatsRestoreFlags(backupID string, opts TeamsChatsOpts, isRestore bool) error {
|
|
if len(backupID) == 0 {
|
|
return clues.New("a backup ID is required")
|
|
}
|
|
|
|
// restore isn't currently supported
|
|
if isRestore {
|
|
return clues.New("restore not supported")
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// AddTeamsChatsFilter adds the scope of the provided values to the selector's
|
|
// filter set
|
|
func AddTeamsChatsFilter(
|
|
sel *selectors.TeamsChatsRestore,
|
|
v string,
|
|
f func(string) []selectors.TeamsChatsScope,
|
|
) {
|
|
if len(v) == 0 {
|
|
return
|
|
}
|
|
|
|
sel.Filter(f(v))
|
|
}
|
|
|
|
// IncludeTeamsChatsRestoreDataSelectors builds the common data-selector
|
|
// inclusions for teamschats commands.
|
|
func IncludeTeamsChatsRestoreDataSelectors(ctx context.Context, opts TeamsChatsOpts) *selectors.TeamsChatsRestore {
|
|
users := opts.Users
|
|
|
|
if len(opts.Users) == 0 {
|
|
users = selectors.Any()
|
|
}
|
|
|
|
return selectors.NewTeamsChatsRestore(users)
|
|
}
|
|
|
|
// FilterTeamsChatsRestoreInfoSelectors builds the common info-selector filters.
|
|
func FilterTeamsChatsRestoreInfoSelectors(
|
|
sel *selectors.TeamsChatsRestore,
|
|
opts TeamsChatsOpts,
|
|
) {
|
|
// TODO: populate when adding filters
|
|
}
|