示例#1
0
        public bool ResolveRecordAccessPath(IRecordAccessPath path, bool forEdit = false)
        {
            if (string.IsNullOrEmpty(path.RecordUid))
            {
                return(false);
            }
            if (metaData.TryGetValue(path.RecordUid, out SyncDownRecordMetaData sdrm))
            {
                if (sdrm.canEdit || !forEdit)
                {
                    return(true);
                }
            }
            else
            {
                return(false);
            }

            foreach (var sharedFolder in sharedFolders.Values)
            {
                if (sharedFolder.records != null)
                {
                    var sfr = sharedFolder.records
                              .FirstOrDefault(x => (x.recordUid == path.RecordUid) && (x.canEdit || !forEdit));
                    if (sfr != null)
                    {
                        if (string.IsNullOrEmpty(sharedFolder.sharedFolderKey))
                        {
                            if (sharedFolder.teams != null)
                            {
                                foreach (var team in sharedFolder.teams)
                                {
                                    if (teams.TryGetValue(team.teamUid, out SyncDownTeam sdt))
                                    {
                                        if (forEdit && sdt.restrictEdit)
                                        {
                                            continue;
                                        }
                                        path.SharedFolderUid = sharedFolder.sharedFolderUid;
                                        path.TeamUid         = sdt.teamUid;
                                        return(true);
                                    }
                                }
                            }
                        }
                        else
                        {
                            path.SharedFolderUid = sharedFolder.sharedFolderUid;
                            return(true);
                        }
                    }
                }
            }
            return(false);
        }
        public static IRecordMetadata ResolveRecordAccessPath(this IVault vault, IRecordAccessPath path, bool forEdit = false,
                                                              bool forShare = false, bool forView = false)
        {
            if (string.IsNullOrEmpty(path.RecordUid))
            {
                return(null);
            }

            foreach (var rmd in vault.Storage.RecordKeys.GetLinksForSubject(path.RecordUid))
            {
                if (forEdit && !rmd.CanEdit)
                {
                    continue;
                }
                if (forShare && !rmd.CanShare)
                {
                    continue;
                }
                if (string.IsNullOrEmpty(rmd.SharedFolderUid) || rmd.SharedFolderUid == vault.Storage.PersonalScopeUid)
                {
                    return(rmd);
                }

                foreach (var sfmd in vault.Storage.SharedFolderKeys.GetLinksForSubject(rmd.SharedFolderUid))
                {
                    if (string.IsNullOrEmpty(sfmd.TeamUid))
                    {
                        path.SharedFolderUid = sfmd.SharedFolderUid;
                        return(rmd);
                    }

                    if (!forEdit && !forShare && !forView)
                    {
                        path.SharedFolderUid = sfmd.SharedFolderUid;
                        path.TeamUid         = sfmd.TeamUid;
                        return(rmd);
                    }

                    if (!vault.TryGetTeam(sfmd.TeamUid, out var team))
                    {
                        continue;
                    }
                    if (forEdit && team.RestrictEdit)
                    {
                        continue;
                    }
                    if (forShare && team.RestrictShare)
                    {
                        continue;
                    }
                    if (forView && team.RestrictView)
                    {
                        continue;
                    }

                    path.SharedFolderUid = sfmd.SharedFolderUid;
                    path.TeamUid         = sfmd.TeamUid;
                    return(rmd);
                }
            }

            return(null);
        }