check authentication for all servers on initialization and update permission roles

This commit is contained in:
jeffvli
2025-12-07 17:53:26 -08:00
parent 4ddada1fe3
commit c82762a3fc
10 changed files with 283 additions and 44 deletions
+14
View File
@@ -586,6 +586,20 @@ export const controller: GeneralController = {
server.type,
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
},
getUserInfo(args) {
const server = getServerById(args.apiClientProps.serverId);
if (!server) {
throw new Error(
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getUserInfo`,
);
}
return apiController(
'getUserInfo',
server.type,
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
},
getUserList(args) {
const server = getServerById(args.apiClientProps.serverId);
@@ -247,6 +247,14 @@ export const contract = c.router({
400: jfType._response.error,
},
},
getUser: {
method: 'GET',
path: 'users/:id',
responses: {
200: jfType._response.user,
400: jfType._response.error,
},
},
movePlaylistItem: {
body: null,
method: 'POST',
@@ -1127,6 +1127,25 @@ export const JellyfinController: InternalControllerEndpoint = {
totalRecordCount: res.body.TotalRecordCount,
};
},
getUserInfo: async (args) => {
const { apiClientProps, query } = args;
const res = await jfApiClient(apiClientProps).getUser({
params: {
id: query.id,
},
});
if (res.status !== 200) {
throw new Error('Failed to get user info');
}
return {
id: res.body.Id,
isAdmin: Boolean(res.body.Policy.IsAdministrator),
name: res.body.Name,
};
},
movePlaylistItem: async (args) => {
const { apiClientProps, query } = args;
@@ -699,6 +699,7 @@ export const NavidromeController: InternalControllerEndpoint = {
};
},
getTopSongs: SubsonicController.getTopSongs,
getUserInfo: SubsonicController.getUserInfo,
getUserList: async (args) => {
const { apiClientProps, query } = args;
@@ -204,6 +204,14 @@ export const contract = c.router({
200: ssType._response.topSongsList,
},
},
getUser: {
method: 'GET',
path: 'getUser.view',
query: ssType._parameters.user,
responses: {
200: ssType._response.user,
},
},
ping: {
method: 'GET',
path: 'ping.view',
@@ -144,7 +144,7 @@ export const SubsonicController: InternalControllerEndpoint = {
return {
credential,
isAdmin: resp.body.user.adminRoles,
isAdmin: Boolean(resp.body.user.adminRole),
userId: resp.body.user.username,
username: body.username,
};
@@ -1472,6 +1472,25 @@ export const SubsonicController: InternalControllerEndpoint = {
totalRecordCount: res.body.topSongs?.song?.length || 0,
};
},
getUserInfo: async (args) => {
const { apiClientProps, query } = args;
const res = await ssApiClient(apiClientProps).getUser({
query: {
id: query.id,
},
});
if (res.status !== 200) {
throw new Error('Failed to get user info');
}
return {
id: res.body.user.username,
isAdmin: Boolean(res.body.user.adminRole),
name: res.body.user.username,
};
},
removeFromPlaylist: async ({ apiClientProps, query }) => {
const res = await ssApiClient(apiClientProps).updatePlaylist({
query: {
@@ -1583,7 +1602,6 @@ export const SubsonicController: InternalControllerEndpoint = {
return null;
},
search: async (args) => {
const { apiClientProps, query } = args;