mirror of
https://github.com/ajnart/homarr.git
synced 2026-02-06 22:59:20 +01:00
🔀 Merge branch 'dev' into feature/add-basic-authentication
This commit is contained in:
@@ -3,7 +3,7 @@ import { boardRouter } from './routers/board';
|
||||
import { calendarRouter } from './routers/calendar';
|
||||
import { configRouter } from './routers/config';
|
||||
import { dashDotRouter } from './routers/dash-dot';
|
||||
import { dnsHoleRouter } from './routers/dns-hole';
|
||||
import { dnsHoleRouter } from './routers/dns-hole/router';
|
||||
import { downloadRouter } from './routers/download';
|
||||
import { iconRouter } from './routers/icon';
|
||||
import { inviteRouter } from './routers/invite';
|
||||
@@ -17,6 +17,8 @@ import { weatherRouter } from './routers/weather';
|
||||
import { dockerRouter } from './routers/docker/router';
|
||||
import { usenetRouter } from './routers/usenet/router';
|
||||
import { createTRPCRouter } from '~/server/api/trpc';
|
||||
import { timezoneRouter } from './routers/timezone';
|
||||
import { notebookRouter } from './routers/notebook';
|
||||
|
||||
/**
|
||||
* This is the primary router for your server.
|
||||
@@ -27,21 +29,23 @@ export const rootRouter = createTRPCRouter({
|
||||
app: appRouter,
|
||||
rss: rssRouter,
|
||||
user: userRouter,
|
||||
calendar: calendarRouter,
|
||||
config: configRouter,
|
||||
docker: dockerRouter,
|
||||
icon: iconRouter,
|
||||
dashDot: dashDotRouter,
|
||||
dnsHole: dnsHoleRouter,
|
||||
docker: dockerRouter,
|
||||
download: downloadRouter,
|
||||
icon: iconRouter,
|
||||
mediaRequest: mediaRequestsRouter,
|
||||
mediaServer: mediaServerRouter,
|
||||
overseerr: overseerrRouter,
|
||||
timezone: timezoneRouter,
|
||||
usenet: usenetRouter,
|
||||
calendar: calendarRouter,
|
||||
weather: weatherRouter,
|
||||
invites: inviteRouter,
|
||||
boards: boardRouter,
|
||||
password: passwordRouter
|
||||
password: passwordRouter,
|
||||
notebook: notebookRouter
|
||||
});
|
||||
|
||||
// export type definition of API
|
||||
|
||||
@@ -23,11 +23,11 @@ export const appRouter = createTRPCRouter({
|
||||
throw new TRPCError({
|
||||
code: 'NOT_FOUND',
|
||||
cause: input,
|
||||
message: `App ${input} was not found`,
|
||||
message: `App ${input.id} was not found`,
|
||||
});
|
||||
}
|
||||
const res = await axios
|
||||
.get(app.url, { httpsAgent: agent, timeout: 2000 })
|
||||
.get(app.url, { httpsAgent: agent, timeout: 10000 })
|
||||
.then((response) => ({
|
||||
status: response.status,
|
||||
statusText: response.statusText,
|
||||
|
||||
@@ -6,7 +6,7 @@ import { PiHoleClient } from '~/tools/server/sdk/pihole/piHole';
|
||||
import { ConfigAppType } from '~/types/app';
|
||||
import { AdStatistics } from '~/widgets/dnshole/type';
|
||||
|
||||
import { createTRPCRouter, publicProcedure } from '../trpc';
|
||||
import { createTRPCRouter, publicProcedure } from '../../trpc';
|
||||
|
||||
export const dnsHoleRouter = createTRPCRouter({
|
||||
control: publicProcedure
|
||||
@@ -135,8 +135,14 @@ const collectAdGuardSummary = async (app: ConfigAppType) => {
|
||||
const status = await adGuard.getStatus();
|
||||
const countFilteredDomains = await adGuard.getCountFilteringDomains();
|
||||
|
||||
const blockedQueriesToday = stats.blocked_filtering.reduce((prev, sum) => prev + sum, 0);
|
||||
const queriesToday = stats.dns_queries.reduce((prev, sum) => prev + sum, 0);
|
||||
const blockedQueriesToday =
|
||||
stats.time_units === 'days'
|
||||
? stats.blocked_filtering[stats.blocked_filtering.length - 1]
|
||||
: stats.blocked_filtering.reduce((prev, sum) => prev + sum, 0);
|
||||
const queriesToday =
|
||||
stats.time_units === 'days'
|
||||
? stats.dns_queries[stats.dns_queries.length - 1]
|
||||
: stats.dns_queries.reduce((prev, sum) => prev + sum, 0);
|
||||
|
||||
return {
|
||||
domainsBeingBlocked: countFilteredDomains,
|
||||
@@ -65,7 +65,7 @@ export const mediaRequestsRouter = createTRPCRouter({
|
||||
status: item.status,
|
||||
backdropPath: `https://image.tmdb.org/t/p/original/${genericItem.backdropPath}`,
|
||||
posterPath: `https://image.tmdb.org/t/p/w600_and_h900_bestv2/${genericItem.posterPath}`,
|
||||
href: `${appUrl}/movie/${item.media.tmdbId}`,
|
||||
href: `${appUrl}/${item.type}/${item.media.tmdbId}`,
|
||||
};
|
||||
})
|
||||
);
|
||||
|
||||
37
src/server/api/routers/notebook.ts
Normal file
37
src/server/api/routers/notebook.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
import { TRPCError } from '@trpc/server';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import { z } from 'zod';
|
||||
import { getConfig } from '~/tools/config/getConfig';
|
||||
import { BackendConfigType } from '~/types/config';
|
||||
import { INotebookWidget } from '~/widgets/notebook/NotebookWidgetTile';
|
||||
|
||||
import { createTRPCRouter, publicProcedure } from '../trpc';
|
||||
|
||||
export const notebookRouter = createTRPCRouter({
|
||||
update: publicProcedure
|
||||
.input(z.object({ widgetId: z.string(), content: z.string(), configName: z.string() }))
|
||||
.mutation(async ({ input }) => {
|
||||
const config = getConfig(input.configName);
|
||||
const widget = config.widgets.find((widget) => widget.id === input.widgetId) as
|
||||
| INotebookWidget
|
||||
| undefined;
|
||||
|
||||
if (!widget) {
|
||||
return new TRPCError({
|
||||
code: 'BAD_REQUEST',
|
||||
message: 'Specified widget was not found',
|
||||
});
|
||||
}
|
||||
|
||||
widget.properties.content = input.content;
|
||||
|
||||
const newConfig: BackendConfigType = {
|
||||
...config,
|
||||
widgets: [...config.widgets.filter((w) => w.id !== widget.id), widget],
|
||||
};
|
||||
|
||||
const targetPath = path.join('data/configs', `${input.configName}.json`);
|
||||
fs.writeFileSync(targetPath, JSON.stringify(newConfig, null, 2), 'utf8');
|
||||
}),
|
||||
});
|
||||
17
src/server/api/routers/timezone.ts
Normal file
17
src/server/api/routers/timezone.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
import { z } from 'zod';
|
||||
import { find } from 'geo-tz'
|
||||
|
||||
import { createTRPCRouter, publicProcedure } from '../trpc';
|
||||
|
||||
export const timezoneRouter = createTRPCRouter({
|
||||
at: publicProcedure
|
||||
.input(
|
||||
z.object({
|
||||
longitude: z.number(),
|
||||
latitude: z.number(),
|
||||
})
|
||||
)
|
||||
.query(async ({ input }) => {
|
||||
return find(input.latitude,input.longitude)[0];
|
||||
}),
|
||||
})
|
||||
Reference in New Issue
Block a user