fixed the bug of Sodistore Home Product not show on side bar and added related backend logs and more accurate frontend error messages

This commit is contained in:
Yinyin Liu 2026-02-03 13:52:20 +01:00
parent d73a85c38d
commit 617ab2f782
4 changed files with 80 additions and 14 deletions

View File

@ -596,7 +596,14 @@ public class Controller : ControllerBase
var folder = Db.GetFolderById(folderAccess.FolderId); var folder = Db.GetFolderById(folderAccess.FolderId);
var user = Db.GetUserById(folderAccess.UserId); var user = Db.GetUserById(folderAccess.UserId);
return session.GrantUserAccessTo(user, folder) // Check if user already has access - treat as idempotent (success)
if (user is not null && folder is not null && user.HasAccessTo(folder))
{
Console.WriteLine($"GrantUserAccessToFolder: User {user.Id} ({user.Name}) already has access to folder {folder.Id} ({folder.Name}) - returning success");
return Ok();
}
return session.GrantUserAccessTo(user, folder)
? Ok() ? Ok()
: Unauthorized(); : Unauthorized();
} }
@ -621,12 +628,19 @@ public class Controller : ControllerBase
public ActionResult GrantUserAccessToInstallation(InstallationAccess installationAccess, Token authToken) public ActionResult GrantUserAccessToInstallation(InstallationAccess installationAccess, Token authToken)
{ {
var session = Db.GetSession(authToken); var session = Db.GetSession(authToken);
// TODO: automatic BadRequest when properties are null during deserialization // TODO: automatic BadRequest when properties are null during deserialization
var installation = Db.GetInstallationById(installationAccess.InstallationId); var installation = Db.GetInstallationById(installationAccess.InstallationId);
var user = Db.GetUserById(installationAccess.UserId); var user = Db.GetUserById(installationAccess.UserId);
return session.GrantUserAccessTo(user, installation) // Check if user already has access - treat as idempotent (success)
if (user is not null && installation is not null && user.HasAccessTo(installation))
{
Console.WriteLine($"GrantUserAccessToInstallation: User {user.Id} ({user.Name}) already has access to installation {installation.Id} ({installation.Name}) - returning success");
return Ok();
}
return session.GrantUserAccessTo(user, installation)
? Ok() ? Ok()
: Unauthorized(); : Unauthorized();
} }

View File

@ -405,13 +405,53 @@ public static class SessionMethods
{ {
var sessionUser = session?.User; var sessionUser = session?.User;
return sessionUser is not null if (sessionUser is null)
&& folder is not null {
&& user is not null Console.WriteLine($"GrantUserAccessToFolder failed: sessionUser is null");
&& user.IsDescendantOf(sessionUser) return false;
&& sessionUser.HasAccessTo(folder) }
&& !user.HasAccessTo(folder)
&& Db.Create(new FolderAccess { UserId = user.Id, FolderId = folder.Id }); if (folder is null)
{
Console.WriteLine($"GrantUserAccessToFolder failed: folder is null");
return false;
}
if (user is null)
{
Console.WriteLine($"GrantUserAccessToFolder failed: user is null");
return false;
}
if (!user.IsDescendantOf(sessionUser))
{
Console.WriteLine($"GrantUserAccessToFolder failed: User {user.Id} ({user.Name}) is not a descendant of sessionUser {sessionUser.Id} ({sessionUser.Name})");
return false;
}
if (!sessionUser.HasAccessTo(folder))
{
Console.WriteLine($"GrantUserAccessToFolder failed: SessionUser {sessionUser.Id} ({sessionUser.Name}) does not have access to folder {folder.Id} ({folder.Name})");
return false;
}
if (user.HasAccessTo(folder))
{
Console.WriteLine($"GrantUserAccessToFolder failed: User {user.Id} ({user.Name}) already has access to folder {folder.Id} ({folder.Name})");
return false;
}
var created = Db.Create(new FolderAccess { UserId = user.Id, FolderId = folder.Id });
if (!created)
{
Console.WriteLine($"GrantUserAccessToFolder failed: Failed to create FolderAccess record for User {user.Id} and Folder {folder.Id}");
}
else
{
Console.WriteLine($"GrantUserAccessToFolder succeeded: Granted User {user.Id} ({user.Name}) access to Folder {folder.Id} ({folder.Name})");
}
return created;
} }
public static Boolean RevokeUserAccessTo(this Session? session, User? user, Installation? installation) public static Boolean RevokeUserAccessTo(this Session? session, User? user, Installation? installation)

View File

@ -76,7 +76,7 @@ function App() {
setUser(response.data.user); setUser(response.data.user);
setAccessToSalimax(response.data.accessToSalimax); setAccessToSalimax(response.data.accessToSalimax);
setAccessToSalidomo(response.data.accessToSalidomo); setAccessToSalidomo(response.data.accessToSalidomo);
setAccessToSodiohome(response.data.accessToSodiohome); setAccessToSodiohome(response.data.accessToSodioHome);
setAccessToSodistore(response.data.accessToSodistoreMax); setAccessToSodistore(response.data.accessToSodistoreMax);
if (response.data.accessToSalimax) { if (response.data.accessToSalimax) {
navigate(routes.installations); navigate(routes.installations);

View File

@ -172,7 +172,13 @@ function UserAccess(props: UserAccessProps) {
} }
}) })
.catch((err) => { .catch((err) => {
setErrorMessage('An error has occured'); if (err.response && err.response.status === 401) {
setErrorMessage(
`User ${props.current_user.name} already has access to folder "${folder.name}" or you don't have permission to grant this access`
);
} else {
setErrorMessage('An error has occured');
}
setError(true); setError(true);
}); });
} }
@ -195,7 +201,13 @@ function UserAccess(props: UserAccessProps) {
} }
}) })
.catch((err) => { .catch((err) => {
setErrorMessage('An error has occured'); if (err.response && err.response.status === 401) {
setErrorMessage(
`User ${props.current_user.name} already has access to installation "${installation.name}" or you don't have permission to grant this access`
);
} else {
setErrorMessage('An error has occured');
}
setError(true); setError(true);
}); });
} }