From 079ee658a5f9faf82b1017b6ca050c478fdc4f09 Mon Sep 17 00:00:00 2001 From: Jason Rasmussen Date: Mon, 9 Jan 2023 23:08:45 -0500 Subject: [PATCH] fix(mobile): omit null values from json requests (#1212) * chore: initial template * feat: exlude null values * chore: regenerate openapi * chore: merge * feat: store changes in a patch file * feat: extract to sh script * chore: regenerate openapi * chore: remove duplicate file * feat: generate mobile by itself * Fixed number property not decorated correctly * Revert hotfix, fix test * Merge main Co-authored-by: Alex Tran --- mobile/openapi/doc/APIKeyResponseDto.md | Bin 500 -> 500 bytes mobile/openapi/lib/model/add_assets_dto.dart | Bin 3369 -> 3371 bytes .../lib/model/add_assets_response_dto.dart | Bin 4596 -> 4613 bytes mobile/openapi/lib/model/add_users_dto.dart | Bin 3414 -> 3416 bytes .../lib/model/admin_signup_response_dto.dart | Bin 4390 -> 4408 bytes .../lib/model/album_count_response_dto.dart | Bin 3876 -> 3886 bytes .../openapi/lib/model/album_response_dto.dart | Bin 5619 -> 5660 bytes .../model/all_job_status_response_dto.dart | Bin 7801 -> 7839 bytes .../openapi/lib/model/api_key_create_dto.dart | Bin 3730 -> 3739 bytes .../model/api_key_create_response_dto.dart | Bin 3729 -> 3735 bytes .../lib/model/api_key_response_dto.dart | Bin 4081 -> 4042 bytes .../openapi/lib/model/api_key_update_dto.dart | Bin 3310 -> 3312 bytes .../lib/model/asset_count_by_time_bucket.dart | Bin 3724 -> 3730 bytes ...set_count_by_time_bucket_response_dto.dart | Bin 4005 -> 4011 bytes .../asset_count_by_user_id_response_dto.dart | Bin 4403 -> 4421 bytes .../model/asset_file_upload_response_dto.dart | Bin 3506 -> 3508 bytes .../openapi/lib/model/asset_response_dto.dart | Bin 9164 -> 9283 bytes .../lib/model/change_password_dto.dart | Bin 3678 -> 3684 bytes .../lib/model/check_duplicate_asset_dto.dart | Bin 3802 -> 3808 bytes .../check_duplicate_asset_response_dto.dart | Bin 4230 -> 4243 bytes .../lib/model/check_existing_assets_dto.dart | Bin 3891 -> 3897 bytes .../check_existing_assets_response_dto.dart | Bin 3768 -> 3770 bytes .../openapi/lib/model/create_album_dto.dart | Bin 4056 -> 4066 bytes .../model/create_album_share_link_dto.dart | Bin 5616 -> 5651 bytes .../create_profile_image_response_dto.dart | Bin 3954 -> 3960 bytes mobile/openapi/lib/model/create_tag_dto.dart | Bin 3449 -> 3455 bytes mobile/openapi/lib/model/create_user_dto.dart | Bin 4026 -> 4040 bytes .../model/curated_locations_response_dto.dart | Bin 4538 -> 4556 bytes .../model/curated_objects_response_dto.dart | Bin 4522 -> 4540 bytes .../openapi/lib/model/delete_asset_dto.dart | Bin 3344 -> 3346 bytes .../lib/model/delete_asset_response_dto.dart | Bin 3661 -> 3667 bytes .../lib/model/device_info_response_dto.dart | Bin 4685 -> 4707 bytes .../openapi/lib/model/download_files_dto.dart | Bin 3449 -> 3451 bytes .../lib/model/edit_shared_link_dto.dart | Bin 6044 -> 6086 bytes .../openapi/lib/model/exif_response_dto.dart | Bin 10263 -> 10481 bytes .../model/get_asset_by_time_bucket_dto.dart | Bin 3615 -> 3617 bytes .../get_asset_count_by_time_bucket_dto.dart | Bin 3637 -> 3639 bytes mobile/openapi/lib/model/job_command_dto.dart | Bin 3307 -> 3309 bytes mobile/openapi/lib/model/job_counts.dart | Bin 4124 -> 4142 bytes .../lib/model/job_status_response_dto.dart | Bin 3722 -> 3728 bytes .../lib/model/login_credential_dto.dart | Bin 3626 -> 3632 bytes .../openapi/lib/model/login_response_dto.dart | Bin 5342 -> 5372 bytes .../lib/model/logout_response_dto.dart | Bin 3698 -> 3704 bytes .../lib/model/o_auth_callback_dto.dart | Bin 3318 -> 3320 bytes .../openapi/lib/model/o_auth_config_dto.dart | Bin 3374 -> 3376 bytes .../lib/model/o_auth_config_response_dto.dart | Bin 5864 -> 5903 bytes .../openapi/lib/model/remove_assets_dto.dart | Bin 3429 -> 3431 bytes .../openapi/lib/model/search_asset_dto.dart | Bin 3362 -> 3364 bytes .../lib/model/server_info_response_dto.dart | Bin 5260 -> 5286 bytes .../lib/model/server_ping_response.dart | Bin 3358 -> 3360 bytes .../lib/model/server_stats_response_dto.dart | Bin 4655 -> 4677 bytes .../lib/model/server_version_reponse_dto.dart | Bin 4091 -> 4105 bytes .../lib/model/shared_link_response_dto.dart | Bin 6512 -> 6571 bytes mobile/openapi/lib/model/sign_up_dto.dart | Bin 3946 -> 3960 bytes .../lib/model/smart_info_response_dto.dart | Bin 4535 -> 4566 bytes .../openapi/lib/model/system_config_dto.dart | Bin 4296 -> 4310 bytes .../lib/model/system_config_f_fmpeg_dto.dart | Bin 4622 -> 4640 bytes .../lib/model/system_config_o_auth_dto.dart | Bin 6010 -> 6048 bytes .../system_config_password_login_dto.dart | Bin 3602 -> 3604 bytes .../system_config_storage_template_dto.dart | Bin 3658 -> 3660 bytes ...em_config_template_storage_option_dto.dart | Bin 6090 -> 6116 bytes .../openapi/lib/model/tag_response_dto.dart | Bin 4246 -> 4271 bytes .../openapi/lib/model/update_album_dto.dart | Bin 4634 -> 4654 bytes .../openapi/lib/model/update_asset_dto.dart | Bin 4065 -> 4078 bytes mobile/openapi/lib/model/update_tag_dto.dart | Bin 4384 -> 4404 bytes mobile/openapi/lib/model/update_user_dto.dart | Bin 8180 -> 8259 bytes .../lib/model/upsert_device_info_dto.dart | Bin 4439 -> 4456 bytes .../openapi/lib/model/usage_by_user_dto.dart | Bin 4188 -> 4206 bytes .../lib/model/user_count_response_dto.dart | Bin 3464 -> 3466 bytes .../openapi/lib/model/user_response_dto.dart | Bin 6142 -> 6187 bytes .../validate_access_token_response_dto.dart | Bin 3678 -> 3680 bytes .../test/api_key_response_dto_test.dart | Bin 859 -> 859 bytes .../repsonse-dto/api-key-response.dto.ts | 2 + .../apps/immich/src/api-v1/user/user.core.ts | 15 +- server/bin/generate-open-api.sh | 24 ++ server/immich-openapi-specs.json | 2 +- .../native/native_class.mustache | 303 ++++++++++++++++++ .../native/native_class.mustache.patch | 19 ++ server/package.json | 6 +- 79 files changed, 353 insertions(+), 18 deletions(-) create mode 100755 server/bin/generate-open-api.sh create mode 100644 server/openapi-generator/templates/serialization/native/native_class.mustache create mode 100644 server/openapi-generator/templates/serialization/native/native_class.mustache.patch diff --git a/mobile/openapi/doc/APIKeyResponseDto.md b/mobile/openapi/doc/APIKeyResponseDto.md index f085aa02553e78dc045d26477a465bff8f0e7745..78ccbc19cac0e0bbdfd7c861ffb2919e8315bddf 100644 GIT binary patch delta 14 Vcmeyu{DpbKQ|8RPl8rBT7y&dd23P<9 delta 14 Vcmeyu{DpbKQ|7$V+>I}I7y&d{23-IE diff --git a/mobile/openapi/lib/model/add_assets_dto.dart b/mobile/openapi/lib/model/add_assets_dto.dart index bebbaeb0831164b433977b21a8854820b21923b7..42908bc82796f1333fd40524e6a050940c5a3fa6 100644 GIT binary patch delta 63 zcmZ1}wOVQeKl5Y(W+lC>;{3emBK5@L;?xq)lw$Q*1zUxZjLc#^n20r(0uU6XmXsFd LDQu2qKEnwBl>rpP delta 47 zcmZ22wNh#WKQm+eWPWBPAZf@fB9>TOoLb_UQf$qo00c#;C8b4q3h|rcna^+n06O~( A(EtDd diff --git a/mobile/openapi/lib/model/add_assets_response_dto.dart b/mobile/openapi/lib/model/add_assets_response_dto.dart index 3f68d7528593f28a3c85246cb450072f06bd39cd..c8723382c32ff54fda6526dbde6a9b894dd0be2c 100644 GIT binary patch delta 176 zcmeyO+^VwSAM51*tV*m|#rb*BlP7SAaKqt%1_KGN=;0u z^vrY2Nh-~?=28HH%rpfJu;N6Jn1Z6MLSAW3j;2C2SXMy+Y;2J_SXLcwGMEc7pjII@ Xr#Ka^USA(m%j5@a;+uc4{ow)t1r<1H delta 141 zcmZow`J%kxA1h=0YH8G{qGtV(6sWjJ` z3nZDDrl64s;wmWGD&&>s%*pdw6-qKPi}faFF-vW3WxmJ>0JPf*qyPW_ delta 30 kcmca1bxmr6E;D2NWL;(@AnDI6IXRbEiZOn3JM%?O0Fc!P`Tzg` diff --git a/mobile/openapi/lib/model/admin_signup_response_dto.dart b/mobile/openapi/lib/model/admin_signup_response_dto.dart index 8757449690fdd52940632dc212d50465b0fe15a3..8e18987078adcf71ef08f17d11018a84ca299ce5 100644 GIT binary patch delta 214 zcmZ3cv_okF59?%JR;Bu^;{3emBK6D^^;iX4g_4ZSV!g~1Yc2&afJ&z3CT8X!c$NKE?`62 delta 211 zcmdm?v`lFO4=ZE*WFA(f`uMEk{JiKQ^~@CYSOr^!%oJ-b1u%d~q~<1O=78nEEOhC# z%%b8Fzr@^Buo5^AU0F^dk}4PnsK^GzuH>TB#FEq$#}cq%a2~|4qSTVoqC5q#yFenf PT$Ak?%{Cjcv2gE;{3emBK7?8ywnu+SOr^!l8nq^JuugrO92d^N{TZQi;&eo m_*fKW=A|P{0;vKDK$I1wmXsFdDS!+F3Dk0NZJx!_#RUKe87+kX delta 146 zcmZ1{w?u9OGYezhun8a)KsH24QEEwPQJw4y1f+m??o|jtWiKGH5fTk=lC#f{oFLAOh2fGKvHi$rODw@LNqSVBa)D%Y~hrxv) zN;A_GG{8no=4Th3Jefm?73|K*0eljiaL<6{?r?~5=<6%Mr6==qiorslI3uwr70KBU qKAK}7f}zE!Ma769KoUe#4h}&il@LBeQBi71X;Gd+*5;Xf^JD^YfyM)Dw$~Q%julOY=(9V-;)_5L|061u%dq%uE3* z$V@?($S==JE%JoOLfPm_5_6JDbNv!?Qz3Q$d1hcPy1L||)Wnk16i0|#;5>-3%rpg! z$^7i1lUH*H0X-qWsR-u%;1C7#jNx7?&PXgug}4X8M7IVa8d{uMR19_y5+7YDI6NS# dAWVpYqSTVoqC5p~*nmW8xwsTIpXK!D0RR!GZ$tn9 diff --git a/mobile/openapi/lib/model/all_job_status_response_dto.dart b/mobile/openapi/lib/model/all_job_status_response_dto.dart index 88865d79931fe48dcf00476e5121ec8d5aaef91e..9bf95e3702455b4e58cb4ee4d3bef9cd211dc8e1 100644 GIT binary patch delta 236 zcmexqGv9W@9G=N@d6Xs};L)DEgi(RRno9u;CiC-Zu$E+G7VAx3$R&dij^R~h0SQn3 z$SQ>pO%zdLQm~z@&m@l!+b5z75{qF{;D;HSRh*v}U8FvF0+Te0dMr?~i%Aiop^i@t zYGVS6%;W=nZ0s=g>qW)6Kn+a diff --git a/mobile/openapi/lib/model/api_key_create_dto.dart b/mobile/openapi/lib/model/api_key_create_dto.dart index 0cd0480b940b471a3903690a2b6b484ed8dfac2e..84b259030b2db43e1dad7bd134a7d844563b307e 100644 GIT binary patch delta 77 zcmbOvJ6m=`GRx!?78Qe%jLc%ayu{p81w~thywaQ;O@(SM1u)1e&d-Z3QU^(@$12z= YfR#>O&mzgJudguqB#Zjyk1Pv00jOvgD*ylh delta 90 zcmbO&J4tp!G7Dq;}ghaPmJEvCX2a3CxPQi3MSaIi;!o cX(5#bsWw2D+G&6sp`!qHqNd{J(;RB-0BQn3umAu6 delta 259 zcmX>l|51L!7e?m1(%jA884H;h<0ogZDAmVj73b$g7pZ5asK+YUDrBZub18rUOd>Ba zHx(=eVxUVV7o{eaq^3BQfK|YG=*mh9QjnCvc|c{{K)Z@kOG=CK6yi54vnDWyp}5CZ vA+Izi2kIh-yX-NAtbjtfdIgC^#i<%d+Vx8EgG-7s^U^gmH8(HeP-6!GPO(l> diff --git a/mobile/openapi/lib/model/api_key_update_dto.dart b/mobile/openapi/lib/model/api_key_update_dto.dart index 9116f84aa26cc41e37bf4ef3563d66ff138bccbd..47847df7888b9fb2d0d10adfb524ee6b2399d958 100644 GIT binary patch delta 55 zcmaDS`9X5SFQ&=AnUvJBiu3cLi`4THb5qr06>JqsGBS(xKs;+M1t2I&Eh#O^Q`qdl Hyp9t9S>+R+ delta 54 zcmew$`A%}fFDAzL$-kJCl;g9C^YfyM)bkQ^Q`KV?Y!yHZYc2&KC`v6UEy`1f-|WP^ GjuQYfM-tQk diff --git a/mobile/openapi/lib/model/asset_count_by_time_bucket.dart b/mobile/openapi/lib/model/asset_count_by_time_bucket.dart index 410afbaae8522015e3730bb7a48fc0b764864a3f..be1b22f8cd4be9ff0601b4ed1956f760d81845ee 100644 GIT binary patch delta 102 zcmeB?og}+q1M}pK%u1nI#rb*BMd~G)xv5U2$=RtT>ahy83MCnt#d-)aYc2&afGSST ZFU>Lr=EsZOQI*{LP!u?n^d2(C4k0vNy)Cg+#t XLDYa*5b2`SlG36)h4{_tEZJNDPLUs$ diff --git a/mobile/openapi/lib/model/asset_count_by_time_bucket_response_dto.dart b/mobile/openapi/lib/model/asset_count_by_time_bucket_response_dto.dart index 0b1f1d262f5273f95f60c8d112747f036a9e9b0b..834a60194a7d8c3c995791f455d17919411f38e4 100644 GIT binary patch delta 87 zcmZ1~zgm6+FUw>;7NyCCEaFZXnZZEgomx_? c9;;xhPy$j36@Vx!N-ZfZ%2U|f#G=d%0H~}RKL7v# delta 83 zcmZ22zf^t$FAHP*WL_2}AgRwHZk1n>nB$yZnpa}Yr2q!;S;hHz(M9S>rODZ;CB^Eo Y3bqPRHbhBLYDsBPo;M1& diff --git a/mobile/openapi/lib/model/asset_count_by_user_id_response_dto.dart b/mobile/openapi/lib/model/asset_count_by_user_id_response_dto.dart index e1dddf121393e821913a92a8337d787534cf5c57..7b1f0e487830b2f0685ad8c913b9f1411e08d7e7 100644 GIT binary patch delta 202 zcmdn2bW~}>U6#rBSd{9siu3cLi_{ZKQ!?|_V-;)_N-{Ew^}t+fE(I`vDk;dwFUc=P zsDbd&6qRMBq#`SV@X-|Imt>?CK@744*#_pLsVT`XNz6f52IfMP6s4Aw7Ud~yUdr0X F4FKp1LK6T0 delta 185 zcmX@Av{`AxT^7dp$#+?l>f^JD^YfyM)DufnGV|4A6>Js2ENdg8Y(<)FQ9}U=~zbO#x;@Nq$LU4p<({g2)%8mXsFdDa3Ey&f3Qf E01K8oEdT%j diff --git a/mobile/openapi/lib/model/asset_file_upload_response_dto.dart b/mobile/openapi/lib/model/asset_file_upload_response_dto.dart index 40583b6ce5ef6422597482ad5746544b3d0be480..d7802e89ea201f856128b1ad0447126207aef41e 100644 GIT binary patch delta 51 zcmdlay+wM1GV^2=W+kPp;{3emBK6D^^;iX4g_4ZSV!g~1Yc2&KC`v6UEy`2aoXYIW F1puH?50?M{ delta 50 zcmdlYy-9k5GBacRWMyV0`S`5j{JiKQ^~@CYSOr^!%oJ-b1t2I&Eh#O^Q;6T3&g{zt E0DtEW%>V!Z diff --git a/mobile/openapi/lib/model/asset_response_dto.dart b/mobile/openapi/lib/model/asset_response_dto.dart index ae15193a30ca844439ab95e4367939dc0cfd4a03..2f516e2bdac32185cdf7b47499cad242d848aaec 100644 GIT binary patch delta 774 zcmZuuyG{Z@6pb+!8kK#4il_sLxWoi#tPBN>N=IRA)M903Va)Ch*&RS*VQmC3{=I&_N##RjkjhEV}mykhn(Dhq)VzhP5y){E?J%5`oA z2ew8rvEs-fk}_fqDZj!=BXrjH`iV)*kk)+Z8%Y&?Q)G1rMDPehL|9YG6*)JFr!;<~ zO6rr{YOb8^@Aq+ql#K4A7l{O9-DM{tHEoG_r1h^l- zz+NHo1&9fWpI~9;6UfU>g{OOb?s?cBr(Y+pv*JP*X2tq`_cjdtOWI(Q0d8EGZ8IJY zSIy*bk~j%P96^928zl#iNFQ5ah*@WjvShRujD1Y!F0+(W(Mjz%$W0&Rb(qN|_>?Pa zJe%T>+~aeb-6S2Jlv>oht~957p--{Ruw$`=7f85f(O%#Xmx#R_{$C{Fu{{bXVd;P5 zFkK|B+4P8qmo6p)uuK%S`BgMnQLEY1R@DaY<_xLLNZ=>cILLiqs+JADJI1|%cxDXX z3>k%a7Iqb5k+|?)Kp-O}%G*R0I6~XmbfCz~aXolO-Z8L zv?|oJjT)DQo=ut12^0&Xw4v657p)#ml3sxyEp8y`J6l}M?CUTIjED5S6tf}q&F))I H|Cas$ZgI%V diff --git a/mobile/openapi/lib/model/change_password_dto.dart b/mobile/openapi/lib/model/change_password_dto.dart index dc8bb31e26afffaf1fd4a507d0b49336bd357adb..ebb6651b7fa9f4f8aa647c76ffb9077f46820329 100644 GIT binary patch delta 92 zcmca7^F(IDHs;COnUyrNiu3cLi_{Aei;K(ii&E5M6>JqsGBS(xU?SFB3Scn#KeM^YfyM)C&@ei_7ziQq*G=Y!zS}Yc2&ah@Z^JB0gD` NMS?MYvnh){7XT}+6tDmQ diff --git a/mobile/openapi/lib/model/check_duplicate_asset_dto.dart b/mobile/openapi/lib/model/check_duplicate_asset_dto.dart index 8644381cbf6497e985e6cb95aa804ea815b8c859..65a4a6ebd293bc9885d2d9550276ff17c5315d88 100644 GIT binary patch delta 78 zcmca5`#^TXUFOO6n3X0ovPepmWMmfWrKFZ+CZ{?U7pInZrdV?+fWc$~77=7=m`qV> ONoi4@!saNJ1}*>@eHjJ- delta 89 zcmaDLdrNl1U1rAk$#Nr#lwvdrXE$KvAD63-NCE(I`%&nnK(i!M@!NP4EI Z$12z=z&H>^MX4pFMR^MGn-f?XxB!5|9k&1g diff --git a/mobile/openapi/lib/model/check_duplicate_asset_response_dto.dart b/mobile/openapi/lib/model/check_duplicate_asset_response_dto.dart index 5ef8f585e09e029953de7936ebb36078b1658c2b..e106a899b5c546a17c68103ddc7b14ea7922d1b4 100644 GIT binary patch delta 114 zcmZouoUFJ(jCHa&t5RrIaeiKOk$PsaYei;piF&MptwKpgX0aYrz?w?|2r|fhM delta 30 lcmdlbyF+$E9W!J6DG4*NxHz>0RrWuN=w?yY!(0GPE-YUF delta 119 zcmaDPe?xvlCJSTyCIA2c diff --git a/mobile/openapi/lib/model/create_album_share_link_dto.dart b/mobile/openapi/lib/model/create_album_share_link_dto.dart index e021ecde611336e1079885fda08c1ab28954e28e..3144f9aa11ee5db74f50a91a4ccae3739d126452 100644 GIT binary patch delta 153 zcmeyMJy~aiIp<^xP9?pp;{3emBK5?aq|#i^6!lmITZNL0%wj#LfHju_5M-t)Xn;j0 z*K-tn>!9-I Mx%4*w0H{Arz0s#Ni9w;$}A|!%+G_Eb^)yHGnXD?{ANY&Ph0@EPd=3Z diff --git a/mobile/openapi/lib/model/create_profile_image_response_dto.dart b/mobile/openapi/lib/model/create_profile_image_response_dto.dart index fc7321cbb8a3cbcdb1019ca9ba810f0287fd6dc5..dfdcba8a47814c2093432f2c6b9229616e096970 100644 GIT binary patch delta 68 zcmew)_d{+2JIiDa7A4iJ;{3emBK6YZ)FRIm^;iX4g_4ZSVm%1ono9u;Ci}3+u!6-W NXRyd_Zew}F1pxn!6>|Up delta 63 zcmew%_epL8I}2m{WOf!MrTDDk{JiKQ_0riZb1zUxZjLc#^5YL)R0SurD@)C2A6o7aT S1x2YPrA2uPn|ClDxe!SZ10q?J QT2fk+rx3q+AM-&@0Du=7>i_@% diff --git a/mobile/openapi/lib/model/create_user_dto.dart b/mobile/openapi/lib/model/create_user_dto.dart index b8977d46d97ebd0c8de15a3d32f9bdb93d26e673..bb7bb7c17df0cacf5a5930284304618507003b5d 100644 GIT binary patch delta 175 zcmdlbe?opkBg^C_7Nz>E;{3emBK6eV#LOJ^SOr^!l8nq^JuugrO92d^N(vH-i_7zi zQV^hze|2YBMW2vM*+i diff --git a/mobile/openapi/lib/model/curated_locations_response_dto.dart b/mobile/openapi/lib/model/curated_locations_response_dto.dart index 5117aa99082e5129dfe184a4aa9f5b4ff4e8bbb9..75cd05c0ad7cc373aa120e491b1505fec46a73eb 100644 GIT binary patch delta 222 zcmdm`d`5YLBkN=*R;Bu^;{3emBK6D^^;iX4g_4ZSV!g~1Yc2&afJ!E3mQ*67K|C}C zMXAM^RjC1qB^d~12r)FpDXC?d$*GRT#i=EpDZU5|DB@W4cp^CxqS_Pc)S}dq(xN(T9l^{ KzuBCvl^X!=oI$$) diff --git a/mobile/openapi/lib/model/delete_asset_dto.dart b/mobile/openapi/lib/model/delete_asset_dto.dart index 4830dd40c314ef5f29ba158a4acf25bc32dc326a..a7c613a436588e231a8ebfad408ee154e2c948ea 100644 GIT binary patch delta 53 zcmbOrHA!m2H>SzonUqwriu3cLi_|kyiq&HkY!yl}GK=+q9BVEGASg;LDJ{xV*lfjo GjS~O|q!Ky+ delta 52 zcmbOvH9=~_HzvmT$={fi6yvjs^YfyM)H73x)ngTG6@augmjVzJrIwTy{|+5pVzi diff --git a/mobile/openapi/lib/model/delete_asset_response_dto.dart b/mobile/openapi/lib/model/delete_asset_response_dto.dart index b71336aca868043d92b2fc20331a353f1ec023a0..d3e3a38f34b203fa012dee080f2e5145bd4da7f2 100644 GIT binary patch delta 88 zcmX>rb6I9XFZ1L+W+nHm;{3emBK6{u#FElt^;iX4g_4ZSVm%1ono9u;po%h65DGF= TAd*F?C8b4q3Y$ML$8rGxQ$rm| delta 83 zcmcaCb5>?UFEeBOpfVR@TYeSe5Ftiu3cLi_|ky)MFKF6-qKPi}f;7thp4x04kZ1T9%od8d6!1 zico|QLsMK@oLc0GWEzBzrU;@Ns7w-WD@+Kca&jV@s4>_*$wjG&C8;TnB`_(Nn~NPw YOY)r(le0?;5DuHXfK77qF1E?s00XK@AOHXW delta 230 zcmaE?a#m%-R#wLN$y-^K>f^JD^YfyM)H74mV-;)_GE=O%6uF#GV^2=W~IrO*o0(k6-qKPi}ezVi&INHQ;My*6o8;8wWPEtPhoQ*GY1y{ Dqkj*z delta 62 zcmew@^;2qtGBacRWMyV0?f9(X{JiKQ^~B=h)Dq8>V)a-BTLl=$no9u)ic(8Ti}DoW KHy1N=Z~*|AOB50S diff --git a/mobile/openapi/lib/model/edit_shared_link_dto.dart b/mobile/openapi/lib/model/edit_shared_link_dto.dart index 458ce2f7597e0c93f30e3abd6761d36c4eb5103f..8d8b98844620edeb5db9455d7504dd030e080a87 100644 GIT binary patch delta 157 zcmbQEe@uVFX|Bm6vnMW1OGG>h5tj9Zp3jpqU BJCy(c diff --git a/mobile/openapi/lib/model/exif_response_dto.dart b/mobile/openapi/lib/model/exif_response_dto.dart index b81f0e347be97d391f6db148c43efb4ef03b83d5..8423aa56a7eb5ebe60f5ee94909ccfe3571f9b92 100644 GIT binary patch delta 1049 zcmZ`&O>5Lp6a_zuN=fpPyu6vrO#8-889IIps33@iE`*Bc&~6oxbdpY^NuEwJi!uwB z;!1|QCp#A{SmzS51MJKy^&%Ni|d+y7@)}QT;mjr!k8jjk~_veN5M>D1$c&S?u>|0Rckwvl;YNq3}boWpqYe zIn4{x417?{>!K!fo_TY1Qm|Cw5g^qP90zLWX4cPKFPKk|q7{ZTgqeZ`$3Jy7Tfq;V zkvDL{69$0|4KE5ISp+joL^lWEwPwoQ-f0w$w0zTJE!&i5z(RRV54AyS*$dLQ5$c@k z_d#tn;1FTS^BJ`O=|o1q5fxfUza%ra^^5RCZ^~$@ZwQ=c;8@Rfe(KGJyhg}ee|P_m zlT>VkW#g9UdT8{rQ35ZDADrwXyf?5S_AiPG|2PESja>DwQD2s-yMsx%@DeawlhG^O z7B28i`Wnw=OF9V*ECMg6ab9}EGcPSWz0`AR!l9a9>YmlGrFOugk)KT5s>xGpNzlKw z)@}&up`Yx}eWxi{j-N*9{7U&-i4^~_t_iL<;TN4tCeV@%wuvo93COD4eMagvIs1@J VqGVhVha=Jy<=;r}(?Sht{{c)2Lp=Zh delta 816 zcmaJ#p2|{s$2n1h?*lcIQGUh*1B4;2)6Q_hw?dNIRQ3_uX@5&OPt`-FpAxXhX}jVMD9H zKqF>*edW>9w=$A!qgh4!N!Ec@6nMo+riJU?r z^mMPgIgVZh!#N{omyr>aN%%+#s68RoM_tkJ!skKUOZwMnFG#8W0hO6;)A|}8iK}(k zRD67AVSJ-y_(P@f7IUD+WWX(U7v8W%MBf>KDJv?p2LISnX%=%R;vP@Ne!3g8N-hYJ zckEiV!;{I?Mr1d2{>heWa%@*>BfPbF(Pw$7cB;AKNOMn|)rTE1j+5baKS~Komy+Sg QmL9)2>$&#lGsiT}0e=Ph)Bpeg diff --git a/mobile/openapi/lib/model/get_asset_by_time_bucket_dto.dart b/mobile/openapi/lib/model/get_asset_by_time_bucket_dto.dart index c00518a1f3aa27a01e604f97f1ec3a9a7bb93cb6..d483153649b0127761a9ef7a72cf4435c83c4594 100644 GIT binary patch delta 48 zcmbO)vruM32=nAnW+myY;{3emBK4BY+*GI1pF delta 48 zcmZ1|Ghb#y2s2~+wVSOr^!$rG8y8RIvvV6Nl> E0ELMUod5s; diff --git a/mobile/openapi/lib/model/get_asset_count_by_time_bucket_dto.dart b/mobile/openapi/lib/model/get_asset_count_by_time_bucket_dto.dart index 4a75a8caae920b5deb5563204f98cf733086fb1a..342d2b59c6da604d6e2d1895d51ae212097bb445 100644 GIT binary patch delta 47 zcmdlgvt4FGD)ZztW+kbt;{3emBK4BY+*J3X{L%vTSOr^!l8nq^y~*>K#WrtcZr}m{ Dlv@ym delta 47 zcmdlkvsGq8Dl=pJ0svt9 B4ygbD delta 60 zcmaDW`C4)VCo^OGWKL!!&G@Y1{JiKQ_2m5A+{C;T^;iX41t{B^O92RqQcFsU@)Y7X Jhci#(1OQrr6Kwzh diff --git a/mobile/openapi/lib/model/job_counts.dart b/mobile/openapi/lib/model/job_counts.dart index dadb72f328bc75cf50c29acbb30baf8db6375563..795821a19bf586df9d8ddbd791a9517a2e9969cd 100644 GIT binary patch delta 202 zcmbQEuufsaDVE8nS(H?>iu3cLi_{a7OESw+)ngTG6-qKPi}fIUYc2&an9R>AS`QXa z&d)8#Ni9iDfk{F2rzK|Qq^2PBL-=TlQc`mgE0I+}1<;h0CuWvp=A|PH0}Jryr9;#e QrIwTyPt(^%t=iF>w_@i3MMDA3M;3i<|I~P>MBpnEXmAE2Wy+WfK`Mse)AUA GDlP!9lrInf diff --git a/mobile/openapi/lib/model/job_status_response_dto.dart b/mobile/openapi/lib/model/job_status_response_dto.dart index d3854b8f3a99de7b5e57523646d2280c0b8ea2fb..2e6edb29380c00ddb7cffb19d2104248be0eed88 100644 GIT binary patch delta 92 zcmeB@oglkm5A)=`%u16VFpIdCWMmfWWfnUomt>ZuT5~CYK~`~oUUZRqVQFeM!@Y2rk$t9U(sp_!`whAzgHJ1Vyz!Vjhrk18U b=a=S{fR!P*5QRmlC8b4q3h|pQS;Dyh9)2PY diff --git a/mobile/openapi/lib/model/login_credential_dto.dart b/mobile/openapi/lib/model/login_credential_dto.dart index b8a23be593df3c2a3bdc39aac520e496e99134ab..103eedd4ba7e7c62198c830ff8053350765fdcb1 100644 GIT binary patch delta 98 zcmZ1_vq5IVMCQqpn3V#viu3cLi_}wd6EkzvV-;)_N-{Ew^}t+fE(I`vDk(@TE-ue6 YNJs2ENd6x delta 278 zcmeyPc~5hL1v_K>WD9ns`uMEk{JiKQ^~B`l)Z*fh{Or^`^;iX41th*TmjW2Tl$I8! z7I~(CRY9286u9OlX6C@vfO+W3(lU#R9ZUQYb5p_UKwK~nU0qHhL>#ON#(^uEtji%Y v*^fg)1?IfWV#k!+Oo%U_Y=q)o4u#2wSj2ch9x6&LDJ{xVh~IpfLz4#p*mzdp diff --git a/mobile/openapi/lib/model/logout_response_dto.dart b/mobile/openapi/lib/model/logout_response_dto.dart index 52120aaabb437a95cf63c67150e8a8fc1e0a7f05..9a86bb6cc68452e76e0f0dadc359f456c1eacdb8 100644 GIT binary patch delta 96 zcmew)^FwCCA?C@4nU!?2iu3cLi`0utlao`6i_=PT)MFKF6-qKPi}es<)?5l;Fqxl4 hTox=>l$w%Rl$u-;T9gTqEJ`gYEy`2aY|moM1puS|AXESV delta 71 zcmew%^GRmIA!f$-$%mMgwBoah^YfyM)Qd}#lT(X}(@JyHV-;)_5L|061u%%8EXX20 PS(inEF@Ccvi!m1ftI-z1 diff --git a/mobile/openapi/lib/model/o_auth_callback_dto.dart b/mobile/openapi/lib/model/o_auth_callback_dto.dart index 3479f5b170ec91b5f3b7eb7361b99980df1c8599..63f9cd31521bc4f50643ee29b60c0ad9d99e18bf 100644 GIT binary patch delta 53 zcmew+`9pHU52ndKnUqwriu3cLi_}Yta@1oLY!yl}GK=+q9BVEGASg;LDJ{xV*lfeR GixU7fO%oIV delta 52 zcmew%`Au@e4<^R=$v>Es6yvjs^YfyM)JuzU)MFKF6@augmjVzJrIwTy=fV5=sC7 diff --git a/mobile/openapi/lib/model/o_auth_config_dto.dart b/mobile/openapi/lib/model/o_auth_config_dto.dart index 23173b46be239cc56f634a4928a2f2096326125b..f33488b03c45fb7baccb1ee344875df0b69febf8 100644 GIT binary patch delta 49 zcmZ1{wLxlw8uMgzW+j=d;{3emBK4xwl+2>k$O!Zg=TZNL0%woOCiOdq4tC+WN F0sx+y5PARr delta 68 zcmdlWwN7e-8Z%@3WHn|b!}zS?{JiKQ^`g|2%%arflF*_|^;iX41th*TmjVzJrIwTy N=Uy7Qg@i diff --git a/mobile/openapi/lib/model/o_auth_config_response_dto.dart b/mobile/openapi/lib/model/o_auth_config_response_dto.dart index db6c9c9e92e45fe0a549173f3b1aa67391cfee60..03025a07cbe702f9fc8db16969d89e168bb5bfd2 100644 GIT binary patch delta 256 zcmaE%+po9bFz4hWoJ#6h#rb*BMe3<}iAg!BDeAEbwhAQ~nZ(rnhBIcm^V3>OM+QnUtw|^mon6#m0U8? zP^C$wB_;WJA*mH5NILFt$%A$L;nK1JTb5W_lJApPnwOk`(@umEB!eQkAqG`)>uz4o H?Z^!Pje}4O delta 174 zcmeCzd!f7GFehXDZy5&Nja%0>ahy83Q)E+mjW2XPv+rLm~6-; zr%_szqo8Q3kXM?Mqp460lZKiAlmzPr(vumvMSt<8 diff --git a/mobile/openapi/lib/model/remove_assets_dto.dart b/mobile/openapi/lib/model/remove_assets_dto.dart index 1457bac3885228ff60c05e95bd31c2d87f74a58a..7dd1e9f9fb7db1424ca1aabb0fa63488c66e8167 100644 GIT binary patch delta 63 zcmaDV^;~L$9P?y(W+lC>;{3emBK5@L;?xq)lw$Q*1zUxZjLc#^n20r(0uU6XmXsFd LDQwPR{>cddxkeS0 delta 47 zcmaDZ^;Bwu95ZA5WI1LfAnCv?B9>TOoLb_UQf$qo00c#;C8b4q3h|rsn16Bt09TU^ AvH$=8 diff --git a/mobile/openapi/lib/model/search_asset_dto.dart b/mobile/openapi/lib/model/search_asset_dto.dart index d90682750b877f5c228667c40070fc9be5b1884a..7bc1341ddb9dfcd14983f256daff156e46e6b0f0 100644 GIT binary patch delta 67 zcmZ1^wM1%zJo97)W+kJn;{3emBK6|b#G>Skkkq1F^;iX4g_4ZSVm*YIHJ1Vq6s4Aw N7Ud~yE@a-w2>|*-7H$9l delta 49 zcmZ1?wMc4%JTqhbWO-&KAnC{~CQ+Q4Sd^R*l3J8&&7}YYMX4pFMR^MGn~Rw@asmKg CoDRMK diff --git a/mobile/openapi/lib/model/server_info_response_dto.dart b/mobile/openapi/lib/model/server_info_response_dto.dart index 0bc23439cab37360eb409bd995cdcd2b4d4244ce..5f359cde08dc4d6a9ff273df89d7fd3093a616af 100644 GIT binary patch delta 295 zcmeCtT&B6_3>H7`FYVr>M5DU*}<7rsX>Y5>ahy83P^lwE(I_^RvKE2 zq7uTzrqHo0F*7GIDF;P4LXbPL9Ik8f8g}`~7ucmeku3tb3B^Hh diff --git a/mobile/openapi/lib/model/server_ping_response.dart b/mobile/openapi/lib/model/server_ping_response.dart index 56af4fa5ba6bcf1e5d0419916ebf779a95e6c9f9..2385b27b8e7eb819c417ed78651519a64e45f529 100644 GIT binary patch delta 53 zcmbOywLoeE6Z2$dW+j!Z;{3emBK4xwV)a-BTZNL0%wjzt$C^t42#QimN{jLoHoGz3 G-~<4-R1lH? delta 52 zcmZ1=HBV{-6EkD{WF}@M#rUk^{JiKQ^`g{b^;iX41t4wBr2qs)sU@XFc?$8HJ(zEB F0sxh(56A!j diff --git a/mobile/openapi/lib/model/server_stats_response_dto.dart b/mobile/openapi/lib/model/server_stats_response_dto.dart index 5417439b4812b6b709af9aea54f951e9b4df81b2..7dbc1db42acaba6f31d3a7557ba2debf756b6884 100644 GIT binary patch delta 272 zcmZ3la#Ur*eAdYeSe5Ftiu3cLi_{A;@=NlI)ngTG6-qKPi}fIUYc2&afGR4>Oi4vn z1mUA8%1_ElO)fz)3Mzo6th6{WJvAt?z8qmERHz)AN;Fm2lsHv}7N-`WDTD|@lozFz WlosVFfII^dsO16@n^&^6aRUG_YgjM< delta 234 zcmX@AvR-Awd{)Nz$@5v2>f^JD^YfyM)C)55OY)1=V-;)_AWUm61u%dqD9cPqg(`qB z(G}z;Wu+#UK#YL0(Up`IC#I(cC6)6DV!MdC(LyJ?3AQDBX ZC8b4q3Seh~L~6Mv+cTPN{=^o{4FIqDNq7JN diff --git a/mobile/openapi/lib/model/server_version_reponse_dto.dart b/mobile/openapi/lib/model/server_version_reponse_dto.dart index 72caaf19409a054ec5dab2adf520d8f647860887..aec917e275411ed225795d77dd6b560bce85f8b1 100644 GIT binary patch delta 164 zcmew@->I-6gJp6ii&A}7aeiKOk$P@oR(_Fstb(mVNk(R|9++#*r2qynC7F3BN$MCLB_ diff --git a/mobile/openapi/lib/model/shared_link_response_dto.dart b/mobile/openapi/lib/model/shared_link_response_dto.dart index aad8972d2e1d35460f61e62913b6264245d1ff8c..9adf91f7a3f06930dcac49a02d5679f04a051653 100644 GIT binary patch delta 482 zcmexhwAy$>A=l(0E+yBj;{3emBK4BWf>iZb1zUxZjLc#^5YL)R0SurDGE)%JnJEy- z%rpfJu=>eoxMXFZ3R6;xlZ!G7N;32F5IQC^aw{nluF;?}H(Dl9EdE%HP%6~afe zHaoQvVG59gCY@ZAnpl#W;#h)E1Q$YcV`@b~W>IRfW69*5+(MIhL|Gv&f5+Xev~r1{PQr$pnyMhyk?f& zp`nqOGkH3XlpUOxlV2WMkdvQ?6hMhNa6yP+MX4pFMR{NoKmxT~lkFHyH!Je`^8f&g CVVAD} delta 401 zcmZ2&{K05LAs1u(VYr^B^DQ_mK1|!Axwnvi8)E7xwwr6OG7k*6iyc85e1rkj7QlJZgx&ietBp?PJSZ9 X$B76&#FnDelG36)h4{^~ynQ?XPJ4R| diff --git a/mobile/openapi/lib/model/sign_up_dto.dart b/mobile/openapi/lib/model/sign_up_dto.dart index dc027a3ce0d807334d05aad4d7e46eed5201714b..5aaa7ac31a41525c38dfa8d02d90c14e2a256ff2 100644 GIT binary patch delta 150 zcmaDQ_d{+&F3aRR7A57Z;{3emBK6eV#LOJ^SOr^!l8nq^JuugrO92cfZ(tFL1Pd1= r78jT27p1^tpqkS%i;7G95_3}#2Ec{Tl;$L&tDG#rD!N&X)rAWHs=+Vi delta 154 zcmew%_eyRG) diff --git a/mobile/openapi/lib/model/smart_info_response_dto.dart b/mobile/openapi/lib/model/smart_info_response_dto.dart index e291cf13e3a1227a23d89a56833931c2cba3e4fc..d24c836d5e28a8a0c7f350fcc05557dfc54664e7 100644 GIT binary patch delta 180 zcmdn4d`)>n2kYccRu!F+jLc%a%oGJhTZO#RoE%MsYAyvZ$STgyi!M^nOi_nRy7MD8k5EEP!?wm*f{Erl*Fa<`(26mZTzdp-DjW6{VJx N7Ud~ye!%*I3jkE9L<#@^ delta 148 zcmcbnctUZ5C@W+9WKmWn$M~$`{JiKQ^|Z9yg4A^NSOr@J2-BKN0SsUY@)Ju-GQjd+ z7F>FAJ*%WxL1J-nd45rfPkwr49zrUROF{u?U~x%)QDS;(NNR3DPGU(aM7}7sq_ikc LA%62a))!m=Mm8=o diff --git a/mobile/openapi/lib/model/system_config_f_fmpeg_dto.dart b/mobile/openapi/lib/model/system_config_f_fmpeg_dto.dart index 73692bdcead6cb45dc6dffc887c338ff2003e965..064bdd36c26aae0018eacc666d5df663bcdef7cc 100644 GIT binary patch delta 169 zcmeBES)j6E7VG5MtV%9f#rb*BMe4~#Y3i{GwhAQ~nZd8fE>ahy83P9SLO92dEQUyh+#i=D=SqKxZ zU=o|`WF8T}-r74;D&iN^+$#7Lr8%n_P!O4j^nR)48(Nm6M^Nq$~PYDEb`9YPGIc=AL}2}!VRiKQj^L8TA0$xAHQAQYWb*>9TRZ@Rw|->+ delta 368 zcmZ3W|4VN}CkJEv9?$vK&+c_p3@qhK8Dih@(?lZ#SIz~(_z2B(4q&{Y>F=NF`cRe@RP(n+Ny zCHZ+FsTB~D5L|SHiKQj^L8Dn8kP3ly#%T(Xn1xa1h)H+OJJ@B#qRICS{{ diff --git a/mobile/openapi/lib/model/system_config_password_login_dto.dart b/mobile/openapi/lib/model/system_config_password_login_dto.dart index f5562800a9162d10634b5ad3ea17d9c7341579b1..5a0eba93a2a9b994af01814eba947ee86bcbbced 100644 GIT binary patch delta 61 zcmbOvGeu^DAM<2?W+k1h;{3emBK6d~#H5_m6!lmITZNL0%wj#LfHju_5EP}BlosVF KY@Wqj!36+xlN1#I delta 60 zcmbOtGf8HHA2Vb8WItvl&G@Y1{JiKQ_0+t?q@2_g^;iX41t{B^O92RqQcFsU@)Y7X J&tb0M0su>M6H5R9 diff --git a/mobile/openapi/lib/model/system_config_storage_template_dto.dart b/mobile/openapi/lib/model/system_config_storage_template_dto.dart index 482641484f7b73307144f5fc8f8d9b04197f31ca..c5fd4f9121c9cfc8e56a342eae54deb9df704dc7 100644 GIT binary patch delta 63 zcmX>lb4F%EBJ<=VW+lC>;{3emBK4Bg+=86Ml2r9r1zUxZjLc#^n20r(0uU6XmXsFd LDQsTPJevyu(fAez delta 62 zcmX>jb4q4IA~R$B@9Z^A$Y+ diff --git a/mobile/openapi/lib/model/system_config_template_storage_option_dto.dart b/mobile/openapi/lib/model/system_config_template_storage_option_dto.dart index a0a799bd09d16c7f4af2200b3a9dccf2a60ded7f..721e79869d539c64702cedce14a3765cd69e3dd5 100644 GIT binary patch delta 256 zcmX@5|3rU775n6BcBRP|ctp)@6-qKPi}fl~6N~%{N;32Fimka6z#ywQKQFpSJvTqE zBm*j?9;*OVKlvfM$mC7DB9c&kN@69N_Q~=b;^JVlGxAH(%$~fLPa+qpGdDA@v?LWx mGt}2A!^;iX41th*TmjW2Tl;-B= zm1H2RMHWC;oRV0HtQ5h8C}dVph@Tw5C+cdekda>sa{;;`xtV#TC8@~fpoqYgPwwWB h6e~_m&d*DMDn>|s;1_4IRhWE-Ly9qe^EZxnd;mGiS1bSk diff --git a/mobile/openapi/lib/model/tag_response_dto.dart b/mobile/openapi/lib/model/tag_response_dto.dart index 69626a2fc6c09a23689aa633bf7232548e309d76..352b0e5aa82277b1d08ae86f1341aa4a310c91e4 100644 GIT binary patch delta 183 zcmbQHxL$F?C6>vTS(NItiu3cLi_|ky)MFKF6-qKPi}f;7thp4x04iBhS&)j52Jz4o zf^JD^YfyM)H74mV-;)_GE=O%6u=rO%>D03>1|Pyhe` delta 99 zcmZ3dGD~H{9X7`J$#>XPWD;|dN^|`Zb5j)*Z58rLb8<8ls<{-vAbzp}yXa&qb~&I@ r5UYS)Wb%7fvB~q<1%VYn delta 103 zcmaDS|4@DdJ1b-SWOi01hxn}G{JiKQ^^(MN&y-^ISOr@J2-BKN0SGeF6f`o6-4e_4 vi!w`66%=h1@=9}ZG!?4BvI+|ElM7kJCik$)1C0Z*jahy83Sb!!&zegC2x=8l zbBa?Hs=*uu1$}*m$p_d}?7*suQbFoM64O0X6clY0@=9}ZG~p_t<|3&<7(ZE(U4a>7 Nloh+)=1lhOoB)zRE~o$i delta 119 zcmdm@v_NS?6dPmwdqWDokF- tCJEGWicLkXC>5k9Br)AH1&hYX0_@_Gb=Vbvib1S2c5%k|&9&^?IRQ6yA)o*N diff --git a/mobile/openapi/lib/model/update_user_dto.dart b/mobile/openapi/lib/model/update_user_dto.dart index bfb19c734d8223f08773abfb6ca6c093eff71f93..edc5298104ccfaa65ddb1d46d000b38b00e89d07 100644 GIT binary patch delta 384 zcmexjf7oHe3xUZm1(X7_iu3cLi_|ky)MFKF6-qKPi}f;7thp3`ATv!t11yl5o0yrS zplGX*SDKTfsZb4;RZxIx1Il!Rqe_YH)znr)3sRt{0M+tRN(c5LhQ94ORsdoSZ2n0yVi-2ySvtVsVLIVs0vu zOV$WMOg<%~VFvM8v13YZW*$zjWJ2VTjF15V)8^@vB@(81t)h2D@=aN pC^>nbuqapoi2p?x<}MBqrOCM>GEi5#i>QLt8CZs8ylZaFIee!0^~nk%B9pfX3jqz36j7LbiA!wqVb%7 delta 124 zcmaE%bX{q~SysmQ$!A%WfaH5tG0T+HvdrYvkjjEoYc2&ah|em{&xOi9fz zMks>t(G(SAf^JD^YfyM)Juy~i#$`*V-;)_AWUm61u%dqD9cPq%`XNk zfH2V&6lCO=Kovlk=n6`U6Vp?J63d~MfH`{QSXCjEK%|ROOG=CK6yi6pXWh>Q05mo} ATL1t6 diff --git a/mobile/openapi/lib/model/user_count_response_dto.dart b/mobile/openapi/lib/model/user_count_response_dto.dart index ba11a4c362caf58621d66762fd8dad568b675f0e..81b0f488a9400d3f7fb935839fdb8cf74611c554 100644 GIT binary patch delta 65 zcmeB>?vmbM%sknIS;-))I6p7CNWHW;wa7WYG_OQGR>4-GBqOs}4=!ZQr2qs)sU@XF Lc?z4GnOV62%x4un delta 47 zcmeB@?vUPK%*+@+*_c^LEIz9^KQFpSy|g&B$T`0>uS7jo!B$~%KC>8O{N`3>RxSWx C1P&_z diff --git a/mobile/openapi/lib/model/user_response_dto.dart b/mobile/openapi/lib/model/user_response_dto.dart index f00efadf27e3ac838880f73e4fddf3551958ec1d..a9e80c593e92e4be149f1ffd54b3f9a00edff9ae 100644 GIT binary patch delta 403 zcmeyTzuI6!Jm=&DPNn*+;{3emBK6D^^;iX4g_4ZSV!g~1Yc2&afJ&z3CT8X!AWtZ4FAE=y*8eFc!nWEXBB9caMiCzh6Ecp?QYQ~+W}QEEwPQJ%u) IdhU820O!tpB>(^b delta 340 zcmZ2&@K1k3JSSuPPaaXE<)aj-@h2VGHeQEFmIYKmhCSQVTHS2o#!OJ;H+mjuwM zm0SvwA8?4o!R27iE_O`G&CG+i9m0kv$xKtwNJ-5}1)Hy+XseJ{nvtq0xDv1l qlV!OrftE#bt82o%pPyJ-lHmyn94H%NK~ZW+X;Gd+{N^>>^*jJ&X=cL! diff --git a/mobile/openapi/lib/model/validate_access_token_response_dto.dart b/mobile/openapi/lib/model/validate_access_token_response_dto.dart index b3f9f9735927b09a5221c0e5f8af2d3fc7d413a7..a32f2d914e14662187c6f6d7ea51b5fcb37e5fd2 100644 GIT binary patch delta 49 zcmca7^FU@pF7xC(W~Ip!nZ;yEGBS(x5=%=mf=d!hN{g+z6o8;8wWPEtPhsCXrZLk`Y{zSW;SS&7}YYMX4pFMR^MGn-4P2=K=tq Cv=E5^ diff --git a/mobile/openapi/test/api_key_response_dto_test.dart b/mobile/openapi/test/api_key_response_dto_test.dart index 6862afa7ad92665bc7c0cdde49713d2a5600d361..a9c7b7e858f9931fd874084eae4b826d33b584ce 100644 GIT binary patch delta 23 fcmcc3cAIU(bw;+#yb^`Xl*x?Dikts2#xeo`ZIcL5 delta 23 fcmcc3cAIU(bw;+l(p-hil*x?Dikts2#xeo`ZRH47 diff --git a/server/apps/immich/src/api-v1/api-key/repsonse-dto/api-key-response.dto.ts b/server/apps/immich/src/api-v1/api-key/repsonse-dto/api-key-response.dto.ts index bc1b6b312..31a43df1b 100644 --- a/server/apps/immich/src/api-v1/api-key/repsonse-dto/api-key-response.dto.ts +++ b/server/apps/immich/src/api-v1/api-key/repsonse-dto/api-key-response.dto.ts @@ -1,6 +1,8 @@ import { APIKeyEntity } from '@app/database'; +import { ApiProperty } from '@nestjs/swagger'; export class APIKeyResponseDto { + @ApiProperty({ type: 'integer' }) id!: number; name!: string; createdAt!: string; diff --git a/server/apps/immich/src/api-v1/user/user.core.ts b/server/apps/immich/src/api-v1/user/user.core.ts index df5804184..a263b3b27 100644 --- a/server/apps/immich/src/api-v1/user/user.core.ts +++ b/server/apps/immich/src/api-v1/user/user.core.ts @@ -35,25 +35,12 @@ export class UserCore { } } - const user = await this.userRepository.get(id); - if (!user) { - throw new NotFoundException('User not found'); - } - try { if (dto.password) { dto.password = await hash(dto.password, SALT_ROUNDS); } - user.password = dto.password ?? user.password; - user.email = dto.email ?? user.email; - user.firstName = dto.firstName ?? user.firstName; - user.lastName = dto.lastName ?? user.lastName; - user.isAdmin = dto.isAdmin ?? user.isAdmin; - user.shouldChangePassword = dto.shouldChangePassword ?? user.shouldChangePassword; - user.profileImagePath = dto.profileImagePath ?? user.profileImagePath; - - return this.userRepository.update(id, user); + return this.userRepository.update(id, dto); } catch (e) { Logger.error(e, 'Failed to update user info'); throw new InternalServerErrorException('Failed to update user info'); diff --git a/server/bin/generate-open-api.sh b/server/bin/generate-open-api.sh new file mode 100755 index 000000000..bc693269e --- /dev/null +++ b/server/bin/generate-open-api.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +function mobile { + rm -rf ../mobile/openapi + cd ./openapi-generator/templates/serialization/native + wget -O native_class.mustache https://raw.githubusercontent.com/OpenAPITools/openapi-generator/master/modules/openapi-generator/src/main/resources/dart2/serialization/native/native_class.mustache + patch -u native_class.mustache dart_constructor}} +{{#vars}} + {{#description}} + /// {{{.}}} + {{/description}} + {{^isEnum}} + {{#minimum}} + {{#description}} + /// + {{/description}} + /// Minimum value: {{{.}}} + {{/minimum}} + {{#maximum}} + {{#description}} + {{^minimum}} + /// + {{/minimum}} + {{/description}} + /// Maximum value: {{{.}}} + {{/maximum}} + {{^isNullable}} + {{^required}} + {{^defaultValue}} + /// + /// Please note: This property should have been non-nullable! Since the specification file + /// does not include a default value (using the "default:" property), however, the generated + /// source code must fall back to having a nullable type. + /// Consider adding a "default:" property in the specification file to hide this note. + /// + {{/defaultValue}} + {{/required}} + {{/isNullable}} + {{/isEnum}} + {{{datatypeWithEnum}}}{{#isNullable}}?{{/isNullable}}{{^isNullable}}{{^required}}{{^defaultValue}}?{{/defaultValue}}{{/required}}{{/isNullable}} {{{name}}}; + +{{/vars}} + @override + bool operator ==(Object other) => identical(this, other) || other is {{{classname}}} && + {{#vars}} + other.{{{name}}} == {{{name}}}{{^-last}} &&{{/-last}}{{#-last}};{{/-last}} + {{/vars}} + + @override + int get hashCode => + // ignore: unnecessary_parenthesis + {{#vars}} + ({{#isNullable}}{{{name}}} == null ? 0 : {{/isNullable}}{{^isNullable}}{{^required}}{{^defaultValue}}{{{name}}} == null ? 0 : {{/defaultValue}}{{/required}}{{/isNullable}}{{{name}}}{{#isNullable}}!{{/isNullable}}{{^isNullable}}{{^required}}{{^defaultValue}}!{{/defaultValue}}{{/required}}{{/isNullable}}.hashCode){{^-last}} +{{/-last}}{{#-last}};{{/-last}} + {{/vars}} + + @override + String toString() => '{{{classname}}}[{{#vars}}{{{name}}}=${{{name}}}{{^-last}}, {{/-last}}{{/vars}}]'; + + Map toJson() { + final json = {}; + {{#vars}} + {{#isNullable}} + if (this.{{{name}}} != null) { + {{/isNullable}} + {{^isNullable}} + {{^required}} + {{^defaultValue}} + if (this.{{{name}}} != null) { + {{/defaultValue}} + {{/required}} + {{/isNullable}} + {{#isDateTime}} + {{#pattern}} + json[r'{{{baseName}}}'] = _dateEpochMarker == '{{{pattern}}}' + ? this.{{{name}}}{{#isNullable}}!{{/isNullable}}{{^isNullable}}{{^required}}{{^defaultValue}}!{{/defaultValue}}{{/required}}{{/isNullable}}.millisecondsSinceEpoch + : this.{{{name}}}{{#isNullable}}!{{/isNullable}}{{^isNullable}}{{^required}}{{^defaultValue}}!{{/defaultValue}}{{/required}}{{/isNullable}}.toUtc().toIso8601String(); + {{/pattern}} + {{^pattern}} + json[r'{{{baseName}}}'] = this.{{{name}}}{{#isNullable}}!{{/isNullable}}{{^isNullable}}{{^required}}{{^defaultValue}}!{{/defaultValue}}{{/required}}{{/isNullable}}.toUtc().toIso8601String(); + {{/pattern}} + {{/isDateTime}} + {{#isDate}} + {{#pattern}} + json[r'{{{baseName}}}'] = _dateEpochMarker == '{{{pattern}}}' + ? this.{{{name}}}{{#isNullable}}!{{/isNullable}}{{^isNullable}}{{^required}}{{^defaultValue}}!{{/defaultValue}}{{/required}}{{/isNullable}}.millisecondsSinceEpoch + : _dateFormatter.format(this.{{{name}}}{{#isNullable}}!{{/isNullable}}{{^isNullable}}{{^required}}{{^defaultValue}}!{{/defaultValue}}{{/required}}{{/isNullable}}.toUtc()); + {{/pattern}} + {{^pattern}} + json[r'{{{baseName}}}'] = _dateFormatter.format(this.{{{name}}}{{#isNullable}}!{{/isNullable}}{{^isNullable}}{{^required}}{{^defaultValue}}!{{/defaultValue}}{{/required}}{{/isNullable}}.toUtc()); + {{/pattern}} + {{/isDate}} + {{^isDateTime}} + {{^isDate}} + json[r'{{{baseName}}}'] = this.{{{name}}}; + {{/isDate}} + {{/isDateTime}} + {{#isNullable}} + } else { + // json[r'{{{baseName}}}'] = null; + } + {{/isNullable}} + {{^isNullable}} + {{^required}} + {{^defaultValue}} + } else { + // json[r'{{{baseName}}}'] = null; + } + {{/defaultValue}} + {{/required}} + {{/isNullable}} + {{/vars}} + return json; + } + + /// Returns a new [{{{classname}}}] instance and imports its values from + /// [value] if it's a [Map], null otherwise. + // ignore: prefer_constructors_over_static_methods + static {{{classname}}}? fromJson(dynamic value) { + if (value is Map) { + final json = value.cast(); + + // Ensure that the map contains the required keys. + // Note 1: the values aren't checked for validity beyond being non-null. + // Note 2: this code is stripped in release mode! + assert(() { + requiredKeys.forEach((key) { + assert(json.containsKey(key), 'Required key "{{{classname}}}[$key]" is missing from JSON.'); + assert(json[key] != null, 'Required key "{{{classname}}}[$key]" has a null value in JSON.'); + }); + return true; + }()); + + return {{{classname}}}( + {{#vars}} + {{#isDateTime}} + {{{name}}}: mapDateTime(json, r'{{{baseName}}}', '{{{pattern}}}'){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}}, + {{/isDateTime}} + {{#isDate}} + {{{name}}}: mapDateTime(json, r'{{{baseName}}}', '{{{pattern}}}'){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}}, + {{/isDate}} + {{^isDateTime}} + {{^isDate}} + {{#complexType}} + {{#isArray}} + {{#items.isArray}} + {{{name}}}: json[r'{{{baseName}}}'] is List + ? (json[r'{{{baseName}}}'] as List).map((e) => + {{#items.complexType}} + {{items.complexType}}.listFromJson(json[r'{{{baseName}}}']){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}} + {{/items.complexType}} + {{^items.complexType}} + e == null ? {{#items.isNullable}}null{{/items.isNullable}}{{^items.isNullable}}const <{{items.items.dataType}}>[]{{/items.isNullable}} : (e as List).cast<{{items.items.dataType}}>() + {{/items.complexType}} + ).toList() + : {{#isNullable}}null{{/isNullable}}{{^isNullable}}const []{{/isNullable}}, + {{/items.isArray}} + {{^items.isArray}} + {{{name}}}: {{{complexType}}}.listFromJson(json[r'{{{baseName}}}']){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}}, + {{/items.isArray}} + {{/isArray}} + {{^isArray}} + {{#isMap}} + {{#items.isArray}} + {{{name}}}: json[r'{{{baseName}}}'] == null + ? {{#defaultValue}}{{{.}}}{{/defaultValue}}{{^defaultValue}}null{{/defaultValue}} + {{#items.complexType}} + : {{items.complexType}}.mapListFromJson(json[r'{{{baseName}}}']), + {{/items.complexType}} + {{^items.complexType}} + : mapCastOfType(json, r'{{{baseName}}}'), + {{/items.complexType}} + {{/items.isArray}} + {{^items.isArray}} + {{#items.isMap}} + {{#items.complexType}} + {{{name}}}: {{items.complexType}}.mapFromJson(json[r'{{{baseName}}}']){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}}, + {{/items.complexType}} + {{^items.complexType}} + {{{name}}}: mapCastOfType(json, r'{{{baseName}}}'){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}}, + {{/items.complexType}} + {{/items.isMap}} + {{^items.isMap}} + {{#items.complexType}} + {{{name}}}: {{{items.complexType}}}.mapFromJson(json[r'{{{baseName}}}'{{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}}]) ?? {{{.}}}{{/defaultValue}}{{/required}}, + {{/items.complexType}} + {{^items.complexType}} + {{{name}}}: mapCastOfType(json, r'{{{baseName}}}'){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}}, + {{/items.complexType}} + {{/items.isMap}} + {{/items.isArray}} + {{/isMap}} + {{^isMap}} + {{#isBinary}} + {{{name}}}: null, // No support for decoding binary content from JSON + {{/isBinary}} + {{^isBinary}} + {{{name}}}: {{{complexType}}}.fromJson(json[r'{{{baseName}}}']){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}}, + {{/isBinary}} + {{/isMap}} + {{/isArray}} + {{/complexType}} + {{^complexType}} + {{#isArray}} + {{#isEnum}} + {{{name}}}: {{{items.datatypeWithEnum}}}.listFromJson(json[r'{{{baseName}}}']){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}}, + {{/isEnum}} + {{^isEnum}} + {{{name}}}: json[r'{{{baseName}}}'] is {{#uniqueItems}}Set{{/uniqueItems}}{{^uniqueItems}}List{{/uniqueItems}} + ? (json[r'{{{baseName}}}'] as {{#uniqueItems}}Set{{/uniqueItems}}{{^uniqueItems}}List{{/uniqueItems}}).cast<{{{items.datatype}}}>() + : {{#defaultValue}}{{{.}}}{{/defaultValue}}{{^defaultValue}}null{{/defaultValue}}, + {{/isEnum}} + {{/isArray}} + {{^isArray}} + {{#isMap}} + {{{name}}}: mapCastOfType(json, r'{{{baseName}}}'){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}}, + {{/isMap}} + {{^isMap}} + {{#isNumber}} + {{{name}}}: json[r'{{{baseName}}}'] == null + ? {{#defaultValue}}{{{.}}}{{/defaultValue}}{{^defaultValue}}null{{/defaultValue}} + : {{{datatypeWithEnum}}}.parse(json[r'{{{baseName}}}'].toString()), + {{/isNumber}} + {{^isNumber}} + {{^isEnum}} + {{{name}}}: mapValueOfType<{{{datatypeWithEnum}}}>(json, r'{{{baseName}}}'){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}}, + {{/isEnum}} + {{#isEnum}} + {{{name}}}: {{{enumName}}}.fromJson(json[r'{{{baseName}}}']){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}}, + {{/isEnum}} + {{/isNumber}} + {{/isMap}} + {{/isArray}} + {{/complexType}} + {{/isDate}} + {{/isDateTime}} + {{/vars}} + ); + } + return null; + } + + static List<{{{classname}}}>? listFromJson(dynamic json, {bool growable = false,}) { + final result = <{{{classname}}}>[]; + if (json is List && json.isNotEmpty) { + for (final row in json) { + final value = {{{classname}}}.fromJson(row); + if (value != null) { + result.add(value); + } + } + } + return result.toList(growable: growable); + } + + static Map mapFromJson(dynamic json) { + final map = {}; + if (json is Map && json.isNotEmpty) { + json = json.cast(); // ignore: parameter_assignments + for (final entry in json.entries) { + final value = {{{classname}}}.fromJson(entry.value); + if (value != null) { + map[entry.key] = value; + } + } + } + return map; + } + + // maps a json object with a list of {{{classname}}}-objects as value to a dart map + static Map> mapListFromJson(dynamic json, {bool growable = false,}) { + final map = >{}; + if (json is Map && json.isNotEmpty) { + json = json.cast(); // ignore: parameter_assignments + for (final entry in json.entries) { + final value = {{{classname}}}.listFromJson(entry.value, growable: growable,); + if (value != null) { + map[entry.key] = value; + } + } + } + return map; + } + + /// The list of required keys that must be present in a JSON. + static const requiredKeys = { +{{#vars}} + {{#required}} + '{{{baseName}}}', + {{/required}} +{{/vars}} + }; +} +{{#vars}} + {{^isModel}} + {{#isEnum}} + {{^isContainer}} + +{{>serialization/native/native_enum_inline}} + {{/isContainer}} + {{#isContainer}} + {{#mostInnerItems}} + +{{>serialization/native/native_enum_inline}} + {{/mostInnerItems}} + {{/isContainer}} + {{/isEnum}} + {{/isModel}} +{{/vars}} diff --git a/server/openapi-generator/templates/serialization/native/native_class.mustache.patch b/server/openapi-generator/templates/serialization/native/native_class.mustache.patch new file mode 100644 index 000000000..11ecf0271 --- /dev/null +++ b/server/openapi-generator/templates/serialization/native/native_class.mustache.patch @@ -0,0 +1,19 @@ +--- native_class.mustache 2023-01-04 09:58:25.683944036 -0500 ++++ native_class1.mustache 2023-01-04 09:59:43.856353945 -0500 +@@ -91,14 +91,14 @@ + {{/isDateTime}} + {{#isNullable}} + } else { +- json[r'{{{baseName}}}'] = null; ++ // json[r'{{{baseName}}}'] = null; + } + {{/isNullable}} + {{^isNullable}} + {{^required}} + {{^defaultValue}} + } else { +- json[r'{{{baseName}}}'] = null; ++ // json[r'{{{baseName}}}'] = null; + } + {{/defaultValue}} + {{/required}} diff --git a/server/package.json b/server/package.json index 1229f23c5..9a0efc48a 100644 --- a/server/package.json +++ b/server/package.json @@ -27,9 +27,9 @@ "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "test:e2e": "jest --config ./apps/immich/test/jest-e2e.json", "typeorm": "node --require ts-node/register ./node_modules/typeorm/cli.js", - "api:typescript": "rm -rf ../web/src/api/open-api && npx openapi-generator-cli generate -g typescript-axios -i ./immich-openapi-specs.json -o ../web/src/api/open-api", - "api:dart": "rm -rf ../mobile/openapi && npx openapi-generator-cli generate -g dart -i ./immich-openapi-specs.json -o ../mobile/openapi", - "api:generate": "npm run api:typescript && npm run api:dart" + "api:typescript": "bash ./bin/generate-open-api.sh web", + "api:dart": "bash ./bin/generate-open-api.sh mobile", + "api:generate": "bash ./bin/generate-open-api.sh" }, "dependencies": { "@nestjs/bull": "^0.5.5",