@@ -2,25 +2,17 @@ import { TRPCError } from "@trpc/server";
2
2
3
3
import { asc , createId , eq , inArray , like } from "@homarr/db" ;
4
4
import { apps } from "@homarr/db/schema/sqlite" ;
5
+ import { selectAppSchema } from "@homarr/db/validationSchemas" ;
5
6
import { validation , z } from "@homarr/validation" ;
6
7
8
+ import { convertIntersectionToZodObject } from "../schema-merger" ;
7
9
import { createTRPCRouter , permissionRequiredProcedure , protectedProcedure , publicProcedure } from "../trpc" ;
8
10
import { canUserSeeAppAsync } from "./app/app-access-control" ;
9
11
10
12
export const appRouter = createTRPCRouter ( {
11
13
all : protectedProcedure
12
14
. input ( z . void ( ) )
13
- . output (
14
- z . array (
15
- z . object ( {
16
- name : z . string ( ) ,
17
- id : z . string ( ) ,
18
- description : z . string ( ) . nullable ( ) ,
19
- iconUrl : z . string ( ) ,
20
- href : z . string ( ) . nullable ( ) ,
21
- } ) ,
22
- ) ,
23
- )
15
+ . output ( z . array ( selectAppSchema ) )
24
16
. meta ( { openapi : { method : "GET" , path : "/api/apps" , tags : [ "apps" ] , protect : true } } )
25
17
. query ( ( { ctx } ) => {
26
18
return ctx . db . query . apps . findMany ( {
@@ -29,17 +21,7 @@ export const appRouter = createTRPCRouter({
29
21
} ) ,
30
22
search : protectedProcedure
31
23
. input ( z . object ( { query : z . string ( ) , limit : z . number ( ) . min ( 1 ) . max ( 100 ) . default ( 10 ) } ) )
32
- . output (
33
- z . array (
34
- z . object ( {
35
- name : z . string ( ) ,
36
- id : z . string ( ) ,
37
- description : z . string ( ) . nullable ( ) ,
38
- iconUrl : z . string ( ) ,
39
- href : z . string ( ) . nullable ( ) ,
40
- } ) ,
41
- ) ,
42
- )
24
+ . output ( z . array ( selectAppSchema ) )
43
25
. meta ( { openapi : { method : "GET" , path : "/api/apps/search" , tags : [ "apps" ] , protect : true } } )
44
26
. query ( ( { ctx, input } ) => {
45
27
return ctx . db . query . apps . findMany ( {
@@ -50,17 +32,7 @@ export const appRouter = createTRPCRouter({
50
32
} ) ,
51
33
selectable : protectedProcedure
52
34
. input ( z . void ( ) )
53
- . output (
54
- z . array (
55
- z . object ( {
56
- name : z . string ( ) ,
57
- id : z . string ( ) ,
58
- iconUrl : z . string ( ) ,
59
- description : z . string ( ) . nullable ( ) ,
60
- href : z . string ( ) . nullable ( ) ,
61
- } ) ,
62
- ) ,
63
- )
35
+ . output ( z . array ( selectAppSchema . pick ( { id : true , name : true , iconUrl : true , href : true , description : true } ) ) )
64
36
. meta ( {
65
37
openapi : {
66
38
method : "GET" ,
@@ -83,15 +55,7 @@ export const appRouter = createTRPCRouter({
83
55
} ) ,
84
56
byId : publicProcedure
85
57
. input ( validation . common . byId )
86
- . output (
87
- z . object ( {
88
- name : z . string ( ) ,
89
- id : z . string ( ) ,
90
- description : z . string ( ) . nullable ( ) ,
91
- iconUrl : z . string ( ) ,
92
- href : z . string ( ) . nullable ( ) ,
93
- } ) ,
94
- )
58
+ . output ( selectAppSchema )
95
59
. meta ( { openapi : { method : "GET" , path : "/api/apps/{id}" , tags : [ "apps" ] , protect : true } } )
96
60
. query ( async ( { ctx, input } ) => {
97
61
const app = await ctx . db . query . apps . findFirst ( {
@@ -136,7 +100,9 @@ export const appRouter = createTRPCRouter({
136
100
} ) ,
137
101
update : permissionRequiredProcedure
138
102
. requiresPermission ( "app-modify-all" )
139
- . input ( validation . app . edit )
103
+ . input ( convertIntersectionToZodObject ( validation . app . edit ) )
104
+ . output ( z . void ( ) )
105
+ . meta ( { openapi : { method : "PATCH" , path : "/api/apps/{id}" , tags : [ "apps" ] , protect : true } } )
140
106
. mutation ( async ( { ctx, input } ) => {
141
107
const app = await ctx . db . query . apps . findFirst ( {
142
108
where : eq ( apps . id , input . id ) ,
0 commit comments