66 lines
2.2 KiB
C#
66 lines
2.2 KiB
C#
using Flawless.Abstraction;
|
|
using Flawless.Server.Models;
|
|
|
|
namespace Flawless.Server.Utility;
|
|
|
|
public enum RepoLocktableOptResult
|
|
{
|
|
Expand,
|
|
Success,
|
|
Already,
|
|
IsChild,
|
|
Rejected,
|
|
}
|
|
|
|
public static class RepoLocktableUtility
|
|
{
|
|
public static RepositoryLockedFile? GetFileLockByPath(List<RepositoryLockedFile> table, string testPath)
|
|
{
|
|
return table.FirstOrDefault(f => WorkPath.IsPathRelated(f.Path, testPath));
|
|
}
|
|
|
|
public static RepoLocktableOptResult AddFileLockOwner(List<RepositoryLockedFile> table, string testPath, AppUser owner)
|
|
{
|
|
var expanded = false;
|
|
foreach (var entry in table)
|
|
{
|
|
if (!WorkPath.IsPathRelated(entry.Path, testPath)) continue;
|
|
|
|
// Check is locked by others
|
|
if (entry.LockDownUser != owner) return RepoLocktableOptResult.Rejected;
|
|
return testPath == entry.Path ? RepoLocktableOptResult.Already : RepoLocktableOptResult.IsChild;
|
|
}
|
|
|
|
// Check if includes can be locked
|
|
for (var i = 0; i < table.Count; i++)
|
|
{
|
|
var entry = table[i];
|
|
if (!WorkPath.IsPathRelated(testPath, entry.Path)) continue;
|
|
|
|
if (entry.LockDownUser != owner) return RepoLocktableOptResult.Rejected;
|
|
table.RemoveAt(i);
|
|
i -= 1;
|
|
expanded = true;
|
|
}
|
|
|
|
table.Add(new RepositoryLockedFile { Path = testPath, LockDownUser = owner });
|
|
return expanded ? RepoLocktableOptResult.Expand : RepoLocktableOptResult.Success;
|
|
}
|
|
|
|
public static RepoLocktableOptResult RemoveFileLockOwner(List<RepositoryLockedFile> table, string testPath, AppUser? owner)
|
|
{
|
|
for (var i = 0; i < table.Count; i++)
|
|
{
|
|
var entry = table[i];
|
|
if (!WorkPath.IsPathRelated(entry.Path, testPath)) continue;
|
|
|
|
if (owner != null && entry.LockDownUser != owner) return RepoLocktableOptResult.Rejected;
|
|
if (testPath != entry.Path) return RepoLocktableOptResult.IsChild;
|
|
|
|
table.Remove(entry);
|
|
return RepoLocktableOptResult.Success;
|
|
}
|
|
|
|
return RepoLocktableOptResult.Rejected;
|
|
}
|
|
} |