mirror of
https://github.com/immich-app/immich.git
synced 2024-12-28 22:51:59 +00:00
Remove VITE_SERVER_ENDPOINT dependency (#428)
* Move backend api to its own instance * Remove external fetch hook * Added endpoint for album * Added endpoint for admin page * Make request directly to immich-server * Refactor unsued code
This commit is contained in:
parent
cf2b9eddfa
commit
b68358766b
23 changed files with 152 additions and 66 deletions
|
@ -56,21 +56,6 @@ ENABLE_MAPBOX=false
|
|||
MAPBOX_KEY=
|
||||
|
||||
|
||||
|
||||
|
||||
###################################################################################
|
||||
# WEB - Required
|
||||
###################################################################################
|
||||
|
||||
# This is the URL of your vm/server where you host Immich, so that the web frontend
|
||||
# know where can it make the request to.
|
||||
# For example: If your server IP address is 10.1.11.50, the environment variable will
|
||||
# be VITE_SERVER_ENDPOINT=http://10.1.11.50:2283/api
|
||||
# !CAUTION! THERE IS NO FORWARD SLASH AT THE END
|
||||
|
||||
VITE_SERVER_ENDPOINT=
|
||||
|
||||
|
||||
####################################################################################
|
||||
# WEB - Optional
|
||||
####################################################################################
|
||||
|
|
|
@ -16,6 +16,5 @@ export const immichAppConfig: ConfigModuleOptions = {
|
|||
then: Joi.string().optional().allow(null, ''),
|
||||
otherwise: Joi.string().required(),
|
||||
}),
|
||||
VITE_SERVER_ENDPOINT: Joi.string().required(),
|
||||
}),
|
||||
};
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
npm start immich
|
|
@ -16,7 +16,7 @@ class ImmichApi {
|
|||
public authenticationApi: AuthenticationApi;
|
||||
public deviceInfoApi: DeviceInfoApi;
|
||||
public serverInfoApi: ServerInfoApi;
|
||||
private config = new Configuration({ basePath: serverEndpoint });
|
||||
private config = new Configuration({ basePath: '/api' });
|
||||
|
||||
constructor() {
|
||||
this.userApi = new UserApi(this.config);
|
||||
|
@ -34,6 +34,12 @@ class ImmichApi {
|
|||
public removeAccessToken() {
|
||||
this.config.accessToken = undefined;
|
||||
}
|
||||
|
||||
public setBaseUrl(baseUrl: string) {
|
||||
this.config.basePath = baseUrl;
|
||||
}
|
||||
}
|
||||
|
||||
export const api = new ImmichApi();
|
||||
export const serverApi = new ImmichApi();
|
||||
serverApi.setBaseUrl('http://immich-server:3001');
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import type { ExternalFetch, GetSession, Handle } from '@sveltejs/kit';
|
||||
import * as cookie from 'cookie';
|
||||
import { api } from '@api';
|
||||
import { api, serverApi } from '@api';
|
||||
|
||||
export const handle: Handle = async ({ event, resolve }) => {
|
||||
const cookies = cookie.parse(event.request.headers.get('cookie') || '');
|
||||
|
@ -11,8 +11,8 @@ export const handle: Handle = async ({ event, resolve }) => {
|
|||
const accessToken = cookies['immich_access_token'];
|
||||
|
||||
try {
|
||||
api.setAccessToken(accessToken);
|
||||
const { data } = await api.userApi.getMyUserInfo();
|
||||
serverApi.setAccessToken(accessToken);
|
||||
const { data } = await serverApi.userApi.getMyUserInfo();
|
||||
event.locals.user = data;
|
||||
|
||||
return await resolve(event);
|
||||
|
|
|
@ -60,7 +60,7 @@
|
|||
});
|
||||
|
||||
$: {
|
||||
if (album.assets.length < 6) {
|
||||
if (album.assets?.length < 6) {
|
||||
thumbnailSize = Math.floor(viewWidth / album.assets.length - album.assets.length);
|
||||
} else {
|
||||
thumbnailSize = Math.floor(viewWidth / 6 - 6);
|
||||
|
|
|
@ -82,11 +82,6 @@
|
|||
<div class="text-xs">
|
||||
<p class="text-sm font-medium text-immich-primary">Server</p>
|
||||
|
||||
<input
|
||||
class="border p-2 rounded-md bg-gray-200 mt-2 text-immich-primary font-medium"
|
||||
value={endpoint}
|
||||
disabled={true}
|
||||
/>
|
||||
<div class="flex justify-items-center justify-between mt-2">
|
||||
<p>Status</p>
|
||||
|
||||
|
|
|
@ -29,3 +29,7 @@ export const getAssetsInfo = async () => {
|
|||
console.log('Error [getAssetsInfo]');
|
||||
}
|
||||
};
|
||||
|
||||
export const setAssetInfo = (data: AssetResponseDto[]) => {
|
||||
assets.set(data);
|
||||
};
|
||||
|
|
|
@ -168,7 +168,7 @@ async function fileUploader(asset: File, uploadType: UploadType) {
|
|||
uploadAssetsStore.updateProgress(deviceAssetId, percentComplete);
|
||||
};
|
||||
|
||||
request.open('POST', `${serverEndpoint}/asset/upload`);
|
||||
request.open('POST', `api/asset/upload`);
|
||||
|
||||
request.send(formData);
|
||||
} catch (e) {
|
||||
|
|
|
@ -2,10 +2,12 @@
|
|||
import type { Load } from '@sveltejs/kit';
|
||||
import { api, UserResponseDto } from '@api';
|
||||
|
||||
export const load: Load = async () => {
|
||||
export const load: Load = async ({ fetch }) => {
|
||||
try {
|
||||
const { data: allUsers } = await api.userApi.getAllUsers(false);
|
||||
const { data: user } = await api.userApi.getMyUserInfo();
|
||||
const [user, allUsers] = await Promise.all([
|
||||
fetch('/data/user/get-my-user-info').then((r) => r.json()),
|
||||
fetch('/data/user/get-all-users?isAll=false').then((r) => r.json())
|
||||
]);
|
||||
|
||||
return {
|
||||
status: 200,
|
||||
|
|
|
@ -2,13 +2,15 @@
|
|||
export const prerender = false;
|
||||
|
||||
import type { Load } from '@sveltejs/kit';
|
||||
import { AlbumResponseDto, api } from '@api';
|
||||
import { AlbumResponseDto } from '@api';
|
||||
|
||||
export const load: Load = async ({ params }) => {
|
||||
export const load: Load = async ({ fetch, params }) => {
|
||||
try {
|
||||
const albumId = params['albumId'];
|
||||
|
||||
const { data: albumInfo } = await api.albumApi.getAlbumInfo(albumId);
|
||||
const albumInfo = await fetch(`/data/album/get-album-info?albumId=${albumId}`).then((r) =>
|
||||
r.json()
|
||||
);
|
||||
|
||||
return {
|
||||
status: 200,
|
||||
|
|
|
@ -1,12 +1,10 @@
|
|||
<script context="module" lang="ts">
|
||||
export const prerender = false;
|
||||
|
||||
import { api } from '@api';
|
||||
import type { Load } from '@sveltejs/kit';
|
||||
|
||||
export const load: Load = async ({ params }) => {
|
||||
try {
|
||||
await api.userApi.getMyUserInfo();
|
||||
await fetch('/data/user/get-my-user-info');
|
||||
} catch (e) {
|
||||
return {
|
||||
status: 302,
|
||||
|
|
|
@ -9,10 +9,12 @@
|
|||
import SideBar from '$lib/components/shared-components/side-bar/side-bar.svelte';
|
||||
import { AlbumResponseDto, api } from '@api';
|
||||
|
||||
export const load: Load = async () => {
|
||||
export const load: Load = async ({ fetch }) => {
|
||||
try {
|
||||
const { data: user } = await api.userApi.getMyUserInfo();
|
||||
const { data: albums } = await api.albumApi.getAllAlbums();
|
||||
const [user, albums] = await Promise.all([
|
||||
fetch('/data/user/get-my-user-info').then((r) => r.json()),
|
||||
fetch('/data/album/get-all-albums').then((r) => r.json())
|
||||
]);
|
||||
|
||||
return {
|
||||
status: 200,
|
||||
|
|
1
web/src/routes/data/README.md
Normal file
1
web/src/routes/data/README.md
Normal file
|
@ -0,0 +1 @@
|
|||
This directory contain SSR endpoints to user serverApi instance to make request directly to DNS
|
18
web/src/routes/data/album/get-album-info.ts
Normal file
18
web/src/routes/data/album/get-album-info.ts
Normal file
|
@ -0,0 +1,18 @@
|
|||
import { AlbumResponseDto, serverApi } from '@api';
|
||||
import type { RequestEvent, RequestHandlerOutput } from '@sveltejs/kit';
|
||||
|
||||
export const GET = async ({
|
||||
url
|
||||
}: RequestEvent): Promise<RequestHandlerOutput<AlbumResponseDto>> => {
|
||||
try {
|
||||
const albumId = url.searchParams.get('albumId') || '';
|
||||
const { data } = await serverApi.albumApi.getAlbumInfo(albumId);
|
||||
return {
|
||||
body: data
|
||||
};
|
||||
} catch {
|
||||
return {
|
||||
status: 500
|
||||
};
|
||||
}
|
||||
};
|
18
web/src/routes/data/album/get-all-albums.ts
Normal file
18
web/src/routes/data/album/get-all-albums.ts
Normal file
|
@ -0,0 +1,18 @@
|
|||
import { AlbumResponseDto, serverApi } from '@api';
|
||||
import type { RequestEvent, RequestHandler, RequestHandlerOutput } from '@sveltejs/kit';
|
||||
|
||||
export const GET = async ({
|
||||
url
|
||||
}: RequestEvent): Promise<RequestHandlerOutput<AlbumResponseDto[]>> => {
|
||||
try {
|
||||
const isShared = url.searchParams.get('isShared') === 'true' || undefined;
|
||||
const { data } = await serverApi.albumApi.getAllAlbums(isShared);
|
||||
return {
|
||||
body: data
|
||||
};
|
||||
} catch {
|
||||
return {
|
||||
status: 500
|
||||
};
|
||||
}
|
||||
};
|
15
web/src/routes/data/asset/get-all-assets.ts
Normal file
15
web/src/routes/data/asset/get-all-assets.ts
Normal file
|
@ -0,0 +1,15 @@
|
|||
import { AssetResponseDto, serverApi } from '@api';
|
||||
import type { RequestHandlerOutput } from '@sveltejs/kit';
|
||||
|
||||
export const GET = async (): Promise<RequestHandlerOutput<AssetResponseDto[]>> => {
|
||||
try {
|
||||
const { data } = await serverApi.assetApi.getAllAssets();
|
||||
return {
|
||||
body: data
|
||||
};
|
||||
} catch {
|
||||
return {
|
||||
status: 500
|
||||
};
|
||||
}
|
||||
};
|
17
web/src/routes/data/user/get-all-users.ts
Normal file
17
web/src/routes/data/user/get-all-users.ts
Normal file
|
@ -0,0 +1,17 @@
|
|||
import { serverApi, UserResponseDto } from '@api';
|
||||
import type { RequestEvent, RequestHandlerOutput } from '@sveltejs/kit';
|
||||
|
||||
export const GET = async ({url} : RequestEvent): Promise<RequestHandlerOutput<UserResponseDto[]>> => {
|
||||
try {
|
||||
const isAll = url.searchParams.get('isAll') === 'true';
|
||||
|
||||
const { data } = await serverApi.userApi.getAllUsers(isAll);
|
||||
return {
|
||||
body: data
|
||||
};
|
||||
} catch {
|
||||
return {
|
||||
status: 500
|
||||
};
|
||||
}
|
||||
};
|
15
web/src/routes/data/user/get-my-user-info.ts
Normal file
15
web/src/routes/data/user/get-my-user-info.ts
Normal file
|
@ -0,0 +1,15 @@
|
|||
import { serverApi, UserResponseDto } from '@api';
|
||||
import type { RequestHandlerOutput } from '@sveltejs/kit';
|
||||
|
||||
export const GET = async (): Promise<RequestHandlerOutput<UserResponseDto>> => {
|
||||
try {
|
||||
const { data } = await serverApi.userApi.getMyUserInfo();
|
||||
return {
|
||||
body: data
|
||||
};
|
||||
} catch {
|
||||
return {
|
||||
status: 500
|
||||
};
|
||||
}
|
||||
};
|
|
@ -4,28 +4,31 @@
|
|||
import { api } from '@api';
|
||||
|
||||
export const load: Load = async () => {
|
||||
try {
|
||||
const { data: user } = await api.userApi.getMyUserInfo();
|
||||
if (browser) {
|
||||
try {
|
||||
const { data: user } = await api.userApi.getMyUserInfo();
|
||||
|
||||
return {
|
||||
status: 302,
|
||||
redirect: '/photos'
|
||||
};
|
||||
} catch (e) {}
|
||||
|
||||
const { data } = await api.userApi.getUserCount();
|
||||
|
||||
return {
|
||||
status: 302,
|
||||
redirect: '/photos'
|
||||
status: 200,
|
||||
props: {
|
||||
isAdminUserExist: data.userCount == 0 ? false : true
|
||||
}
|
||||
};
|
||||
} catch (e) {}
|
||||
|
||||
const { data } = await api.userApi.getUserCount();
|
||||
|
||||
return {
|
||||
status: 200,
|
||||
props: {
|
||||
isAdminUserExist: data.userCount == 0 ? false : true
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<script lang="ts">
|
||||
import { goto } from '$app/navigation';
|
||||
import { browser } from '$app/env';
|
||||
|
||||
export let isAdminUserExist: boolean;
|
||||
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
<script context="module" lang="ts">
|
||||
export const prerender = false;
|
||||
|
||||
import { api } from '@api';
|
||||
import type { Load } from '@sveltejs/kit';
|
||||
|
||||
export const load: Load = async () => {
|
||||
export const load: Load = async ({ fetch }) => {
|
||||
try {
|
||||
await api.userApi.getMyUserInfo();
|
||||
await fetch('/data/user/get-my-user-info');
|
||||
|
||||
return {
|
||||
status: 302,
|
||||
redirect: '/photos'
|
||||
|
|
|
@ -2,20 +2,25 @@
|
|||
export const prerender = false;
|
||||
|
||||
import type { Load } from '@sveltejs/kit';
|
||||
import { getAssetsInfo } from '$lib/stores/assets';
|
||||
import { setAssetInfo } from '$lib/stores/assets';
|
||||
|
||||
export const load: Load = async () => {
|
||||
export const load: Load = async ({ fetch }) => {
|
||||
try {
|
||||
const { data } = await api.userApi.getMyUserInfo();
|
||||
await getAssetsInfo();
|
||||
const [userInfo, assets] = await Promise.all([
|
||||
fetch('/data/user/get-my-user-info').then((r) => r.json()),
|
||||
fetch('/data/asset/get-all-assets').then((r) => r.json())
|
||||
]);
|
||||
|
||||
setAssetInfo(assets);
|
||||
|
||||
return {
|
||||
status: 200,
|
||||
props: {
|
||||
user: data
|
||||
user: userInfo
|
||||
}
|
||||
};
|
||||
} catch (e) {
|
||||
console.log('ERROR load photos index');
|
||||
return {
|
||||
status: 302,
|
||||
redirect: '/auth/login'
|
||||
|
@ -33,7 +38,7 @@
|
|||
import moment from 'moment';
|
||||
import AssetViewer from '$lib/components/asset-viewer/asset-viewer.svelte';
|
||||
import { openFileUploadDialog, UploadType } from '$lib/utils/file-uploader';
|
||||
import { api, AssetResponseDto, UserResponseDto } from '@api';
|
||||
import { AssetResponseDto, UserResponseDto } from '@api';
|
||||
import SideBar from '$lib/components/shared-components/side-bar/side-bar.svelte';
|
||||
|
||||
export let user: UserResponseDto;
|
||||
|
|
|
@ -4,10 +4,12 @@
|
|||
import type { Load } from '@sveltejs/kit';
|
||||
import { AlbumResponseDto, api, UserResponseDto } from '@api';
|
||||
|
||||
export const load: Load = async () => {
|
||||
export const load: Load = async ({ fetch }) => {
|
||||
try {
|
||||
const { data: user } = await api.userApi.getMyUserInfo();
|
||||
const { data: sharedAlbums } = await api.albumApi.getAllAlbums(true);
|
||||
const [user, sharedAlbums] = await Promise.all([
|
||||
fetch('/data/user/get-my-user-info').then((r) => r.json()),
|
||||
fetch('/data/album/get-all-albums?isShared=true').then((r) => r.json())
|
||||
]);
|
||||
|
||||
return {
|
||||
status: 200,
|
||||
|
|
Loading…
Reference in a new issue