From 78c7ff855de0fe43d8aa956a90c4fa0f87d6f0f7 Mon Sep 17 00:00:00 2001 From: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com> Date: Sat, 20 Apr 2024 02:35:54 +0200 Subject: [PATCH] refactor(server): move file file report endpoints to their own controller (#8925) * move file report to its own controller * chore: open api --- mobile/openapi/.openapi-generator/FILES | 3 + mobile/openapi/README.md | Bin 26368 -> 26365 bytes mobile/openapi/doc/AuditApi.md | Bin 8494 -> 2481 bytes mobile/openapi/doc/FileReportApi.md | Bin 0 -> 6243 bytes mobile/openapi/lib/api.dart | Bin 9081 -> 9114 bytes mobile/openapi/lib/api/audit_api.dart | Bin 6836 -> 2478 bytes mobile/openapi/lib/api/file_report_api.dart | Bin 0 -> 4721 bytes mobile/openapi/test/audit_api_test.dart | Bin 1053 -> 637 bytes mobile/openapi/test/file_report_api_test.dart | Bin 0 -> 883 bytes open-api/immich-openapi-specs.json | 224 +++++++++--------- open-api/typescript-sdk/src/fetch-client.ts | 128 +++++----- server/src/controllers/audit.controller.ts | 31 +-- .../src/controllers/file-report.controller.ts | 30 +++ server/src/controllers/index.ts | 16 +- 14 files changed, 221 insertions(+), 211 deletions(-) create mode 100644 mobile/openapi/doc/FileReportApi.md create mode 100644 mobile/openapi/lib/api/file_report_api.dart create mode 100644 mobile/openapi/test/file_report_api_test.dart create mode 100644 server/src/controllers/file-report.controller.ts diff --git a/mobile/openapi/.openapi-generator/FILES b/mobile/openapi/.openapi-generator/FILES index 2181476b3..42f1034dc 100644 --- a/mobile/openapi/.openapi-generator/FILES +++ b/mobile/openapi/.openapi-generator/FILES @@ -69,6 +69,7 @@ doc/FaceApi.md doc/FaceDto.md doc/FileChecksumDto.md doc/FileChecksumResponseDto.md +doc/FileReportApi.md doc/FileReportDto.md doc/FileReportFixDto.md doc/FileReportItemDto.md @@ -212,6 +213,7 @@ lib/api/audit_api.dart lib/api/authentication_api.dart lib/api/download_api.dart lib/api/face_api.dart +lib/api/file_report_api.dart lib/api/job_api.dart lib/api/library_api.dart lib/api/memory_api.dart @@ -478,6 +480,7 @@ test/face_api_test.dart test/face_dto_test.dart test/file_checksum_dto_test.dart test/file_checksum_response_dto_test.dart +test/file_report_api_test.dart test/file_report_dto_test.dart test/file_report_fix_dto_test.dart test/file_report_item_dto_test.dart diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index 7bd651ad102c11fb2fa745527182aeed1d36db10..3ebd65025b606cd030899cfffaad5099acb6832b 100644 GIT binary patch delta 153 zcmZoT$N2Xw#yxm+112T6Ql-dri$;t2p2jyppD diff --git a/mobile/openapi/doc/AuditApi.md b/mobile/openapi/doc/AuditApi.md index 8514cdec7376841e8525ae099fb31043b4368805..2c768c40d190b52b7744eb50cee37b5a19f03308 100644 GIT binary patch delta 15 XcmZ4Iv{87%waHqHKAX33_HzILHY^4% delta 1162 zcmah{&x_MQ6sEXjL-ZgBdeDW3*+V+g2KJz`s|)qVdJ!$%1qBg_$<&T+W`@jETI{kn z1z|xM@Ne)WXfOU99z-vC)PKR7Z_+JJQ>{5A?|u2+_rCYNKk@F$tIzE&8?^cv(_3tp zDnjl@VMN> zvr2p8`rlcRF__R5Nz!lnIc6)uAn>H?$s2E_4Pxty$vAv_BJpG2|;j4Pe+lr|Snu5Sc;kS03q zfqCn#9d*#=hxcMm6P{}XXkt~Ey>_*RSFewt)E0&zbg1qZ9Q07qAb2WR1`*Ar9zsEt z6kJhwD6(N49Yk=euY00k=A!@RTq5NzLyb)E_^}c^fChTpN>eH|A?t8UXvk=nahjQ5 z{>SlZ?Z98NXQ%`R&+tbgx(+k_2#>I`WY)ddvnUmrm)_kY_=-N9B|AN)fbvWV#&MdU z3OJ7ClxC3dA;_dia;j<3G~bs`o}QUA>&t+9YtChaw9SMWSskGO0;)8@I`K-~U7@ zmYgg}*L7G18wea9kH_QP@qT2BOe%Gls(}A?RU$_+HJR* zU4~OB&d<-|Ftb9f8JLumZ5kh#Ur9hpa&O06w!-J!-?^7=;qR@i|#B6OU?IYHpv2N|nux4y!h#eWsWOSJ?=J$IB zTkKR+Dc$Q_HOhvOEO@`RWwA{SiN`iwes|T?jx`<3LzY`Kyb9-O@=clT^=N#sb3g;5 zCu+JtX1PQz<&we$vYDwbNVCyf6d7}=r0DfxISCgDm)0OrQrn=2DT+&56&1>_Ft#U` zeHhsG+HPXI!=(u+{YveR2gjo`taG+E{D|s;4+|Zc`5Y$bLMG-jS5+?UBBeBwoIOtl z(|}$}lwQ`MiODKAUyz!RmNJ&{_xpC}7K4XwCFk4I;)C6tA#8uciE`$DGeYamJt;)R z`F9~)FQbbhg`Dz1m`nOOpksU;*-Ysvjm@RhPmADNYg4yES!T{Kf{425N0H3)!kSkW z+h8y}IyxI4><#zZoucH5^?z~e@1p*=%<1z?MKhX8Ewj*abAv+xds}+AG>fdT`^Kr5 zteWa|=qm+5KsW#J2L5_U>_beH4in-mDV^I;M-m5&JJT%yJg7OX^}f;2bgcx+gx#(T zIC0UNY__DYg7B#?7vOlVTI${2^itdq+5)2LNrb4FpCa4VYY(p?Sx^CCml|40!d0+Z zyq~J>cEkP_{Um?WoWUChC2o6%VHVD%m02#tKK_HZ<7LWUHS!RC?i(xfZ$l7fH4r6= z{#=FEMF*t0CctIocqOmX%ExGYL}pAo*Ip#abe;m z8a(flEB&@33vuE)>!}w6z0t70^I^y|bi&RHIw_Ct+IT5t1$SiD#+|TSu>ta#4C5lk z)I|^g42yo<(M6m6( z3k2A_$~sVt)=|4)cpEZr$o!-3F6BYKy*6yf{2a+FR#bJ6M&rlr8ffPHR!nzy?CKT7 zL}v^;jJgR-#P8#5qjNpR+3`%}RJC4;jm$}-!Sh9&LcPQrvqW-m59b=FMAK}(>L6f9 zJ_F>{k+w#=J2ZUW$YaLUp1PpkdjR@XT|6o;EJ)urQ?Ndk7uUkd05mpS+;DNj#o{Tv zd9gn7Vy(4}^1)h@)ZVK#Y4N;zGFTt(R6hu{jYS`$?Z5V_t;MkZsBMVdo3CfY@gVfYPkS390jQW delta 1195 zcmb7CO=}ZT6lIdOX{w;6Em(wb3znH_C(TNbBu(&xU_nvZf-4u}$1M64^fF5LJ7T)A=CKjD4Tp}Es&(A~^^_ndprx#z?5=PMt-7?_qoq%5er46zjxJlW3|@B+FDxb^4*(KJOJHAD_}+JNx~!6v(?MOYzvXsG@VAq z_qp7d>r`Vi^m7!+!toTO#8mm@JHw=C5xsr>Z{wNlK zsf_WfMO3DmE~j^MpEP9b-IK3~>VwvZ!7a<|UDVm_nd>j1+nrQ1A~ExPg=i$f8_ z3|DU-pM$=}Y0xOER-*qWwUr2R@MP9v4l@)hf_LzgKMnLFaD9lf+1EvH4_4GcY5sgO zO)KCNMn3>cT`14*(>@2xks8c27P`gGr~sBdcZ6z-G)ke7)@CH0x(|KUfWGU;W6W+& Iski0oZ|_;GIRF3v diff --git a/mobile/openapi/lib/api/file_report_api.dart b/mobile/openapi/lib/api/file_report_api.dart new file mode 100644 index 0000000000000000000000000000000000000000..df307e12c714a9ba22408f202b64d3174a206467 GIT binary patch literal 4721 zcmeHL-*4MC5PtVxaqUBG51!oxeHhZjnVZ;cfG*Aw7sU_+E+d^{wlb-bRBW%v|GpzB z$x{5IS&#uK(1+M2b$7fw-hJOGoldROf!>GF@YlEflm1z6)IWm3@%w%Yj)rhD9KoN% zqvOHf&q&Nl{t+@|_IKL9?bPg&Ukj;l97#2fc#OM{id17b#u%q4OergW`F#~F|j$OHvTc$@xS*J`yOW?I95qB}zyL@(j+tp?Sd#szI3#++O@ z08;cnFPpHtT)}?n_rU>#7_l_A_PjJ51`u( zVk`UYs;r)`O7Z4fd8+btIn;b_8BxAd_Pfn>f0~#D9DqpUn0lx3)M0?vYuYs3+A#j7 z3cis%yi>jZxng}~sI1>?_sA)qBhN}Wq>+f$(coy{yf0M0>U~&t;{pqOJvv9`-W+Xphgr!0n8aQlw12>lX zo#mc!LxJH_v??>j4bc(paovJXcGTM?2&UuACpv)4ctD}a52)h9U|qEvzY&bJv(hQJVDhRxzfh>#yM&p8+@*@I??4%$haGrO6y0S=Yl*p z56AIrs4MySV<7v_nXah7`xo(huFYP#c=MMOGST%^Qhuu4xK}ET@09aqwy9XH5KdHT zCGz4)j(a}|=&=Z>S|N7GE?x;XvyEqxfjRZU-i?B2C9qmZ{nS h+tMeElAw`RvvEyt80^aa>nEa@XQUx&8}HrL{sjfb8i@b^ literal 0 HcmV?d00001 diff --git a/mobile/openapi/test/audit_api_test.dart b/mobile/openapi/test/audit_api_test.dart index 8161d4e4dbfd49d00f70e97518002ed37aae89bb..8114283a1a339405796696eb51ff9b127a98e965 100644 GIT binary patch delta 18 ZcmbQs@t0-83C793OzYWdHLba7xd22|1}Ojl delta 263 zcmey%GM8h+3C19Ww9E>}(v-{+x6GW>Vhs=(lvCAlW%ti%Fgtr~;%h z3Q3bsW^oBvr*lSXa&~cPZcu7*L4ICwD##45As}O6k`TAUcrd3U@qyMz@gVD%?9ZeJ E0Ka%$-v9sr diff --git a/mobile/openapi/test/file_report_api_test.dart b/mobile/openapi/test/file_report_api_test.dart new file mode 100644 index 0000000000000000000000000000000000000000..255c787002b022c803d609cdf43b82fb7d6c7c52 GIT binary patch literal 883 zcmb7?O>5gg5Qgvi71NV#aHAxr;(QPjStZ~`VBAAa%OZ{CA=2( zJ!r+O-g)0=2Bm3|rZE4$EvD-mQ*WkQEapo8)|R{K?R4Ezy@1Xemd0D8g2c_4%z&a?@pNDg~hi(mfMwV`83k< z+oN@CZr$njQY+`B@`5T3qz$3%+TF>ph7>x{XjQY!Z>17nE=9SO)+I^L2qPoQS6Sms z8&uLz%FjiddUW%b#G~_RJO)8rN(%AD0WSq|UdjsN>~llO4^0)clGJztzY+kJZb-=n zsGFfgxI69`Pi_*{)m8^H9-XlrP2rDUbj*Vf7TI?<4;A?c;Km1xoOYSl{CVK&FD4+} zyDB*gI{H5B*rm_ubRB)v@&xN5E4sdY4|{;PJ;ZY6J=EwwFrA4!68(SVlAP~yAGcV( ly3nrB8U95u5_AX=YWUc1W~he6e5lVu9@+dOXWY;}`3;^7AC>?B literal 0 HcmV?d00001 diff --git a/open-api/immich-openapi-specs.json b/open-api/immich-openapi-specs.json index 6e616febb..f49df7bae 100644 --- a/open-api/immich-openapi-specs.json +++ b/open-api/immich-openapi-specs.json @@ -2345,118 +2345,6 @@ ] } }, - "/audit/file-report": { - "get": { - "operationId": "getAuditFiles", - "parameters": [], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FileReportDto" - } - } - }, - "description": "" - } - }, - "security": [ - { - "bearer": [] - }, - { - "cookie": [] - }, - { - "api_key": [] - } - ], - "tags": [ - "Audit" - ] - } - }, - "/audit/file-report/checksum": { - "post": { - "operationId": "getFileChecksums", - "parameters": [], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FileChecksumDto" - } - } - }, - "required": true - }, - "responses": { - "201": { - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/FileChecksumResponseDto" - }, - "type": "array" - } - } - }, - "description": "" - } - }, - "security": [ - { - "bearer": [] - }, - { - "cookie": [] - }, - { - "api_key": [] - } - ], - "tags": [ - "Audit" - ] - } - }, - "/audit/file-report/fix": { - "post": { - "operationId": "fixAuditFiles", - "parameters": [], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FileReportFixDto" - } - } - }, - "required": true - }, - "responses": { - "201": { - "description": "" - } - }, - "security": [ - { - "bearer": [] - }, - { - "cookie": [] - }, - { - "api_key": [] - } - ], - "tags": [ - "Audit" - ] - } - }, "/auth/admin-sign-up": { "post": { "operationId": "signUpAdmin", @@ -4429,6 +4317,118 @@ ] } }, + "/report": { + "get": { + "operationId": "getAuditFiles", + "parameters": [], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileReportDto" + } + } + }, + "description": "" + } + }, + "security": [ + { + "bearer": [] + }, + { + "cookie": [] + }, + { + "api_key": [] + } + ], + "tags": [ + "File Report" + ] + } + }, + "/report/checksum": { + "post": { + "operationId": "getFileChecksums", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileChecksumDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/FileChecksumResponseDto" + }, + "type": "array" + } + } + }, + "description": "" + } + }, + "security": [ + { + "bearer": [] + }, + { + "cookie": [] + }, + { + "api_key": [] + } + ], + "tags": [ + "File Report" + ] + } + }, + "/report/fix": { + "post": { + "operationId": "fixAuditFiles", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FileReportFixDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "" + } + }, + "security": [ + { + "bearer": [] + }, + { + "cookie": [] + }, + { + "api_key": [] + } + ], + "tags": [ + "File Report" + ] + } + }, "/search": { "get": { "deprecated": true, diff --git a/open-api/typescript-sdk/src/fetch-client.ts b/open-api/typescript-sdk/src/fetch-client.ts index dc121117b..9148b4d3b 100644 --- a/open-api/typescript-sdk/src/fetch-client.ts +++ b/open-api/typescript-sdk/src/fetch-client.ts @@ -316,27 +316,6 @@ export type AuditDeletesResponseDto = { ids: string[]; needsFullSync: boolean; }; -export type FileReportItemDto = { - checksum?: string; - entityId: string; - entityType: PathEntityType; - pathType: PathType; - pathValue: string; -}; -export type FileReportDto = { - extras: string[]; - orphans: FileReportItemDto[]; -}; -export type FileChecksumDto = { - filenames: string[]; -}; -export type FileChecksumResponseDto = { - checksum: string; - filename: string; -}; -export type FileReportFixDto = { - items: FileReportItemDto[]; -}; export type SignUpDto = { email: string; name: string; @@ -599,6 +578,27 @@ export type AssetFaceUpdateDto = { export type PersonStatisticsResponseDto = { assets: number; }; +export type FileReportItemDto = { + checksum?: string; + entityId: string; + entityType: PathEntityType; + pathType: PathType; + pathValue: string; +}; +export type FileReportDto = { + extras: string[]; + orphans: FileReportItemDto[]; +}; +export type FileChecksumDto = { + filenames: string[]; +}; +export type FileChecksumResponseDto = { + checksum: string; + filename: string; +}; +export type FileReportFixDto = { + items: FileReportItemDto[]; +}; export type SearchFacetCountResponseDto = { count: number; value: string; @@ -1651,35 +1651,6 @@ export function getAuditDeletes({ after, entityType, userId }: { ...opts })); } -export function getAuditFiles(opts?: Oazapfts.RequestOpts) { - return oazapfts.ok(oazapfts.fetchJson<{ - status: 200; - data: FileReportDto; - }>("/audit/file-report", { - ...opts - })); -} -export function getFileChecksums({ fileChecksumDto }: { - fileChecksumDto: FileChecksumDto; -}, opts?: Oazapfts.RequestOpts) { - return oazapfts.ok(oazapfts.fetchJson<{ - status: 201; - data: FileChecksumResponseDto[]; - }>("/audit/file-report/checksum", oazapfts.json({ - ...opts, - method: "POST", - body: fileChecksumDto - }))); -} -export function fixAuditFiles({ fileReportFixDto }: { - fileReportFixDto: FileReportFixDto; -}, opts?: Oazapfts.RequestOpts) { - return oazapfts.ok(oazapfts.fetchText("/audit/file-report/fix", oazapfts.json({ - ...opts, - method: "POST", - body: fileReportFixDto - }))); -} export function signUpAdmin({ signUpDto }: { signUpDto: SignUpDto; }, opts?: Oazapfts.RequestOpts) { @@ -2206,6 +2177,35 @@ export function getPersonThumbnail({ id }: { ...opts })); } +export function getAuditFiles(opts?: Oazapfts.RequestOpts) { + return oazapfts.ok(oazapfts.fetchJson<{ + status: 200; + data: FileReportDto; + }>("/report", { + ...opts + })); +} +export function getFileChecksums({ fileChecksumDto }: { + fileChecksumDto: FileChecksumDto; +}, opts?: Oazapfts.RequestOpts) { + return oazapfts.ok(oazapfts.fetchJson<{ + status: 201; + data: FileChecksumResponseDto[]; + }>("/report/checksum", oazapfts.json({ + ...opts, + method: "POST", + body: fileChecksumDto + }))); +} +export function fixAuditFiles({ fileReportFixDto }: { + fileReportFixDto: FileReportFixDto; +}, opts?: Oazapfts.RequestOpts) { + return oazapfts.ok(oazapfts.fetchText("/report/fix", oazapfts.json({ + ...opts, + method: "POST", + body: fileReportFixDto + }))); +} export function search({ clip, motion, page, q, query, recent, size, smart, $type, withArchived }: { clip?: boolean; motion?: boolean; @@ -2948,20 +2948,6 @@ export enum EntityType { Asset = "ASSET", Album = "ALBUM" } -export enum PathEntityType { - Asset = "asset", - Person = "person", - User = "user" -} -export enum PathType { - Original = "original", - Preview = "preview", - Thumbnail = "thumbnail", - EncodedVideo = "encoded_video", - Sidecar = "sidecar", - Face = "face", - Profile = "profile" -} export enum JobName { ThumbnailGeneration = "thumbnailGeneration", MetadataExtraction = "metadataExtraction", @@ -2993,6 +2979,20 @@ export enum Type2 { export enum MemoryType { OnThisDay = "on_this_day" } +export enum PathEntityType { + Asset = "asset", + Person = "person", + User = "user" +} +export enum PathType { + Original = "original", + Preview = "preview", + Thumbnail = "thumbnail", + EncodedVideo = "encoded_video", + Sidecar = "sidecar", + Face = "face", + Profile = "profile" +} export enum SearchSuggestionType { Country = "country", State = "state", diff --git a/server/src/controllers/audit.controller.ts b/server/src/controllers/audit.controller.ts index 1487e78d4..8eea6a6e3 100644 --- a/server/src/controllers/audit.controller.ts +++ b/server/src/controllers/audit.controller.ts @@ -1,15 +1,8 @@ -import { Body, Controller, Get, Post, Query } from '@nestjs/common'; +import { Controller, Get, Query } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; -import { - AuditDeletesDto, - AuditDeletesResponseDto, - FileChecksumDto, - FileChecksumResponseDto, - FileReportDto, - FileReportFixDto, -} from 'src/dtos/audit.dto'; +import { AuditDeletesDto, AuditDeletesResponseDto } from 'src/dtos/audit.dto'; import { AuthDto } from 'src/dtos/auth.dto'; -import { AdminRoute, Auth, Authenticated } from 'src/middleware/auth.guard'; +import { Auth, Authenticated } from 'src/middleware/auth.guard'; import { AuditService } from 'src/services/audit.service'; @ApiTags('Audit') @@ -22,22 +15,4 @@ export class AuditController { getAuditDeletes(@Auth() auth: AuthDto, @Query() dto: AuditDeletesDto): Promise { return this.service.getDeletes(auth, dto); } - - @AdminRoute() - @Get('file-report') - getAuditFiles(): Promise { - return this.service.getFileReport(); - } - - @AdminRoute() - @Post('file-report/checksum') - getFileChecksums(@Body() dto: FileChecksumDto): Promise { - return this.service.getChecksums(dto); - } - - @AdminRoute() - @Post('file-report/fix') - fixAuditFiles(@Body() dto: FileReportFixDto): Promise { - return this.service.fixItems(dto.items); - } } diff --git a/server/src/controllers/file-report.controller.ts b/server/src/controllers/file-report.controller.ts new file mode 100644 index 000000000..6bdf72607 --- /dev/null +++ b/server/src/controllers/file-report.controller.ts @@ -0,0 +1,30 @@ +import { Body, Controller, Get, Post } from '@nestjs/common'; +import { ApiTags } from '@nestjs/swagger'; +import { FileChecksumDto, FileChecksumResponseDto, FileReportDto, FileReportFixDto } from 'src/dtos/audit.dto'; +import { AdminRoute, Authenticated } from 'src/middleware/auth.guard'; +import { AuditService } from 'src/services/audit.service'; + +@ApiTags('File Report') +@Controller('report') +@Authenticated() +export class ReportController { + constructor(private service: AuditService) {} + + @AdminRoute() + @Get() + getAuditFiles(): Promise { + return this.service.getFileReport(); + } + + @AdminRoute() + @Post('/checksum') + getFileChecksums(@Body() dto: FileChecksumDto): Promise { + return this.service.getChecksums(dto); + } + + @AdminRoute() + @Post('/fix') + fixAuditFiles(@Body() dto: FileReportFixDto): Promise { + return this.service.fixItems(dto.items); + } +} diff --git a/server/src/controllers/index.ts b/server/src/controllers/index.ts index 5e109f1eb..ad2f6e8de 100644 --- a/server/src/controllers/index.ts +++ b/server/src/controllers/index.ts @@ -8,6 +8,7 @@ import { AuditController } from 'src/controllers/audit.controller'; import { AuthController } from 'src/controllers/auth.controller'; import { DownloadController } from 'src/controllers/download.controller'; import { FaceController } from 'src/controllers/face.controller'; +import { ReportController } from 'src/controllers/file-report.controller'; import { JobController } from 'src/controllers/job.controller'; import { LibraryController } from 'src/controllers/library.controller'; import { MemoryController } from 'src/controllers/memory.controller'; @@ -26,13 +27,13 @@ import { TrashController } from 'src/controllers/trash.controller'; import { UserController } from 'src/controllers/user.controller'; export const controllers = [ - ActivityController, - AssetsController, - AssetControllerV1, - AssetController, - AppController, - AlbumController, APIKeyController, + ActivityController, + AlbumController, + AppController, + AssetController, + AssetControllerV1, + AssetsController, AuditController, AuthController, DownloadController, @@ -42,6 +43,8 @@ export const controllers = [ MemoryController, OAuthController, PartnerController, + PersonController, + ReportController, SearchController, ServerInfoController, SessionController, @@ -52,5 +55,4 @@ export const controllers = [ TimelineController, TrashController, UserController, - PersonController, ];