From 7080a37a8255b0193418d0e44dad40b3ea135f59 Mon Sep 17 00:00:00 2001 From: admin Date: Mon, 30 Mar 2026 13:27:38 +0700 Subject: [PATCH] 260330:1327 Addied correspondence_revieion_attcahments table table #02 --- ...84e27323b-57a192785d1688a165b9d928bb0781fb | Bin 71082 -> 71514 bytes ...ollerspec_01f22c35c4e8dac55125442b982e36b1 | 48 + ...rspec_01f22c35c4e8dac55125442b982e36b1.map | 1 + ...tementity_0240c1ba7ad97cfdf085dd8677bd13ce | 66 ++ ...ntity_0240c1ba7ad97cfdf085dd8677bd13ce.map | 1 + ...onservice_031ecbbe4d01ad3d9a68be397c5645b1 | 102 ++ ...rvice_031ecbbe4d01ad3d9a68be397c5645b1.map | 1 + ...tagentity_04feabc0b7d8c85123dca45a6315c665 | 65 ++ ...ntity_04feabc0b7d8c85123dca45a6315c665.map | 1 + ...rorentity_0941b82490357482bc9f4bee7db01ff7 | 75 ++ ...ntity_0941b82490357482bc9f4bee7db01ff7.map | 1 + ...gisterdto_0ed888354b381cec6a824534fd55be4a | 44 + ...erdto_0ed888354b381cec6a824534fd55be4a.map | 1 + ...maservice_0e6c1f23d6d98dca6687cfd5c3032b84 | 115 +++ ...rvice_0e6c1f23d6d98dca6687cfd5c3032b84.map | 1 + ...ententity_0ff8771ed74454f89aff9994cf6ef628 | 54 ++ ...ntity_0ff8771ed74454f89aff9994cf6ef628.map | 1 + ...ontroller_0fbed68f47eaecd76a1e8dbc637902eb | 128 +++ ...oller_0fbed68f47eaecd76a1e8dbc637902eb.map | 1 + ...oryentity_15219612174d1d2f4f5f145fd438785d | 80 ++ ...ntity_15219612174d1d2f4f5f145fd438785d.map | 1 + ...decorator_162c051522422ed99c6329e366a925ba | 13 + ...rator_162c051522422ed99c6329e366a925ba.map | 1 + ...oleentity_167ae781e401650da7dcc03d9b583938 | 64 ++ ...ntity_167ae781e401650da7dcc03d9b583938.map | 1 + ...ndencedto_1917d88cac86c7d38761d87ad86160db | 28 + ...cedto_1917d88cac86c7d38761d87ad86160db.map | 1 + ...onservice_1a5355ad83ff0e0ecee7c8796d481e45 | 178 ++++ ...rvice_1a5355ad83ff0e0ecee7c8796d481e45.map | 1 + ...ontroller_1d61510bd0de0f450b01a5cde69e070b | 36 + ...oller_1d61510bd0de0f450b01a5cde69e070b.map | 1 + ...ollerspec_1d2b7cbdae38dd21d83a8ac1ba20de2d | 89 ++ ...rspec_1d2b7cbdae38dd21d83a8ac1ba20de2d.map | 1 + ...rvicespec_1fc0fd62ff80c0c90d23cb4141ae6810 | 149 +++ ...espec_1fc0fd62ff80c0c90d23cb4141ae6810.map | 1 + .../1f/v35_1f4d6f999aa69769c492865b1396afbb | 43 + .../v35_1f4d6f999aa69769c492865b1396afbb.map | 1 + ...ingentity_20e539711485c87e198d35edab37d894 | 86 ++ ...ntity_20e539711485c87e198d35edab37d894.map | 1 + ...ppservice_21d326aab79b05aa0dedde1ceb161e5d | 21 + ...rvice_21d326aab79b05aa0dedde1ceb161e5d.map | 1 + ...tepentity_2156f3e58473799aa2a675a27211d118 | 86 ++ ...ntity_2156f3e58473799aa2a675a27211d118.map | 1 + ...erservice_2221293af5c9176ac31bf8fa020cdc5a | 88 ++ ...rvice_2221293af5c9176ac31bf8fa020cdc5a.map | 1 + ...tbatchdto_262c393514cbdebc3944d447aa32fed5 | 44 + ...chdto_262c393514cbdebc3944d447aa32fed5.map | 1 + ...ionentity_29b10ac40c51596f01411c0936261f7d | 50 + ...ntity_29b10ac40c51596f01411c0936261f7d.map | 1 + ...mapentity_2e85b81ca8f336f48097bfe5f99d35ce | 56 ++ ...ntity_2e85b81ca8f336f48097bfe5f99d35ce.map | 1 + ...ckservice_30afd2380f9ec6310699d91060265631 | 71 ++ ...rvice_30afd2380f9ec6310699d91060265631.map | 1 + ...authguard_31560c3664d1bca2e28678e96d013ae5 | 19 + ...guard_31560c3664d1bca2e28678e96d013ae5.map | 1 + .../32/index_325e14fedb3b9296fc130d25f9109c49 | 33 + ...index_325e14fedb3b9296fc130d25f9109c49.map | 1 + ...ententity_33bf9c7c6638ef3cf8ad77bbdeea9a1c | 54 ++ ...ntity_33bf9c7c6638ef3cf8ad77bbdeea9a1c.map | 1 + ...ctoryspec_34511f78c6a357cf9f9762795d4af8e9 | 137 +++ ...yspec_34511f78c6a357cf9f9762795d4af8e9.map | 1 + ...terkeydto_351a47cc29bea6f1e2bda8734f0052a3 | 22 + ...eydto_351a47cc29bea6f1e2bda8734f0052a3.map | 1 + ...actentity_368e2e62d8d219a68fded59440a670e8 | 63 ++ ...ntity_368e2e62d8d219a68fded59440a670e8.map | 1 + ...onservice_399aa855c7775eaa61d46c3a49de20bb | 172 ++++ ...rvice_399aa855c7775eaa61d46c3a49de20bb.map | 1 + ...schemadto_394841aa52929518040f7b49d36f3fb5 | 10 + ...madto_394841aa52929518040f7b49d36f3fb5.map | 1 + ...umeentity_3b2f36c013c1b54da2256e298156fa0c | 60 ++ ...ntity_3b2f36c013c1b54da2256e298156fa0c.map | 1 + ...erservice_3cb5b5fe1dbdff0417bdda978e024234 | 111 +++ ...rvice_3cb5b5fe1dbdff0417bdda978e024234.map | 1 + ...jestsetup_454824338728b276d821dbd4aebb4c28 | 40 + ...setup_454824338728b276d821dbd4aebb4c28.map | 1 + ...rvicespec_4619003876a0356c456881bcac752b3f | 201 ++++ ...espec_4619003876a0356c456881bcac752b3f.map | 1 + ...ontroller_47b6657e09337a2e65746953c9dcefc6 | 319 ++++++ ...oller_47b6657e09337a2e65746953c9dcefc6.map | 1 + .../48/v3_48f32482646a4d7525289af85f0ce07d | 16 + .../v3_48f32482646a4d7525289af85f0ce07d.map | 1 + .../49/md5_492d12f97f16fb5ab77effc461ec7562 | 15 + .../md5_492d12f97f16fb5ab77effc461ec7562.map | 1 + ...maservice_4c698e35d782ba409cfca244345003e5 | 317 ++++++ ...rvice_4c698e35d782ba409cfca244345003e5.map | 1 + ...ionentity_5141c40a0afe3cfa4ec4036fd186bfd8 | 152 +++ ...ntity_5141c40a0afe3cfa4ec4036fd186bfd8.map | 1 + ...lowentity_51880ef91639f200aaee6b2a662c73b1 | 99 ++ ...ntity_51880ef91639f200aaee6b2a662c73b1.map | 1 + ...rorentity_53b050c5d1af74a17caf24765a8193b9 | 66 ++ ...ntity_53b050c5d1af74a17caf24765a8193b9.map | 1 + .../native_548917a23d6fe6cc3c48c9539627bdc9 | 6 + ...ative_548917a23d6fe6cc3c48c9539627bdc9.map | 1 + ...oleentity_540b9039e779734579ca9c31fb31cdb1 | 42 + ...ntity_540b9039e779734579ca9c31fb31cdb1.map | 1 + ...ontroller_55fb8ae11b11b11e700eb6b1a3499bc9 | 180 ++++ ...oller_55fb8ae11b11b11e700eb6b1a3499bc9.map | 1 + ...neservice_56e5849b90e20ae3b6280216e4d638ce | 345 +++++++ ...rvice_56e5849b90e20ae3b6280216e4d638ce.map | 1 + ...ionentity_57ffa5b8a12b394b6fe52756e53c2027 | 76 ++ ...ntity_57ffa5b8a12b394b6fe52756e53c2027.map | 1 + ...matentity_5a3d0de37e7b9f3152a1d411dd0f9d25 | 76 ++ ...ntity_5a3d0de37e7b9f3152a1d411dd0f9d25.map | 1 + ...ontroller_5a5c2f21e7047c054c5007b586de9f9d | 207 ++++ ...oller_5a5c2f21e7047c054c5007b586de9f9d.map | 1 + ...rvicespec_5a537f9973f4abc7efd76426c2858a1b | 92 ++ ...espec_5a537f9973f4abc7efd76426c2858a1b.map | 1 + ...atservice_5b80502de833b4704f252f5b67b90d66 | 148 +++ ...rvice_5b80502de833b4704f252f5b67b90d66.map | 1 + ...onservice_5b6998e2dbfb353e9d8968e9721537e2 | 167 ++++ ...rvice_5b6998e2dbfb353e9d8968e9721537e2.map | 1 + .../5d/v7_5db91ea355080bfa2d90ae5b5f2fb5a9 | 71 ++ .../v7_5db91ea355080bfa2d90ae5b5f2fb5a9.map | 1 + ...tedatadto_5fc4702b52b0731b76c9c1d9c0d34cee | 35 + ...tadto_5fc4702b52b0731b76c9c1d9c0d34cee.map | 1 + ...rvicespec_5faf19cc6799478d39fbda80519f078b | 133 +++ ...espec_5faf19cc6799478d39fbda80519f078b.map | 1 + ...aseentity_608b668623d9fcbf5ab8d6d9d171784a | 31 + ...ntity_608b668623d9fcbf5ab8d6d9d171784a.map | 1 + ...rbacguard_601bfb0d32c8333cec517da3b22343ec | 54 ++ ...guard_601bfb0d32c8333cec517da3b22343ec.map | 1 + ...ionentity_628b90e7a7504230203752d5578eafce | 47 + ...ntity_628b90e7a7504230203752d5578eafce.map | 1 + ...ngservice_63f23bba7d43943751607f2b8545eaf4 | 449 +++++++++ ...rvice_63f23bba7d43943751607f2b8545eaf4.map | 1 + .../63/nil_6310299ee9928c1f054cce44dffdedbd | 5 + .../nil_6310299ee9928c1f054cce44dffdedbd.map | 1 + ...rvicespec_64bccaa90f006507e557550ed585fcf5 | 117 +++ ...espec_64bccaa90f006507e557550ed585fcf5.map | 1 + .../validate_6469029621a113f8adf6688e5b4e660f | 9 + ...idate_6469029621a113f8adf6688e5b4e660f.map | 1 + ...schemadto_65bf7d6e9c485421a9f64c6b5ced8846 | 92 ++ ...madto_65bf7d6e9c485421a9f64c6b5ced8846.map | 1 + ...ateentity_655794e2120ea78769f9f4f1a5c5be24 | 57 ++ ...ntity_655794e2120ea78769f9f4f1a5c5be24.map | 1 + ...terentity_665fa52a65aaf5309e56d1ee239d8d48 | 71 ++ ...ntity_665fa52a65aaf5309e56d1ee239d8d48.map | 1 + .../66/sha1_66e6dcc6acc3f3541177f968539b9ce6 | 15 + .../sha1_66e6dcc6acc3f3541177f968539b9ce6.map | 1 + .../68/v5_68c452f27d93aa45cead3864553364cb | 16 + .../v5_68c452f27d93aa45cead3864553364cb.map | 1 + ...onservice_6bb0fde7b04e8e16815dc23ab0aff0f6 | 535 ++++++++++ ...rvice_6bb0fde7b04e8e16815dc23ab0aff0f6.map | 1 + ...ionentity_6b3ce0cffafbe10506b3d48552a95df7 | 64 ++ ...ntity_6b3ce0cffafbe10506b3d48552a95df7.map | 1 + ...tusentity_6cd9674f6d716087b5f3d16aa634606c | 41 + ...ntity_6cd9674f6d716087b5f3d16aa634606c.map | 1 + ...ontroller_6c267c2f0fe72bae92837146680df4ea | 97 ++ ...oller_6c267c2f0fe72bae92837146680df4ea.map | 1 + ...tyfactory_71acd4f06948161a9038ed8bb92a44d9 | 101 ++ ...ctory_71acd4f06948161a9038ed8bb92a44d9.map | 1 + ...ollerspec_728cd9096ddc1d7290817f9d4949f2e0 | 58 ++ ...rspec_728cd9096ddc1d7290817f9d4949f2e0.map | 1 + ...rvicespec_734bdcab2dfb6efde612c0805c2de895 | 625 ++++++++++++ ...espec_734bdcab2dfb6efde612c0805c2de895.map | 1 + ...ionentity_748fcda51980c012ec6452aab8313bfa | 127 +++ ...ntity_748fcda51980c012ec6452aab8313bfa.map | 1 + ...decorator_756d861fb3fbfe77d847637987836a6d | 19 + ...rator_756d861fb3fbfe77d847637987836a6d.map | 1 + ...euuidpipe_75a9802dc98f15e3303d636e3033592a | 33 + ...dpipe_75a9802dc98f15e3303d636e3033592a.map | 1 + ...nceentity_767d26e42d0dcded199e02d8cfeed978 | 41 + ...ntity_767d26e42d0dcded199e02d8cfeed978.map | 1 + ...csservice_769bcb0e914a7deb72901e32eaa4559a | 38 + ...rvice_769bcb0e914a7deb72901e32eaa4559a.map | 1 + .../version_76c977e478e6d783fbb7d8c7e0fe5b33 | 12 + ...rsion_76c977e478e6d783fbb7d8c7e0fe5b33.map | 1 + ...aseentity_7b3e9cd55ed540bfcd8af187ebbdd7de | 50 + ...ntity_7b3e9cd55ed540bfcd8af187ebbdd7de.map | 1 + ...odeentity_7cb73d4ed6d16a9335aa5136ca0c6698 | 45 + ...ntity_7cb73d4ed6d16a9335aa5136ca0c6698.map | 1 + ...mnservice_7c27b269e64ebb1a10a212d78f62babf | 133 +++ ...rvice_7c27b269e64ebb1a10a212d78f62babf.map | 1 + ...ndencedto_84ed95e09c7a524e84c9d06242469288 | 82 ++ ...cedto_84ed95e09c7a524e84c9d06242469288.map | 1 + ...equerydto_86e92c67dbc40015462ab660eb32159d | 51 + ...rydto_86e92c67dbc40015462ab660eb32159d.map | 1 + ...itservice_892193ffeea2f7f738d0560b8b65f546 | 47 + ...rvice_892193ffeea2f7f738d0560b8b65f546.map | 1 + .../8a/parse_8a4fbdc5fdee8d9d488883273b5da927 | 13 + ...parse_8a4fbdc5fdee8d9d488883273b5da927.map | 1 + ...erservice_8b1d27b6691bbd260fdee0af6ad9ca3f | 159 +++ ...rvice_8b1d27b6691bbd260fdee0af6ad9ca3f.map | 1 + ...thservice_8d6ae9b98ba0de0c46e8600296cc75f9 | 313 ++++++ ...rvice_8d6ae9b98ba0de0c46e8600296cc75f9.map | 1 + ...rvicespec_8e8583e4fc564774b51895736ccdf1f1 | 59 ++ ...espec_8e8583e4fc564774b51895736ccdf1f1.map | 1 + ...ditentity_8f1d1cd40dada15740cff52014266f7a | 144 +++ ...ntity_8f1d1cd40dada15740cff52014266f7a.map | 1 + ...deservice_8f2885af9b3396edaff274554fed1fb9 | 49 + ...rvice_8f2885af9b3396edaff274554fed1fb9.map | 1 + ...slservice_909e15f6dcb6f70cf3679802928c76ce | 171 ++++ ...rvice_909e15f6dcb6f70cf3679802928c76ce.map | 1 + .../91/rng_9185b5bf4adcd6c99f571f345039954e | 15 + .../rng_9185b5bf4adcd6c99f571f345039954e.map | 1 + .../91/v4_91908fa9c1f1402413509327d57a3d17 | 31 + .../v4_91908fa9c1f1402413509327d57a3d17.map | 1 + ...reshguard_93de3b0a08eb778599bcf4f333440a10 | 19 + ...guard_93de3b0a08eb778599bcf4f333440a10.map | 1 + ...emaentity_98f89c5c1b7cc2c3d1aa088965d21d23 | 69 ++ ...ntity_98f89c5c1b7cc2c3d1aa088965d21d23.map | 1 + ...ypeentity_997ac5f038b75f4cd42c9c3e9e2adef7 | 41 + ...ntity_997ac5f038b75f4cd42c9c3e9e2adef7.map | 1 + ...rojectdto_9915d0c26c54bc0d6f46c43fd4f57da3 | 33 + ...ctdto_9915d0c26c54bc0d6f46c43fd4f57da3.map | 1 + ...dpipespec_99d299cb6228d815df5dc89951f747ab | 71 ++ ...espec_99d299cb6228d815df5dc89951f747ab.map | 1 + ...schemadto_9a77995363a030e6d1582008441b405e | 52 + ...madto_9a77995363a030e6d1582008441b405e.map | 1 + ...ionentity_9ba306f97bcbc6961a6aaa73f7ef7b0e | 78 ++ ...ntity_9ba306f97bcbc6961a6aaa73f7ef7b0e.map | 1 + .../9c/max_9c6c3f2785acbd15308947612bb30e18 | 5 + .../max_9c6c3f2785acbd15308947612bb30e18.map | 1 + ...ollerspec_9dcd614ef36fcf352a01bb00013221d4 | 50 + ...rspec_9dcd614ef36fcf352a01bb00013221d4.map | 1 + ...ingentity_9ee4ac5a7e2bbbe13e27e541a8ffd285 | 103 ++ ...ntity_9ee4ac5a7e2bbbe13e27e541a8ffd285.map | 1 + ...ionentity_a1ee00f00d5847dc62cefe60d16c955f | 127 +++ ...ntity_a1ee00f00d5847dc62cefe60d16c955f.map | 1 + ...oryentity_a28bd1b55d0bad1fa21b22665160c222 | 58 ++ ...ntity_a28bd1b55d0bad1fa21b22665160c222.map | 1 + ...ndencedto_a3ceabf26c8ca26d934edda2b0ed4ab7 | 108 +++ ...cedto_a3ceabf26c8ca26d934edda2b0ed4ab7.map | 1 + ...ineentity_a4babfc1dd3a9a2ef918333d11e29a97 | 62 ++ ...ntity_a4babfc1dd3a9a2ef918333d11e29a97.map | 1 + ...rvicespec_aa9ebc4d0a97b6c3a1ddebf9c9b22032 | 181 ++++ ...espec_aa9ebc4d0a97b6c3a1ddebf9c9b22032.map | 1 + ...eueentity_aac64a604f7801b0724251867566c1b8 | 126 +++ ...ntity_aac64a604f7801b0724251867566c1b8.map | 1 + ...nceentity_ad8bc364adfe3a46bba930b3a508713d | 109 +++ ...ntity_ad8bc364adfe3a46bba930b3a508713d.map | 1 + ...tagentity_af3367c9adb35a574b84ed144a9fb079 | 42 + ...ntity_af3367c9adb35a574b84ed144a9fb079.map | 1 + ...rojectdto_b37c976b8cc164c77012c317a0db0327 | 52 + ...ctdto_b37c976b8cc164c77012c317a0db0327.map | 1 + ...ctservice_b58a6892c260dee338f7b0290c276312 | 114 +++ ...rvice_b58a6892c260dee338f7b0290c276312.map | 1 + .../v6ToV1_bc94dc67f15a0950896bd74549e92e15 | 15 + ...6ToV1_bc94dc67f15a0950896bd74549e92e15.map | 1 + ...ollerspec_be01d6d478a32ac64cf5ff735bdc6ed3 | 70 ++ ...rspec_be01d6d478a32ac64cf5ff735bdc6ed3.map | 1 + ...ndencedto_bef00686a687b51e0980752a5b6c9571 | 156 +++ ...cedto_bef00686a687b51e0980752a5b6c9571.map | 1 + ...decorator_bf9a30a43b4c7196ee2732450eefc6c2 | 9 + ...rator_bf9a30a43b4c7196ee2732450eefc6c2.map | 1 + ...rvicespec_c07b2be49127bf1524290034556fef27 | 625 ++++++++++++ ...espec_c07b2be49127bf1524290034556fef27.map | 1 + ...erservice_c15380ec5ccdd36a7c9db129b5db65c9 | 281 ++++++ ...rvice_c15380ec5ccdd36a7c9db129b5db65c9.map | 1 + ...rationdto_c324a9895fd4c321ed46e358d6e90f1f | 108 +++ ...ondto_c324a9895fd4c321ed46e358d6e90f1f.map | 1 + ...canceldto_c47afaa1afa58700a68f20020409a608 | 29 + ...eldto_c47afaa1afa58700a68f20020409a608.map | 1 + ...dslschema_c5cabd3031f97b9263a01c5f89cb3919 | 177 ++++ ...chema_c5cabd3031f97b9263a01c5f89cb3919.map | 1 + ...ndencedto_c7dbe840ed42bce7da58582be522689e | 10 + ...cedto_c7dbe840ed42bce7da58582be522689e.map | 1 + ...odeentity_c9dcda1258d518107c11cd89006e9742 | 45 + ...ntity_c9dcda1258d518107c11cd89006e9742.map | 1 + ...nerrordto_d08805f6bb42c0b63831872da96be2f9 | 46 + ...ordto_d08805f6bb42c0b63831872da96be2f9.map | 1 + ...kenentity_d2abd8834c5a4b20225977edc2b18a0f | 60 ++ ...ntity_d2abd8834c5a4b20225977edc2b18a0f.map | 1 + ...stringify_d2cd26e64927689c4a6f754c87f57dac | 41 + ...ngify_d2cd26e64927689c4a6f754c87f57dac.map | 1 + ...rvicespec_d358f3290538fb6a6a5cec29846eacd5 | 240 +++++ ...espec_d358f3290538fb6a6a5cec29846eacd5.map | 1 + ...ollerspec_d48812f9f2031cb8a9251911e95fef18 | 22 + ...rspec_d48812f9f2031cb8a9251911e95fef18.map | 1 + ...ingentity_d4d4692454e74d45cfa5b98b15dca8e3 | 92 ++ ...ntity_d4d4692454e74d45cfa5b98b15dca8e3.map | 1 + ...nceentity_d4265ce3bf2f4d9f69fac10e9f68acd5 | 54 ++ ...ntity_d4265ce3bf2f4d9f69fac10e9f68acd5.map | 1 + ...owservice_d594806472d229cf8c80ddadf6ae4d7e | 160 +++ ...rvice_d594806472d229cf8c80ddadf6ae4d7e.map | 1 + ...rvicespec_d5167b4d60ea5a3678045fd966d840bb | 152 +++ ...espec_d5167b4d60ea5a3678045fd966d840bb.map | 1 + ...ongateway_d57b1a0af4e39fcfe2fabb5f60aff91a | 49 + ...teway_d57b1a0af4e39fcfe2fabb5f60aff91a.map | 1 + ...ionentity_d767f95649fe928f8b415acb6077308b | 87 ++ ...ntity_d767f95649fe928f8b415acb6077308b.map | 1 + ...geservice_d8c424ff74b3a97c0b9fa3330d0a60b9 | 316 ++++++ ...rvice_d8c424ff74b3a97c0b9fa3330d0a60b9.map | 1 + ...ntservice_d8263716c15fd09882d37d13da00fa51 | 75 ++ ...rvice_d8263716c15fd09882d37d13da00fa51.map | 1 + ...toservice_d94fb8fca20f7a7b18f203fd1141e965 | 106 ++ ...rvice_d94fb8fca20f7a7b18f203fd1141e965.map | 1 + ...rojectdto_d94c4ce750d5054f7326d5626a57ca13 | 10 + ...ctdto_d94c4ce750d5054f7326d5626a57ca13.map | 1 + ...rvicespec_daaf06fc7b27b9d454ba3d3f4dcc0121 | 77 ++ ...espec_daaf06fc7b27b9d454ba3d3f4dcc0121.map | 1 + ...oryentity_db702410fe427ce5596f5483aea98a15 | 60 ++ ...ntity_db702410fe427ce5596f5483aea98a15.map | 1 + ...erencedto_de618b4cb1acf6bd3a1dc051d1761ca5 | 28 + ...cedto_de618b4cb1acf6bd3a1dc051d1761ca5.map | 1 + ...actiondto_de25df6637f0f6baa62507feb9bba1f7 | 80 ++ ...ondto_de25df6637f0f6baa62507feb9bba1f7.map | 1 + ...ontroller_df3af79a98cd0cc3642b18f0befcdf94 | 204 ++++ ...oller_df3af79a98cd0cc3642b18f0befcdf94.map | 1 + ...tyservice_dfc24cb882be3c83955914f235f463d5 | 108 +++ ...rvice_dfc24cb882be3c83955914f235f463d5.map | 1 + ...ectentity_df9270cfe86330dbe81d78bdcfac5524 | 61 ++ ...ntity_df9270cfe86330dbe81d78bdcfac5524.map | 1 + ...rvicespec_dfa2b87d1a4f741ac6f8d136866acaff | 170 ++++ ...espec_dfa2b87d1a4f741ac6f8d136866acaff.map | 1 + ...ntityspec_e098b8a2511d0107635b195f6fbea8de | 61 ++ ...yspec_e098b8a2511d0107635b195f6fbea8de.map | 1 + ...erservice_e3eeeec977b0a2ef96ee65e1f116c970 | 171 ++++ ...rvice_e3eeeec977b0a2ef96ee65e1f116c970.map | 1 + ...oryentity_e35b39331cb52779870e0d0e5d2b17fc | 58 ++ ...ntity_e35b39331cb52779870e0d0e5d2b17fc.map | 1 + ...ententity_e328ba3a163f74f87685fc110a022bcb | 91 ++ ...ntity_e328ba3a163f74f87685fc110a022bcb.map | 1 + ...ententity_e6d8c5873482cabb391dfa74e13913fe | 48 + ...ntity_e6d8c5873482cabb391dfa74e13913fe.map | 1 + ...ceservice_e6c952ee6661779150c964b393cfe3e9 | 918 ++++++++++++++++++ ...rvice_e6c952ee6661779150c964b393cfe3e9.map | 1 + ...ollerspec_e621314ae9ea57aa03badc4fddd55cfb | 47 + ...rspec_e621314ae9ea57aa03badc4fddd55cfb.map | 1 + ...ypeentity_e9a71dc19d0a819fbe0ae761ce9a21f2 | 67 ++ ...ntity_e9a71dc19d0a819fbe0ae761ce9a21f2.map | 1 + .../logindto_ea9943d8075027b5c18f2644b208cae7 | 34 + ...indto_ea9943d8075027b5c18f2644b208cae7.map | 1 + ...ndencedto_ebb04387677382f14e1f652c45891954 | 32 + ...cedto_ebb04387677382f14e1f652c45891954.map | 1 + .../v1ToV6_ec131fd3e0527fc11743e8d943583a0f | 15 + ...1ToV6_ec131fd3e0527fc11743e8d943583a0f.map | 1 + ...ententity_ee6169e7532be32869b3706b38c31ae6 | 83 ++ ...ntity_ee6169e7532be32869b3706b38c31ae6.map | 1 + ...nceentity_eeff4ca20af4844957e9c398a4e1a62f | 95 ++ ...ntity_eeff4ca20af4844957e9c398a4e1a62f.map | 1 + ...chservice_efc26b5aacfbd6df8c915e34775e0b66 | 186 ++++ ...rvice_efc26b5aacfbd6df8c915e34775e0b66.map | 1 + ...rfaentity_f073b741f89f84f3a87b305bb53a4285 | 60 ++ ...ntity_f073b741f89f84f3a87b305bb53a4285.map | 1 + .../f0/v6_f0e9bebcaffc237d2d87341e893e8a15 | 21 + .../v6_f0e9bebcaffc237d2d87341e893e8a15.map | 1 + ...oryentity_f7e4dfe86e367746d72c3af0ff6cf9f8 | 60 ++ ...ntity_f7e4dfe86e367746d72c3af0ff6cf9f8.map | 1 + ...ionentity_fc2513a9000bc0c62e55ef0a27371865 | 126 +++ ...ntity_fc2513a9000bc0c62e55ef0a27371865.map | 1 + .../fc/regex_fc3895a35aab4118dfe668d885715538 | 5 + ...regex_fc3895a35aab4118dfe668d885715538.map | 1 + ...serentity_fdca98e7b265cfba4cee3f0fcd57da00 | 110 +++ ...ntity_fdca98e7b265cfba4cee3f0fcd57da00.map | 1 + ...interface_fd7580bd648c3465dfcf9cf53ba3d4ea | 22 + ...rface_fd7580bd648c3465dfcf9cf53ba3d4ea.map | 1 + .../ff/v1_ff3aea057c914bf134f062778c2320f8 | 89 ++ .../v1_ff3aea057c914bf134f062778c2320f8.map | 1 + ...c4f4e1366-da39a3ee5e6b4b0d3255bfef95601890 | 2 +- .../correspondence.service.spec.ts | 5 + 351 files changed, 17381 insertions(+), 1 deletion(-) create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/01/filestoragecontrollerspec_01f22c35c4e8dac55125442b982e36b1 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/01/filestoragecontrollerspec_01f22c35c4e8dac55125442b982e36b1.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/02/rfaitementity_0240c1ba7ad97cfdf085dd8677bd13ce create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/02/rfaitementity_0240c1ba7ad97cfdf085dd8677bd13ce.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/03/organizationservice_031ecbbe4d01ad3d9a68be397c5645b1 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/03/organizationservice_031ecbbe4d01ad3d9a68be397c5645b1.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/04/tagentity_04feabc0b7d8c85123dca45a6315c665 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/04/tagentity_04feabc0b7d8c85123dca45a6315c665.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/09/documentnumbererrorentity_0941b82490357482bc9f4bee7db01ff7 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/09/documentnumbererrorentity_0941b82490357482bc9f4bee7db01ff7.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0e/registerdto_0ed888354b381cec6a824534fd55be4a create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0e/registerdto_0ed888354b381cec6a824534fd55be4a.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0e/uischemaservice_0e6c1f23d6d98dca6687cfd5c3032b84 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0e/uischemaservice_0e6c1f23d6d98dca6687cfd5c3032b84.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0f/correspondencerevisionattachmententity_0ff8771ed74454f89aff9994cf6ef628 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0f/correspondencerevisionattachmententity_0ff8771ed74454f89aff9994cf6ef628.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0f/projectcontroller_0fbed68f47eaecd76a1e8dbc637902eb create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0f/projectcontroller_0fbed68f47eaecd76a1e8dbc637902eb.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/15/workflowhistoryentity_15219612174d1d2f4f5f145fd438785d create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/15/workflowhistoryentity_15219612174d1d2f4f5f145fd438785d.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/16/requirepermissiondecorator_162c051522422ed99c6329e366a925ba create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/16/requirepermissiondecorator_162c051522422ed99c6329e366a925ba.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/16/roleentity_167ae781e401650da7dcc03d9b583938 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/16/roleentity_167ae781e401650da7dcc03d9b583938.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/19/cancelcorrespondencedto_1917d88cac86c7d38761d87ad86160db create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/19/cancelcorrespondencedto_1917d88cac86c7d38761d87ad86160db.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1a/reservationservice_1a5355ad83ff0e0ecee7c8796d481e45 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1a/reservationservice_1a5355ad83ff0e0ecee7c8796d481e45.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1d/appcontroller_1d61510bd0de0f450b01a5cde69e070b create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1d/appcontroller_1d61510bd0de0f450b01a5cde69e070b.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1d/correspondencecontrollerspec_1d2b7cbdae38dd21d83a8ac1ba20de2d create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1d/correspondencecontrollerspec_1d2b7cbdae38dd21d83a8ac1ba20de2d.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1f/parserservicespec_1fc0fd62ff80c0c90d23cb4141ae6810 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1f/parserservicespec_1fc0fd62ff80c0c90d23cb4141ae6810.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1f/v35_1f4d6f999aa69769c492865b1396afbb create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1f/v35_1f4d6f999aa69769c492865b1396afbb.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/20/shopdrawingentity_20e539711485c87e198d35edab37d894 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/20/shopdrawingentity_20e539711485c87e198d35edab37d894.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/21/appservice_21d326aab79b05aa0dedde1ceb161e5d create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/21/appservice_21d326aab79b05aa0dedde1ceb161e5d.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/21/rfaworkflowtemplatestepentity_2156f3e58473799aa2a675a27211d118 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/21/rfaworkflowtemplatestepentity_2156f3e58473799aa2a675a27211d118.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/22/duedatereminderservice_2221293af5c9176ac31bf8fa020cdc5a create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/22/duedatereminderservice_2221293af5c9176ac31bf8fa020cdc5a.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/26/commitbatchdto_262c393514cbdebc3944d447aa32fed5 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/26/commitbatchdto_262c393514cbdebc3944d447aa32fed5.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/29/permissionentity_29b10ac40c51596f01411c0936261f7d create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/29/permissionentity_29b10ac40c51596f01411c0936261f7d.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2e/contractdrawingsubcatcatmapentity_2e85b81ca8f336f48097bfe5f99d35ce create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2e/contractdrawingsubcatcatmapentity_2e85b81ca8f336f48097bfe5f99d35ce.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/30/documentnumberinglockservice_30afd2380f9ec6310699d91060265631 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/30/documentnumberinglockservice_30afd2380f9ec6310699d91060265631.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/31/jwtauthguard_31560c3664d1bca2e28678e96d013ae5 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/31/jwtauthguard_31560c3664d1bca2e28678e96d013ae5.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/32/index_325e14fedb3b9296fc130d25f9109c49 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/32/index_325e14fedb3b9296fc130d25f9109c49.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/33/correspondencerevisionattachmententity_33bf9c7c6638ef3cf8ad77bbdeea9a1c create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/33/correspondencerevisionattachmententity_33bf9c7c6638ef3cf8ad77bbdeea9a1c.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/34/abilityfactoryspec_34511f78c6a357cf9f9762795d4af8e9 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/34/abilityfactoryspec_34511f78c6a357cf9f9762795d4af8e9.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/35/counterkeydto_351a47cc29bea6f1e2bda8734f0052a3 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/35/counterkeydto_351a47cc29bea6f1e2bda8734f0052a3.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/36/contractentity_368e2e62d8d219a68fded59440a670e8 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/36/contractentity_368e2e62d8d219a68fded59440a670e8.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/39/schemamigrationservice_399aa855c7775eaa61d46c3a49de20bb create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/39/schemamigrationservice_399aa855c7775eaa61d46c3a49de20bb.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/39/updatejsonschemadto_394841aa52929518040f7b49d36f3fb5 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/39/updatejsonschemadto_394841aa52929518040f7b49d36f3fb5.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3b/contractdrawingvolumeentity_3b2f36c013c1b54da2256e298156fa0c create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3b/contractdrawingvolumeentity_3b2f36c013c1b54da2256e298156fa0c.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3c/uuidresolverservice_3cb5b5fe1dbdff0417bdda978e024234 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3c/uuidresolverservice_3cb5b5fe1dbdff0417bdda978e024234.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/45/jestsetup_454824338728b276d821dbd4aebb4c28 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/45/jestsetup_454824338728b276d821dbd4aebb4c28.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/46/duedatereminderservicespec_4619003876a0356c456881bcac752b3f create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/46/duedatereminderservicespec_4619003876a0356c456881bcac752b3f.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/47/correspondencecontroller_47b6657e09337a2e65746953c9dcefc6 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/47/correspondencecontroller_47b6657e09337a2e65746953c9dcefc6.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/48/v3_48f32482646a4d7525289af85f0ce07d create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/48/v3_48f32482646a4d7525289af85f0ce07d.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/49/md5_492d12f97f16fb5ab77effc461ec7562 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/49/md5_492d12f97f16fb5ab77effc461ec7562.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4c/jsonschemaservice_4c698e35d782ba409cfca244345003e5 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4c/jsonschemaservice_4c698e35d782ba409cfca244345003e5.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/51/correspondencerevisionentity_5141c40a0afe3cfa4ec4036fd186bfd8 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/51/correspondencerevisionentity_5141c40a0afe3cfa4ec4036fd186bfd8.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/51/rfaworkflowentity_51880ef91639f200aaee6b2a662c73b1 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/51/rfaworkflowentity_51880ef91639f200aaee6b2a662c73b1.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/53/migrationerrorentity_53b050c5d1af74a17caf24765a8193b9 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/53/migrationerrorentity_53b050c5d1af74a17caf24765a8193b9.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/54/native_548917a23d6fe6cc3c48c9539627bdc9 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/54/native_548917a23d6fe6cc3c48c9539627bdc9.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/54/organizationroleentity_540b9039e779734579ca9c31fb31cdb1 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/54/organizationroleentity_540b9039e779734579ca9c31fb31cdb1.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/55/authcontroller_55fb8ae11b11b11e700eb6b1a3499bc9 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/55/authcontroller_55fb8ae11b11b11e700eb6b1a3499bc9.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/56/workflowengineservice_56e5849b90e20ae3b6280216e4d638ce create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/56/workflowengineservice_56e5849b90e20ae3b6280216e4d638ce.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/57/workflowdefinitionentity_57ffa5b8a12b394b6fe52756e53c2027 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/57/workflowdefinitionentity_57ffa5b8a12b394b6fe52756e53c2027.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5a/documentnumberformatentity_5a3d0de37e7b9f3152a1d411dd0f9d25 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5a/documentnumberformatentity_5a3d0de37e7b9f3152a1d411dd0f9d25.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5a/migrationcontroller_5a5c2f21e7047c054c5007b586de9f9d create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5a/migrationcontroller_5a5c2f21e7047c054c5007b586de9f9d.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5a/migrationservicespec_5a537f9973f4abc7efd76426c2858a1b create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5a/migrationservicespec_5a537f9973f4abc7efd76426c2858a1b.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5b/formatservice_5b80502de833b4704f252f5b67b90d66 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5b/formatservice_5b80502de833b4704f252f5b67b90d66.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5b/notificationservice_5b6998e2dbfb353e9d8968e9721537e2 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5b/notificationservice_5b6998e2dbfb353e9d8968e9721537e2.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5d/v7_5db91ea355080bfa2d90ae5b5f2fb5a9 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5d/v7_5db91ea355080bfa2d90ae5b5f2fb5a9.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5f/migratedatadto_5fc4702b52b0731b76c9c1d9c0d34cee create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5f/migratedatadto_5fc4702b52b0731b76c9c1d9c0d34cee.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5f/uuidresolverservicespec_5faf19cc6799478d39fbda80519f078b create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5f/uuidresolverservicespec_5faf19cc6799478d39fbda80519f078b.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/60/baseentity_608b668623d9fcbf5ab8d6d9d171784a create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/60/baseentity_608b668623d9fcbf5ab8d6d9d171784a.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/60/rbacguard_601bfb0d32c8333cec517da3b22343ec create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/60/rbacguard_601bfb0d32c8333cec517da3b22343ec.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/62/importtransactionentity_628b90e7a7504230203752d5578eafce create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/62/importtransactionentity_628b90e7a7504230203752d5578eafce.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/63/documentnumberingservice_63f23bba7d43943751607f2b8545eaf4 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/63/documentnumberingservice_63f23bba7d43943751607f2b8545eaf4.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/63/nil_6310299ee9928c1f054cce44dffdedbd create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/63/nil_6310299ee9928c1f054cce44dffdedbd.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/64/userservicespec_64bccaa90f006507e557550ed585fcf5 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/64/userservicespec_64bccaa90f006507e557550ed585fcf5.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/64/validate_6469029621a113f8adf6688e5b4e660f create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/64/validate_6469029621a113f8adf6688e5b4e660f.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/65/createjsonschemadto_65bf7d6e9c485421a9f64c6b5ced8846 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/65/createjsonschemadto_65bf7d6e9c485421a9f64c6b5ced8846.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/65/rfaworkflowtemplateentity_655794e2120ea78769f9f4f1a5c5be24 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/65/rfaworkflowtemplateentity_655794e2120ea78769f9f4f1a5c5be24.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/66/documentnumbercounterentity_665fa52a65aaf5309e56d1ee239d8d48 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/66/documentnumbercounterentity_665fa52a65aaf5309e56d1ee239d8d48.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/66/sha1_66e6dcc6acc3f3541177f968539b9ce6 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/66/sha1_66e6dcc6acc3f3541177f968539b9ce6.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/68/v5_68c452f27d93aa45cead3864553364cb create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/68/v5_68c452f27d93aa45cead3864553364cb.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6b/migrationservice_6bb0fde7b04e8e16815dc23ab0aff0f6 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6b/migrationservice_6bb0fde7b04e8e16815dc23ab0aff0f6.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6b/organizationentity_6b3ce0cffafbe10506b3d48552a95df7 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6b/organizationentity_6b3ce0cffafbe10506b3d48552a95df7.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6c/correspondencestatusentity_6cd9674f6d716087b5f3d16aa634606c create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6c/correspondencestatusentity_6cd9674f6d716087b5f3d16aa634606c.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6c/filestoragecontroller_6c267c2f0fe72bae92837146680df4ea create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6c/filestoragecontroller_6c267c2f0fe72bae92837146680df4ea.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/71/abilityfactory_71acd4f06948161a9038ed8bb92a44d9 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/71/abilityfactory_71acd4f06948161a9038ed8bb92a44d9.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/72/projectcontrollerspec_728cd9096ddc1d7290817f9d4949f2e0 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/72/projectcontrollerspec_728cd9096ddc1d7290817f9d4949f2e0.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/73/correspondenceservicespec_734bdcab2dfb6efde612c0805c2de895 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/73/correspondenceservicespec_734bdcab2dfb6efde612c0805c2de895.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/74/shopdrawingrevisionentity_748fcda51980c012ec6452aab8313bfa create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/74/shopdrawingrevisionentity_748fcda51980c012ec6452aab8313bfa.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/75/currentuserdecorator_756d861fb3fbfe77d847637987836a6d create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/75/currentuserdecorator_756d861fb3fbfe77d847637987836a6d.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/75/parseuuidpipe_75a9802dc98f15e3303d636e3033592a create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/75/parseuuidpipe_75a9802dc98f15e3303d636e3033592a.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/76/correspondencereferenceentity_767d26e42d0dcded199e02d8cfeed978 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/76/correspondencereferenceentity_767d26e42d0dcded199e02d8cfeed978.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/76/metricsservice_769bcb0e914a7deb72901e32eaa4559a create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/76/metricsservice_769bcb0e914a7deb72901e32eaa4559a.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/76/version_76c977e478e6d783fbb7d8c7e0fe5b33 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/76/version_76c977e478e6d783fbb7d8c7e0fe5b33.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/uuidbaseentity_7b3e9cd55ed540bfcd8af187ebbdd7de create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/uuidbaseentity_7b3e9cd55ed540bfcd8af187ebbdd7de.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7c/rfastatuscodeentity_7cb73d4ed6d16a9335aa5136ca0c6698 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7c/rfastatuscodeentity_7cb73d4ed6d16a9335aa5136ca0c6698.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7c/virtualcolumnservice_7c27b269e64ebb1a10a212d78f62babf create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7c/virtualcolumnservice_7c27b269e64ebb1a10a212d78f62babf.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/84/searchcorrespondencedto_84ed95e09c7a524e84c9d06242469288 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/84/searchcorrespondencedto_84ed95e09c7a524e84c9d06242469288.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/86/migrationqueuequerydto_86e92c67dbc40015462ab660eb32159d create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/86/migrationqueuequerydto_86e92c67dbc40015462ab660eb32159d.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/89/auditservice_892193ffeea2f7f738d0560b8b65f546 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/89/auditservice_892193ffeea2f7f738d0560b8b65f546.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8a/parse_8a4fbdc5fdee8d9d488883273b5da927 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8a/parse_8a4fbdc5fdee8d9d488883273b5da927.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8b/counterservice_8b1d27b6691bbd260fdee0af6ad9ca3f create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8b/counterservice_8b1d27b6691bbd260fdee0af6ad9ca3f.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8d/authservice_8d6ae9b98ba0de0c46e8600296cc75f9 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8d/authservice_8d6ae9b98ba0de0c46e8600296cc75f9.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8e/manualoverrideservicespec_8e8583e4fc564774b51895736ccdf1f1 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8e/manualoverrideservicespec_8e8583e4fc564774b51895736ccdf1f1.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8f/documentnumberauditentity_8f1d1cd40dada15740cff52014266f7a create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8f/documentnumberauditentity_8f1d1cd40dada15740cff52014266f7a.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8f/manualoverrideservice_8f2885af9b3396edaff274554fed1fb9 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8f/manualoverrideservice_8f2885af9b3396edaff274554fed1fb9.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/90/workflowdslservice_909e15f6dcb6f70cf3679802928c76ce create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/90/workflowdslservice_909e15f6dcb6f70cf3679802928c76ce.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/91/rng_9185b5bf4adcd6c99f571f345039954e create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/91/rng_9185b5bf4adcd6c99f571f345039954e.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/91/v4_91908fa9c1f1402413509327d57a3d17 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/91/v4_91908fa9c1f1402413509327d57a3d17.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/93/jwtrefreshguard_93de3b0a08eb778599bcf4f333440a10 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/93/jwtrefreshguard_93de3b0a08eb778599bcf4f333440a10.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/98/jsonschemaentity_98f89c5c1b7cc2c3d1aa088965d21d23 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/98/jsonschemaentity_98f89c5c1b7cc2c3d1aa088965d21d23.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/99/correspondencetypeentity_997ac5f038b75f4cd42c9c3e9e2adef7 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/99/correspondencetypeentity_997ac5f038b75f4cd42c9c3e9e2adef7.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/99/createprojectdto_9915d0c26c54bc0d6f46c43fd4f57da3 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/99/createprojectdto_9915d0c26c54bc0d6f46c43fd4f57da3.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/99/parseuuidpipespec_99d299cb6228d815df5dc89951f747ab create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/99/parseuuidpipespec_99d299cb6228d815df5dc89951f747ab.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9a/searchjsonschemadto_9a77995363a030e6d1582008441b405e create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9a/searchjsonschemadto_9a77995363a030e6d1582008441b405e.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9b/notificationentity_9ba306f97bcbc6961a6aaa73f7ef7b0e create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9b/notificationentity_9ba306f97bcbc6961a6aaa73f7ef7b0e.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9c/max_9c6c3f2785acbd15308947612bb30e18 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9c/max_9c6c3f2785acbd15308947612bb30e18.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9d/jsonschemacontrollerspec_9dcd614ef36fcf352a01bb00013221d4 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9d/jsonschemacontrollerspec_9dcd614ef36fcf352a01bb00013221d4.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9e/contractdrawingentity_9ee4ac5a7e2bbbe13e27e541a8ffd285 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9e/contractdrawingentity_9ee4ac5a7e2bbbe13e27e541a8ffd285.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a1/asbuiltdrawingrevisionentity_a1ee00f00d5847dc62cefe60d16c955f create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a1/asbuiltdrawingrevisionentity_a1ee00f00d5847dc62cefe60d16c955f.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a2/shopdrawingmaincategoryentity_a28bd1b55d0bad1fa21b22665160c222 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a2/shopdrawingmaincategoryentity_a28bd1b55d0bad1fa21b22665160c222.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a3/importcorrespondencedto_a3ceabf26c8ca26d934edda2b0ed4ab7 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a3/importcorrespondencedto_a3ceabf26c8ca26d934edda2b0ed4ab7.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a4/disciplineentity_a4babfc1dd3a9a2ef918333d11e29a97 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a4/disciplineentity_a4babfc1dd3a9a2ef918333d11e29a97.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/aa/documentnumberingservicespec_aa9ebc4d0a97b6c3a1ddebf9c9b22032 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/aa/documentnumberingservicespec_aa9ebc4d0a97b6c3a1ddebf9c9b22032.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/aa/migrationreviewqueueentity_aac64a604f7801b0724251867566c1b8 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/aa/migrationreviewqueueentity_aac64a604f7801b0724251867566c1b8.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ad/correspondenceentity_ad8bc364adfe3a46bba930b3a508713d create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ad/correspondenceentity_ad8bc364adfe3a46bba930b3a508713d.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/af/correspondencetagentity_af3367c9adb35a574b84ed144a9fb079 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/af/correspondencetagentity_af3367c9adb35a574b84ed144a9fb079.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b3/searchprojectdto_b37c976b8cc164c77012c317a0db0327 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b3/searchprojectdto_b37c976b8cc164c77012c317a0db0327.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b5/projectservice_b58a6892c260dee338f7b0290c276312 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b5/projectservice_b58a6892c260dee338f7b0290c276312.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bc/v6ToV1_bc94dc67f15a0950896bd74549e92e15 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bc/v6ToV1_bc94dc67f15a0950896bd74549e92e15.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/be/authcontrollerspec_be01d6d478a32ac64cf5ff735bdc6ed3 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/be/authcontrollerspec_be01d6d478a32ac64cf5ff735bdc6ed3.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/be/createcorrespondencedto_bef00686a687b51e0980752a5b6c9571 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/be/createcorrespondencedto_bef00686a687b51e0980752a5b6c9571.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bf/auditdecorator_bf9a30a43b4c7196ee2732450eefc6c2 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bf/auditdecorator_bf9a30a43b4c7196ee2732450eefc6c2.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c0/correspondenceservicespec_c07b2be49127bf1524290034556fef27 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c0/correspondenceservicespec_c07b2be49127bf1524290034556fef27.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c1/userservice_c15380ec5ccdd36a7c9db129b5db65c9 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c1/userservice_c15380ec5ccdd36a7c9db129b5db65c9.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c3/enqueuemigrationdto_c324a9895fd4c321ed46e358d6e90f1f create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c3/enqueuemigrationdto_c324a9895fd4c321ed46e358d6e90f1f.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c4/bulkcanceldto_c47afaa1afa58700a68f20020409a608 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c4/bulkcanceldto_c47afaa1afa58700a68f20020409a608.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c5/workflowdslschema_c5cabd3031f97b9263a01c5f89cb3919 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c5/workflowdslschema_c5cabd3031f97b9263a01c5f89cb3919.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c7/updatecorrespondencedto_c7dbe840ed42bce7da58582be522689e create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c7/updatecorrespondencedto_c7dbe840ed42bce7da58582be522689e.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c9/rfaapprovecodeentity_c9dcda1258d518107c11cd89006e9742 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c9/rfaapprovecodeentity_c9dcda1258d518107c11cd89006e9742.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d0/createmigrationerrordto_d08805f6bb42c0b63831872da96be2f9 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d0/createmigrationerrordto_d08805f6bb42c0b63831872da96be2f9.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d2/refreshtokenentity_d2abd8834c5a4b20225977edc2b18a0f create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d2/refreshtokenentity_d2abd8834c5a4b20225977edc2b18a0f.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d2/stringify_d2cd26e64927689c4a6f754c87f57dac create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d2/stringify_d2cd26e64927689c4a6f754c87f57dac.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d3/authservicespec_d358f3290538fb6a6a5cec29846eacd5 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d3/authservicespec_d358f3290538fb6a6a5cec29846eacd5.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/appcontrollerspec_d48812f9f2031cb8a9251911e95fef18 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/appcontrollerspec_d48812f9f2031cb8a9251911e95fef18.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/asbuiltdrawingentity_d4d4692454e74d45cfa5b98b15dca8e3 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/asbuiltdrawingentity_d4d4692454e74d45cfa5b98b15dca8e3.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/userpreferenceentity_d4265ce3bf2f4d9f69fac10e9f68acd5 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/userpreferenceentity_d4265ce3bf2f4d9f69fac10e9f68acd5.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d5/correspondenceworkflowservice_d594806472d229cf8c80ddadf6ae4d7e create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d5/correspondenceworkflowservice_d594806472d229cf8c80ddadf6ae4d7e.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d5/filestorageservicespec_d5167b4d60ea5a3678045fd966d840bb create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d5/filestorageservicespec_d5167b4d60ea5a3678045fd966d840bb.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d5/notificationgateway_d57b1a0af4e39fcfe2fabb5f60aff91a create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d5/notificationgateway_d57b1a0af4e39fcfe2fabb5f60aff91a.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d7/rfarevisionentity_d767f95649fe928f8b415acb6077308b create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d7/rfarevisionentity_d767f95649fe928f8b415acb6077308b.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d8/filestorageservice_d8c424ff74b3a97c0b9fa3330d0a60b9 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d8/filestorageservice_d8c424ff74b3a97c0b9fa3330d0a60b9.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d8/workfloweventservice_d8263716c15fd09882d37d13da00fa51 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d8/workfloweventservice_d8263716c15fd09882d37d13da00fa51.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d9/cryptoservice_d94fb8fca20f7a7b18f203fd1141e965 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d9/cryptoservice_d94fb8fca20f7a7b18f203fd1141e965.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d9/updateprojectdto_d94c4ce750d5054f7326d5626a57ca13 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d9/updateprojectdto_d94c4ce750d5054f7326d5626a57ca13.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/da/projectservicespec_daaf06fc7b27b9d454ba3d3f4dcc0121 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/da/projectservicespec_daaf06fc7b27b9d454ba3d3f4dcc0121.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/db/contractdrawingsubcategoryentity_db702410fe427ce5596f5483aea98a15 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/db/contractdrawingsubcategoryentity_db702410fe427ce5596f5483aea98a15.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/de/addreferencedto_de618b4cb1acf6bd3a1dc051d1761ca5 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/de/addreferencedto_de618b4cb1acf6bd3a1dc051d1761ca5.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/de/workflowactiondto_de25df6637f0f6baa62507feb9bba1f7 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/de/workflowactiondto_de25df6637f0f6baa62507feb9bba1f7.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/jsonschemacontroller_df3af79a98cd0cc3642b18f0befcdf94 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/jsonschemacontroller_df3af79a98cd0cc3642b18f0befcdf94.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/jsonsecurityservice_dfc24cb882be3c83955914f235f463d5 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/jsonsecurityservice_dfc24cb882be3c83955914f235f463d5.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/projectentity_df9270cfe86330dbe81d78bdcfac5524 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/projectentity_df9270cfe86330dbe81d78bdcfac5524.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/workflowengineservicespec_dfa2b87d1a4f741ac6f8d136866acaff create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/workflowengineservicespec_dfa2b87d1a4f741ac6f8d136866acaff.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e0/uuidbaseentityspec_e098b8a2511d0107635b195f6fbea8de create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e0/uuidbaseentityspec_e098b8a2511d0107635b195f6fbea8de.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/parserservice_e3eeeec977b0a2ef96ee65e1f116c970 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/parserservice_e3eeeec977b0a2ef96ee65e1f116c970.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/shopdrawingsubcategoryentity_e35b39331cb52779870e0d0e5d2b17fc create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/shopdrawingsubcategoryentity_e35b39331cb52779870e0d0e5d2b17fc.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/userassignmententity_e328ba3a163f74f87685fc110a022bcb create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/userassignmententity_e328ba3a163f74f87685fc110a022bcb.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/correspondencerecipiententity_e6d8c5873482cabb391dfa74e13913fe create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/correspondencerecipiententity_e6d8c5873482cabb391dfa74e13913fe.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/correspondenceservice_e6c952ee6661779150c964b393cfe3e9 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/correspondenceservice_e6c952ee6661779150c964b393cfe3e9.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/migrationcontrollerspec_e621314ae9ea57aa03badc4fddd55cfb create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/migrationcontrollerspec_e621314ae9ea57aa03badc4fddd55cfb.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e9/rfatypeentity_e9a71dc19d0a819fbe0ae761ce9a21f2 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e9/rfatypeentity_e9a71dc19d0a819fbe0ae761ce9a21f2.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ea/logindto_ea9943d8075027b5c18f2644b208cae7 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ea/logindto_ea9943d8075027b5c18f2644b208cae7.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/eb/submitcorrespondencedto_ebb04387677382f14e1f652c45891954 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/eb/submitcorrespondencedto_ebb04387677382f14e1f652c45891954.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ec/v1ToV6_ec131fd3e0527fc11743e8d943583a0f create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ec/v1ToV6_ec131fd3e0527fc11743e8d943583a0f.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ee/attachmententity_ee6169e7532be32869b3706b38c31ae6 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ee/attachmententity_ee6169e7532be32869b3706b38c31ae6.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ee/workflowinstanceentity_eeff4ca20af4844957e9c398a4e1a62f create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ee/workflowinstanceentity_eeff4ca20af4844957e9c398a4e1a62f.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ef/searchservice_efc26b5aacfbd6df8c915e34775e0b66 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ef/searchservice_efc26b5aacfbd6df8c915e34775e0b66.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f0/rfaentity_f073b741f89f84f3a87b305bb53a4285 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f0/rfaentity_f073b741f89f84f3a87b305bb53a4285.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f0/v6_f0e9bebcaffc237d2d87341e893e8a15 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f0/v6_f0e9bebcaffc237d2d87341e893e8a15.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f7/contractdrawingcategoryentity_f7e4dfe86e367746d72c3af0ff6cf9f8 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f7/contractdrawingcategoryentity_f7e4dfe86e367746d72c3af0ff6cf9f8.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fc/documentnumberreservationentity_fc2513a9000bc0c62e55ef0a27371865 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fc/documentnumberreservationentity_fc2513a9000bc0c62e55ef0a27371865.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fc/regex_fc3895a35aab4118dfe668d885715538 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fc/regex_fc3895a35aab4118dfe668d885715538.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fd/userentity_fdca98e7b265cfba4cee3f0fcd57da00 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fd/userentity_fdca98e7b265cfba4cee3f0fcd57da00.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fd/workflowinterface_fd7580bd648c3465dfcf9cf53ba3d4ea create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fd/workflowinterface_fd7580bd648c3465dfcf9cf53ba3d4ea.map create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ff/v1_ff3aea057c914bf134f062778c2320f8 create mode 100644 backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ff/v1_ff3aea057c914bf134f062778c2320f8.map diff --git a/backend/src/.jest-cache/haste-map-51fed4c0665a260afb7eef9c4f4e1366-661f9c4a99782bf15c49c5484e27323b-57a192785d1688a165b9d928bb0781fb b/backend/src/.jest-cache/haste-map-51fed4c0665a260afb7eef9c4f4e1366-661f9c4a99782bf15c49c5484e27323b-57a192785d1688a165b9d928bb0781fb index 177ba017dcdabf45802475b293f1f4c07af79ce7..1925a75743a5dfc54dbd9404f51437ffc1570fda 100644 GIT binary patch delta 1491 zcmY*ZYfzI%6z%;a3132hn1qB7lmtex@{%GlpcHXxCu#w;j#xm0h**$<$~Y=0NDEeN z9rcWUJ{a4I){4AjMUbksYMENCL{Tef0qZ!50;2f9N3luC^zrNNp1XT??>%R??2toi zrNib&7`;g97FAe!zIkP|$-z|f8JWZ;&g5uhQaq~CGhfn(;9o2m;+&ifh1!iJiEr_E zpiG31G7X`sS=gvFBhobs4=@eTxa5;jqZeD zVh>_MqzD`3#{7JrbL^_$4nl7d&n)jwC+0o6hHx%YiwQvw(O7Sb&S)Q_zyx18I~8>R3UDABX;TtYl0vVOO9Q=0KkOksqtZ z9FspaMnwdtMu)IZ`^r&U2m7I1v5}cE{IWINB*%c7-!b z*bY+nIN8-J?sKqjD3V}FVKA!-UqKE|=A z1qX;m*`};@{z76OPTQzNZX6HuV<}6?>~zNM)m_-MoX4?T9m~qIHn2L^8v)xS$n26s zoPUn7f~7>GVR)%VM4=qd{FD$CRHA7O&jJefXjn!`AE7OQ7p{xR2?Zritb6Ag?r+J` z_T)%~Tdw2|$+xa3_*}wr%dBo2CmdFh_8&}kFp9_*Y_o~nhqU^6xLB8m4M(NSQtw4r(O|}u zdOdoNEoRpnk_q!qtfOg&{UOjM(f^uFM^vhRpV(ecyGCXtp3=gSqk^nMj#KR;5qx~6 zs+#)kE^3UhFYLz7kE zTiCrV?^U(Qz}}`Xvk^G5Fwu6zw-;2x^lc^!Gd1+*V}I2DO=)x_vBJ zAqD*J@(65q!9cu(@wYq(`nx(*-&VkLwhQ8Gow2p!edhB=v6w|Y(hv-N8eDoDhuM!; zm4@|^;IFb?bnlaS2z!#u=xGZv;W-A@4c!X`SpN#tzQ};$#Rlf}@+iUd zIsqZC)wuR*E)pAfR`I%#&@zyX`vX#J8kow$-ehw&hYL;|-4nheN~n9n(JP6NB%@Wr zLn#&1b;>A+giqyk1CgtEAzMyL!Cg)M~sD64jknQVt16hLWc+ rM?tAV#86r(oK(>2Ix8k8O?ZLGI3zPUJ0kooqbM^gC1aU&lq>oR!T@r= delta 1446 zcmYLIdr;I>6z2TcUG|5&3;SYuv#jJZM2wMw6htxCaSRzz1`rnU1qhOwr9pz3XlbI~ z;7<+TOeQFxS0qqGEz_AyF-=oaU_?PQd1Jh!WpSqa&pqed^O$?S?|WDzDkv1?v^h?b z7_8=6Wv*QN0etU(~gu8el~ID5i9bwA@V_eg$^xK?9e`0t+ikH#QKl*Ax4q0VU$r~XY$udjH?yVyr_fue1 z6_1<#9k>b=)&(s@+*c!*Joq>v#m^Bpra8k^FGFic8H#*|{AcXwgeZb|>?^3pwBz{n z*DOEOKKpM_jry_HKNH#;gY6l!AEnWo9DLySUw_ z#Xy#vz1p-{hwU*uOU>KEvDN!Kh=~qm*s{#RG-6pN1_`Yv`z^3%7K>3;6iFk|cG44y zqI{fkmf~)4I&{UQEUe@;$L^QqayWB#9sBm&oM9MUu(jeoYR<=@;({w;&zn#>$q}YX z5nFIUL8z--iCLBD96lgr>Gwu+n03yrkX&_uo5S_KDBV9I@ZV;9>aH&1!x=&kV3EH(O&a|wON!n{ji(`Jq;&( zzC;DP#(B7Sp2z-Y3Cz?;!@=H0TWn6T$Lwcvcs&0QIn7F}Zdyx$*ws7+Y0E|lF2NpoZE{xnGEgFHl$sM2b*s=- zw+(yh;w%A{TJOb~3C1HaLWT(q>kz$oC~L^(QSu}a`3<`)e7N<<1_#VCe5bY!k284o z)X3^w4)@M5*mUZSHFXlgy5rH*wSt}Qen9Zs;DDn&C2;9c zBLCke7<+fa)R$(yol(=9%&Pm&5xNIrp&rm;%Rn@n|K=9uHjy$H6oIpYuDL-pzqE(q zIKe2QXd%*?+RE}p)Mq0&$thDfEu$5}AsMO4_Q`1?3770>?htif3krK`HLsG#Hz(}N zK2_46BusW7H=#yDONDYRWeCAqT3=?4$%!*eMOLAsa8pex1bEpBB^t6pd6&ElY8p@U hzU5V?q#3$^HzI>|N_<*ifR#a { + let controller; + let mockFileStorageService; + beforeEach(async () => { + mockFileStorageService = { + upload: jest.fn(), + download: jest.fn(), + delete: jest.fn(), + }; + const module = await testing_1.Test.createTestingModule({ + controllers: [file_storage_controller_1.FileStorageController], + providers: [ + { + provide: file_storage_service_1.FileStorageService, + useValue: mockFileStorageService, + }, + ], + }).compile(); + controller = module.get(file_storage_controller_1.FileStorageController); + }); + it('should be defined', () => { + expect(controller).toBeDefined(); + }); + describe('uploadFile', () => { + it('should upload a file successfully', async () => { + const mockFile = { + originalname: 'test.pdf', + buffer: Buffer.from('test'), + mimetype: 'application/pdf', + size: 100, + }; + const mockResult = { attachment_id: 1, originalFilename: 'test.pdf' }; + mockFileStorageService.upload.mockResolvedValue(mockResult); + const mockReq = { + user: { user_id: 1, username: 'testuser' }, + }; + const _result = await controller.uploadFile(mockFile, mockReq); + expect(mockFileStorageService.upload).toHaveBeenCalledWith(mockFile, 1); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxmaWxlLXN0b3JhZ2VcXGZpbGUtc3RvcmFnZS5jb250cm9sbGVyLnNwZWMudHMiLCJtYXBwaW5ncyI6Ijs7QUFBQSw2Q0FBc0Q7QUFDdEQsdUVBQWtFO0FBQ2xFLGlFQUE0RDtBQUc1RCxRQUFRLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO0lBQ3JDLElBQUksVUFBaUMsQ0FBQztJQUN0QyxJQUFJLHNCQUFtRCxDQUFDO0lBRXhELFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNwQixzQkFBc0IsR0FBRztZQUN2QixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNqQixRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNuQixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtTQUNsQixDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQWtCLE1BQU0sY0FBSSxDQUFDLG1CQUFtQixDQUFDO1lBQzNELFdBQVcsRUFBRSxDQUFDLCtDQUFxQixDQUFDO1lBQ3BDLFNBQVMsRUFBRTtnQkFDVDtvQkFDRSxPQUFPLEVBQUUseUNBQWtCO29CQUMzQixRQUFRLEVBQUUsc0JBQXNCO2lCQUNqQzthQUNGO1NBQ0YsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRWIsVUFBVSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQXdCLCtDQUFxQixDQUFDLENBQUM7SUFDeEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxFQUFFO1FBQzNCLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNuQyxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFO1FBQzFCLEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNqRCxNQUFNLFFBQVEsR0FBRztnQkFDZixZQUFZLEVBQUUsVUFBVTtnQkFDeEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUMzQixRQUFRLEVBQUUsaUJBQWlCO2dCQUMzQixJQUFJLEVBQUUsR0FBRzthQUNhLENBQUM7WUFFekIsTUFBTSxVQUFVLEdBQUcsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxDQUFDO1lBQ3JFLHNCQUFzQixDQUFDLE1BQW9CLENBQUMsaUJBQWlCLENBQzVELFVBQVUsQ0FDWCxDQUFDO1lBRUYsTUFBTSxPQUFPLEdBQUc7Z0JBQ2QsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFO2FBQ2IsQ0FBQztZQUNoQyxNQUFNLE9BQU8sR0FBRyxNQUFNLFVBQVUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBRS9ELE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXGNvbW1vblxcZmlsZS1zdG9yYWdlXFxmaWxlLXN0b3JhZ2UuY29udHJvbGxlci5zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlc3QsIFRlc3RpbmdNb2R1bGUgfSBmcm9tICdAbmVzdGpzL3Rlc3RpbmcnO1xuaW1wb3J0IHsgRmlsZVN0b3JhZ2VDb250cm9sbGVyIH0gZnJvbSAnLi9maWxlLXN0b3JhZ2UuY29udHJvbGxlcic7XG5pbXBvcnQgeyBGaWxlU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuL2ZpbGUtc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcXVlc3RXaXRoVXNlciB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVxdWVzdC13aXRoLXVzZXIuaW50ZXJmYWNlJztcblxuZGVzY3JpYmUoJ0ZpbGVTdG9yYWdlQ29udHJvbGxlcicsICgpID0+IHtcbiAgbGV0IGNvbnRyb2xsZXI6IEZpbGVTdG9yYWdlQ29udHJvbGxlcjtcbiAgbGV0IG1vY2tGaWxlU3RvcmFnZVNlcnZpY2U6IFBhcnRpYWw8RmlsZVN0b3JhZ2VTZXJ2aWNlPjtcblxuICBiZWZvcmVFYWNoKGFzeW5jICgpID0+IHtcbiAgICBtb2NrRmlsZVN0b3JhZ2VTZXJ2aWNlID0ge1xuICAgICAgdXBsb2FkOiBqZXN0LmZuKCksXG4gICAgICBkb3dubG9hZDogamVzdC5mbigpLFxuICAgICAgZGVsZXRlOiBqZXN0LmZuKCksXG4gICAgfTtcblxuICAgIGNvbnN0IG1vZHVsZTogVGVzdGluZ01vZHVsZSA9IGF3YWl0IFRlc3QuY3JlYXRlVGVzdGluZ01vZHVsZSh7XG4gICAgICBjb250cm9sbGVyczogW0ZpbGVTdG9yYWdlQ29udHJvbGxlcl0sXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IEZpbGVTdG9yYWdlU2VydmljZSxcbiAgICAgICAgICB1c2VWYWx1ZTogbW9ja0ZpbGVTdG9yYWdlU2VydmljZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSkuY29tcGlsZSgpO1xuXG4gICAgY29udHJvbGxlciA9IG1vZHVsZS5nZXQ8RmlsZVN0b3JhZ2VDb250cm9sbGVyPihGaWxlU3RvcmFnZUNvbnRyb2xsZXIpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJlIGRlZmluZWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGNvbnRyb2xsZXIpLnRvQmVEZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd1cGxvYWRGaWxlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdXBsb2FkIGEgZmlsZSBzdWNjZXNzZnVsbHknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBtb2NrRmlsZSA9IHtcbiAgICAgICAgb3JpZ2luYWxuYW1lOiAndGVzdC5wZGYnLFxuICAgICAgICBidWZmZXI6IEJ1ZmZlci5mcm9tKCd0ZXN0JyksXG4gICAgICAgIG1pbWV0eXBlOiAnYXBwbGljYXRpb24vcGRmJyxcbiAgICAgICAgc2l6ZTogMTAwLFxuICAgICAgfSBhcyBFeHByZXNzLk11bHRlci5GaWxlO1xuXG4gICAgICBjb25zdCBtb2NrUmVzdWx0ID0geyBhdHRhY2htZW50X2lkOiAxLCBvcmlnaW5hbEZpbGVuYW1lOiAndGVzdC5wZGYnIH07XG4gICAgICAobW9ja0ZpbGVTdG9yYWdlU2VydmljZS51cGxvYWQgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZShcbiAgICAgICAgbW9ja1Jlc3VsdFxuICAgICAgKTtcblxuICAgICAgY29uc3QgbW9ja1JlcSA9IHtcbiAgICAgICAgdXNlcjogeyB1c2VyX2lkOiAxLCB1c2VybmFtZTogJ3Rlc3R1c2VyJyB9LFxuICAgICAgfSBhcyB1bmtub3duIGFzIFJlcXVlc3RXaXRoVXNlcjtcbiAgICAgIGNvbnN0IF9yZXN1bHQgPSBhd2FpdCBjb250cm9sbGVyLnVwbG9hZEZpbGUobW9ja0ZpbGUsIG1vY2tSZXEpO1xuXG4gICAgICBleHBlY3QobW9ja0ZpbGVTdG9yYWdlU2VydmljZS51cGxvYWQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKG1vY2tGaWxlLCAxKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/01/filestoragecontrollerspec_01f22c35c4e8dac55125442b982e36b1.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/01/filestoragecontrollerspec_01f22c35c4e8dac55125442b982e36b1.map new file mode 100644 index 0000000..88ead8d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/01/filestoragecontrollerspec_01f22c35c4e8dac55125442b982e36b1.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\file-storage\\file-storage.controller.spec.ts","mappings":";;AAAA,6CAAsD;AACtD,uEAAkE;AAClE,iEAA4D;AAG5D,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAI,UAAiC,CAAC;IACtC,IAAI,sBAAmD,CAAC;IAExD,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,sBAAsB,GAAG;YACvB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;YACjB,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;YACnB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;SAClB,CAAC;QAEF,MAAM,MAAM,GAAkB,MAAM,cAAI,CAAC,mBAAmB,CAAC;YAC3D,WAAW,EAAE,CAAC,+CAAqB,CAAC;YACpC,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,yCAAkB;oBAC3B,QAAQ,EAAE,sBAAsB;iBACjC;aACF;SACF,CAAC,CAAC,OAAO,EAAE,CAAC;QAEb,UAAU,GAAG,MAAM,CAAC,GAAG,CAAwB,+CAAqB,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,QAAQ,GAAG;gBACf,YAAY,EAAE,UAAU;gBACxB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC3B,QAAQ,EAAE,iBAAiB;gBAC3B,IAAI,EAAE,GAAG;aACa,CAAC;YAEzB,MAAM,UAAU,GAAG,EAAE,aAAa,EAAE,CAAC,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC;YACrE,sBAAsB,CAAC,MAAoB,CAAC,iBAAiB,CAC5D,UAAU,CACX,CAAC;YAEF,MAAM,OAAO,GAAG;gBACd,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE;aACb,CAAC;YAChC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAE/D,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\file-storage\\file-storage.controller.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\nimport { FileStorageController } from './file-storage.controller';\nimport { FileStorageService } from './file-storage.service';\nimport { RequestWithUser } from '../interfaces/request-with-user.interface';\n\ndescribe('FileStorageController', () => {\n let controller: FileStorageController;\n let mockFileStorageService: Partial;\n\n beforeEach(async () => {\n mockFileStorageService = {\n upload: jest.fn(),\n download: jest.fn(),\n delete: jest.fn(),\n };\n\n const module: TestingModule = await Test.createTestingModule({\n controllers: [FileStorageController],\n providers: [\n {\n provide: FileStorageService,\n useValue: mockFileStorageService,\n },\n ],\n }).compile();\n\n controller = module.get(FileStorageController);\n });\n\n it('should be defined', () => {\n expect(controller).toBeDefined();\n });\n\n describe('uploadFile', () => {\n it('should upload a file successfully', async () => {\n const mockFile = {\n originalname: 'test.pdf',\n buffer: Buffer.from('test'),\n mimetype: 'application/pdf',\n size: 100,\n } as Express.Multer.File;\n\n const mockResult = { attachment_id: 1, originalFilename: 'test.pdf' };\n (mockFileStorageService.upload as jest.Mock).mockResolvedValue(\n mockResult\n );\n\n const mockReq = {\n user: { user_id: 1, username: 'testuser' },\n } as unknown as RequestWithUser;\n const _result = await controller.uploadFile(mockFile, mockReq);\n\n expect(mockFileStorageService.upload).toHaveBeenCalledWith(mockFile, 1);\n });\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/02/rfaitementity_0240c1ba7ad97cfdf085dd8677bd13ce b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/02/rfaitementity_0240c1ba7ad97cfdf085dd8677bd13ce new file mode 100644 index 0000000..7f01d3e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/02/rfaitementity_0240c1ba7ad97cfdf085dd8677bd13ce @@ -0,0 +1,66 @@ +c859336883fb06670865a3ea9c584369 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RfaItem = void 0; +const typeorm_1 = require("typeorm"); +const rfa_revision_entity_1 = require("./rfa-revision.entity"); +const asbuilt_drawing_revision_entity_1 = require("../../drawing/entities/asbuilt-drawing-revision.entity"); +const shop_drawing_revision_entity_1 = require("../../drawing/entities/shop-drawing-revision.entity"); +let RfaItem = class RfaItem { +}; +exports.RfaItem = RfaItem; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], RfaItem.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'rfa_revision_id' }), + __metadata("design:type", Number) +], RfaItem.prototype, "rfaRevisionId", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'item_type', + type: 'enum', + enum: ['SHOP', 'AS_BUILT'], + }), + __metadata("design:type", String) +], RfaItem.prototype, "itemType", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'shop_drawing_revision_id', nullable: true }), + __metadata("design:type", Number) +], RfaItem.prototype, "shopDrawingRevisionId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'asbuilt_drawing_revision_id', nullable: true }), + __metadata("design:type", Number) +], RfaItem.prototype, "asBuiltDrawingRevisionId", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => rfa_revision_entity_1.RfaRevision, (rfaRev) => rfaRev.items, { + onDelete: 'CASCADE', + }), + (0, typeorm_1.JoinColumn)({ name: 'rfa_revision_id' }), + __metadata("design:type", typeof (_a = typeof rfa_revision_entity_1.RfaRevision !== "undefined" && rfa_revision_entity_1.RfaRevision) === "function" ? _a : Object) +], RfaItem.prototype, "rfaRevision", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => shop_drawing_revision_entity_1.ShopDrawingRevision), + (0, typeorm_1.JoinColumn)({ name: 'shop_drawing_revision_id' }), + __metadata("design:type", typeof (_b = typeof shop_drawing_revision_entity_1.ShopDrawingRevision !== "undefined" && shop_drawing_revision_entity_1.ShopDrawingRevision) === "function" ? _b : Object) +], RfaItem.prototype, "shopDrawingRevision", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => asbuilt_drawing_revision_entity_1.AsBuiltDrawingRevision), + (0, typeorm_1.JoinColumn)({ name: 'asbuilt_drawing_revision_id' }), + __metadata("design:type", typeof (_c = typeof asbuilt_drawing_revision_entity_1.AsBuiltDrawingRevision !== "undefined" && asbuilt_drawing_revision_entity_1.AsBuiltDrawingRevision) === "function" ? _c : Object) +], RfaItem.prototype, "asBuiltDrawingRevision", void 0); +exports.RfaItem = RfaItem = __decorate([ + (0, typeorm_1.Entity)('rfa_items') +], RfaItem); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccmZhXFxlbnRpdGllc1xccmZhLWl0ZW0uZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FNaUI7QUFDakIsK0RBQW9EO0FBQ3BELDRHQUFnRztBQUNoRyxzR0FBMEY7QUFHbkYsSUFBTSxPQUFPLEdBQWIsTUFBTSxPQUFPO0NBa0NuQixDQUFBO0FBbENZLDBCQUFPO0FBRWxCO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7bUNBQ2I7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDOzs4Q0FDYjtBQU92QjtJQUxDLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSxXQUFXO1FBQ2pCLElBQUksRUFBRSxNQUFNO1FBQ1osSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQztLQUMzQixDQUFDOzt5Q0FDNkI7QUFHL0I7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOztzREFDOUI7QUFHL0I7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsNkJBQTZCLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzt5REFDOUI7QUFPbEM7SUFKQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsaUNBQVcsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUN0RCxRQUFRLEVBQUUsU0FBUztLQUNwQixDQUFDO0lBQ0QsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUM7a0RBQzFCLGlDQUFXLG9CQUFYLGlDQUFXOzRDQUFDO0FBSTFCO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLGtEQUFtQixDQUFDO0lBQ3BDLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxDQUFDO2tEQUMzQixrREFBbUIsb0JBQW5CLGtEQUFtQjtvREFBQztBQUkxQztJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyx3REFBc0IsQ0FBQztJQUN2QyxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsNkJBQTZCLEVBQUUsQ0FBQztrREFDM0Isd0RBQXNCLG9CQUF0Qix3REFBc0I7dURBQUM7a0JBakNyQyxPQUFPO0lBRG5CLElBQUEsZ0JBQU0sRUFBQyxXQUFXLENBQUM7R0FDUCxPQUFPLENBa0NuQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxyZmFcXGVudGl0aWVzXFxyZmEtaXRlbS5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29sdW1uLFxuICBFbnRpdHksXG4gIEpvaW5Db2x1bW4sXG4gIE1hbnlUb09uZSxcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbn0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBSZmFSZXZpc2lvbiB9IGZyb20gJy4vcmZhLXJldmlzaW9uLmVudGl0eSc7XG5pbXBvcnQgeyBBc0J1aWx0RHJhd2luZ1JldmlzaW9uIH0gZnJvbSAnLi4vLi4vZHJhd2luZy9lbnRpdGllcy9hc2J1aWx0LWRyYXdpbmctcmV2aXNpb24uZW50aXR5JztcbmltcG9ydCB7IFNob3BEcmF3aW5nUmV2aXNpb24gfSBmcm9tICcuLi8uLi9kcmF3aW5nL2VudGl0aWVzL3Nob3AtZHJhd2luZy1yZXZpc2lvbi5lbnRpdHknO1xuXG5ARW50aXR5KCdyZmFfaXRlbXMnKVxuZXhwb3J0IGNsYXNzIFJmYUl0ZW0ge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIGlkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmZhX3JldmlzaW9uX2lkJyB9KVxuICByZmFSZXZpc2lvbklkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oe1xuICAgIG5hbWU6ICdpdGVtX3R5cGUnLFxuICAgIHR5cGU6ICdlbnVtJyxcbiAgICBlbnVtOiBbJ1NIT1AnLCAnQVNfQlVJTFQnXSxcbiAgfSlcbiAgaXRlbVR5cGUhOiAnU0hPUCcgfCAnQVNfQlVJTFQnO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnc2hvcF9kcmF3aW5nX3JldmlzaW9uX2lkJywgbnVsbGFibGU6IHRydWUgfSlcbiAgc2hvcERyYXdpbmdSZXZpc2lvbklkPzogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnYXNidWlsdF9kcmF3aW5nX3JldmlzaW9uX2lkJywgbnVsbGFibGU6IHRydWUgfSlcbiAgYXNCdWlsdERyYXdpbmdSZXZpc2lvbklkPzogbnVtYmVyO1xuXG4gIC8vIFJlbGF0aW9uc1xuICBATWFueVRvT25lKCgpID0+IFJmYVJldmlzaW9uLCAocmZhUmV2KSA9PiByZmFSZXYuaXRlbXMsIHtcbiAgICBvbkRlbGV0ZTogJ0NBU0NBREUnLFxuICB9KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdyZmFfcmV2aXNpb25faWQnIH0pXG4gIHJmYVJldmlzaW9uITogUmZhUmV2aXNpb247XG5cbiAgQE1hbnlUb09uZSgoKSA9PiBTaG9wRHJhd2luZ1JldmlzaW9uKVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdzaG9wX2RyYXdpbmdfcmV2aXNpb25faWQnIH0pXG4gIHNob3BEcmF3aW5nUmV2aXNpb24/OiBTaG9wRHJhd2luZ1JldmlzaW9uO1xuXG4gIEBNYW55VG9PbmUoKCkgPT4gQXNCdWlsdERyYXdpbmdSZXZpc2lvbilcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAnYXNidWlsdF9kcmF3aW5nX3JldmlzaW9uX2lkJyB9KVxuICBhc0J1aWx0RHJhd2luZ1JldmlzaW9uPzogQXNCdWlsdERyYXdpbmdSZXZpc2lvbjtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/02/rfaitementity_0240c1ba7ad97cfdf085dd8677bd13ce.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/02/rfaitementity_0240c1ba7ad97cfdf085dd8677bd13ce.map new file mode 100644 index 0000000..b69de76 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/02/rfaitementity_0240c1ba7ad97cfdf085dd8677bd13ce.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-item.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAMiB;AACjB,+DAAoD;AACpD,4GAAgG;AAChG,sGAA0F;AAGnF,IAAM,OAAO,GAAb,MAAM,OAAO;CAkCnB,CAAA;AAlCY,0BAAO;AAElB;IADC,IAAA,gCAAsB,GAAE;;mCACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;;8CACb;AAOvB;IALC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;KAC3B,CAAC;;yCAC6B;AAG/B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sDAC9B;AAG/B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,6BAA6B,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yDAC9B;AAOlC;IAJC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,iCAAW,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE;QACtD,QAAQ,EAAE,SAAS;KACpB,CAAC;IACD,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;kDAC1B,iCAAW,oBAAX,iCAAW;4CAAC;AAI1B;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kDAAmB,CAAC;IACpC,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;kDAC3B,kDAAmB,oBAAnB,kDAAmB;oDAAC;AAI1C;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wDAAsB,CAAC;IACvC,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,6BAA6B,EAAE,CAAC;kDAC3B,wDAAsB,oBAAtB,wDAAsB;uDAAC;kBAjCrC,OAAO;IADnB,IAAA,gBAAM,EAAC,WAAW,CAAC;GACP,OAAO,CAkCnB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-item.entity.ts"],"sourcesContent":["import {\n Column,\n Entity,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n} from 'typeorm';\nimport { RfaRevision } from './rfa-revision.entity';\nimport { AsBuiltDrawingRevision } from '../../drawing/entities/asbuilt-drawing-revision.entity';\nimport { ShopDrawingRevision } from '../../drawing/entities/shop-drawing-revision.entity';\n\n@Entity('rfa_items')\nexport class RfaItem {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'rfa_revision_id' })\n rfaRevisionId!: number;\n\n @Column({\n name: 'item_type',\n type: 'enum',\n enum: ['SHOP', 'AS_BUILT'],\n })\n itemType!: 'SHOP' | 'AS_BUILT';\n\n @Column({ name: 'shop_drawing_revision_id', nullable: true })\n shopDrawingRevisionId?: number;\n\n @Column({ name: 'asbuilt_drawing_revision_id', nullable: true })\n asBuiltDrawingRevisionId?: number;\n\n // Relations\n @ManyToOne(() => RfaRevision, (rfaRev) => rfaRev.items, {\n onDelete: 'CASCADE',\n })\n @JoinColumn({ name: 'rfa_revision_id' })\n rfaRevision!: RfaRevision;\n\n @ManyToOne(() => ShopDrawingRevision)\n @JoinColumn({ name: 'shop_drawing_revision_id' })\n shopDrawingRevision?: ShopDrawingRevision;\n\n @ManyToOne(() => AsBuiltDrawingRevision)\n @JoinColumn({ name: 'asbuilt_drawing_revision_id' })\n asBuiltDrawingRevision?: AsBuiltDrawingRevision;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/03/organizationservice_031ecbbe4d01ad3d9a68be397c5645b1 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/03/organizationservice_031ecbbe4d01ad3d9a68be397c5645b1 new file mode 100644 index 0000000..cf49c06 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/03/organizationservice_031ecbbe4d01ad3d9a68be397c5645b1 @@ -0,0 +1,102 @@ +1537bd61cc4b0645c5d4697e84aeeef5 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.OrganizationService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const organization_entity_1 = require("./entities/organization.entity"); +let OrganizationService = class OrganizationService { + constructor(orgRepo) { + this.orgRepo = orgRepo; + } + async create(dto) { + const existing = await this.orgRepo.findOne({ + where: { organizationCode: dto.organizationCode }, + }); + if (existing) { + throw new common_1.ConflictException(`Organization Code "${dto.organizationCode}" already exists`); + } + const org = this.orgRepo.create(dto); + return this.orgRepo.save(org); + } + async findAll(params) { + const { search, roleId, projectId, page = 1, limit = 100 } = params || {}; + const skip = (page - 1) * limit; + // Start with a basic query builder to handle dynamic conditions easily + const queryBuilder = this.orgRepo.createQueryBuilder('org'); + if (search) { + queryBuilder.andWhere('(org.organizationCode LIKE :search OR org.organizationName LIKE :search)', { search: `%${search}%` }); + } + // [Refactor] Support filtering by roleId (e.g., getting all CONTRACTORS) + if (roleId) { + // Assuming there is a relation or a way to filter by role. + // If Organization has a roleId column directly: + queryBuilder.andWhere('org.roleId = :roleId', { roleId }); + } + // [New] Support filtering by projectId (e.g. organizations in a project) + // Assuming a Many-to-Many or One-to-Many relation exists via ProjectOrganization + if (projectId) { + // Use raw join to avoid circular dependency with ProjectOrganization entity + queryBuilder.innerJoin('project_organizations', 'po', 'po.organization_id = org.id AND po.project_id = :projectId', { projectId }); + } + queryBuilder.orderBy('org.organizationCode', 'ASC').skip(skip).take(limit); + const [data, total] = await queryBuilder.getManyAndCount(); + return { + data, + meta: { + total, + page, + limit, + totalPages: Math.ceil(total / limit), + }, + }; + } + async findOne(id) { + const org = await this.orgRepo.findOne({ where: { id } }); + if (!org) + throw new common_1.NotFoundException(`Organization ID ${id} not found`); + return org; + } + async findOneByUuid(publicId) { + const org = await this.orgRepo.findOne({ where: { publicId } }); + if (!org) + throw new common_1.NotFoundException(`Organization publicId ${publicId} not found`); + return org; + } + async update(uuid, dto) { + const org = await this.findOneByUuid(uuid); + Object.assign(org, dto); + return this.orgRepo.save(org); + } + async remove(uuid) { + const org = await this.findOneByUuid(uuid); + return this.orgRepo.remove(org); + } + async findAllActive() { + return this.orgRepo.find({ + where: { isActive: true }, + order: { organizationCode: 'ASC' }, + }); + } +}; +exports.OrganizationService = OrganizationService; +exports.OrganizationService = OrganizationService = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(organization_entity_1.Organization)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object]) +], OrganizationService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcb3JnYW5pemF0aW9uXFxvcmdhbml6YXRpb24uc2VydmljZS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBSXdCO0FBQ3hCLDZDQUFtRDtBQUNuRCxxQ0FBcUM7QUFDckMsd0VBQThEO0FBS3ZELElBQU0sbUJBQW1CLEdBQXpCLE1BQU0sbUJBQW1CO0lBQzlCLFlBRW1CLE9BQWlDO1FBQWpDLFlBQU8sR0FBUCxPQUFPLENBQTBCO0lBQ2pELENBQUM7SUFFSixLQUFLLENBQUMsTUFBTSxDQUFDLEdBQTBCO1FBQ3JDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDMUMsS0FBSyxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixFQUFFO1NBQ2xELENBQUMsQ0FBQztRQUNILElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksMEJBQWlCLENBQ3pCLHNCQUFzQixHQUFHLENBQUMsZ0JBQWdCLGtCQUFrQixDQUM3RCxDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQUMsTUFNYjtRQUNDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxHQUFHLEVBQUUsR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO1FBQzFFLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUVoQyx1RUFBdUU7UUFDdkUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFD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LENBQUM7Q0FDRixDQUFBO0FBekdZLGtEQUFtQjs4QkFBbkIsbUJBQW1CO0lBRC9CLElBQUEsbUJBQVUsR0FBRTtJQUdSLFdBQUEsSUFBQSwwQkFBZ0IsRUFBQyxrQ0FBWSxDQUFDLENBQUE7eURBQ0wsb0JBQVUsb0JBQVYsb0JBQVU7R0FIM0IsbUJBQW1CLENBeUcvQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxvcmdhbml6YXRpb25cXG9yZ2FuaXphdGlvbi5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgSW5qZWN0YWJsZSxcclxuICBOb3RGb3VuZEV4Y2VwdGlvbixcclxuICBDb25mbGljdEV4Y2VwdGlvbixcclxufSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XHJcbmltcG9ydCB7IEluamVjdFJlcG9zaXRvcnkgfSBmcm9tICdAbmVzdGpzL3R5cGVvcm0nO1xyXG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSAndHlwZW9ybSc7XHJcbmltcG9ydCB7IE9yZ2FuaXphdGlvbiB9IGZyb20gJy4vZW50aXRpZXMvb3JnYW5pemF0aW9uLmVudGl0eSc7XHJcbmltcG9ydCB7IENyZWF0ZU9yZ2FuaXphdGlvbkR0byB9IGZyb20gJy4vZHRvL2NyZWF0ZS1vcmdhbml6YXRpb24uZHRvLmpzJztcclxuaW1wb3J0IHsgVXBkYXRlT3JnYW5pemF0aW9uRHRvIH0gZnJvbSAnLi9kdG8vdXBkYXRlLW9yZ2FuaXphdGlvbi5kdG8uanMnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgT3JnYW5pemF0aW9uU2VydmljZSB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShPcmdhbml6YXRpb24pXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9yZ1JlcG86IFJlcG9zaXRvcnk8T3JnYW5pemF0aW9uPlxyXG4gICkge31cclxuXHJcbiAgYXN5bmMgY3JlYXRlKGR0bzogQ3JlYXRlT3JnYW5pemF0aW9uRHRvKSB7XHJcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMub3JnUmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgb3JnYW5pemF0aW9uQ29kZTogZHRvLm9yZ2FuaXphdGlvbkNvZGUgfSxcclxuICAgIH0pO1xyXG4gICAgaWYgKGV4aXN0aW5nKSB7XHJcbiAgICAgIHRocm93IG5ldyBDb25mbGljdEV4Y2VwdGlvbihcclxuICAgICAgICBgT3JnYW5pemF0aW9uIENvZGUgXCIke2R0by5vcmdhbml6YXRpb25Db2RlfVwiIGFscmVhZHkgZXhpc3RzYFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgb3JnID0gdGhpcy5vcmdSZXBvLmNyZWF0ZShkdG8pO1xyXG4gICAgcmV0dXJuIHRoaXMub3JnUmVwby5zYXZlKG9yZyk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBmaW5kQWxsKHBhcmFtcz86IHtcclxuICAgIHNlYXJjaD86IHN0cmluZztcclxuICAgIHJvbGVJZD86IG51bWJlcjtcclxuICAgIHByb2plY3RJZD86IG51bWJlcjtcclxuICAgIHBhZ2U/OiBudW1iZXI7XHJcbiAgICBsaW1pdD86IG51bWJlcjtcclxuICB9KSB7XHJcbiAgICBjb25zdCB7IHNlYXJjaCwgcm9sZUlkLCBwcm9qZWN0SWQsIHBhZ2UgPSAxLCBsaW1pdCA9IDEwMCB9ID0gcGFyYW1zIHx8IHt9O1xyXG4gICAgY29uc3Qgc2tpcCA9IChwYWdlIC0gMSkgKiBsaW1pdDtcclxuXHJcbiAgICAvLyBTdGFydCB3aXRoIGEgYmFzaWMgcXVlcnkgYnVpbGRlciB0byBoYW5kbGUgZHluYW1pYyBjb25kaXRpb25zIGVhc2lseVxyXG4gICAgY29uc3QgcXVlcnlCdWlsZGVyID0gdGhpcy5vcmdSZXBvLmNyZWF0ZVF1ZXJ5QnVpbGRlcignb3JnJyk7XHJcblxyXG4gICAgaWYgKHNlYXJjaCkge1xyXG4gICAgICBxdWVyeUJ1aWxkZXIuYW5kV2hlcmUoXHJcbiAgICAgICAgJyhvcmcub3JnYW5pemF0aW9uQ29kZSBMSUtFIDpzZWFyY2ggT1Igb3JnLm9yZ2FuaXphdGlvbk5hbWUgTElLRSA6c2VhcmNoKScsXHJcbiAgICAgICAgeyBzZWFyY2g6IGAlJHtzZWFyY2h9JWAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFtSZWZhY3Rvcl0gU3VwcG9ydCBmaWx0ZXJpbmcgYnkgcm9sZUlkIChlLmcuLCBnZXR0aW5nIGFsbCBDT05UUkFDVE9SUylcclxuICAgIGlmIChyb2xlSWQpIHtcclxuICAgICAgLy8gQXNzdW1pbmcgdGhlcmUgaXMgYSByZWxhdGlvbiBvciBhIHdheSB0byBmaWx0ZXIgYnkgcm9sZS5cclxuICAgICAgLy8gSWYgT3JnYW5pemF0aW9uIGhhcyBhIHJvbGVJZCBjb2x1bW4gZGlyZWN0bHk6XHJcbiAgICAgIHF1ZXJ5QnVpbGRlci5hbmRXaGVyZSgnb3JnLnJvbGVJZCA9IDpyb2xlSWQnLCB7IHJvbGVJZCB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBbTmV3XSBTdXBwb3J0IGZpbHRlcmluZyBieSBwcm9qZWN0SWQgKGUuZy4gb3JnYW5pemF0aW9ucyBpbiBhIHByb2plY3QpXHJcbiAgICAvLyBBc3N1bWluZyBhIE1hbnktdG8tTWFueSBvciBPbmUtdG8tTWFueSByZWxhdGlvbiBleGlzdHMgdmlhIFByb2plY3RPcmdhbml6YXRpb25cclxuICAgIGlmIChwcm9qZWN0SWQpIHtcclxuICAgICAgLy8gVXNlIHJhdyBqb2luIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3kgd2l0aCBQcm9qZWN0T3JnYW5pemF0aW9uIGVudGl0eVxyXG4gICAgICBxdWVyeUJ1aWxkZXIuaW5uZXJKb2luKFxyXG4gICAgICAgICdwcm9qZWN0X29yZ2FuaXphdGlvbnMnLFxyXG4gICAgICAgICdwbycsXHJcbiAgICAgICAgJ3BvLm9yZ2FuaXphdGlvbl9pZCA9IG9yZy5pZCBBTkQgcG8ucHJvamVjdF9pZCA9IDpwcm9qZWN0SWQnLFxyXG4gICAgICAgIHsgcHJvamVjdElkIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBxdWVyeUJ1aWxkZXIub3JkZXJCeSgnb3JnLm9yZ2FuaXphdGlvbkNvZGUnLCAnQVNDJykuc2tpcChza2lwKS50YWtlKGxpbWl0KTtcclxuXHJcbiAgICBjb25zdCBbZGF0YSwgdG90YWxdID0gYXdhaXQgcXVlcnlCdWlsZGVyLmdldE1hbnlBbmRDb3VudCgpO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGRhdGEsXHJcbiAgICAgIG1ldGE6IHtcclxuICAgICAgICB0b3RhbCxcclxuICAgICAgICBwYWdlLFxyXG4gICAgICAgIGxpbWl0LFxyXG4gICAgICAgIHRvdGFsUGFnZXM6IE1hdGguY2VpbCh0b3RhbCAvIGxpbWl0KSxcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBhc3luYyBmaW5kT25lKGlkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG9yZyA9IGF3YWl0IHRoaXMub3JnUmVwby5maW5kT25lKHsgd2hlcmU6IHsgaWQgfSB9KTtcclxuICAgIGlmICghb3JnKSB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oYE9yZ2FuaXphdGlvbiBJRCAke2lkfSBub3QgZm91bmRgKTtcclxuICAgIHJldHVybiBvcmc7XHJcbiAgfVxyXG5cclxuICBhc3luYyBmaW5kT25lQnlVdWlkKHB1YmxpY0lkOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IG9yZyA9IGF3YWl0IHRoaXMub3JnUmVwby5maW5kT25lKHsgd2hlcmU6IHsgcHVibGljSWQgfSB9KTtcclxuICAgIGlmICghb3JnKVxyXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oXHJcbiAgICAgICAgYE9yZ2FuaXphdGlvbiBwdWJsaWNJZCAke3B1YmxpY0lkfSBub3QgZm91bmRgXHJcbiAgICAgICk7XHJcbiAgICByZXR1cm4gb3JnO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgdXBkYXRlKHV1aWQ6IHN0cmluZywgZHRvOiBVcGRhdGVPcmdhbml6YXRpb25EdG8pIHtcclxuICAgIGNvbnN0IG9yZyA9IGF3YWl0IHRoaXMuZmluZE9uZUJ5VXVpZCh1dWlkKTtcclxuICAgIE9iamVjdC5hc3NpZ24ob3JnLCBkdG8pO1xyXG4gICAgcmV0dXJuIHRoaXMub3JnUmVwby5zYXZlKG9yZyk7XHJcbiAgfVxyXG5cclxuICBhc3luYyByZW1vdmUodXVpZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBvcmcgPSBhd2FpdCB0aGlzLmZpbmRPbmVCeVV1aWQodXVpZCk7XHJcbiAgICByZXR1cm4gdGhpcy5vcmdSZXBvLnJlbW92ZShvcmcpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmluZEFsbEFjdGl2ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm9yZ1JlcG8uZmluZCh7XHJcbiAgICAgIHdoZXJlOiB7IGlzQWN0aXZlOiB0cnVlIH0sXHJcbiAgICAgIG9yZGVyOiB7IG9yZ2FuaXphdGlvbkNvZGU6ICdBU0MnIH0sXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/03/organizationservice_031ecbbe4d01ad3d9a68be397c5645b1.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/03/organizationservice_031ecbbe4d01ad3d9a68be397c5645b1.map new file mode 100644 index 0000000..0920ae2 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/03/organizationservice_031ecbbe4d01ad3d9a68be397c5645b1.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\organization\\organization.service.ts","mappings":";;;;;;;;;;;;;;;;AAAA,2CAIwB;AACxB,6CAAmD;AACnD,qCAAqC;AACrC,wEAA8D;AAKvD,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAC9B,YAEmB,OAAiC;QAAjC,YAAO,GAAP,OAAO,CAA0B;IACjD,CAAC;IAEJ,KAAK,CAAC,MAAM,CAAC,GAA0B;QACrC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YAC1C,KAAK,EAAE,EAAE,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,EAAE;SAClD,CAAC,CAAC;QACH,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,0BAAiB,CACzB,sBAAsB,GAAG,CAAC,gBAAgB,kBAAkB,CAC7D,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAMb;QACC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,GAAG,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;QAC1E,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QAEhC,uEAAuE;QACvE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAE5D,IAAI,MAAM,EAAE,CAAC;YACX,YAAY,CAAC,QAAQ,CACnB,0EAA0E,EAC1E,EAAE,MAAM,EAAE,IAAI,MAAM,GAAG,EAAE,CAC1B,CAAC;QACJ,CAAC;QAED,yEAAyE;QACzE,IAAI,MAAM,EAAE,CAAC;YACX,2DAA2D;YAC3D,gDAAgD;YAChD,YAAY,CAAC,QAAQ,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,yEAAyE;QACzE,iFAAiF;QACjF,IAAI,SAAS,EAAE,CAAC;YACd,4EAA4E;YAC5E,YAAY,CAAC,SAAS,CACpB,uBAAuB,EACvB,IAAI,EACJ,4DAA4D,EAC5D,EAAE,SAAS,EAAE,CACd,CAAC;QACJ,CAAC;QAED,YAAY,CAAC,OAAO,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE3E,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,YAAY,CAAC,eAAe,EAAE,CAAC;QAE3D,OAAO;YACL,IAAI;YACJ,IAAI,EAAE;gBACJ,KAAK;gBACL,IAAI;gBACJ,KAAK;gBACL,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;aACrC;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,0BAAiB,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;QACzE,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAgB;QAClC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,GAAG;YACN,MAAM,IAAI,0BAAiB,CACzB,yBAAyB,QAAQ,YAAY,CAC9C,CAAC;QACJ,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,GAA0B;QACnD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YACvB,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;YACzB,KAAK,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE;SACnC,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AAzGY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,0BAAgB,EAAC,kCAAY,CAAC,CAAA;yDACL,oBAAU,oBAAV,oBAAU;GAH3B,mBAAmB,CAyG/B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\organization\\organization.service.ts"],"sourcesContent":["import {\r\n Injectable,\r\n NotFoundException,\r\n ConflictException,\r\n} from '@nestjs/common';\r\nimport { InjectRepository } from '@nestjs/typeorm';\r\nimport { Repository } from 'typeorm';\r\nimport { Organization } from './entities/organization.entity';\r\nimport { CreateOrganizationDto } from './dto/create-organization.dto.js';\r\nimport { UpdateOrganizationDto } from './dto/update-organization.dto.js';\r\n\r\n@Injectable()\r\nexport class OrganizationService {\r\n constructor(\r\n @InjectRepository(Organization)\r\n private readonly orgRepo: Repository\r\n ) {}\r\n\r\n async create(dto: CreateOrganizationDto) {\r\n const existing = await this.orgRepo.findOne({\r\n where: { organizationCode: dto.organizationCode },\r\n });\r\n if (existing) {\r\n throw new ConflictException(\r\n `Organization Code \"${dto.organizationCode}\" already exists`\r\n );\r\n }\r\n const org = this.orgRepo.create(dto);\r\n return this.orgRepo.save(org);\r\n }\r\n\r\n async findAll(params?: {\r\n search?: string;\r\n roleId?: number;\r\n projectId?: number;\r\n page?: number;\r\n limit?: number;\r\n }) {\r\n const { search, roleId, projectId, page = 1, limit = 100 } = params || {};\r\n const skip = (page - 1) * limit;\r\n\r\n // Start with a basic query builder to handle dynamic conditions easily\r\n const queryBuilder = this.orgRepo.createQueryBuilder('org');\r\n\r\n if (search) {\r\n queryBuilder.andWhere(\r\n '(org.organizationCode LIKE :search OR org.organizationName LIKE :search)',\r\n { search: `%${search}%` }\r\n );\r\n }\r\n\r\n // [Refactor] Support filtering by roleId (e.g., getting all CONTRACTORS)\r\n if (roleId) {\r\n // Assuming there is a relation or a way to filter by role.\r\n // If Organization has a roleId column directly:\r\n queryBuilder.andWhere('org.roleId = :roleId', { roleId });\r\n }\r\n\r\n // [New] Support filtering by projectId (e.g. organizations in a project)\r\n // Assuming a Many-to-Many or One-to-Many relation exists via ProjectOrganization\r\n if (projectId) {\r\n // Use raw join to avoid circular dependency with ProjectOrganization entity\r\n queryBuilder.innerJoin(\r\n 'project_organizations',\r\n 'po',\r\n 'po.organization_id = org.id AND po.project_id = :projectId',\r\n { projectId }\r\n );\r\n }\r\n\r\n queryBuilder.orderBy('org.organizationCode', 'ASC').skip(skip).take(limit);\r\n\r\n const [data, total] = await queryBuilder.getManyAndCount();\r\n\r\n return {\r\n data,\r\n meta: {\r\n total,\r\n page,\r\n limit,\r\n totalPages: Math.ceil(total / limit),\r\n },\r\n };\r\n }\r\n\r\n async findOne(id: number) {\r\n const org = await this.orgRepo.findOne({ where: { id } });\r\n if (!org) throw new NotFoundException(`Organization ID ${id} not found`);\r\n return org;\r\n }\r\n\r\n async findOneByUuid(publicId: string) {\r\n const org = await this.orgRepo.findOne({ where: { publicId } });\r\n if (!org)\r\n throw new NotFoundException(\r\n `Organization publicId ${publicId} not found`\r\n );\r\n return org;\r\n }\r\n\r\n async update(uuid: string, dto: UpdateOrganizationDto) {\r\n const org = await this.findOneByUuid(uuid);\r\n Object.assign(org, dto);\r\n return this.orgRepo.save(org);\r\n }\r\n\r\n async remove(uuid: string) {\r\n const org = await this.findOneByUuid(uuid);\r\n return this.orgRepo.remove(org);\r\n }\r\n\r\n async findAllActive() {\r\n return this.orgRepo.find({\r\n where: { isActive: true },\r\n order: { organizationCode: 'ASC' },\r\n });\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/04/tagentity_04feabc0b7d8c85123dca45a6315c665 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/04/tagentity_04feabc0b7d8c85123dca45a6315c665 new file mode 100644 index 0000000..63b0d67 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/04/tagentity_04feabc0b7d8c85123dca45a6315c665 @@ -0,0 +1,65 @@ +5fe6685aed65a08e3734f479cb92fc03 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Tag = void 0; +const typeorm_1 = require("typeorm"); +const project_entity_1 = require("../../project/entities/project.entity"); +let Tag = class Tag { +}; +exports.Tag = Tag; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], Tag.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id', type: 'int', nullable: true }), + __metadata("design:type", Object) +], Tag.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'tag_name', length: 100 }), + __metadata("design:type", String) +], Tag.prototype, "tagName", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'color_code', length: 30, default: 'default' }), + __metadata("design:type", String) +], Tag.prototype, "colorCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", Object) +], Tag.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => project_entity_1.Project), + (0, typeorm_1.JoinColumn)({ name: 'project_id' }), + __metadata("design:type", typeof (_a = typeof project_entity_1.Project !== "undefined" && project_entity_1.Project) === "function" ? _a : Object) +], Tag.prototype, "project", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], Tag.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], Tag.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'created_by', type: 'int', nullable: true }), + __metadata("design:type", Object) +], Tag.prototype, "createdBy", void 0); +__decorate([ + (0, typeorm_1.DeleteDateColumn)({ name: 'deleted_at' }), + __metadata("design:type", Object) +], Tag.prototype, "deletedAt", void 0); +exports.Tag = Tag = __decorate([ + (0, typeorm_1.Entity)('tags'), + (0, typeorm_1.Unique)('ux_tag_project', ['projectId', 'tagName']) +], Tag); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWFzdGVyXFxlbnRpdGllc1xcdGFnLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBVWlCO0FBQ2pCLDBFQUFnRTtBQUl6RCxJQUFNLEdBQUcsR0FBVCxNQUFNLEdBQUc7Q0FnQ2YsQ0FBQTtBQWhDWSxrQkFBRztBQUVkO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7K0JBQ2I7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O3NDQUNsQztBQUcxQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOztvQ0FDekI7QUFHakI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDOztzQ0FDNUM7QUFHbkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7d0NBQ2I7QUFLNUI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsd0JBQU8sQ0FBQztJQUN4QixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLHdCQUFPLG9CQUFQLHdCQUFPO29DQUFDO0FBR2xCO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDN0IsSUFBSSxvQkFBSixJQUFJO3NDQUFDO0FBR2pCO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDN0IsSUFBSSxvQkFBSixJQUFJO3NDQUFDO0FBR2pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7c0NBQ2xDO0FBRzFCO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7c0NBQ2pCO2NBL0JiLEdBQUc7SUFGZixJQUFBLGdCQUFNLEVBQUMsTUFBTSxDQUFDO0lBQ2QsSUFBQSxnQkFBTSxFQUFDLGdCQUFnQixFQUFFLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0dBQ3RDLEdBQUcsQ0FnQ2YiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWFzdGVyXFxlbnRpdGllc1xcdGFnLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEVudGl0eSxcclxuICBDb2x1bW4sXHJcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcclxuICBDcmVhdGVEYXRlQ29sdW1uLFxyXG4gIFVwZGF0ZURhdGVDb2x1bW4sXHJcbiAgRGVsZXRlRGF0ZUNvbHVtbixcclxuICBVbmlxdWUsXHJcbiAgTWFueVRvT25lLFxyXG4gIEpvaW5Db2x1bW4sXHJcbn0gZnJvbSAndHlwZW9ybSc7XHJcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0L2VudGl0aWVzL3Byb2plY3QuZW50aXR5JztcclxuXHJcbkBFbnRpdHkoJ3RhZ3MnKVxyXG5AVW5pcXVlKCd1eF90YWdfcHJvamVjdCcsIFsncHJvamVjdElkJywgJ3RhZ05hbWUnXSlcclxuZXhwb3J0IGNsYXNzIFRhZyB7XHJcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxyXG4gIGlkITogbnVtYmVyOyAvLyDguYDguJ7guLTguYjguKEgIVxyXG5cclxuICBAQ29sdW1uKHsgbmFtZTogJ3Byb2plY3RfaWQnLCB0eXBlOiAnaW50JywgbnVsbGFibGU6IHRydWUgfSlcclxuICBwcm9qZWN0SWQhOiBudW1iZXIgfCBudWxsOyAvLyDguYDguJ7guLTguYjguKEgIVxyXG5cclxuICBAQ29sdW1uKHsgbmFtZTogJ3RhZ19uYW1lJywgbGVuZ3RoOiAxMDAgfSlcclxuICB0YWdOYW1lITogc3RyaW5nOyAvLyDguYDguJ7guLTguYjguKEgIVxyXG5cclxuICBAQ29sdW1uKHsgbmFtZTogJ2NvbG9yX2NvZGUnLCBsZW5ndGg6IDMwLCBkZWZhdWx0OiAnZGVmYXVsdCcgfSlcclxuICBjb2xvckNvZGUhOiBzdHJpbmc7IC8vIOC5gOC4nuC4tOC5iOC4oSAhXHJcblxyXG4gIEBDb2x1bW4oeyB0eXBlOiAndGV4dCcsIG51bGxhYmxlOiB0cnVlIH0pXHJcbiAgZGVzY3JpcHRpb24hOiBzdHJpbmcgfCBudWxsOyAvLyDguYDguJ7guLTguYjguKEgIVxyXG5cclxuICAvLyBSZWxhdGlvbnNcclxuICBATWFueVRvT25lKCgpID0+IFByb2plY3QpXHJcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAncHJvamVjdF9pZCcgfSlcclxuICBwcm9qZWN0PzogUHJvamVjdDtcclxuXHJcbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcclxuICBjcmVhdGVkQXQhOiBEYXRlOyAvLyDguYDguJ7guLTguYjguKEgIVxyXG5cclxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxyXG4gIHVwZGF0ZWRBdCE6IERhdGU7IC8vIOC5gOC4nuC4tOC5iOC4oSAhXHJcblxyXG4gIEBDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9ieScsIHR5cGU6ICdpbnQnLCBudWxsYWJsZTogdHJ1ZSB9KVxyXG4gIGNyZWF0ZWRCeSE6IG51bWJlciB8IG51bGw7IC8vIOC5gOC4nuC4tOC5iOC4oSAhXHJcblxyXG4gIEBEZWxldGVEYXRlQ29sdW1uKHsgbmFtZTogJ2RlbGV0ZWRfYXQnIH0pXHJcbiAgZGVsZXRlZEF0ITogRGF0ZSB8IG51bGw7IC8vIOC5gOC4nuC4tOC5iOC4oSAhXHJcbn1cclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/04/tagentity_04feabc0b7d8c85123dca45a6315c665.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/04/tagentity_04feabc0b7d8c85123dca45a6315c665.map new file mode 100644 index 0000000..6dabd4d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/04/tagentity_04feabc0b7d8c85123dca45a6315c665.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\master\\entities\\tag.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAUiB;AACjB,0EAAgE;AAIzD,IAAM,GAAG,GAAT,MAAM,GAAG;CAgCf,CAAA;AAhCY,kBAAG;AAEd;IADC,IAAA,gCAAsB,GAAE;;+BACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sCAClC;AAG1B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;oCACzB;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;;sCAC5C;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;wCACb;AAK5B;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wBAAO,CAAC;IACxB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,wBAAO,oBAAP,wBAAO;oCAAC;AAGlB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;sCAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;sCAAC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sCAClC;AAG1B;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;sCACjB;cA/Bb,GAAG;IAFf,IAAA,gBAAM,EAAC,MAAM,CAAC;IACd,IAAA,gBAAM,EAAC,gBAAgB,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;GACtC,GAAG,CAgCf","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\master\\entities\\tag.entity.ts"],"sourcesContent":["import {\r\n Entity,\r\n Column,\r\n PrimaryGeneratedColumn,\r\n CreateDateColumn,\r\n UpdateDateColumn,\r\n DeleteDateColumn,\r\n Unique,\r\n ManyToOne,\r\n JoinColumn,\r\n} from 'typeorm';\r\nimport { Project } from '../../project/entities/project.entity';\r\n\r\n@Entity('tags')\r\n@Unique('ux_tag_project', ['projectId', 'tagName'])\r\nexport class Tag {\r\n @PrimaryGeneratedColumn()\r\n id!: number; // เพิ่ม !\r\n\r\n @Column({ name: 'project_id', type: 'int', nullable: true })\r\n projectId!: number | null; // เพิ่ม !\r\n\r\n @Column({ name: 'tag_name', length: 100 })\r\n tagName!: string; // เพิ่ม !\r\n\r\n @Column({ name: 'color_code', length: 30, default: 'default' })\r\n colorCode!: string; // เพิ่ม !\r\n\r\n @Column({ type: 'text', nullable: true })\r\n description!: string | null; // เพิ่ม !\r\n\r\n // Relations\r\n @ManyToOne(() => Project)\r\n @JoinColumn({ name: 'project_id' })\r\n project?: Project;\r\n\r\n @CreateDateColumn({ name: 'created_at' })\r\n createdAt!: Date; // เพิ่ม !\r\n\r\n @UpdateDateColumn({ name: 'updated_at' })\r\n updatedAt!: Date; // เพิ่ม !\r\n\r\n @Column({ name: 'created_by', type: 'int', nullable: true })\r\n createdBy!: number | null; // เพิ่ม !\r\n\r\n @DeleteDateColumn({ name: 'deleted_at' })\r\n deletedAt!: Date | null; // เพิ่ม !\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/09/documentnumbererrorentity_0941b82490357482bc9f4bee7db01ff7 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/09/documentnumbererrorentity_0941b82490357482bc9f4bee7db01ff7 new file mode 100644 index 0000000..556a610 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/09/documentnumbererrorentity_0941b82490357482bc9f4bee7db01ff7 @@ -0,0 +1,75 @@ +ce82c3a571f9064abc6f276907e30932 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DocumentNumberError = void 0; +const typeorm_1 = require("typeorm"); +let DocumentNumberError = class DocumentNumberError { +}; +exports.DocumentNumberError = DocumentNumberError; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], DocumentNumberError.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'error_type', + type: 'enum', + enum: [ + 'LOCK_TIMEOUT', + 'VERSION_CONFLICT', + 'DB_ERROR', + 'REDIS_ERROR', + 'VALIDATION_ERROR', + 'SEQUENCE_EXHAUSTED', + 'RESERVATION_EXPIRED', + 'DUPLICATE_NUMBER', + 'GENERATE_ERROR', + ], + }), + __metadata("design:type", String) +], DocumentNumberError.prototype, "errorType", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'error_message', type: 'text' }), + __metadata("design:type", String) +], DocumentNumberError.prototype, "errorMessage", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'stack_trace', type: 'text', nullable: true }), + __metadata("design:type", String) +], DocumentNumberError.prototype, "stackTrace", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'context_data', type: 'json', nullable: true }), + __metadata("design:type", typeof (_a = typeof Record !== "undefined" && Record) === "function" ? _a : Object) +], DocumentNumberError.prototype, "contextData", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'user_id', nullable: true }), + __metadata("design:type", Number) +], DocumentNumberError.prototype, "userId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'ip_address', length: 45, nullable: true }), + __metadata("design:type", String) +], DocumentNumberError.prototype, "ipAddress", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], DocumentNumberError.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'resolved_at', type: 'timestamp', nullable: true }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], DocumentNumberError.prototype, "resolvedAt", void 0); +exports.DocumentNumberError = DocumentNumberError = __decorate([ + (0, typeorm_1.Entity)('document_number_errors'), + (0, typeorm_1.Index)(['errorType']), + (0, typeorm_1.Index)(['createdAt']), + (0, typeorm_1.Index)(['userId']) +], DocumentNumberError); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxlbnRpdGllc1xcZG9jdW1lbnQtbnVtYmVyLWVycm9yLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBTWlCO0FBTVYsSUFBTSxtQkFBbUIsR0FBekIsTUFBTSxtQkFBbUI7Q0F5Qy9CLENBQUE7QUF6Q1ksa0RBQW1CO0FBRTlCO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7K0NBQ2I7QUFpQlo7SUFmQyxJQUFBLGdCQUFNLEVBQUM7UUFDTixJQUFJLEVBQUUsWUFBWTtRQUNsQixJQUFJLEVBQUUsTUFBTTtRQUNaLElBQUksRUFBRTtZQUNKLGNBQWM7WUFDZCxrQkFBa0I7WUFDbEIsVUFBVTtZQUNWLGFBQWE7WUFDYixrQkFBa0I7WUFDbEIsb0JBQW9CO1lBQ3BCLHFCQUFxQjtZQUNyQixrQkFBa0I7WUFDbEIsZ0JBQWdCO1NBQ2pCO0tBQ0YsQ0FBQzs7c0RBQ2lCO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7O3lEQUMxQjtBQUd0QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O3VEQUMxQztBQUdwQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7a0RBQ2pELE1BQU0sb0JBQU4sTUFBTTt3REFBa0I7QUFHdEM7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7bURBQzVCO0FBR2hCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7c0RBQ3hDO0FBR25CO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDN0IsSUFBSSxvQkFBSixJQUFJO3NEQUFDO0FBR2pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztrREFDdEQsSUFBSSxvQkFBSixJQUFJO3VEQUFDOzhCQXhDUCxtQkFBbUI7SUFKL0IsSUFBQSxnQkFBTSxFQUFDLHdCQUF3QixDQUFDO0lBQ2hDLElBQUEsZUFBSyxFQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDcEIsSUFBQSxlQUFLLEVBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNwQixJQUFBLGVBQUssRUFBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0dBQ0wsbUJBQW1CLENBeUMvQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxkb2N1bWVudC1udW1iZXJpbmdcXGVudGl0aWVzXFxkb2N1bWVudC1udW1iZXItZXJyb3IuZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVudGl0eSxcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbiAgQ29sdW1uLFxuICBDcmVhdGVEYXRlQ29sdW1uLFxuICBJbmRleCxcbn0gZnJvbSAndHlwZW9ybSc7XG5cbkBFbnRpdHkoJ2RvY3VtZW50X251bWJlcl9lcnJvcnMnKVxuQEluZGV4KFsnZXJyb3JUeXBlJ10pXG5ASW5kZXgoWydjcmVhdGVkQXQnXSlcbkBJbmRleChbJ3VzZXJJZCddKVxuZXhwb3J0IGNsYXNzIERvY3VtZW50TnVtYmVyRXJyb3Ige1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIGlkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oe1xuICAgIG5hbWU6ICdlcnJvcl90eXBlJyxcbiAgICB0eXBlOiAnZW51bScsXG4gICAgZW51bTogW1xuICAgICAgJ0xPQ0tfVElNRU9VVCcsXG4gICAgICAnVkVSU0lPTl9DT05GTElDVCcsXG4gICAgICAnREJfRVJST1InLFxuICAgICAgJ1JFRElTX0VSUk9SJyxcbiAgICAgICdWQUxJREFUSU9OX0VSUk9SJyxcbiAgICAgICdTRVFVRU5DRV9FWEhBVVNURUQnLFxuICAgICAgJ1JFU0VSVkFUSU9OX0VYUElSRUQnLFxuICAgICAgJ0RVUExJQ0FURV9OVU1CRVInLFxuICAgICAgJ0dFTkVSQVRFX0VSUk9SJyxcbiAgICBdLFxuICB9KVxuICBlcnJvclR5cGUhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdlcnJvcl9tZXNzYWdlJywgdHlwZTogJ3RleHQnIH0pXG4gIGVycm9yTWVzc2FnZSE6IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ3N0YWNrX3RyYWNlJywgdHlwZTogJ3RleHQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBzdGFja1RyYWNlPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnY29udGV4dF9kYXRhJywgdHlwZTogJ2pzb24nLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBjb250ZXh0RGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAndXNlcl9pZCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHVzZXJJZD86IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2lwX2FkZHJlc3MnLCBsZW5ndGg6IDQ1LCBudWxsYWJsZTogdHJ1ZSB9KVxuICBpcEFkZHJlc3M/OiBzdHJpbmc7XG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3Jlc29sdmVkX2F0JywgdHlwZTogJ3RpbWVzdGFtcCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHJlc29sdmVkQXQ/OiBEYXRlO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/09/documentnumbererrorentity_0941b82490357482bc9f4bee7db01ff7.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/09/documentnumbererrorentity_0941b82490357482bc9f4bee7db01ff7.map new file mode 100644 index 0000000..9621e5b --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/09/documentnumbererrorentity_0941b82490357482bc9f4bee7db01ff7.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\entities\\document-number-error.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAMiB;AAMV,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;CAyC/B,CAAA;AAzCY,kDAAmB;AAE9B;IADC,IAAA,gCAAsB,GAAE;;+CACb;AAiBZ;IAfC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE;YACJ,cAAc;YACd,kBAAkB;YAClB,UAAU;YACV,aAAa;YACb,kBAAkB;YAClB,oBAAoB;YACpB,qBAAqB;YACrB,kBAAkB;YAClB,gBAAgB;SACjB;KACF,CAAC;;sDACiB;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;yDAC1B;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;uDAC1C;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACjD,MAAM,oBAAN,MAAM;wDAAkB;AAGtC;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;mDAC5B;AAGhB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sDACxC;AAGnB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;sDAAC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACtD,IAAI,oBAAJ,IAAI;uDAAC;8BAxCP,mBAAmB;IAJ/B,IAAA,gBAAM,EAAC,wBAAwB,CAAC;IAChC,IAAA,eAAK,EAAC,CAAC,WAAW,CAAC,CAAC;IACpB,IAAA,eAAK,EAAC,CAAC,WAAW,CAAC,CAAC;IACpB,IAAA,eAAK,EAAC,CAAC,QAAQ,CAAC,CAAC;GACL,mBAAmB,CAyC/B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\entities\\document-number-error.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n Index,\n} from 'typeorm';\n\n@Entity('document_number_errors')\n@Index(['errorType'])\n@Index(['createdAt'])\n@Index(['userId'])\nexport class DocumentNumberError {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({\n name: 'error_type',\n type: 'enum',\n enum: [\n 'LOCK_TIMEOUT',\n 'VERSION_CONFLICT',\n 'DB_ERROR',\n 'REDIS_ERROR',\n 'VALIDATION_ERROR',\n 'SEQUENCE_EXHAUSTED',\n 'RESERVATION_EXPIRED',\n 'DUPLICATE_NUMBER',\n 'GENERATE_ERROR',\n ],\n })\n errorType!: string;\n\n @Column({ name: 'error_message', type: 'text' })\n errorMessage!: string;\n\n @Column({ name: 'stack_trace', type: 'text', nullable: true })\n stackTrace?: string;\n\n @Column({ name: 'context_data', type: 'json', nullable: true })\n contextData?: Record;\n\n @Column({ name: 'user_id', nullable: true })\n userId?: number;\n\n @Column({ name: 'ip_address', length: 45, nullable: true })\n ipAddress?: string;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @Column({ name: 'resolved_at', type: 'timestamp', nullable: true })\n resolvedAt?: Date;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0e/registerdto_0ed888354b381cec6a824534fd55be4a b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0e/registerdto_0ed888354b381cec6a824534fd55be4a new file mode 100644 index 0000000..8866a4e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0e/registerdto_0ed888354b381cec6a824534fd55be4a @@ -0,0 +1,44 @@ +53fb2fc96633de3cc84ca869a70687f4 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RegisterDto = void 0; +const class_validator_1 = require("class-validator"); +class RegisterDto { +} +exports.RegisterDto = RegisterDto; +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], RegisterDto.prototype, "username", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + (0, class_validator_1.MinLength)(6, { message: 'Password must be at least 6 characters' }), + __metadata("design:type", String) +], RegisterDto.prototype, "password", void 0); +__decorate([ + (0, class_validator_1.IsEmail)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], RegisterDto.prototype, "email", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], RegisterDto.prototype, "firstName", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], RegisterDto.prototype, "lastName", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxhdXRoXFxkdG9cXHJlZ2lzdGVyLmR0by50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxxREFNeUI7QUFFekIsTUFBYSxXQUFXO0NBcUJ2QjtBQXJCRCxrQ0FxQkM7QUFsQkM7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7OzZDQUNLO0FBS2xCO0lBSEMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFO0lBQ1osSUFBQSwyQkFBUyxFQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSx3Q0FBd0MsRUFBRSxDQUFDOzs2Q0FDbEQ7QUFJbEI7SUFGQyxJQUFBLHlCQUFPLEdBQUU7SUFDVCxJQUFBLDRCQUFVLEdBQUU7OzBDQUNFO0FBSWY7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7OzhDQUNNO0FBSW5CO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzs2Q0FDSyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxjb21tb25cXGF1dGhcXGR0b1xccmVnaXN0ZXIuZHRvLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIElzRW1haWwsXG4gIElzTm90RW1wdHksXG4gIElzU3RyaW5nLFxuICBNaW5MZW5ndGgsXG4gIElzT3B0aW9uYWwsXG59IGZyb20gJ2NsYXNzLXZhbGlkYXRvcic7XG5cbmV4cG9ydCBjbGFzcyBSZWdpc3RlckR0byB7XG4gIEBJc1N0cmluZygpXG4gIEBJc05vdEVtcHR5KClcbiAgdXNlcm5hbWUhOiBzdHJpbmc7XG5cbiAgQElzU3RyaW5nKClcbiAgQElzTm90RW1wdHkoKVxuICBATWluTGVuZ3RoKDYsIHsgbWVzc2FnZTogJ1Bhc3N3b3JkIG11c3QgYmUgYXQgbGVhc3QgNiBjaGFyYWN0ZXJzJyB9KVxuICBwYXNzd29yZCE6IHN0cmluZztcblxuICBASXNFbWFpbCgpXG4gIEBJc05vdEVtcHR5KClcbiAgZW1haWwhOiBzdHJpbmc7XG5cbiAgQElzU3RyaW5nKClcbiAgQElzT3B0aW9uYWwoKVxuICBmaXJzdE5hbWU/OiBzdHJpbmc7XG5cbiAgQElzU3RyaW5nKClcbiAgQElzT3B0aW9uYWwoKVxuICBsYXN0TmFtZT86IHN0cmluZztcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0e/registerdto_0ed888354b381cec6a824534fd55be4a.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0e/registerdto_0ed888354b381cec6a824534fd55be4a.map new file mode 100644 index 0000000..48c9fe7 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0e/registerdto_0ed888354b381cec6a824534fd55be4a.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\auth\\dto\\register.dto.ts","mappings":";;;;;;;;;;;;AAAA,qDAMyB;AAEzB,MAAa,WAAW;CAqBvB;AArBD,kCAqBC;AAlBC;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;6CACK;AAKlB;IAHC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;IACZ,IAAA,2BAAS,EAAC,CAAC,EAAE,EAAE,OAAO,EAAE,wCAAwC,EAAE,CAAC;;6CAClD;AAIlB;IAFC,IAAA,yBAAO,GAAE;IACT,IAAA,4BAAU,GAAE;;0CACE;AAIf;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;8CACM;AAInB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;6CACK","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\auth\\dto\\register.dto.ts"],"sourcesContent":["import {\n IsEmail,\n IsNotEmpty,\n IsString,\n MinLength,\n IsOptional,\n} from 'class-validator';\n\nexport class RegisterDto {\n @IsString()\n @IsNotEmpty()\n username!: string;\n\n @IsString()\n @IsNotEmpty()\n @MinLength(6, { message: 'Password must be at least 6 characters' })\n password!: string;\n\n @IsEmail()\n @IsNotEmpty()\n email!: string;\n\n @IsString()\n @IsOptional()\n firstName?: string;\n\n @IsString()\n @IsOptional()\n lastName?: string;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0e/uischemaservice_0e6c1f23d6d98dca6687cfd5c3032b84 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0e/uischemaservice_0e6c1f23d6d98dca6687cfd5c3032b84 new file mode 100644 index 0000000..cb3c13f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0e/uischemaservice_0e6c1f23d6d98dca6687cfd5c3032b84 @@ -0,0 +1,115 @@ +2c20ac0a8e9c7e0218de0b5e202343d0 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var UiSchemaService_1; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UiSchemaService = void 0; +// File: src/modules/json-schema/services/ui-schema.service.ts +const common_1 = require("@nestjs/common"); +let UiSchemaService = UiSchemaService_1 = class UiSchemaService { + constructor() { + this.logger = new common_1.Logger(UiSchemaService_1.name); + } + /** + * ตรวจสอบความถูกต้องของ UI Schema + */ + validateUiSchema(uiSchema, dataSchema) { + if (!uiSchema) + return true; // Optional field + // 1. Validate Structure เบื้องต้น + if (!uiSchema.layout || !uiSchema.fields) { + throw new common_1.BadRequestException('UI Schema must contain "layout" and "fields" properties.'); + } + // 2. ตรวจสอบว่า Fields ใน Layout มีคำนิยามครบถ้วน + const definedFields = new Set(Object.keys(uiSchema.fields)); + const layoutFields = new Set(); + uiSchema.layout.groups.forEach((group) => { + group.fields.forEach((fieldKey) => { + layoutFields.add(fieldKey); + if (!definedFields.has(fieldKey)) { + throw new common_1.BadRequestException(`Field "${fieldKey}" used in layout "${group.title}" is not defined in "fields".`); + } + }); + }); + // 3. (Optional) ตรวจสอบว่า Fields ใน Data Schema (AJV) มีครบใน UI Schema หรือไม่ + // ถ้า Data Schema บอกว่ามี field 'title' แต่ UI Schema ไม่มี -> Frontend อาจจะไม่เรนเดอร์ + if (dataSchema && dataSchema.properties) { + const dataKeys = Object.keys(dataSchema.properties); + const missingFields = dataKeys.filter((key) => !definedFields.has(key)); + if (missingFields.length > 0) { + this.logger.warn(`Data schema properties [${missingFields.join(', ')}] are missing from UI Schema.`); + // ไม่ Throw Error เพราะบางทีเราอาจตั้งใจซ่อน Field (Hidden field) + } + } + return true; + } + /** + * สร้าง UI Schema พื้นฐานจาก Data Schema (AJV) อัตโนมัติ + * ใช้กรณี user ไม่ได้ส่ง UI Schema มาให้ + */ + generateDefaultUiSchema(dataSchema) { + if (!dataSchema || !dataSchema.properties) { + return { + layout: { type: 'stack', groups: [] }, + fields: {}, + }; + } + const fields = {}; + const groupFields = []; + for (const [key, value] of Object.entries(dataSchema.properties)) { + groupFields.push(key); + fields[key] = { + type: value.type || 'string', + title: value.title || this.humanize(key), + description: value.description, + required: (dataSchema.required || []).includes(key), + widget: this.guessWidget(value), + colSpan: 12, // Default full width + }; + } + return { + layout: { + type: 'stack', + groups: [ + { + id: 'default', + title: 'General Information', + type: 'section', + fields: groupFields, + }, + ], + }, + fields, + }; + } + // Helpers + humanize(str) { + return str + .replace(/([A-Z])/g, ' $1') + .replace(/^./, (str) => str.toUpperCase()) + .trim(); + } + guessWidget(schemaProp) { + if (schemaProp.enum) + return 'select'; + if (schemaProp.type === 'boolean') + return 'checkbox'; + if (schemaProp.format === 'date') + return 'date'; + if (schemaProp.format === 'date-time') + return 'datetime'; + if (schemaProp.format === 'binary') + return 'file-upload'; + return 'text'; + } +}; +exports.UiSchemaService = UiSchemaService; +exports.UiSchemaService = UiSchemaService = UiSchemaService_1 = __decorate([ + (0, common_1.Injectable)() +], UiSchemaService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcanNvbi1zY2hlbWFcXHNlcnZpY2VzXFx1aS1zY2hlbWEuc2VydmljZS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEsOERBQThEO0FBQzlELDJDQUF5RTtBQVFsRSxJQUFNLGVBQWUsdUJBQXJCLE1BQU0sZUFBZTtJQUFyQjtRQUNZLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxpQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBZ0g3RCxDQUFDO0lBOUdDOztPQUVHO0lBQ0gsZ0JBQWdCLENBQ2QsUUFBa0IsRUFDbEIsVUFBbUM7UUFFbkMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLGlCQUFpQjtRQUU3QyxrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDekMsTUFBTSxJQUFJLDRCQUFtQixDQUMzQiwwREFBMEQsQ0FDM0QsQ0FBQztRQUNKLENBQUM7UUFFRCxrREFBa0Q7UUFDbEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBRXZDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3ZDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ2hDLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7b0JBQ2pDLE1BQU0sSUFBSSw0QkFBbUIsQ0FDM0IsVUFBVSxRQUFRLHFCQUFxQixLQUFLLENB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O1FBQ3JELElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxNQUFNO1lBQUUsT0FBTyxNQUFNLENBQUM7UUFDaEQsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLFdBQVc7WUFBRSxPQUFPLFVBQVUsQ0FBQztRQUN6RCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssUUFBUTtZQUFFLE9BQU8sYUFBYSxDQUFDO1FBQ3pELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRixDQUFBO0FBakhZLDBDQUFlOzBCQUFmLGVBQWU7SUFEM0IsSUFBQSxtQkFBVSxHQUFFO0dBQ0EsZUFBZSxDQWlIM0IiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcanNvbi1zY2hlbWFcXHNlcnZpY2VzXFx1aS1zY2hlbWEuc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGaWxlOiBzcmMvbW9kdWxlcy9qc29uLXNjaGVtYS9zZXJ2aWNlcy91aS1zY2hlbWEuc2VydmljZS50c1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgQmFkUmVxdWVzdEV4Y2VwdGlvbiwgTG9nZ2VyIH0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xuaW1wb3J0IHtcbiAgVWlTY2hlbWEsXG4gIFVpU2NoZW1hRmllbGQsXG4gIFdpZGdldFR5cGUsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvdWktc2NoZW1hLmludGVyZmFjZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBVaVNjaGVtYVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoVWlTY2hlbWFTZXJ2aWNlLm5hbWUpO1xuXG4gIC8qKlxuICAgKiDguJXguKPguKfguIjguKrguK3guJrguITguKfguLLguKHguJbguLnguIHguJXguYnguK3guIfguILguK3guIcgVUkgU2NoZW1hXG4gICAqL1xuICB2YWxpZGF0ZVVpU2NoZW1hKFxuICAgIHVpU2NoZW1hOiBVaVNjaGVtYSxcbiAgICBkYXRhU2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXVpU2NoZW1hKSByZXR1cm4gdHJ1ZTsgLy8gT3B0aW9uYWwgZmllbGRcblxuICAgIC8vIDEuIFZhbGlkYXRlIFN0cnVjdHVyZSDguYDguJrguLfguYnguK3guIfguJXguYnguJlcbiAgICBpZiAoIXVpU2NoZW1hLmxheW91dCB8fCAhdWlTY2hlbWEuZmllbGRzKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgJ1VJIFNjaGVtYSBtdXN0IGNvbnRhaW4gXCJsYXlvdXRcIiBhbmQgXCJmaWVsZHNcIiBwcm9wZXJ0aWVzLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gMi4g4LiV4Lij4Lin4LiI4Liq4Lit4Lia4Lin4LmI4LiyIEZpZWxkcyDguYPguJkgTGF5b3V0IOC4oeC4teC4hOC4s+C4meC4tOC4ouC4suC4oeC4hOC4o+C4muC4luC5ieC4p+C4mVxuICAgIGNvbnN0IGRlZmluZWRGaWVsZHMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHVpU2NoZW1hLmZpZWxkcykpO1xuICAgIGNvbnN0IGxheW91dEZpZWxkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgdWlTY2hlbWEubGF5b3V0Lmdyb3Vwcy5mb3JFYWNoKChncm91cCkgPT4ge1xuICAgICAgZ3JvdXAuZmllbGRzLmZvckVhY2goKGZpZWxkS2V5KSA9PiB7XG4gICAgICAgIGxheW91dEZpZWxkcy5hZGQoZmllbGRLZXkpO1xuICAgICAgICBpZiAoIWRlZmluZWRGaWVsZHMuaGFzKGZpZWxkS2V5KSkge1xuICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICAgICAgYEZpZWxkIFwiJHtmaWVsZEtleX1cIiB1c2VkIGluIGxheW91dCBcIiR7Z3JvdXAudGl0bGV9XCIgaXMgbm90IGRlZmluZWQgaW4gXCJmaWVsZHNcIi5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyAzLiAoT3B0aW9uYWwpIOC4leC4o+C4p+C4iOC4quC4reC4muC4p+C5iOC4siBGaWVsZHMg4LmD4LiZIERhdGEgU2NoZW1hIChBSlYpIOC4oeC4teC4hOC4o+C4muC5g+C4mSBVSSBTY2hlbWEg4Lir4Lij4Li34Lit4LmE4Lih4LmIXG4gICAgLy8g4LiW4LmJ4LiyIERhdGEgU2NoZW1hIOC4muC4reC4geC4p+C5iOC4suC4oeC4tSBmaWVsZCAndGl0bGUnIOC5geC4leC5iCBVSSBTY2hlbWEg4LmE4Lih4LmI4Lih4Li1IC0+IEZyb250ZW5kIOC4reC4suC4iOC4iOC4sOC5hOC4oeC5iOC5gOC4o+C4meC5gOC4lOC4reC4o+C5jFxuICAgIGlmIChkYXRhU2NoZW1hICYmIGRhdGFTY2hlbWEucHJvcGVydGllcykge1xuICAgICAgY29uc3QgZGF0YUtleXMgPSBPYmplY3Qua2V5cyhkYXRhU2NoZW1hLnByb3BlcnRpZXMpO1xuICAgICAgY29uc3QgbWlzc2luZ0ZpZWxkcyA9IGRhdGFLZXlzLmZpbHRlcigoa2V5KSA9PiAhZGVmaW5lZEZpZWxkcy5oYXMoa2V5KSk7XG5cbiAgICAgIGlmIChtaXNzaW5nRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgRGF0YSBzY2hlbWEgcHJvcGVydGllcyBbJHttaXNzaW5nRmllbGRzLmpvaW4oJywgJyl9XSBhcmUgbWlzc2luZyBmcm9tIFVJIFNjaGVtYS5gXG4gICAgICAgICk7XG4gICAgICAgIC8vIOC5hOC4oeC5iCBUaHJvdyBFcnJvciDguYDguJ7guKPguLLguLDguJrguLLguIfguJfguLXguYDguKPguLLguK3guLLguIjguJXguLHguYnguIfguYPguIjguIvguYjguK3guJkgRmllbGQgKEhpZGRlbiBmaWVsZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDguKrguKPguYnguLLguIcgVUkgU2NoZW1hIOC4nuC4t+C5ieC4meC4kOC4suC4meC4iOC4suC4gSBEYXRhIFNjaGVtYSAoQUpWKSDguK3guLHguJXguYLguJnguKHguLHguJXguLRcbiAgICog4LmD4LiK4LmJ4LiB4Lij4LiT4Li1IHVzZXIg4LmE4Lih4LmI4LmE4LiU4LmJ4Liq4LmI4LiHIFVJIFNjaGVtYSDguKHguLLguYPguKvguYlcbiAgICovXG4gIGdlbmVyYXRlRGVmYXVsdFVpU2NoZW1hKGRhdGFTY2hlbWE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogVWlTY2hlbWEge1xuICAgIGlmICghZGF0YVNjaGVtYSB8fCAhZGF0YVNjaGVtYS5wcm9wZXJ0aWVzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYXlvdXQ6IHsgdHlwZTogJ3N0YWNrJywgZ3JvdXBzOiBbXSB9LFxuICAgICAgICBmaWVsZHM6IHt9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZHM6IHsgW2tleTogc3RyaW5nXTogVWlTY2hlbWFGaWVsZCB9ID0ge307XG4gICAgY29uc3QgZ3JvdXBGaWVsZHM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgIGRhdGFTY2hlbWEucHJvcGVydGllcyBhcyBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgICApKSB7XG4gICAgICBncm91cEZpZWxkcy5wdXNoKGtleSk7XG5cbiAgICAgIGZpZWxkc1trZXldID0ge1xuICAgICAgICB0eXBlOiAodmFsdWUudHlwZSBhcyBVaVNjaGVtYUZpZWxkWyd0eXBlJ10pIHx8ICdzdHJpbmcnLFxuICAgICAgICB0aXRsZTogKHZhbHVlLnRpdGxlIGFzIHN0cmluZykgfHwgdGhpcy5odW1hbml6ZShrZXkpLFxuICAgICAgICBkZXNjcmlwdGlvbjogdmFsdWUuZGVzY3JpcHRpb24gYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICByZXF1aXJlZDogKChkYXRhU2NoZW1hLnJlcXVpcmVkIGFzIHN0cmluZ1tdKSB8fCBbXSkuaW5jbHVkZXMoa2V5KSxcbiAgICAgICAgd2lkZ2V0OiB0aGlzLmd1ZXNzV2lkZ2V0KHZhbHVlKSxcbiAgICAgICAgY29sU3BhbjogMTIsIC8vIERlZmF1bHQgZnVsbCB3aWR0aFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGF5b3V0OiB7XG4gICAgICAgIHR5cGU6ICdzdGFjaycsXG4gICAgICAgIGdyb3VwczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICB0aXRsZTogJ0dlbmVyYWwgSW5mb3JtYXRpb24nLFxuICAgICAgICAgICAgdHlwZTogJ3NlY3Rpb24nLFxuICAgICAgICAgICAgZmllbGRzOiBncm91cEZpZWxkcyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIGZpZWxkcyxcbiAgICB9O1xuICB9XG5cbiAgLy8gSGVscGVyc1xuICBwcml2YXRlIGh1bWFuaXplKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RyXG4gICAgICAucmVwbGFjZSgvKFtBLVpdKS9nLCAnICQxJylcbiAgICAgIC5yZXBsYWNlKC9eLi8sIChzdHIpID0+IHN0ci50b1VwcGVyQ2FzZSgpKVxuICAgICAgLnRyaW0oKTtcbiAgfVxuXG4gIHByaXZhdGUgZ3Vlc3NXaWRnZXQoc2NoZW1hUHJvcDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBXaWRnZXRUeXBlIHtcbiAgICBpZiAoc2NoZW1hUHJvcC5lbnVtKSByZXR1cm4gJ3NlbGVjdCc7XG4gICAgaWYgKHNjaGVtYVByb3AudHlwZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gJ2NoZWNrYm94JztcbiAgICBpZiAoc2NoZW1hUHJvcC5mb3JtYXQgPT09ICdkYXRlJykgcmV0dXJuICdkYXRlJztcbiAgICBpZiAoc2NoZW1hUHJvcC5mb3JtYXQgPT09ICdkYXRlLXRpbWUnKSByZXR1cm4gJ2RhdGV0aW1lJztcbiAgICBpZiAoc2NoZW1hUHJvcC5mb3JtYXQgPT09ICdiaW5hcnknKSByZXR1cm4gJ2ZpbGUtdXBsb2FkJztcbiAgICByZXR1cm4gJ3RleHQnO1xuICB9XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0e/uischemaservice_0e6c1f23d6d98dca6687cfd5c3032b84.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0e/uischemaservice_0e6c1f23d6d98dca6687cfd5c3032b84.map new file mode 100644 index 0000000..937977d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0e/uischemaservice_0e6c1f23d6d98dca6687cfd5c3032b84.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\services\\ui-schema.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\services\\ui-schema.service.ts"],"sourcesContent":["// File: src/modules/json-schema/services/ui-schema.service.ts\nimport { Injectable, BadRequestException, Logger } from '@nestjs/common';\nimport {\n UiSchema,\n UiSchemaField,\n WidgetType,\n} from '../interfaces/ui-schema.interface';\n\n@Injectable()\nexport class UiSchemaService {\n private readonly logger = new Logger(UiSchemaService.name);\n\n /**\n * ตรวจสอบความถูกต้องของ UI Schema\n */\n validateUiSchema(\n uiSchema: UiSchema,\n dataSchema: Record\n ): boolean {\n if (!uiSchema) return true; // Optional field\n\n // 1. Validate Structure เบื้องต้น\n if (!uiSchema.layout || !uiSchema.fields) {\n throw new BadRequestException(\n 'UI Schema must contain \"layout\" and \"fields\" properties.'\n );\n }\n\n // 2. ตรวจสอบว่า Fields ใน Layout มีคำนิยามครบถ้วน\n const definedFields = new Set(Object.keys(uiSchema.fields));\n const layoutFields = new Set();\n\n uiSchema.layout.groups.forEach((group) => {\n group.fields.forEach((fieldKey) => {\n layoutFields.add(fieldKey);\n if (!definedFields.has(fieldKey)) {\n throw new BadRequestException(\n `Field \"${fieldKey}\" used in layout \"${group.title}\" is not defined in \"fields\".`\n );\n }\n });\n });\n\n // 3. (Optional) ตรวจสอบว่า Fields ใน Data Schema (AJV) มีครบใน UI Schema หรือไม่\n // ถ้า Data Schema บอกว่ามี field 'title' แต่ UI Schema ไม่มี -> Frontend อาจจะไม่เรนเดอร์\n if (dataSchema && dataSchema.properties) {\n const dataKeys = Object.keys(dataSchema.properties);\n const missingFields = dataKeys.filter((key) => !definedFields.has(key));\n\n if (missingFields.length > 0) {\n this.logger.warn(\n `Data schema properties [${missingFields.join(', ')}] are missing from UI Schema.`\n );\n // ไม่ Throw Error เพราะบางทีเราอาจตั้งใจซ่อน Field (Hidden field)\n }\n }\n\n return true;\n }\n\n /**\n * สร้าง UI Schema พื้นฐานจาก Data Schema (AJV) อัตโนมัติ\n * ใช้กรณี user ไม่ได้ส่ง UI Schema มาให้\n */\n generateDefaultUiSchema(dataSchema: Record): UiSchema {\n if (!dataSchema || !dataSchema.properties) {\n return {\n layout: { type: 'stack', groups: [] },\n fields: {},\n };\n }\n\n const fields: { [key: string]: UiSchemaField } = {};\n const groupFields: string[] = [];\n\n for (const [key, value] of Object.entries(\n dataSchema.properties as Record>\n )) {\n groupFields.push(key);\n\n fields[key] = {\n type: (value.type as UiSchemaField['type']) || 'string',\n title: (value.title as string) || this.humanize(key),\n description: value.description as string | undefined,\n required: ((dataSchema.required as string[]) || []).includes(key),\n widget: this.guessWidget(value),\n colSpan: 12, // Default full width\n };\n }\n\n return {\n layout: {\n type: 'stack',\n groups: [\n {\n id: 'default',\n title: 'General Information',\n type: 'section',\n fields: groupFields,\n },\n ],\n },\n fields,\n };\n }\n\n // Helpers\n private humanize(str: string): string {\n return str\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, (str) => str.toUpperCase())\n .trim();\n }\n\n private guessWidget(schemaProp: Record): WidgetType {\n if (schemaProp.enum) return 'select';\n if (schemaProp.type === 'boolean') return 'checkbox';\n if (schemaProp.format === 'date') return 'date';\n if (schemaProp.format === 'date-time') return 'datetime';\n if (schemaProp.format === 'binary') return 'file-upload';\n return 'text';\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0f/correspondencerevisionattachmententity_0ff8771ed74454f89aff9994cf6ef628 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0f/correspondencerevisionattachmententity_0ff8771ed74454f89aff9994cf6ef628 new file mode 100644 index 0000000..11f67d7 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0f/correspondencerevisionattachmententity_0ff8771ed74454f89aff9994cf6ef628 @@ -0,0 +1,54 @@ +4b5cbb5bf5451f06bb72b25c9c1d277c +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceRevisionAttachment = void 0; +// File: src/modules/correspondence/entities/correspondence-revision-attachment.entity.ts +const typeorm_1 = require("typeorm"); +const correspondence_revision_entity_1 = require("./correspondence-revision.entity"); +const attachment_entity_1 = require("../../../common/file-storage/entities/attachment.entity"); +/** + * CorrespondenceRevisionAttachment + * + * ตารางเชื่อม correspondence_revisions กับ attachments (M:N) + * [FIX v1.8.1] FK ชี้ไป correspondence_revisions.id ไม่ใช่ correspondences.id + * เหตุผล: ไฟล์แนบผูกกับ revision เพื่อรองรับไฟล์ที่ต่างกันในแต่ละ revision + */ +let CorrespondenceRevisionAttachment = class CorrespondenceRevisionAttachment { +}; +exports.CorrespondenceRevisionAttachment = CorrespondenceRevisionAttachment; +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'correspondence_revision_id' }), + __metadata("design:type", Number) +], CorrespondenceRevisionAttachment.prototype, "correspondenceRevisionId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'attachment_id' }), + __metadata("design:type", Number) +], CorrespondenceRevisionAttachment.prototype, "attachmentId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_main_document', default: false }), + __metadata("design:type", Boolean) +], CorrespondenceRevisionAttachment.prototype, "isMainDocument", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => correspondence_revision_entity_1.CorrespondenceRevision, (revision) => revision.attachmentLinks, { onDelete: 'CASCADE' }), + (0, typeorm_1.JoinColumn)({ name: 'correspondence_revision_id' }), + __metadata("design:type", typeof (_a = typeof correspondence_revision_entity_1.CorrespondenceRevision !== "undefined" && correspondence_revision_entity_1.CorrespondenceRevision) === "function" ? _a : Object) +], CorrespondenceRevisionAttachment.prototype, "revision", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => attachment_entity_1.Attachment, { onDelete: 'CASCADE', eager: false }), + (0, typeorm_1.JoinColumn)({ name: 'attachment_id' }), + __metadata("design:type", typeof (_b = typeof attachment_entity_1.Attachment !== "undefined" && attachment_entity_1.Attachment) === "function" ? _b : Object) +], CorrespondenceRevisionAttachment.prototype, "attachment", void 0); +exports.CorrespondenceRevisionAttachment = CorrespondenceRevisionAttachment = __decorate([ + (0, typeorm_1.Entity)('correspondence_revision_attachments') +], CorrespondenceRevisionAttachment); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGVudGl0aWVzXFxjb3JyZXNwb25kZW5jZS1yZXZpc2lvbi1hdHRhY2htZW50LmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEseUZBQXlGO0FBQ3pGLHFDQUErRTtBQUMvRSxxRkFBMEU7QUFDMUUsK0ZBQXFGO0FBRXJGOzs7Ozs7R0FNRztBQUVJLElBQU0sZ0NBQWdDLEdBQXRDLE1BQU0sZ0NBQWdDO0NBMEI1QyxDQUFBO0FBMUJZLDRFQUFnQztBQUczQztJQURDLElBQUEsdUJBQWEsRUFBQyxFQUFFLElBQUksRUFBRSw0QkFBNEIsRUFBRSxDQUFDOztrRkFDcEI7QUFJbEM7SUFEQyxJQUFBLHVCQUFhLEVBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLENBQUM7O3NFQUNuQjtBQUl0QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7O3dFQUM1QjtBQVN6QjtJQU5DLElBQUEsbUJBQVMsRUFDUixHQUFHLEVBQUUsQ0FBQyx1REFBc0IsRUFDNUIsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQ3RDLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUN4QjtJQUNBLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSw0QkFBNEIsRUFBRSxDQUFDO2tEQUN4Qyx1REFBc0Isb0JBQXRCLHVEQUFzQjtrRUFBQztBQUtsQztJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyw4QkFBVSxFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDbEUsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxDQUFDO2tEQUN6Qiw4QkFBVSxvQkFBViw4QkFBVTtvRUFBQzsyQ0F6QmIsZ0NBQWdDO0lBRDVDLElBQUEsZ0JBQU0sRUFBQyxxQ0FBcUMsQ0FBQztHQUNqQyxnQ0FBZ0MsQ0EwQjVDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGNvcnJlc3BvbmRlbmNlXFxlbnRpdGllc1xcY29ycmVzcG9uZGVuY2UtcmV2aXNpb24tYXR0YWNobWVudC5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRmlsZTogc3JjL21vZHVsZXMvY29ycmVzcG9uZGVuY2UvZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtcmV2aXNpb24tYXR0YWNobWVudC5lbnRpdHkudHNcbmltcG9ydCB7IEVudGl0eSwgQ29sdW1uLCBNYW55VG9PbmUsIEpvaW5Db2x1bW4sIFByaW1hcnlDb2x1bW4gfSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlUmV2aXNpb24gfSBmcm9tICcuL2NvcnJlc3BvbmRlbmNlLXJldmlzaW9uLmVudGl0eSc7XG5pbXBvcnQgeyBBdHRhY2htZW50IH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2ZpbGUtc3RvcmFnZS9lbnRpdGllcy9hdHRhY2htZW50LmVudGl0eSc7XG5cbi8qKlxuICogQ29ycmVzcG9uZGVuY2VSZXZpc2lvbkF0dGFjaG1lbnRcbiAqXG4gKiDguJXguLLguKPguLLguIfguYDguIrguLfguYjguK3guKEgY29ycmVzcG9uZGVuY2VfcmV2aXNpb25zIOC4geC4seC4miBhdHRhY2htZW50cyAoTTpOKVxuICogW0ZJWCB2MS44LjFdIEZLIOC4iuC4teC5ieC5hOC4myBjb3JyZXNwb25kZW5jZV9yZXZpc2lvbnMuaWQg4LmE4Lih4LmI4LmD4LiK4LmIIGNvcnJlc3BvbmRlbmNlcy5pZFxuICog4LmA4Lir4LiV4Li44Lic4LilOiDguYTguJ/guKXguYzguYHguJnguJrguJzguLnguIHguIHguLHguJogcmV2aXNpb24g4LmA4Lie4Li34LmI4Lit4Lij4Lit4LiH4Lij4Lix4Lia4LmE4Lif4Lil4LmM4LiX4Li14LmI4LiV4LmI4Liy4LiH4LiB4Lix4LiZ4LmD4LiZ4LmB4LiV4LmI4Lil4LiwIHJldmlzaW9uXG4gKi9cbkBFbnRpdHkoJ2NvcnJlc3BvbmRlbmNlX3JldmlzaW9uX2F0dGFjaG1lbnRzJylcbmV4cG9ydCBjbGFzcyBDb3JyZXNwb25kZW5jZVJldmlzaW9uQXR0YWNobWVudCB7XG4gIC8vIOC4hOC4teC4ouC5jOC4q+C4peC4seC4geC4guC4reC4hyByZXZpc2lvbiDguJfguLXguYjguJzguLnguIHguYTguJ/guKXguYzguJnguLXguYlcbiAgQFByaW1hcnlDb2x1bW4oeyBuYW1lOiAnY29ycmVzcG9uZGVuY2VfcmV2aXNpb25faWQnIH0pXG4gIGNvcnJlc3BvbmRlbmNlUmV2aXNpb25JZCE6IG51bWJlcjtcblxuICAvLyDguITguLXguKLguYzguKvguKXguLHguIHguILguK3guIcgYXR0YWNobWVudFxuICBAUHJpbWFyeUNvbHVtbih7IG5hbWU6ICdhdHRhY2htZW50X2lkJyB9KVxuICBhdHRhY2htZW50SWQhOiBudW1iZXI7XG5cbiAgLy8g4LmE4Lif4Lil4LmM4Lir4Lil4Lix4LiB4LiC4Lit4LiHIHJldmlzaW9uIOC4meC4teC5iSAo4LmA4LiK4LmI4LiZIFBERiDguKvguKXguLHguIEpXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXNfbWFpbl9kb2N1bWVudCcsIGRlZmF1bHQ6IGZhbHNlIH0pXG4gIGlzTWFpbkRvY3VtZW50ITogYm9vbGVhbjtcblxuICAvLyBSZWxhdGlvbjog4Lir4Lil4Liy4LiiIENvcnJlc3BvbmRlbmNlUmV2aXNpb25BdHRhY2htZW50IOKGkiDguKvguJnguLbguYjguIcgQ29ycmVzcG9uZGVuY2VSZXZpc2lvblxuICBATWFueVRvT25lKFxuICAgICgpID0+IENvcnJlc3BvbmRlbmNlUmV2aXNpb24sXG4gICAgKHJldmlzaW9uKSA9PiByZXZpc2lvbi5hdHRhY2htZW50TGlua3MsXG4gICAgeyBvbkRlbGV0ZTogJ0NBU0NBREUnIH1cbiAgKVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdjb3JyZXNwb25kZW5jZV9yZXZpc2lvbl9pZCcgfSlcbiAgcmV2aXNpb24/OiBDb3JyZXNwb25kZW5jZVJldmlzaW9uO1xuXG4gIC8vIFJlbGF0aW9uOiDguKvguKXguLLguKIgQ29ycmVzcG9uZGVuY2VSZXZpc2lvbkF0dGFjaG1lbnQg4oaSIOC4q+C4meC4tuC5iOC4hyBBdHRhY2htZW50XG4gIEBNYW55VG9PbmUoKCkgPT4gQXR0YWNobWVudCwgeyBvbkRlbGV0ZTogJ0NBU0NBREUnLCBlYWdlcjogZmFsc2UgfSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAnYXR0YWNobWVudF9pZCcgfSlcbiAgYXR0YWNobWVudD86IEF0dGFjaG1lbnQ7XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0f/correspondencerevisionattachmententity_0ff8771ed74454f89aff9994cf6ef628.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0f/correspondencerevisionattachmententity_0ff8771ed74454f89aff9994cf6ef628.map new file mode 100644 index 0000000..4c7a837 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0f/correspondencerevisionattachmententity_0ff8771ed74454f89aff9994cf6ef628.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-revision-attachment.entity.ts","mappings":";;;;;;;;;;;;;AAAA,yFAAyF;AACzF,qCAA+E;AAC/E,qFAA0E;AAC1E,+FAAqF;AAErF;;;;;;GAMG;AAEI,IAAM,gCAAgC,GAAtC,MAAM,gCAAgC;CA0B5C,CAAA;AA1BY,4EAAgC;AAG3C;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC;;kFACpB;AAIlC;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;;sEACnB;AAItB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;wEAC5B;AASzB;IANC,IAAA,mBAAS,EACR,GAAG,EAAE,CAAC,uDAAsB,EAC5B,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,eAAe,EACtC,EAAE,QAAQ,EAAE,SAAS,EAAE,CACxB;IACA,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC;kDACxC,uDAAsB,oBAAtB,uDAAsB;kEAAC;AAKlC;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,8BAAU,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAClE,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;kDACzB,8BAAU,oBAAV,8BAAU;oEAAC;2CAzBb,gCAAgC;IAD5C,IAAA,gBAAM,EAAC,qCAAqC,CAAC;GACjC,gCAAgC,CA0B5C","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-revision-attachment.entity.ts"],"sourcesContent":["// File: src/modules/correspondence/entities/correspondence-revision-attachment.entity.ts\nimport { Entity, Column, ManyToOne, JoinColumn, PrimaryColumn } from 'typeorm';\nimport { CorrespondenceRevision } from './correspondence-revision.entity';\nimport { Attachment } from '../../../common/file-storage/entities/attachment.entity';\n\n/**\n * CorrespondenceRevisionAttachment\n *\n * ตารางเชื่อม correspondence_revisions กับ attachments (M:N)\n * [FIX v1.8.1] FK ชี้ไป correspondence_revisions.id ไม่ใช่ correspondences.id\n * เหตุผล: ไฟล์แนบผูกกับ revision เพื่อรองรับไฟล์ที่ต่างกันในแต่ละ revision\n */\n@Entity('correspondence_revision_attachments')\nexport class CorrespondenceRevisionAttachment {\n // คีย์หลักของ revision ที่ผูกไฟล์นี้\n @PrimaryColumn({ name: 'correspondence_revision_id' })\n correspondenceRevisionId!: number;\n\n // คีย์หลักของ attachment\n @PrimaryColumn({ name: 'attachment_id' })\n attachmentId!: number;\n\n // ไฟล์หลักของ revision นี้ (เช่น PDF หลัก)\n @Column({ name: 'is_main_document', default: false })\n isMainDocument!: boolean;\n\n // Relation: หลาย CorrespondenceRevisionAttachment → หนึ่ง CorrespondenceRevision\n @ManyToOne(\n () => CorrespondenceRevision,\n (revision) => revision.attachmentLinks,\n { onDelete: 'CASCADE' }\n )\n @JoinColumn({ name: 'correspondence_revision_id' })\n revision?: CorrespondenceRevision;\n\n // Relation: หลาย CorrespondenceRevisionAttachment → หนึ่ง Attachment\n @ManyToOne(() => Attachment, { onDelete: 'CASCADE', eager: false })\n @JoinColumn({ name: 'attachment_id' })\n attachment?: Attachment;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0f/projectcontroller_0fbed68f47eaecd76a1e8dbc637902eb b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0f/projectcontroller_0fbed68f47eaecd76a1e8dbc637902eb new file mode 100644 index 0000000..ebcd6df --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0f/projectcontroller_0fbed68f47eaecd76a1e8dbc637902eb @@ -0,0 +1,128 @@ +4c7e494a61ffe7e65effb9e0f3873eb7 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ProjectController = void 0; +const common_1 = require("@nestjs/common"); +const swagger_1 = require("@nestjs/swagger"); +const project_service_1 = require("./project.service"); +const create_project_dto_1 = require("./dto/create-project.dto"); +const update_project_dto_1 = require("./dto/update-project.dto"); +const search_project_dto_1 = require("./dto/search-project.dto"); +const jwt_auth_guard_1 = require("../../common/guards/jwt-auth.guard"); +const rbac_guard_1 = require("../../common/guards/rbac.guard"); +const parse_uuid_pipe_1 = require("../../common/pipes/parse-uuid.pipe"); +const require_permission_decorator_1 = require("../../common/decorators/require-permission.decorator"); +let ProjectController = class ProjectController { + constructor(projectService) { + this.projectService = projectService; + } + create(createDto) { + return this.projectService.create(createDto); + } + findAll(searchDto) { + return this.projectService.findAll(searchDto); + } + // @RequirePermission('organization.view') // หรือเปิดให้ดูได้ทั่วไปถ้าจำเป็น + findAllOrgs() { + return this.projectService.findAllOrganizations(); + } + findContracts(uuid) { + return this.projectService.findContracts(uuid); + } + findOne(uuid) { + return this.projectService.findOneByUuid(uuid); + } + update(uuid, updateDto) { + return this.projectService.update(uuid, updateDto); + } + remove(uuid) { + return this.projectService.remove(uuid); + } +}; +exports.ProjectController = ProjectController; +__decorate([ + (0, common_1.Post)(), + (0, swagger_1.ApiOperation)({ summary: 'Create new Project' }), + (0, require_permission_decorator_1.RequirePermission)('project.create'), + __param(0, (0, common_1.Body)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_b = typeof create_project_dto_1.CreateProjectDto !== "undefined" && create_project_dto_1.CreateProjectDto) === "function" ? _b : Object]), + __metadata("design:returntype", void 0) +], ProjectController.prototype, "create", null); +__decorate([ + (0, common_1.Get)(), + (0, swagger_1.ApiOperation)({ summary: 'Search Projects' }), + (0, require_permission_decorator_1.RequirePermission)('project.view'), + __param(0, (0, common_1.Query)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_c = typeof search_project_dto_1.SearchProjectDto !== "undefined" && search_project_dto_1.SearchProjectDto) === "function" ? _c : Object]), + __metadata("design:returntype", void 0) +], ProjectController.prototype, "findAll", null); +__decorate([ + (0, common_1.Get)('organizations'), + (0, swagger_1.ApiOperation)({ summary: 'List All Organizations (Master Data)' }) + // @RequirePermission('organization.view') // หรือเปิดให้ดูได้ทั่วไปถ้าจำเป็น + , + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", void 0) +], ProjectController.prototype, "findAllOrgs", null); +__decorate([ + (0, common_1.Get)(':uuid/contracts'), + (0, swagger_1.ApiOperation)({ summary: 'List All Contracts in Project' }), + (0, require_permission_decorator_1.RequirePermission)('project.view'), + __param(0, (0, common_1.Param)('uuid', parse_uuid_pipe_1.ParseUuidPipe)), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String]), + __metadata("design:returntype", void 0) +], ProjectController.prototype, "findContracts", null); +__decorate([ + (0, common_1.Get)(':uuid'), + (0, swagger_1.ApiOperation)({ summary: 'Get Project Details' }), + (0, require_permission_decorator_1.RequirePermission)('project.view'), + __param(0, (0, common_1.Param)('uuid', parse_uuid_pipe_1.ParseUuidPipe)), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String]), + __metadata("design:returntype", void 0) +], ProjectController.prototype, "findOne", null); +__decorate([ + (0, common_1.Patch)(':uuid'), + (0, swagger_1.ApiOperation)({ summary: 'Update Project' }), + (0, require_permission_decorator_1.RequirePermission)('project.edit'), + __param(0, (0, common_1.Param)('uuid', parse_uuid_pipe_1.ParseUuidPipe)), + __param(1, (0, common_1.Body)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, typeof (_d = typeof update_project_dto_1.UpdateProjectDto !== "undefined" && update_project_dto_1.UpdateProjectDto) === "function" ? _d : Object]), + __metadata("design:returntype", void 0) +], ProjectController.prototype, "update", null); +__decorate([ + (0, common_1.Delete)(':uuid'), + (0, swagger_1.ApiOperation)({ summary: 'Delete Project (Soft Delete)' }), + (0, require_permission_decorator_1.RequirePermission)('project.delete'), + __param(0, (0, common_1.Param)('uuid', parse_uuid_pipe_1.ParseUuidPipe)), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String]), + __metadata("design:returntype", void 0) +], ProjectController.prototype, "remove", null); +exports.ProjectController = ProjectController = __decorate([ + (0, swagger_1.ApiTags)('Projects'), + (0, swagger_1.ApiBearerAuth)(), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard, rbac_guard_1.RbacGuard), + (0, common_1.Controller)('projects') // แนะนำให้ใช้ plural noun (projects) + , + __metadata("design:paramtypes", [typeof (_a = typeof project_service_1.ProjectService !== "undefined" && project_service_1.ProjectService) === "function" ? _a : Object]) +], ProjectController); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccHJvamVjdFxccHJvamVjdC5jb250cm9sbGVyLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FVd0I7QUFDeEIsNkNBQXVFO0FBRXZFLHVEQUFtRDtBQUNuRCxpRUFBNEQ7QUFDNUQsaUVBQTREO0FBQzVELGlFQUE0RDtBQUU1RCx1RUFBa0U7QUFDbEUsK0RBQTJEO0FBQzNELHdFQUFtRTtBQUNuRSx1R0FBeUY7QUFNbEYsSUFBTSxpQkFBaUIsR0FBdkIsTUFBTSxpQkFBaUI7SUFDNUIsWUFBNkIsY0FBOEI7UUFBOUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO0lBQUcsQ0FBQztJQUsvRCxNQUFNLENBQVMsU0FBMkI7UUFDeEMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBS0QsT0FBTyxDQUFVLFNBQTJCO1FBQzFDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUtELEFBREEsNkVBQTZFO0lBQzdFLFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBS0QsYUFBYSxDQUErQixJQUFZO1FBQ3RELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUtELE9BQU8sQ0FBK0IsSUFBWTtRQUNoRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFLRCxNQUFNLENBQzBCLElBQVksRUFDbEMsU0FBMkI7UUFFbkMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUtELE1BQU0sQ0FBK0IsSUFBWTtRQUMvQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7Q0FDRixDQUFBO0FBdERZLDhDQUFpQjtBQU01QjtJQUhDLElBQUEsYUFBSSxHQUFFO0lBQ04sSUFBQSxzQkFBWSxFQUFDLEVBQUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLENBQUM7SUFDL0MsSUFBQSxnREFBaUIsRUFBQyxnQkFBZ0IsQ0FBQztJQUM1QixXQUFBLElBQUEsYUFBSSxHQUFFLENBQUE7O3lEQUFZLHFDQUFnQixvQkFBaEIscUNBQWdCOzsrQ0FFekM7QUFLRDtJQUhDLElBQUEsWUFBRyxHQUFFO0lBQ0wsSUFBQSxzQkFBWSxFQUFDLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLENBQUM7SUFDNUMsSUFBQSxnREFBaUIsRUFBQyxjQUFjLENBQUM7SUFDekIsV0FBQSxJQUFBLGNBQUssR0FBRSxDQUFBOzt5REFBWSxxQ0FBZ0Isb0JBQWhCLHFDQUFnQjs7Z0RBRTNDO0FBS0Q7SUFIQyxJQUFBLFlBQUcsRUFBQyxlQUFlLENBQUM7SUFDcEIsSUFBQSxzQkFBWSxFQUFDLEVBQUUsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLENBQUM7SUFDbEUsNkVBQTZFOzs7OztvREFHNUU7QUFLRDtJQUhDLElBQUEsWUFBRyxFQUFDLGlCQUFpQixDQUFDO0lBQ3RCLElBQUEsc0JBQVksRUFBQyxFQUFFLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxDQUFDO0lBQzFELElBQUEsZ0RBQWlCLEVBQUMsY0FBYyxDQUFDO0lBQ25CLFdBQUEsSUFBQSxjQUFLLEVBQUMsTUFBTSxFQUFFLCtCQUFhLENBQUMsQ0FBQTs7OztzREFFMUM7QUFLRDtJQUhDLElBQUEsWUFBRyxFQUFDLE9BQU8sQ0FBQztJQUNaLElBQUEsc0JBQVksRUFBQyxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxDQUFDO0lBQ2hELElBQUEsZ0RBQWlCLEVBQUMsY0FBYyxDQUFDO0lBQ3pCLFdBQUEsSUFBQSxjQUFLLEVBQUMsTUFBTSxFQUFFLCtCQUFhLENBQUMsQ0FBQTs7OztnREFFcEM7QUFLRDtJQUhDLElBQUEsY0FBSyxFQUFDLE9BQU8sQ0FBQztJQUNkLElBQUEsc0JBQVksRUFBQyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO0lBQzNDLElBQUEsZ0RBQWlCLEVBQUMsY0FBYyxDQUFDO0lBRS9CLFdBQUEsSUFBQSxjQUFLLEVBQUMsTUFBTSxFQUFFLCtCQUFhLENBQUMsQ0FBQTtJQUM1QixXQUFBLElBQUEsYUFBSSxHQUFFLENBQUE7O2lFQUFZLHFDQUFnQixvQkFBaEIscUNBQWdCOzsrQ0FHcEM7QUFLRDtJQUhDLElBQUEsZUFBTSxFQUFDLE9BQU8sQ0FBQztJQUNmLElBQUEsc0JBQVksRUFBQyxFQUFFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxDQUFDO0lBQ3pELElBQUEsZ0RBQWlCLEVBQUMsZ0JBQWdCLENBQUM7SUFDNUIsV0FBQSxJQUFBLGNBQUssRUFBQyxNQUFNLEVBQUUsK0JBQWEsQ0FBQyxDQUFBOzs7OytDQUVuQzs0QkFyRFUsaUJBQWlCO0lBSjdCLElBQUEsaUJBQU8sRUFBQyxVQUFVLENBQUM7SUFDbkIsSUFBQSx1QkFBYSxHQUFFO0lBQ2YsSUFBQSxrQkFBUyxFQUFDLDZCQUFZLEVBQUUsc0JBQVMsQ0FBQztJQUNsQyxJQUFBLG1CQUFVLEVBQUMsVUFBVSxDQUFDLENBQUMscUNBQXFDOzt5REFFZCxnQ0FBYyxvQkFBZCxnQ0FBYztHQURoRCxpQkFBaUIsQ0FzRDdCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXHByb2plY3RcXHByb2plY3QuY29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb250cm9sbGVyLFxuICBHZXQsXG4gIFBvc3QsXG4gIEJvZHksXG4gIFBhdGNoLFxuICBQYXJhbSxcbiAgRGVsZXRlLFxuICBRdWVyeSxcbiAgVXNlR3VhcmRzLFxufSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XG5pbXBvcnQgeyBBcGlUYWdzLCBBcGlPcGVyYXRpb24sIEFwaUJlYXJlckF1dGggfSBmcm9tICdAbmVzdGpzL3N3YWdnZXInO1xuXG5pbXBvcnQgeyBQcm9qZWN0U2VydmljZSB9IGZyb20gJy4vcHJvamVjdC5zZXJ2aWNlJztcbmltcG9ydCB7IENyZWF0ZVByb2plY3REdG8gfSBmcm9tICcuL2R0by9jcmVhdGUtcHJvamVjdC5kdG8nO1xuaW1wb3J0IHsgVXBkYXRlUHJvamVjdER0byB9IGZyb20gJy4vZHRvL3VwZGF0ZS1wcm9qZWN0LmR0byc7XG5pbXBvcnQgeyBTZWFyY2hQcm9qZWN0RHRvIH0gZnJvbSAnLi9kdG8vc2VhcmNoLXByb2plY3QuZHRvJztcblxuaW1wb3J0IHsgSnd0QXV0aEd1YXJkIH0gZnJvbSAnLi4vLi4vY29tbW9uL2d1YXJkcy9qd3QtYXV0aC5ndWFyZCc7XG5pbXBvcnQgeyBSYmFjR3VhcmQgfSBmcm9tICcuLi8uLi9jb21tb24vZ3VhcmRzL3JiYWMuZ3VhcmQnO1xuaW1wb3J0IHsgUGFyc2VVdWlkUGlwZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9waXBlcy9wYXJzZS11dWlkLnBpcGUnO1xuaW1wb3J0IHsgUmVxdWlyZVBlcm1pc3Npb24gfSBmcm9tICcuLi8uLi9jb21tb24vZGVjb3JhdG9ycy9yZXF1aXJlLXBlcm1pc3Npb24uZGVjb3JhdG9yJztcblxuQEFwaVRhZ3MoJ1Byb2plY3RzJylcbkBBcGlCZWFyZXJBdXRoKClcbkBVc2VHdWFyZHMoSnd0QXV0aEd1YXJkLCBSYmFjR3VhcmQpXG5AQ29udHJvbGxlcigncHJvamVjdHMnKSAvLyDguYHguJnguLDguJnguLPguYPguKvguYnguYPguIrguYkgcGx1cmFsIG5vdW4gKHByb2plY3RzKVxuZXhwb3J0IGNsYXNzIFByb2plY3RDb250cm9sbGVyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9qZWN0U2VydmljZTogUHJvamVjdFNlcnZpY2UpIHt9XG5cbiAgQFBvc3QoKVxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ0NyZWF0ZSBuZXcgUHJvamVjdCcgfSlcbiAgQFJlcXVpcmVQZXJtaXNzaW9uKCdwcm9qZWN0LmNyZWF0ZScpXG4gIGNyZWF0ZShAQm9keSgpIGNyZWF0ZUR0bzogQ3JlYXRlUHJvamVjdER0bykge1xuICAgIHJldHVybiB0aGlzLnByb2plY3RTZXJ2aWNlLmNyZWF0ZShjcmVhdGVEdG8pO1xuICB9XG5cbiAgQEdldCgpXG4gIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiAnU2VhcmNoIFByb2plY3RzJyB9KVxuICBAUmVxdWlyZVBlcm1pc3Npb24oJ3Byb2plY3QudmlldycpXG4gIGZpbmRBbGwoQFF1ZXJ5KCkgc2VhcmNoRHRvOiBTZWFyY2hQcm9qZWN0RHRvKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvamVjdFNlcnZpY2UuZmluZEFsbChzZWFyY2hEdG8pO1xuICB9XG5cbiAgQEdldCgnb3JnYW5pemF0aW9ucycpXG4gIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiAnTGlzdCBBbGwgT3JnYW5pemF0aW9ucyAoTWFzdGVyIERhdGEpJyB9KVxuICAvLyBAUmVxdWlyZVBlcm1pc3Npb24oJ29yZ2FuaXphdGlvbi52aWV3JykgLy8g4Lir4Lij4Li34Lit4LmA4Lib4Li04LiU4LmD4Lir4LmJ4LiU4Li54LmE4LiU4LmJ4LiX4Lix4LmI4Lin4LmE4Lib4LiW4LmJ4Liy4LiI4Liz4LmA4Lib4LmH4LiZXG4gIGZpbmRBbGxPcmdzKCkge1xuICAgIHJldHVybiB0aGlzLnByb2plY3RTZXJ2aWNlLmZpbmRBbGxPcmdhbml6YXRpb25zKCk7XG4gIH1cblxuICBAR2V0KCc6dXVpZC9jb250cmFjdHMnKVxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ0xpc3QgQWxsIENvbnRyYWN0cyBpbiBQcm9qZWN0JyB9KVxuICBAUmVxdWlyZVBlcm1pc3Npb24oJ3Byb2plY3QudmlldycpXG4gIGZpbmRDb250cmFjdHMoQFBhcmFtKCd1dWlkJywgUGFyc2VVdWlkUGlwZSkgdXVpZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvamVjdFNlcnZpY2UuZmluZENvbnRyYWN0cyh1dWlkKTtcbiAgfVxuXG4gIEBHZXQoJzp1dWlkJylcbiAgQEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6ICdHZXQgUHJvamVjdCBEZXRhaWxzJyB9KVxuICBAUmVxdWlyZVBlcm1pc3Npb24oJ3Byb2plY3QudmlldycpXG4gIGZpbmRPbmUoQFBhcmFtKCd1dWlkJywgUGFyc2VVdWlkUGlwZSkgdXVpZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvamVjdFNlcnZpY2UuZmluZE9uZUJ5VXVpZCh1dWlkKTtcbiAgfVxuXG4gIEBQYXRjaCgnOnV1aWQnKVxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ1VwZGF0ZSBQcm9qZWN0JyB9KVxuICBAUmVxdWlyZVBlcm1pc3Npb24oJ3Byb2plY3QuZWRpdCcpXG4gIHVwZGF0ZShcbiAgICBAUGFyYW0oJ3V1aWQnLCBQYXJzZVV1aWRQaXBlKSB1dWlkOiBzdHJpbmcsXG4gICAgQEJvZHkoKSB1cGRhdGVEdG86IFVwZGF0ZVByb2plY3REdG9cbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvamVjdFNlcnZpY2UudXBkYXRlKHV1aWQsIHVwZGF0ZUR0byk7XG4gIH1cblxuICBARGVsZXRlKCc6dXVpZCcpXG4gIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiAnRGVsZXRlIFByb2plY3QgKFNvZnQgRGVsZXRlKScgfSlcbiAgQFJlcXVpcmVQZXJtaXNzaW9uKCdwcm9qZWN0LmRlbGV0ZScpXG4gIHJlbW92ZShAUGFyYW0oJ3V1aWQnLCBQYXJzZVV1aWRQaXBlKSB1dWlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9qZWN0U2VydmljZS5yZW1vdmUodXVpZCk7XG4gIH1cbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0f/projectcontroller_0fbed68f47eaecd76a1e8dbc637902eb.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0f/projectcontroller_0fbed68f47eaecd76a1e8dbc637902eb.map new file mode 100644 index 0000000..6092fbf --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/0f/projectcontroller_0fbed68f47eaecd76a1e8dbc637902eb.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\project\\project.controller.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\project\\project.controller.ts"],"sourcesContent":["import {\n Controller,\n Get,\n Post,\n Body,\n Patch,\n Param,\n Delete,\n Query,\n UseGuards,\n} from '@nestjs/common';\nimport { ApiTags, ApiOperation, ApiBearerAuth } from '@nestjs/swagger';\n\nimport { ProjectService } from './project.service';\nimport { CreateProjectDto } from './dto/create-project.dto';\nimport { UpdateProjectDto } from './dto/update-project.dto';\nimport { SearchProjectDto } from './dto/search-project.dto';\n\nimport { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';\nimport { RbacGuard } from '../../common/guards/rbac.guard';\nimport { ParseUuidPipe } from '../../common/pipes/parse-uuid.pipe';\nimport { RequirePermission } from '../../common/decorators/require-permission.decorator';\n\n@ApiTags('Projects')\n@ApiBearerAuth()\n@UseGuards(JwtAuthGuard, RbacGuard)\n@Controller('projects') // แนะนำให้ใช้ plural noun (projects)\nexport class ProjectController {\n constructor(private readonly projectService: ProjectService) {}\n\n @Post()\n @ApiOperation({ summary: 'Create new Project' })\n @RequirePermission('project.create')\n create(@Body() createDto: CreateProjectDto) {\n return this.projectService.create(createDto);\n }\n\n @Get()\n @ApiOperation({ summary: 'Search Projects' })\n @RequirePermission('project.view')\n findAll(@Query() searchDto: SearchProjectDto) {\n return this.projectService.findAll(searchDto);\n }\n\n @Get('organizations')\n @ApiOperation({ summary: 'List All Organizations (Master Data)' })\n // @RequirePermission('organization.view') // หรือเปิดให้ดูได้ทั่วไปถ้าจำเป็น\n findAllOrgs() {\n return this.projectService.findAllOrganizations();\n }\n\n @Get(':uuid/contracts')\n @ApiOperation({ summary: 'List All Contracts in Project' })\n @RequirePermission('project.view')\n findContracts(@Param('uuid', ParseUuidPipe) uuid: string) {\n return this.projectService.findContracts(uuid);\n }\n\n @Get(':uuid')\n @ApiOperation({ summary: 'Get Project Details' })\n @RequirePermission('project.view')\n findOne(@Param('uuid', ParseUuidPipe) uuid: string) {\n return this.projectService.findOneByUuid(uuid);\n }\n\n @Patch(':uuid')\n @ApiOperation({ summary: 'Update Project' })\n @RequirePermission('project.edit')\n update(\n @Param('uuid', ParseUuidPipe) uuid: string,\n @Body() updateDto: UpdateProjectDto\n ) {\n return this.projectService.update(uuid, updateDto);\n }\n\n @Delete(':uuid')\n @ApiOperation({ summary: 'Delete Project (Soft Delete)' })\n @RequirePermission('project.delete')\n remove(@Param('uuid', ParseUuidPipe) uuid: string) {\n return this.projectService.remove(uuid);\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/15/workflowhistoryentity_15219612174d1d2f4f5f145fd438785d b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/15/workflowhistoryentity_15219612174d1d2f4f5f145fd438785d new file mode 100644 index 0000000..454de30 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/15/workflowhistoryentity_15219612174d1d2f4f5f145fd438785d @@ -0,0 +1,80 @@ +13e308fb67dff5b4ad5214fe705328de +"use strict"; +// File: src/modules/workflow-engine/entities/workflow-history.entity.ts +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WorkflowHistory = void 0; +const typeorm_1 = require("typeorm"); +const workflow_instance_entity_1 = require("./workflow-instance.entity"); +/** + * เก็บประวัติการเปลี่ยนสถานะ (Audit Trail) + * สำคัญมากสำหรับการตรวจสอบย้อนหลัง (Who did What, When) + */ +let WorkflowHistory = class WorkflowHistory { +}; +exports.WorkflowHistory = WorkflowHistory; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)('uuid'), + __metadata("design:type", String) +], WorkflowHistory.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => workflow_instance_entity_1.WorkflowInstance, { onDelete: 'CASCADE' }), + (0, typeorm_1.JoinColumn)({ name: 'instance_id' }), + __metadata("design:type", typeof (_a = typeof workflow_instance_entity_1.WorkflowInstance !== "undefined" && workflow_instance_entity_1.WorkflowInstance) === "function" ? _a : Object) +], WorkflowHistory.prototype, "instance", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'instance_id' }), + __metadata("design:type", String) +], WorkflowHistory.prototype, "instanceId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'from_state', length: 50, comment: 'สถานะต้นทาง' }), + __metadata("design:type", String) +], WorkflowHistory.prototype, "fromState", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'to_state', length: 50, comment: 'สถานะปลายทาง' }), + __metadata("design:type", String) +], WorkflowHistory.prototype, "toState", void 0); +__decorate([ + (0, typeorm_1.Column)({ length: 50, comment: 'Action ที่ User กด (เช่น APPROVE, REJECT)' }), + __metadata("design:type", String) +], WorkflowHistory.prototype, "action", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'action_by_user_id', + nullable: true, + comment: 'User ID ผู้ดำเนินการ (Nullable กรณี System Auto)', + }), + __metadata("design:type", Number) +], WorkflowHistory.prototype, "actionByUserId", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true, comment: 'ความเห็นประกอบการอนุมัติ' }), + __metadata("design:type", String) +], WorkflowHistory.prototype, "comment", void 0); +__decorate([ + (0, typeorm_1.Column)({ + type: 'json', + nullable: true, + comment: 'Snapshot of Context or Metadata', + }), + __metadata("design:type", typeof (_b = typeof Record !== "undefined" && Record) === "function" ? _b : Object) +], WorkflowHistory.prototype, "metadata", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], WorkflowHistory.prototype, "createdAt", void 0); +exports.WorkflowHistory = WorkflowHistory = __decorate([ + (0, typeorm_1.Entity)('workflow_histories'), + (0, typeorm_1.Index)(['instanceId']) // ค้นหาประวัติของ Instance นี้ + , + (0, typeorm_1.Index)(['actionByUserId']) // ค้นหาว่า User คนนี้ทำอะไรไปบ้าง +], WorkflowHistory); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcd29ya2Zsb3ctZW5naW5lXFxlbnRpdGllc1xcd29ya2Zsb3ctaGlzdG9yeS5lbnRpdHkudHMiLCJtYXBwaW5ncyI6IjtBQUFBLHdFQUF3RTs7Ozs7Ozs7Ozs7OztBQUV4RSxxQ0FRaUI7QUFDakIseUVBQThEO0FBRTlEOzs7R0FHRztBQUlJLElBQU0sZUFBZSxHQUFyQixNQUFNLGVBQWU7Q0F3QzNCLENBQUE7QUF4Q1ksMENBQWU7QUFFMUI7SUFEQyxJQUFBLGdDQUFzQixFQUFDLE1BQU0sQ0FBQzs7MkNBQ25CO0FBSVo7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsMkNBQWdCLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDMUQsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDO2tEQUN6QiwyQ0FBZ0Isb0JBQWhCLDJDQUFnQjtpREFBQztBQUc1QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQzs7bURBQ1o7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDOztrREFDaEQ7QUFHbkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxDQUFDOztnREFDakQ7QUFHakI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSwyQ0FBMkMsRUFBRSxDQUFDOzsrQ0FDN0Q7QUFPaEI7SUFMQyxJQUFBLGdCQUFNLEVBQUM7UUFDTixJQUFJLEVBQUUsbUJBQW1CO1FBQ3pCLFFBQVEsRUFBRSxJQUFJO1FBQ2QsT0FBTyxFQUFFLGtEQUFrRDtLQUM1RCxDQUFDOzt1REFDc0I7QUFHeEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLENBQUM7O2dEQUM3RDtBQVFqQjtJQUxDLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSxNQUFNO1FBQ1osUUFBUSxFQUFFLElBQUk7UUFDZCxPQUFPLEVBQUUsaUNBQWlDO0tBQzNDLENBQUM7a0RBQ1MsTUFBTSxvQkFBTixNQUFNO2lEQUFrQjtBQUduQztJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTtrREFBQzswQkF2Q04sZUFBZTtJQUgzQixJQUFBLGdCQUFNLEVBQUMsb0JBQW9CLENBQUM7SUFDNUIsSUFBQSxlQUFLLEVBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLCtCQUErQjs7SUFDckQsSUFBQSxlQUFLLEVBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsa0NBQWtDO0dBQ2hELGVBQWUsQ0F3QzNCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXHdvcmtmbG93LWVuZ2luZVxcZW50aXRpZXNcXHdvcmtmbG93LWhpc3RvcnkuZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9tb2R1bGVzL3dvcmtmbG93LWVuZ2luZS9lbnRpdGllcy93b3JrZmxvdy1oaXN0b3J5LmVudGl0eS50c1xuXG5pbXBvcnQge1xuICBDb2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIEVudGl0eSxcbiAgSW5kZXgsXG4gIEpvaW5Db2x1bW4sXG4gIE1hbnlUb09uZSxcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbn0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBXb3JrZmxvd0luc3RhbmNlIH0gZnJvbSAnLi93b3JrZmxvdy1pbnN0YW5jZS5lbnRpdHknO1xuXG4vKipcbiAqIOC5gOC4geC5h+C4muC4m+C4o+C4sOC4p+C4seC4leC4tOC4geC4suC4o+C5gOC4m+C4peC4teC5iOC4ouC4meC4quC4luC4suC4meC4sCAoQXVkaXQgVHJhaWwpXG4gKiDguKrguLPguITguLHguI3guKHguLLguIHguKrguLPguKvguKPguLHguJrguIHguLLguKPguJXguKPguKfguIjguKrguK3guJrguKLguYnguK3guJnguKvguKXguLHguIcgKFdobyBkaWQgV2hhdCwgV2hlbilcbiAqL1xuQEVudGl0eSgnd29ya2Zsb3dfaGlzdG9yaWVzJylcbkBJbmRleChbJ2luc3RhbmNlSWQnXSkgLy8g4LiE4LmJ4LiZ4Lir4Liy4Lib4Lij4Liw4Lin4Lix4LiV4Li04LiC4Lit4LiHIEluc3RhbmNlIOC4meC4teC5iVxuQEluZGV4KFsnYWN0aW9uQnlVc2VySWQnXSkgLy8g4LiE4LmJ4LiZ4Lir4Liy4Lin4LmI4LiyIFVzZXIg4LiE4LiZ4LiZ4Li14LmJ4LiX4Liz4Lit4Liw4LmE4Lij4LmE4Lib4Lia4LmJ4Liy4LiHXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dIaXN0b3J5IHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oJ3V1aWQnKVxuICBpZCE6IHN0cmluZztcblxuICBATWFueVRvT25lKCgpID0+IFdvcmtmbG93SW5zdGFuY2UsIHsgb25EZWxldGU6ICdDQVNDQURFJyB9KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdpbnN0YW5jZV9pZCcgfSlcbiAgaW5zdGFuY2UhOiBXb3JrZmxvd0luc3RhbmNlO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnaW5zdGFuY2VfaWQnIH0pXG4gIGluc3RhbmNlSWQhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdmcm9tX3N0YXRlJywgbGVuZ3RoOiA1MCwgY29tbWVudDogJ+C4quC4luC4suC4meC4sOC4leC5ieC4meC4l+C4suC4hycgfSlcbiAgZnJvbVN0YXRlITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAndG9fc3RhdGUnLCBsZW5ndGg6IDUwLCBjb21tZW50OiAn4Liq4LiW4Liy4LiZ4Liw4Lib4Lil4Liy4Lii4LiX4Liy4LiHJyB9KVxuICB0b1N0YXRlITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBsZW5ndGg6IDUwLCBjb21tZW50OiAnQWN0aW9uIOC4l+C4teC5iCBVc2VyIOC4geC4lCAo4LmA4LiK4LmI4LiZIEFQUFJPVkUsIFJFSkVDVCknIH0pXG4gIGFjdGlvbiE6IHN0cmluZztcblxuICBAQ29sdW1uKHtcbiAgICBuYW1lOiAnYWN0aW9uX2J5X3VzZXJfaWQnLFxuICAgIG51bGxhYmxlOiB0cnVlLFxuICAgIGNvbW1lbnQ6ICdVc2VyIElEIOC4nOC4ueC5ieC4lOC4s+C5gOC4meC4tOC4meC4geC4suC4oyAoTnVsbGFibGUg4LiB4Lij4LiT4Li1IFN5c3RlbSBBdXRvKScsXG4gIH0pXG4gIGFjdGlvbkJ5VXNlcklkPzogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndGV4dCcsIG51bGxhYmxlOiB0cnVlLCBjb21tZW50OiAn4LiE4Lin4Liy4Lih4LmA4Lir4LmH4LiZ4Lib4Lij4Liw4LiB4Lit4Lia4LiB4Liy4Lij4Lit4LiZ4Li44Lih4Lix4LiV4Li0JyB9KVxuICBjb21tZW50Pzogc3RyaW5nO1xuXG4gIC8vIFNuYXBzaG90IOC4guC5ieC4reC4oeC4ueC4pSDguJMg4LmA4Lin4Lil4Liy4LiX4Li14LmI4LmA4Lib4Lil4Li14LmI4Lii4LiZ4Liq4LiW4Liy4LiZ4LiwIOC5gOC4nuC4t+C5iOC4reC5gOC4m+C5h+C4meC4q+C4peC4seC4geC4kOC4suC4meC4q+C4suC4gSBDb250ZXh0IOC5gOC4m+C4peC4teC5iOC4ouC4meC5g+C4meC4reC4meC4suC4hOC4lVxuICBAQ29sdW1uKHtcbiAgICB0eXBlOiAnanNvbicsXG4gICAgbnVsbGFibGU6IHRydWUsXG4gICAgY29tbWVudDogJ1NuYXBzaG90IG9mIENvbnRleHQgb3IgTWV0YWRhdGEnLFxuICB9KVxuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIEBDcmVhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/15/workflowhistoryentity_15219612174d1d2f4f5f145fd438785d.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/15/workflowhistoryentity_15219612174d1d2f4f5f145fd438785d.map new file mode 100644 index 0000000..d5804d5 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/15/workflowhistoryentity_15219612174d1d2f4f5f145fd438785d.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\entities\\workflow-history.entity.ts","mappings":";AAAA,wEAAwE;;;;;;;;;;;;;AAExE,qCAQiB;AACjB,yEAA8D;AAE9D;;;GAGG;AAII,IAAM,eAAe,GAArB,MAAM,eAAe;CAwC3B,CAAA;AAxCY,0CAAe;AAE1B;IADC,IAAA,gCAAsB,EAAC,MAAM,CAAC;;2CACnB;AAIZ;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,2CAAgB,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC1D,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;kDACzB,2CAAgB,oBAAhB,2CAAgB;iDAAC;AAG5B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;mDACZ;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;;kDAChD;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;;gDACjD;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,2CAA2C,EAAE,CAAC;;+CAC7D;AAOhB;IALC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,mBAAmB;QACzB,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,kDAAkD;KAC5D,CAAC;;uDACsB;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC;;gDAC7D;AAQjB;IALC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,iCAAiC;KAC3C,CAAC;kDACS,MAAM,oBAAN,MAAM;iDAAkB;AAGnC;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;kDAAC;0BAvCN,eAAe;IAH3B,IAAA,gBAAM,EAAC,oBAAoB,CAAC;IAC5B,IAAA,eAAK,EAAC,CAAC,YAAY,CAAC,CAAC,CAAC,+BAA+B;;IACrD,IAAA,eAAK,EAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,kCAAkC;GAChD,eAAe,CAwC3B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\entities\\workflow-history.entity.ts"],"sourcesContent":["// File: src/modules/workflow-engine/entities/workflow-history.entity.ts\n\nimport {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n} from 'typeorm';\nimport { WorkflowInstance } from './workflow-instance.entity';\n\n/**\n * เก็บประวัติการเปลี่ยนสถานะ (Audit Trail)\n * สำคัญมากสำหรับการตรวจสอบย้อนหลัง (Who did What, When)\n */\n@Entity('workflow_histories')\n@Index(['instanceId']) // ค้นหาประวัติของ Instance นี้\n@Index(['actionByUserId']) // ค้นหาว่า User คนนี้ทำอะไรไปบ้าง\nexport class WorkflowHistory {\n @PrimaryGeneratedColumn('uuid')\n id!: string;\n\n @ManyToOne(() => WorkflowInstance, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'instance_id' })\n instance!: WorkflowInstance;\n\n @Column({ name: 'instance_id' })\n instanceId!: string;\n\n @Column({ name: 'from_state', length: 50, comment: 'สถานะต้นทาง' })\n fromState!: string;\n\n @Column({ name: 'to_state', length: 50, comment: 'สถานะปลายทาง' })\n toState!: string;\n\n @Column({ length: 50, comment: 'Action ที่ User กด (เช่น APPROVE, REJECT)' })\n action!: string;\n\n @Column({\n name: 'action_by_user_id',\n nullable: true,\n comment: 'User ID ผู้ดำเนินการ (Nullable กรณี System Auto)',\n })\n actionByUserId?: number;\n\n @Column({ type: 'text', nullable: true, comment: 'ความเห็นประกอบการอนุมัติ' })\n comment?: string;\n\n // Snapshot ข้อมูล ณ เวลาที่เปลี่ยนสถานะ เพื่อเป็นหลักฐานหาก Context เปลี่ยนในอนาคต\n @Column({\n type: 'json',\n nullable: true,\n comment: 'Snapshot of Context or Metadata',\n })\n metadata?: Record;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/16/requirepermissiondecorator_162c051522422ed99c6329e366a925ba b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/16/requirepermissiondecorator_162c051522422ed99c6329e366a925ba new file mode 100644 index 0000000..54e73b6 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/16/requirepermissiondecorator_162c051522422ed99c6329e366a925ba @@ -0,0 +1,13 @@ +871d624c7966c65172d651a56a6d6b59 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RequirePermission = exports.PERMISSIONS_KEY = void 0; +const common_1 = require("@nestjs/common"); +exports.PERMISSIONS_KEY = 'permissions'; // Changed from PERMISSION_KEY +/** + * Decorator สำหรับกำหนด permissions ที่จำเป็นสำหรับ route + * รองรับ multiple permissions (user ต้องมี ALL permissions) + */ +const RequirePermission = (...permissions) => (0, common_1.SetMetadata)(exports.PERMISSIONS_KEY, permissions); +exports.RequirePermission = RequirePermission; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxkZWNvcmF0b3JzXFxyZXF1aXJlLXBlcm1pc3Npb24uZGVjb3JhdG9yLnRzIiwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUE2QztBQUVoQyxRQUFBLGVBQWUsR0FBRyxhQUFhLENBQUMsQ0FBQyw4QkFBOEI7QUFFNUU7OztHQUdHO0FBQ0ksTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEdBQUcsV0FBcUIsRUFBRSxFQUFFLENBQzVELElBQUEsb0JBQVcsRUFBQyx1QkFBZSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBRC9CLFFBQUEsaUJBQWlCLHFCQUNjIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXGNvbW1vblxcZGVjb3JhdG9yc1xccmVxdWlyZS1wZXJtaXNzaW9uLmRlY29yYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZXRNZXRhZGF0YSB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcblxuZXhwb3J0IGNvbnN0IFBFUk1JU1NJT05TX0tFWSA9ICdwZXJtaXNzaW9ucyc7IC8vIENoYW5nZWQgZnJvbSBQRVJNSVNTSU9OX0tFWVxuXG4vKipcbiAqIERlY29yYXRvciDguKrguLPguKvguKPguLHguJrguIHguLPguKvguJnguJQgcGVybWlzc2lvbnMg4LiX4Li14LmI4LiI4Liz4LmA4Lib4LmH4LiZ4Liq4Liz4Lir4Lij4Lix4LiaIHJvdXRlXG4gKiDguKPguK3guIfguKPguLHguJogbXVsdGlwbGUgcGVybWlzc2lvbnMgKHVzZXIg4LiV4LmJ4Lit4LiH4Lih4Li1IEFMTCBwZXJtaXNzaW9ucylcbiAqL1xuZXhwb3J0IGNvbnN0IFJlcXVpcmVQZXJtaXNzaW9uID0gKC4uLnBlcm1pc3Npb25zOiBzdHJpbmdbXSkgPT5cbiAgU2V0TWV0YWRhdGEoUEVSTUlTU0lPTlNfS0VZLCBwZXJtaXNzaW9ucyk7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/16/requirepermissiondecorator_162c051522422ed99c6329e366a925ba.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/16/requirepermissiondecorator_162c051522422ed99c6329e366a925ba.map new file mode 100644 index 0000000..3837c1c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/16/requirepermissiondecorator_162c051522422ed99c6329e366a925ba.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\decorators\\require-permission.decorator.ts","mappings":";;;AAAA,2CAA6C;AAEhC,QAAA,eAAe,GAAG,aAAa,CAAC,CAAC,8BAA8B;AAE5E;;;GAGG;AACI,MAAM,iBAAiB,GAAG,CAAC,GAAG,WAAqB,EAAE,EAAE,CAC5D,IAAA,oBAAW,EAAC,uBAAe,EAAE,WAAW,CAAC,CAAC;AAD/B,QAAA,iBAAiB,qBACc","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\decorators\\require-permission.decorator.ts"],"sourcesContent":["import { SetMetadata } from '@nestjs/common';\n\nexport const PERMISSIONS_KEY = 'permissions'; // Changed from PERMISSION_KEY\n\n/**\n * Decorator สำหรับกำหนด permissions ที่จำเป็นสำหรับ route\n * รองรับ multiple permissions (user ต้องมี ALL permissions)\n */\nexport const RequirePermission = (...permissions: string[]) =>\n SetMetadata(PERMISSIONS_KEY, permissions);\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/16/roleentity_167ae781e401650da7dcc03d9b583938 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/16/roleentity_167ae781e401650da7dcc03d9b583938 new file mode 100644 index 0000000..fc36c4a --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/16/roleentity_167ae781e401650da7dcc03d9b583938 @@ -0,0 +1,64 @@ +de808bf15a7404907c767ae951b8cee1 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Role = exports.RoleScope = void 0; +const typeorm_1 = require("typeorm"); +const permission_entity_1 = require("./permission.entity"); +var RoleScope; +(function (RoleScope) { + RoleScope["GLOBAL"] = "Global"; + RoleScope["ORGANIZATION"] = "Organization"; + RoleScope["PROJECT"] = "Project"; + RoleScope["CONTRACT"] = "Contract"; +})(RoleScope || (exports.RoleScope = RoleScope = {})); +let Role = class Role { +}; +exports.Role = Role; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)({ name: 'role_id' }), + __metadata("design:type", Number) +], Role.prototype, "roleId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'role_name', length: 100 }), + __metadata("design:type", String) +], Role.prototype, "roleName", void 0); +__decorate([ + (0, typeorm_1.Column)({ + type: 'enum', + enum: RoleScope, + }), + __metadata("design:type", String) +], Role.prototype, "scope", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], Role.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_system', default: false }), + __metadata("design:type", Boolean) +], Role.prototype, "isSystem", void 0); +__decorate([ + (0, typeorm_1.ManyToMany)(() => permission_entity_1.Permission), + (0, typeorm_1.JoinTable)({ + name: 'role_permissions', + joinColumn: { name: 'role_id', referencedColumnName: 'roleId' }, + inverseJoinColumn: { + name: 'permission_id', + referencedColumnName: 'permissionId', + }, + }), + __metadata("design:type", Array) +], Role.prototype, "permissions", void 0); +exports.Role = Role = __decorate([ + (0, typeorm_1.Entity)('roles') +], Role); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcdXNlclxcZW50aXRpZXNcXHJvbGUuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLHFDQU1pQjtBQUNqQiwyREFBaUQ7QUFFakQsSUFBWSxTQUtYO0FBTEQsV0FBWSxTQUFTO0lBQ25CLDhCQUFpQixDQUFBO0lBQ2pCLDBDQUE2QixDQUFBO0lBQzdCLGdDQUFtQixDQUFBO0lBQ25CLGtDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFMVyxTQUFTLHlCQUFULFNBQVMsUUFLcEI7QUFHTSxJQUFNLElBQUksR0FBVixNQUFNLElBQUk7Q0E2QmhCLENBQUE7QUE3Qlksb0JBQUk7QUFFZjtJQURDLElBQUEsZ0NBQXNCLEVBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7O29DQUM1QjtBQUdoQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOztzQ0FDekI7QUFNbEI7SUFKQyxJQUFBLGdCQUFNLEVBQUM7UUFDTixJQUFJLEVBQUUsTUFBTTtRQUNaLElBQUksRUFBRSxTQUFTO0tBQ2hCLENBQUM7O21DQUNnQjtBQUdsQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzt5Q0FDcEI7QUFHckI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQzs7c0NBQzNCO0FBV25CO0lBVEMsSUFBQSxvQkFBVSxFQUFDLEdBQUcsRUFBRSxDQUFDLDhCQUFVLENBQUM7SUFDNUIsSUFBQSxtQkFBUyxFQUFDO1FBQ1QsSUFBSSxFQUFFLGtCQUFrQjtRQUN4QixVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsRUFBRTtRQUMvRCxpQkFBaUIsRUFBRTtZQUNqQixJQUFJLEVBQUUsZUFBZTtZQUNyQixvQkFBb0IsRUFBRSxjQUFjO1NBQ3JDO0tBQ0YsQ0FBQzs7eUNBQ3lCO2VBNUJoQixJQUFJO0lBRGhCLElBQUEsZ0JBQU0sRUFBQyxPQUFPLENBQUM7R0FDSCxJQUFJLENBNkJoQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFx1c2VyXFxlbnRpdGllc1xccm9sZS5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW50aXR5LFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBDb2x1bW4sXG4gIE1hbnlUb01hbnksXG4gIEpvaW5UYWJsZSxcbn0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uIH0gZnJvbSAnLi9wZXJtaXNzaW9uLmVudGl0eSc7XG5cbmV4cG9ydCBlbnVtIFJvbGVTY29wZSB7XG4gIEdMT0JBTCA9ICdHbG9iYWwnLFxuICBPUkdBTklaQVRJT04gPSAnT3JnYW5pemF0aW9uJyxcbiAgUFJPSkVDVCA9ICdQcm9qZWN0JyxcbiAgQ09OVFJBQ1QgPSAnQ29udHJhY3QnLFxufVxuXG5ARW50aXR5KCdyb2xlcycpXG5leHBvcnQgY2xhc3MgUm9sZSB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKHsgbmFtZTogJ3JvbGVfaWQnIH0pXG4gIHJvbGVJZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3JvbGVfbmFtZScsIGxlbmd0aDogMTAwIH0pXG4gIHJvbGVOYW1lITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oe1xuICAgIHR5cGU6ICdlbnVtJyxcbiAgICBlbnVtOiBSb2xlU2NvcGUsXG4gIH0pXG4gIHNjb3BlITogUm9sZVNjb3BlO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndGV4dCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXNfc3lzdGVtJywgZGVmYXVsdDogZmFsc2UgfSlcbiAgaXNTeXN0ZW0hOiBib29sZWFuO1xuXG4gIEBNYW55VG9NYW55KCgpID0+IFBlcm1pc3Npb24pXG4gIEBKb2luVGFibGUoe1xuICAgIG5hbWU6ICdyb2xlX3Blcm1pc3Npb25zJyxcbiAgICBqb2luQ29sdW1uOiB7IG5hbWU6ICdyb2xlX2lkJywgcmVmZXJlbmNlZENvbHVtbk5hbWU6ICdyb2xlSWQnIH0sXG4gICAgaW52ZXJzZUpvaW5Db2x1bW46IHtcbiAgICAgIG5hbWU6ICdwZXJtaXNzaW9uX2lkJyxcbiAgICAgIHJlZmVyZW5jZWRDb2x1bW5OYW1lOiAncGVybWlzc2lvbklkJyxcbiAgICB9LFxuICB9KVxuICBwZXJtaXNzaW9ucz86IFBlcm1pc3Npb25bXTtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/16/roleentity_167ae781e401650da7dcc03d9b583938.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/16/roleentity_167ae781e401650da7dcc03d9b583938.map new file mode 100644 index 0000000..354fcfe --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/16/roleentity_167ae781e401650da7dcc03d9b583938.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\entities\\role.entity.ts","mappings":";;;;;;;;;;;;AAAA,qCAMiB;AACjB,2DAAiD;AAEjD,IAAY,SAKX;AALD,WAAY,SAAS;IACnB,8BAAiB,CAAA;IACjB,0CAA6B,CAAA;IAC7B,gCAAmB,CAAA;IACnB,kCAAqB,CAAA;AACvB,CAAC,EALW,SAAS,yBAAT,SAAS,QAKpB;AAGM,IAAM,IAAI,GAAV,MAAM,IAAI;CA6BhB,CAAA;AA7BY,oBAAI;AAEf;IADC,IAAA,gCAAsB,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;oCAC5B;AAGhB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;sCACzB;AAMlB;IAJC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,SAAS;KAChB,CAAC;;mCACgB;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yCACpB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;sCAC3B;AAWnB;IATC,IAAA,oBAAU,EAAC,GAAG,EAAE,CAAC,8BAAU,CAAC;IAC5B,IAAA,mBAAS,EAAC;QACT,IAAI,EAAE,kBAAkB;QACxB,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,oBAAoB,EAAE,QAAQ,EAAE;QAC/D,iBAAiB,EAAE;YACjB,IAAI,EAAE,eAAe;YACrB,oBAAoB,EAAE,cAAc;SACrC;KACF,CAAC;;yCACyB;eA5BhB,IAAI;IADhB,IAAA,gBAAM,EAAC,OAAO,CAAC;GACH,IAAI,CA6BhB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\entities\\role.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n ManyToMany,\n JoinTable,\n} from 'typeorm';\nimport { Permission } from './permission.entity';\n\nexport enum RoleScope {\n GLOBAL = 'Global',\n ORGANIZATION = 'Organization',\n PROJECT = 'Project',\n CONTRACT = 'Contract',\n}\n\n@Entity('roles')\nexport class Role {\n @PrimaryGeneratedColumn({ name: 'role_id' })\n roleId!: number;\n\n @Column({ name: 'role_name', length: 100 })\n roleName!: string;\n\n @Column({\n type: 'enum',\n enum: RoleScope,\n })\n scope!: RoleScope;\n\n @Column({ type: 'text', nullable: true })\n description?: string;\n\n @Column({ name: 'is_system', default: false })\n isSystem!: boolean;\n\n @ManyToMany(() => Permission)\n @JoinTable({\n name: 'role_permissions',\n joinColumn: { name: 'role_id', referencedColumnName: 'roleId' },\n inverseJoinColumn: {\n name: 'permission_id',\n referencedColumnName: 'permissionId',\n },\n })\n permissions?: Permission[];\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/19/cancelcorrespondencedto_1917d88cac86c7d38761d87ad86160db b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/19/cancelcorrespondencedto_1917d88cac86c7d38761d87ad86160db new file mode 100644 index 0000000..c3099fe --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/19/cancelcorrespondencedto_1917d88cac86c7d38761d87ad86160db @@ -0,0 +1,28 @@ +1392f4037731be5b7557fad753ade41e +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CancelCorrespondenceDto = void 0; +const swagger_1 = require("@nestjs/swagger"); +const class_validator_1 = require("class-validator"); +class CancelCorrespondenceDto { +} +exports.CancelCorrespondenceDto = CancelCorrespondenceDto; +__decorate([ + (0, swagger_1.ApiProperty)({ + description: 'Reason for cancelling the correspondence', + example: 'Document was created in error', + }), + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], CancelCorrespondenceDto.prototype, "reason", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGR0b1xcY2FuY2VsLWNvcnJlc3BvbmRlbmNlLmR0by50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBOEM7QUFDOUMscURBQXVEO0FBRXZELE1BQWEsdUJBQXVCO0NBUW5DO0FBUkQsMERBUUM7QUFEQztJQU5DLElBQUEscUJBQVcsRUFBQztRQUNYLFdBQVcsRUFBRSwwQ0FBMEM7UUFDdkQsT0FBTyxFQUFFLCtCQUErQjtLQUN6QyxDQUFDO0lBQ0QsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzt1REFDRyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxjb3JyZXNwb25kZW5jZVxcZHRvXFxjYW5jZWwtY29ycmVzcG9uZGVuY2UuZHRvLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwaVByb3BlcnR5IH0gZnJvbSAnQG5lc3Rqcy9zd2FnZ2VyJztcclxuaW1wb3J0IHsgSXNTdHJpbmcsIElzTm90RW1wdHkgfSBmcm9tICdjbGFzcy12YWxpZGF0b3InO1xyXG5cclxuZXhwb3J0IGNsYXNzIENhbmNlbENvcnJlc3BvbmRlbmNlRHRvIHtcclxuICBAQXBpUHJvcGVydHkoe1xyXG4gICAgZGVzY3JpcHRpb246ICdSZWFzb24gZm9yIGNhbmNlbGxpbmcgdGhlIGNvcnJlc3BvbmRlbmNlJyxcclxuICAgIGV4YW1wbGU6ICdEb2N1bWVudCB3YXMgY3JlYXRlZCBpbiBlcnJvcicsXHJcbiAgfSlcclxuICBASXNTdHJpbmcoKVxyXG4gIEBJc05vdEVtcHR5KClcclxuICByZWFzb24hOiBzdHJpbmc7XHJcbn1cclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/19/cancelcorrespondencedto_1917d88cac86c7d38761d87ad86160db.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/19/cancelcorrespondencedto_1917d88cac86c7d38761d87ad86160db.map new file mode 100644 index 0000000..aa8cbf7 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/19/cancelcorrespondencedto_1917d88cac86c7d38761d87ad86160db.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\cancel-correspondence.dto.ts","mappings":";;;;;;;;;;;;AAAA,6CAA8C;AAC9C,qDAAuD;AAEvD,MAAa,uBAAuB;CAQnC;AARD,0DAQC;AADC;IANC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,0CAA0C;QACvD,OAAO,EAAE,+BAA+B;KACzC,CAAC;IACD,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;uDACG","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\cancel-correspondence.dto.ts"],"sourcesContent":["import { ApiProperty } from '@nestjs/swagger';\r\nimport { IsString, IsNotEmpty } from 'class-validator';\r\n\r\nexport class CancelCorrespondenceDto {\r\n @ApiProperty({\r\n description: 'Reason for cancelling the correspondence',\r\n example: 'Document was created in error',\r\n })\r\n @IsString()\r\n @IsNotEmpty()\r\n reason!: string;\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1a/reservationservice_1a5355ad83ff0e0ecee7c8796d481e45 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1a/reservationservice_1a5355ad83ff0e0ecee7c8796d481e45 new file mode 100644 index 0000000..0bcb385 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1a/reservationservice_1a5355ad83ff0e0ecee7c8796d481e45 @@ -0,0 +1,178 @@ +714357ff48f856987e1bde62a395623d +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var ReservationService_1; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReservationService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const schedule_1 = require("@nestjs/schedule"); +const uuid_1 = require("uuid"); +const document_number_reservation_entity_1 = require("../entities/document-number-reservation.entity"); +const counter_service_1 = require("./counter.service"); +const format_service_1 = require("./format.service"); +const counter_key_dto_1 = require("../dto/counter-key.dto"); +let ReservationService = ReservationService_1 = class ReservationService { + constructor(reservationRepo, counterService, formatService) { + this.reservationRepo = reservationRepo; + this.counterService = counterService; + this.formatService = formatService; + this.logger = new common_1.Logger(ReservationService_1.name); + this.RESERVATION_TTL_MINUTES = 5; + } + /** + * Reserve a document number (Phase 1 of Two-Phase Commit) + */ + async reserve(dto, userId, ipAddress, userAgent) { + // Build counter key + const counterKey = (0, counter_key_dto_1.buildCounterKey)({ + projectId: dto.projectId, + originatorOrgId: dto.originatorOrganizationId, + recipientOrgId: dto.recipientOrganizationId, + correspondenceTypeId: dto.correspondenceTypeId, + subTypeId: dto.subTypeId, + rfaTypeId: dto.rfaTypeId, + disciplineId: dto.disciplineId, + isRFA: dto.rfaTypeId !== undefined && dto.rfaTypeId > 0, + }); + // Increment counter + const sequence = await this.counterService.incrementCounter(counterKey); + // Format document number + const { previewNumber: documentNumber } = await this.formatService.format({ + ...dto, + sequence, + resetScope: counterKey.resetScope, + }); + // Create reservation + const token = (0, uuid_1.v4)(); + const expiresAt = new Date(Date.now() + this.RESERVATION_TTL_MINUTES * 60 * 1000); + const _reservation = await this.reservationRepo.save({ + token, + documentNumber, + status: document_number_reservation_entity_1.ReservationStatus.RESERVED, + expiresAt, + userId, + ipAddress, + userAgent, + projectId: dto.projectId, + correspondenceTypeId: dto.correspondenceTypeId, + originatorOrganizationId: dto.originatorOrganizationId, + recipientOrganizationId: dto.recipientOrganizationId || 0, + metadata: dto.metadata, + }); + this.logger.log(`Reserved: ${documentNumber} for user ${userId} (token: ${token})`); + return { + token, + documentNumber, + expiresAt, + }; + } + /** + * Confirm a reservation (Phase 2 of Two-Phase Commit) + */ + async confirm(dto, userId) { + const reservation = await this.reservationRepo.findOne({ + where: { + token: dto.token, + status: document_number_reservation_entity_1.ReservationStatus.RESERVED, + }, + }); + if (!reservation) { + throw new common_1.NotFoundException('Reservation not found or already used'); + } + // Check expiration + if (new Date() > reservation.expiresAt) { + await this.cancel(dto.token, userId, 'Expired'); + throw new common_1.GoneException('Reservation expired. Please reserve a new number.'); + } + // Confirm + reservation.status = document_number_reservation_entity_1.ReservationStatus.CONFIRMED; + reservation.documentId = dto.documentId ?? null; + reservation.confirmedAt = new Date(); + await this.reservationRepo.save(reservation); + this.logger.log(`Confirmed: ${reservation.documentNumber} → document ${dto.documentId}`); + return { + documentNumber: reservation.documentNumber, + confirmedAt: reservation.confirmedAt, + }; + } + /** + * Cancel a reservation + */ + async cancel(token, userId, reason) { + const reservation = await this.reservationRepo.findOne({ + where: { token }, + }); + if (reservation && reservation.status === document_number_reservation_entity_1.ReservationStatus.RESERVED) { + reservation.status = document_number_reservation_entity_1.ReservationStatus.CANCELLED; + reservation.cancelledAt = new Date(); + reservation.metadata = { + ...reservation.metadata, + cancelReason: reason, + cancelledBy: userId, + }; + await this.reservationRepo.save(reservation); + this.logger.log(`Cancelled: ${reservation.documentNumber} by user ${userId}`); + } + } + /** + * Cron job: Cleanup expired reservations every 5 minutes + * ใช้ try/catch เพื่อรองรับ transient ECONNRESET — TypeORM pool จะ reconnect อัตโนมัติใน tick ถัดไป + */ + async cleanupExpired() { + try { + const result = await this.reservationRepo + .createQueryBuilder() + .update() + .set({ + status: document_number_reservation_entity_1.ReservationStatus.CANCELLED, + cancelledAt: () => 'NOW()', + }) + .where('document_number_status = :status', { + status: document_number_reservation_entity_1.ReservationStatus.RESERVED, + }) + .andWhere('expires_at < NOW()') + .execute(); + if ((result.affected ?? 0) > 0) { + this.logger.log(`Cleaned up ${result.affected} expired reservations`); + } + } + catch (error) { + // ECONNRESET บน idle connection — TypeORM จะ reconnect pool ใน request ถัดไปโดยอัตโนมัติ + const msg = error instanceof Error ? error.message : String(error); + this.logger.warn(`[cleanupExpired] Transient DB error (will retry next tick): ${msg}`); + } + } + /** + * Get reservation by token + */ + async getByToken(token) { + return this.reservationRepo.findOne({ where: { token } }); + } +}; +exports.ReservationService = ReservationService; +__decorate([ + (0, schedule_1.Cron)('*/5 * * * *'), + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", typeof (_d = typeof Promise !== "undefined" && Promise) === "function" ? _d : Object) +], ReservationService.prototype, "cleanupExpired", null); +exports.ReservationService = ReservationService = ReservationService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(document_number_reservation_entity_1.DocumentNumberReservation)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object, typeof (_b = typeof counter_service_1.CounterService !== "undefined" && counter_service_1.CounterService) === "function" ? _b : Object, typeof (_c = typeof format_service_1.FormatService !== "undefined" && format_service_1.FormatService) === "function" ? _c : Object]) +], ReservationService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxzZXJ2aWNlc1xccmVzZXJ2YXRpb24uc2VydmljZS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUt3QjtBQUN4Qiw2Q0FBbUQ7QUFDbkQscUNBQXFDO0FBQ3JDLCtDQUF3QztBQUN4QywrQkFBb0M7QUFDcEMsdUdBR3dEO0FBU3hELHVEQUFtRDtBQUNuRCxxREFBaUQ7QUFDakQsNERBQXlEO0FBR2xELElBQU0sa0JBQWtCLDBCQUF4QixNQUFNLGtCQUFrQjtJQUk3QixZQUVFLGVBQThELEVBQ3RELGNBQThCLEVBQzlCLGFBQTRCO1FBRjVCLG9CQUFlLEdBQWYsZUFBZSxDQUF1QztRQUN0RCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFQckIsV0FBTSxHQUFHLElBQUksZUFBTSxDQUFDLG9CQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLDRCQUF1QixHQUFHLENBQUMsQ0FBQztJQU8xQyxDQUFDO0lBRUo7O09BRUc7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUNYLEdBQXFCLEVBQ3JCLE1BQWMsRUFDZCxTQUFpQixFQUNqQixTQUFpQjtRQUVqQixvQkFBb0I7UUFDcEIsTUFBTSxVQUFVLEdBQUcsSUFBQSxpQ0FBZSxFQUFDO1lBQ2pDLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUztZQUN4QixlQUFlLEVBQUUsR0FBRyxDQUFDLHdCQUF3QjtZQUM3QyxjQUFjLEVBQUUsR0FBRyxDQUFDLHVCQUF1QjtZQUMzQyxvQkFBb0IsRUFBRSxHQUFHLENBQUMsb0JBQW9CO1lBQzlDLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUztZQUN4QixTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVM7WUFDeEIsWUFBWSxFQUFFLEdBQUcsQ0FBQyxZQUFZO1lBQzlCLEtBQUssRUFBRSxHQUFHLENBQUMsU0FBUyxLQUFLLFNBQVMs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YnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGRvY3VtZW50LW51bWJlcmluZ1xcc2VydmljZXNcXHJlc2VydmF0aW9uLnNlcnZpY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSW5qZWN0YWJsZSxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIEdvbmVFeGNlcHRpb24sXG4gIExvZ2dlcixcbn0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0UmVwb3NpdG9yeSB9IGZyb20gJ0BuZXN0anMvdHlwZW9ybSc7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBDcm9uIH0gZnJvbSAnQG5lc3Rqcy9zY2hlZHVsZSc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7XG4gIERvY3VtZW50TnVtYmVyUmVzZXJ2YXRpb24sXG4gIFJlc2VydmF0aW9uU3RhdHVzLFxufSBmcm9tICcuLi9lbnRpdGllcy9kb2N1bWVudC1udW1iZXItcmVzZXJ2YXRpb24uZW50aXR5JztcbmltcG9ydCB7XG4gIFJlc2VydmVOdW1iZXJEdG8sXG4gIFJlc2VydmVOdW1iZXJSZXNwb25zZUR0byxcbn0gZnJvbSAnLi4vZHRvL3Jlc2VydmUtbnVtYmVyLmR0byc7XG5pbXBvcnQge1xuICBDb25maXJtUmVzZXJ2YXRpb25EdG8sXG4gIENvbmZpcm1SZXNlcnZhdGlvblJlc3BvbnNlRHRvLFxufSBmcm9tICcuLi9kdG8vY29uZmlybS1yZXNlcnZhdGlvbi5kdG8nO1xuaW1wb3J0IHsgQ291bnRlclNlcnZpY2UgfSBmcm9tICcuL2NvdW50ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBGb3JtYXRTZXJ2aWNlIH0gZnJvbSAnLi9mb3JtYXQuc2VydmljZSc7XG5pbXBvcnQgeyBidWlsZENvdW50ZXJLZXkgfSBmcm9tICcuLi9kdG8vY291bnRlci1rZXkuZHRvJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlc2VydmF0aW9uU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IExvZ2dlcihSZXNlcnZhdGlvblNlcnZpY2UubmFtZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgUkVTRVJWQVRJT05fVFRMX01JTlVURVMgPSA1O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3RSZXBvc2l0b3J5KERvY3VtZW50TnVtYmVyUmVzZXJ2YXRpb24pXG4gICAgcHJpdmF0ZSByZXNlcnZhdGlvblJlcG86IFJlcG9zaXRvcnk8RG9jdW1lbnROdW1iZXJSZXNlcnZhdGlvbj4sXG4gICAgcHJpdmF0ZSBjb3VudGVyU2VydmljZTogQ291bnRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmb3JtYXRTZXJ2aWNlOiBGb3JtYXRTZXJ2aWNlXG4gICkge31cblxuICAvKipcbiAgICogUmVzZXJ2ZSBhIGRvY3VtZW50IG51bWJlciAoUGhhc2UgMSBvZiBUd28tUGhhc2UgQ29tbWl0KVxuICAgKi9cbiAgYXN5bmMgcmVzZXJ2ZShcbiAgICBkdG86IFJlc2VydmVOdW1iZXJEdG8sXG4gICAgdXNlcklkOiBudW1iZXIsXG4gICAgaXBBZGRyZXNzOiBzdHJpbmcsXG4gICAgdXNlckFnZW50OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxSZXNlcnZlTnVtYmVyUmVzcG9uc2VEdG8+IHtcbiAgICAvLyBCdWlsZCBjb3VudGVyIGtleVxuICAgIGNvbnN0IGNvdW50ZXJLZXkgPSBidWlsZENvdW50ZXJLZXkoe1xuICAgICAgcHJvamVjdElkOiBkdG8ucHJvamVjdElkLFxuICAgICAgb3JpZ2luYXRvck9yZ0lkOiBkdG8ub3JpZ2luYXRvck9yZ2FuaXphdGlvbklkLFxuICAgICAgcmVjaXBpZW50T3JnSWQ6IGR0by5yZWNpcGllbnRPcmdhbml6YXRpb25JZCxcbiAgICAgIGNvcnJlc3BvbmRlbmNlVHlwZUlkOiBkdG8uY29ycmVzcG9uZGVuY2VUeXBlSWQsXG4gICAgICBzdWJUeXBlSWQ6IGR0by5zdWJUeXBlSWQsXG4gICAgICByZmFUeXBlSWQ6IGR0by5yZmFUeXBlSWQsXG4gICAgICBkaXNjaXBsaW5lSWQ6IGR0by5kaXNjaXBsaW5lSWQsXG4gICAgICBpc1JGQTogZHRvLnJmYVR5cGVJZCAhPT0gdW5kZWZpbmVkICYmIGR0by5yZmFUeXBlSWQgPiAwLFxuICAgIH0pO1xuXG4gICAgLy8gSW5jcmVtZW50IGNvdW50ZXJcbiAgICBjb25zdCBzZXF1ZW5jZSA9IGF3YWl0IHRoaXMuY291bnRlclNlcnZpY2UuaW5jcmVtZW50Q291bnRlcihjb3VudGVyS2V5KTtcblxuICAgIC8vIEZvcm1hdCBkb2N1bWVudCBudW1iZXJcbiAgICBjb25zdCB7IHByZXZpZXdOdW1iZXI6IGRvY3VtZW50TnVtYmVyIH0gPSBhd2FpdCB0aGlzLmZvcm1hdFNlcnZpY2UuZm9ybWF0KHtcbiAgICAgIC4uLmR0byxcbiAgICAgIHNlcXVlbmNlLFxuICAgICAgcmVzZXRTY29wZTogY291bnRlcktleS5yZXNldFNjb3BlLFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIHJlc2VydmF0aW9uXG4gICAgY29uc3QgdG9rZW4gPSB1dWlkdjQoKTtcbiAgICBjb25zdCBleHBpcmVzQXQgPSBuZXcgRGF0ZShcbiAgICAgIERhdGUubm93KCkgKyB0aGlzLlJFU0VSVkFUSU9OX1RUTF9NSU5VVEVTICogNjAgKiAxMDAwXG4gICAgKTtcblxuICAgIGNvbnN0IF9yZXNlcnZhdGlvbiA9IGF3YWl0IHRoaXMucmVzZXJ2YXRpb25SZXBvLnNhdmUoe1xuICAgICAgdG9rZW4sXG4gICAgICBkb2N1bWVudE51bWJlcixcbiAgICAgIHN0YXR1czogUmVzZXJ2YXRpb25TdGF0dXMuUkVTRVJWRUQsXG4gICAgICBleHBpcmVzQXQsXG4gICAgICB1c2VySWQsXG4gICAgICBpcEFkZHJlc3MsXG4gICAgICB1c2VyQWdlbnQsXG4gICAgICBwcm9qZWN0SWQ6IGR0by5wcm9qZWN0SWQsXG4gICAgICBjb3JyZXNwb25kZW5jZVR5cGVJZDogZHRvLmNvcnJlc3BvbmRlbmNlVHlwZUlkLFxuICAgICAgb3JpZ2luYXRvck9yZ2FuaXphdGlvbklkOiBkdG8ub3JpZ2luYXRvck9yZ2FuaXphdGlvbklkLFxuICAgICAgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQ6IGR0by5yZWNpcGllbnRPcmdhbml6YXRpb25JZCB8fCAwLFxuICAgICAgbWV0YWRhdGE6IGR0by5tZXRhZGF0YSxcbiAgICB9KTtcblxuICAgIHRoaXMubG9nZ2VyLmxvZyhcbiAgICAgIGBSZXNlcnZlZDogJHtkb2N1bWVudE51bWJlcn0gZm9yIHVzZXIgJHt1c2VySWR9ICh0b2tlbjogJHt0b2tlbn0pYFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG9rZW4sXG4gICAgICBkb2N1bWVudE51bWJlcixcbiAgICAgIGV4cGlyZXNBdCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpcm0gYSByZXNlcnZhdGlvbiAoUGhhc2UgMiBvZiBUd28tUGhhc2UgQ29tbWl0KVxuICAgKi9cbiAgYXN5bmMgY29uZmlybShcbiAgICBkdG86IENvbmZpcm1SZXNlcnZhdGlvbkR0byxcbiAgICB1c2VySWQ6IG51bWJlclxuICApOiBQcm9taXNlPENvbmZpcm1SZXNlcnZhdGlvblJlc3BvbnNlRHRvPiB7XG4gICAgY29uc3QgcmVzZXJ2YXRpb24gPSBhd2FpdCB0aGlzLnJlc2VydmF0aW9uUmVwby5maW5kT25lKHtcbiAgICAgIHdoZXJlOiB7XG4gICAgICAgIHRva2VuOiBkdG8udG9rZW4sXG4gICAgICAgIHN0YXR1czogUmVzZXJ2YXRpb25TdGF0dXMuUkVTRVJWRUQsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNlcnZhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCdSZXNlcnZhdGlvbiBub3QgZm91bmQgb3IgYWxyZWFkeSB1c2VkJyk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZXhwaXJhdGlvblxuICAgIGlmIChuZXcgRGF0ZSgpID4gcmVzZXJ2YXRpb24uZXhwaXJlc0F0KSB7XG4gICAgICBhd2FpdCB0aGlzLmNhbmNlbChkdG8udG9rZW4sIHVzZXJJZCwgJ0V4cGlyZWQnKTtcbiAgICAgIHRocm93IG5ldyBHb25lRXhjZXB0aW9uKFxuICAgICAgICAnUmVzZXJ2YXRpb24gZXhwaXJlZC4gUGxlYXNlIHJlc2VydmUgYSBuZXcgbnVtYmVyLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ29uZmlybVxuICAgIHJlc2VydmF0aW9uLnN0YXR1cyA9IFJlc2VydmF0aW9uU3RhdHVzLkNPTkZJUk1FRDtcbiAgICByZXNlcnZhdGlvbi5kb2N1bWVudElkID0gZHRvLmRvY3VtZW50SWQgPz8gbnVsbDtcbiAgICByZXNlcnZhdGlvbi5jb25maXJtZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgYXdhaXQgdGhpcy5yZXNlcnZhdGlvblJlcG8uc2F2ZShyZXNlcnZhdGlvbik7XG5cbiAgICB0aGlzLmxvZ2dlci5sb2coXG4gICAgICBgQ29uZmlybWVkOiAke3Jlc2VydmF0aW9uLmRvY3VtZW50TnVtYmVyfSDihpIgZG9jdW1lbnQgJHtkdG8uZG9jdW1lbnRJZH1gXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBkb2N1bWVudE51bWJlcjogcmVzZXJ2YXRpb24uZG9jdW1lbnROdW1iZXIsXG4gICAgICBjb25maXJtZWRBdDogcmVzZXJ2YXRpb24uY29uZmlybWVkQXQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgYSByZXNlcnZhdGlvblxuICAgKi9cbiAgYXN5bmMgY2FuY2VsKHRva2VuOiBzdHJpbmcsIHVzZXJJZDogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXNlcnZhdGlvbiA9IGF3YWl0IHRoaXMucmVzZXJ2YXRpb25SZXBvLmZpbmRPbmUoe1xuICAgICAgd2hlcmU6IHsgdG9rZW4gfSxcbiAgICB9KTtcblxuICAgIGlmIChyZXNlcnZhdGlvbiAmJiByZXNlcnZhdGlvbi5zdGF0dXMgPT09IFJlc2VydmF0aW9uU3RhdHVzLlJFU0VSVkVEKSB7XG4gICAgICByZXNlcnZhdGlvbi5zdGF0dXMgPSBSZXNlcnZhdGlvblN0YXR1cy5DQU5DRUxMRUQ7XG4gICAgICByZXNlcnZhdGlvbi5jYW5jZWxsZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgICByZXNlcnZhdGlvbi5tZXRhZGF0YSA9IHtcbiAgICAgICAgLi4ucmVzZXJ2YXRpb24ubWV0YWRhdGEsXG4gICAgICAgIGNhbmNlbFJlYXNvbjogcmVhc29uLFxuICAgICAgICBjYW5jZWxsZWRCeTogdXNlcklkLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IHRoaXMucmVzZXJ2YXRpb25SZXBvLnNhdmUocmVzZXJ2YXRpb24pO1xuXG4gICAgICB0aGlzLmxvZ2dlci5sb2coXG4gICAgICAgIGBDYW5jZWxsZWQ6ICR7cmVzZXJ2YXRpb24uZG9jdW1lbnROdW1iZXJ9IGJ5IHVzZXIgJHt1c2VySWR9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JvbiBqb2I6IENsZWFudXAgZXhwaXJlZCByZXNlcnZhdGlvbnMgZXZlcnkgNSBtaW51dGVzXG4gICAqIOC5g+C4iuC5iSB0cnkvY2F0Y2gg4LmA4Lie4Li34LmI4Lit4Lij4Lit4LiH4Lij4Lix4LiaIHRyYW5zaWVudCBFQ09OTlJFU0VUIOKAlCBUeXBlT1JNIHBvb2wg4LiI4LiwIHJlY29ubmVjdCDguK3guLHguJXguYLguJnguKHguLHguJXguLTguYPguJkgdGljayDguJbguLHguJTguYTguJtcbiAgICovXG4gIEBDcm9uKCcqLzUgKiAqICogKicpXG4gIGFzeW5jIGNsZWFudXBFeHBpcmVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlc2VydmF0aW9uUmVwb1xuICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgICAgLnVwZGF0ZSgpXG4gICAgICAgIC5zZXQoe1xuICAgICAgICAgIHN0YXR1czogUmVzZXJ2YXRpb25TdGF0dXMuQ0FOQ0VMTEVELFxuICAgICAgICAgIGNhbmNlbGxlZEF0OiAoKSA9PiAnTk9XKCknLFxuICAgICAgICB9KVxuICAgICAgICAud2hlcmUoJ2RvY3VtZW50X251bWJlcl9zdGF0dXMgPSA6c3RhdHVzJywge1xuICAgICAgICAgIHN0YXR1czogUmVzZXJ2YXRpb25TdGF0dXMuUkVTRVJWRUQsXG4gICAgICAgIH0pXG4gICAgICAgIC5hbmRXaGVyZSgnZXhwaXJlc19hdCA8IE5PVygpJylcbiAgICAgICAgLmV4ZWN1dGUoKTtcblxuICAgICAgaWYgKChyZXN1bHQuYWZmZWN0ZWQgPz8gMCkgPiAwKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhgQ2xlYW5lZCB1cCAke3Jlc3VsdC5hZmZlY3RlZH0gZXhwaXJlZCByZXNlcnZhdGlvbnNgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLy8gRUNPTk5SRVNFVCDguJrguJkgaWRsZSBjb25uZWN0aW9uIOKAlCBUeXBlT1JNIOC4iOC4sCByZWNvbm5lY3QgcG9vbCDguYPguJkgcmVxdWVzdCDguJbguLHguJTguYTguJvguYLguJTguKLguK3guLHguJXguYLguJnguKHguLHguJXguLRcbiAgICAgIGNvbnN0IG1zZyA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgIGBbY2xlYW51cEV4cGlyZWRdIFRyYW5zaWVudCBEQiBlcnJvciAod2lsbCByZXRyeSBuZXh0IHRpY2spOiAke21zZ31gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVzZXJ2YXRpb24gYnkgdG9rZW5cbiAgICovXG4gIGFzeW5jIGdldEJ5VG9rZW4odG9rZW46IHN0cmluZyk6IFByb21pc2U8RG9jdW1lbnROdW1iZXJSZXNlcnZhdGlvbiB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5yZXNlcnZhdGlvblJlcG8uZmluZE9uZSh7IHdoZXJlOiB7IHRva2VuIH0gfSk7XG4gIH1cbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1a/reservationservice_1a5355ad83ff0e0ecee7c8796d481e45.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1a/reservationservice_1a5355ad83ff0e0ecee7c8796d481e45.map new file mode 100644 index 0000000..fd0d4c6 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1a/reservationservice_1a5355ad83ff0e0ecee7c8796d481e45.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\reservation.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\reservation.service.ts"],"sourcesContent":["import {\n Injectable,\n NotFoundException,\n GoneException,\n Logger,\n} from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { Repository } from 'typeorm';\nimport { Cron } from '@nestjs/schedule';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n DocumentNumberReservation,\n ReservationStatus,\n} from '../entities/document-number-reservation.entity';\nimport {\n ReserveNumberDto,\n ReserveNumberResponseDto,\n} from '../dto/reserve-number.dto';\nimport {\n ConfirmReservationDto,\n ConfirmReservationResponseDto,\n} from '../dto/confirm-reservation.dto';\nimport { CounterService } from './counter.service';\nimport { FormatService } from './format.service';\nimport { buildCounterKey } from '../dto/counter-key.dto';\n\n@Injectable()\nexport class ReservationService {\n private readonly logger = new Logger(ReservationService.name);\n private readonly RESERVATION_TTL_MINUTES = 5;\n\n constructor(\n @InjectRepository(DocumentNumberReservation)\n private reservationRepo: Repository,\n private counterService: CounterService,\n private formatService: FormatService\n ) {}\n\n /**\n * Reserve a document number (Phase 1 of Two-Phase Commit)\n */\n async reserve(\n dto: ReserveNumberDto,\n userId: number,\n ipAddress: string,\n userAgent: string\n ): Promise {\n // Build counter key\n const counterKey = buildCounterKey({\n projectId: dto.projectId,\n originatorOrgId: dto.originatorOrganizationId,\n recipientOrgId: dto.recipientOrganizationId,\n correspondenceTypeId: dto.correspondenceTypeId,\n subTypeId: dto.subTypeId,\n rfaTypeId: dto.rfaTypeId,\n disciplineId: dto.disciplineId,\n isRFA: dto.rfaTypeId !== undefined && dto.rfaTypeId > 0,\n });\n\n // Increment counter\n const sequence = await this.counterService.incrementCounter(counterKey);\n\n // Format document number\n const { previewNumber: documentNumber } = await this.formatService.format({\n ...dto,\n sequence,\n resetScope: counterKey.resetScope,\n });\n\n // Create reservation\n const token = uuidv4();\n const expiresAt = new Date(\n Date.now() + this.RESERVATION_TTL_MINUTES * 60 * 1000\n );\n\n const _reservation = await this.reservationRepo.save({\n token,\n documentNumber,\n status: ReservationStatus.RESERVED,\n expiresAt,\n userId,\n ipAddress,\n userAgent,\n projectId: dto.projectId,\n correspondenceTypeId: dto.correspondenceTypeId,\n originatorOrganizationId: dto.originatorOrganizationId,\n recipientOrganizationId: dto.recipientOrganizationId || 0,\n metadata: dto.metadata,\n });\n\n this.logger.log(\n `Reserved: ${documentNumber} for user ${userId} (token: ${token})`\n );\n\n return {\n token,\n documentNumber,\n expiresAt,\n };\n }\n\n /**\n * Confirm a reservation (Phase 2 of Two-Phase Commit)\n */\n async confirm(\n dto: ConfirmReservationDto,\n userId: number\n ): Promise {\n const reservation = await this.reservationRepo.findOne({\n where: {\n token: dto.token,\n status: ReservationStatus.RESERVED,\n },\n });\n\n if (!reservation) {\n throw new NotFoundException('Reservation not found or already used');\n }\n\n // Check expiration\n if (new Date() > reservation.expiresAt) {\n await this.cancel(dto.token, userId, 'Expired');\n throw new GoneException(\n 'Reservation expired. Please reserve a new number.'\n );\n }\n\n // Confirm\n reservation.status = ReservationStatus.CONFIRMED;\n reservation.documentId = dto.documentId ?? null;\n reservation.confirmedAt = new Date();\n await this.reservationRepo.save(reservation);\n\n this.logger.log(\n `Confirmed: ${reservation.documentNumber} → document ${dto.documentId}`\n );\n\n return {\n documentNumber: reservation.documentNumber,\n confirmedAt: reservation.confirmedAt,\n };\n }\n\n /**\n * Cancel a reservation\n */\n async cancel(token: string, userId: number, reason?: string): Promise {\n const reservation = await this.reservationRepo.findOne({\n where: { token },\n });\n\n if (reservation && reservation.status === ReservationStatus.RESERVED) {\n reservation.status = ReservationStatus.CANCELLED;\n reservation.cancelledAt = new Date();\n reservation.metadata = {\n ...reservation.metadata,\n cancelReason: reason,\n cancelledBy: userId,\n };\n await this.reservationRepo.save(reservation);\n\n this.logger.log(\n `Cancelled: ${reservation.documentNumber} by user ${userId}`\n );\n }\n }\n\n /**\n * Cron job: Cleanup expired reservations every 5 minutes\n * ใช้ try/catch เพื่อรองรับ transient ECONNRESET — TypeORM pool จะ reconnect อัตโนมัติใน tick ถัดไป\n */\n @Cron('*/5 * * * *')\n async cleanupExpired(): Promise {\n try {\n const result = await this.reservationRepo\n .createQueryBuilder()\n .update()\n .set({\n status: ReservationStatus.CANCELLED,\n cancelledAt: () => 'NOW()',\n })\n .where('document_number_status = :status', {\n status: ReservationStatus.RESERVED,\n })\n .andWhere('expires_at < NOW()')\n .execute();\n\n if ((result.affected ?? 0) > 0) {\n this.logger.log(`Cleaned up ${result.affected} expired reservations`);\n }\n } catch (error: unknown) {\n // ECONNRESET บน idle connection — TypeORM จะ reconnect pool ใน request ถัดไปโดยอัตโนมัติ\n const msg = error instanceof Error ? error.message : String(error);\n this.logger.warn(\n `[cleanupExpired] Transient DB error (will retry next tick): ${msg}`\n );\n }\n }\n\n /**\n * Get reservation by token\n */\n async getByToken(token: string): Promise {\n return this.reservationRepo.findOne({ where: { token } });\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1d/appcontroller_1d61510bd0de0f450b01a5cde69e070b b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1d/appcontroller_1d61510bd0de0f450b01a5cde69e070b new file mode 100644 index 0000000..b83b4fa --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1d/appcontroller_1d61510bd0de0f450b01a5cde69e070b @@ -0,0 +1,36 @@ +d5feed34649f89b92f8094603a889707 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AppController = void 0; +const common_1 = require("@nestjs/common"); +const app_service_1 = require("./app.service"); +let AppController = class AppController { + constructor(appService) { + this.appService = appService; + } + getHello() { + return this.appService.getHello(); + } +}; +exports.AppController = AppController; +__decorate([ + (0, common_1.Get)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", String) +], AppController.prototype, "getHello", null); +exports.AppController = AppController = __decorate([ + (0, common_1.Controller)(), + __metadata("design:paramtypes", [typeof (_a = typeof app_service_1.AppService !== "undefined" && app_service_1.AppService) === "function" ? _a : Object]) +], AppController); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcYXBwLmNvbnRyb2xsZXIudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUFpRDtBQUNqRCwrQ0FBMkM7QUFHcEMsSUFBTSxhQUFhLEdBQW5CLE1BQU0sYUFBYTtJQUN4QixZQUE2QixVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZO0lBQUcsQ0FBQztJQUd2RCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BDLENBQUM7Q0FDRixDQUFBO0FBUFksc0NBQWE7QUFJeEI7SUFEQyxJQUFBLFlBQUcsR0FBRTs7Ozs2Q0FHTDt3QkFOVSxhQUFhO0lBRHpCLElBQUEsbUJBQVUsR0FBRTt5REFFOEIsd0JBQVUsb0JBQVYsd0JBQVU7R0FEeEMsYUFBYSxDQU96QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxhcHAuY29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb250cm9sbGVyLCBHZXQgfSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XG5pbXBvcnQgeyBBcHBTZXJ2aWNlIH0gZnJvbSAnLi9hcHAuc2VydmljZSc7XG5cbkBDb250cm9sbGVyKClcbmV4cG9ydCBjbGFzcyBBcHBDb250cm9sbGVyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBhcHBTZXJ2aWNlOiBBcHBTZXJ2aWNlKSB7fVxuXG4gIEBHZXQoKVxuICBnZXRIZWxsbygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFwcFNlcnZpY2UuZ2V0SGVsbG8oKTtcbiAgfVxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1d/appcontroller_1d61510bd0de0f450b01a5cde69e070b.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1d/appcontroller_1d61510bd0de0f450b01a5cde69e070b.map new file mode 100644 index 0000000..6e8694d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1d/appcontroller_1d61510bd0de0f450b01a5cde69e070b.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\app.controller.ts","mappings":";;;;;;;;;;;;;AAAA,2CAAiD;AACjD,+CAA2C;AAGpC,IAAM,aAAa,GAAnB,MAAM,aAAa;IACxB,YAA6B,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAGvD,QAAQ;QACN,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;IACpC,CAAC;CACF,CAAA;AAPY,sCAAa;AAIxB;IADC,IAAA,YAAG,GAAE;;;;6CAGL;wBANU,aAAa;IADzB,IAAA,mBAAU,GAAE;yDAE8B,wBAAU,oBAAV,wBAAU;GADxC,aAAa,CAOzB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\app.controller.ts"],"sourcesContent":["import { Controller, Get } from '@nestjs/common';\nimport { AppService } from './app.service';\n\n@Controller()\nexport class AppController {\n constructor(private readonly appService: AppService) {}\n\n @Get()\n getHello(): string {\n return this.appService.getHello();\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1d/correspondencecontrollerspec_1d2b7cbdae38dd21d83a8ac1ba20de2d b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1d/correspondencecontrollerspec_1d2b7cbdae38dd21d83a8ac1ba20de2d new file mode 100644 index 0000000..62ac01f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1d/correspondencecontrollerspec_1d2b7cbdae38dd21d83a8ac1ba20de2d @@ -0,0 +1,89 @@ +d1b8bb1a0174d2a6556d41bd0e00f175 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const testing_1 = require("@nestjs/testing"); +const correspondence_controller_1 = require("./correspondence.controller"); +const correspondence_service_1 = require("./correspondence.service"); +const correspondence_workflow_service_1 = require("./correspondence-workflow.service"); +const jwt_auth_guard_1 = require("../../common/guards/jwt-auth.guard"); +const rbac_guard_1 = require("../../common/guards/rbac.guard"); +describe('CorrespondenceController', () => { + let controller; + let mockCorrespondenceService; + let mockWorkflowService; + beforeEach(async () => { + mockCorrespondenceService = { + create: jest.fn(), + findAll: jest.fn(), + findOne: jest.fn(), + getReferences: jest.fn(), + addReference: jest.fn(), + removeReference: jest.fn(), + findOneByUuid: jest.fn(), + }; + mockWorkflowService = { + submitWorkflow: jest.fn(), + processAction: jest.fn(), + }; + const module = await testing_1.Test.createTestingModule({ + controllers: [correspondence_controller_1.CorrespondenceController], + providers: [ + { + provide: correspondence_service_1.CorrespondenceService, + useValue: mockCorrespondenceService, + }, + { + provide: correspondence_workflow_service_1.CorrespondenceWorkflowService, + useValue: mockWorkflowService, + }, + ], + }) + .overrideGuard(jwt_auth_guard_1.JwtAuthGuard) + .useValue({ canActivate: () => true }) + .overrideGuard(rbac_guard_1.RbacGuard) + .useValue({ canActivate: () => true }) + .compile(); + controller = module.get(correspondence_controller_1.CorrespondenceController); + }); + it('should be defined', () => { + expect(controller).toBeDefined(); + }); + describe('findAll', () => { + it('should return correspondences', async () => { + const mockResult = [{ id: 1 }]; + mockCorrespondenceService.findAll.mockResolvedValue(mockResult); + const result = await controller.findAll({}); + expect(mockCorrespondenceService.findAll).toHaveBeenCalled(); + expect(result).toEqual(mockResult); + }); + }); + describe('create', () => { + it('should create a correspondence', async () => { + const mockCorr = { id: 1, correspondenceNumber: 'TEST-001' }; + mockCorrespondenceService.create.mockResolvedValue(mockCorr); + const mockReq = { user: { user_id: 1 } }; + const createDto = { + projectId: 1, + typeId: 1, + subject: 'Test Subject', + }; + const _result = await controller.create(createDto, mockReq); + expect(mockCorrespondenceService.create).toHaveBeenCalledWith(createDto, mockReq.user); + }); + }); + describe('submit', () => { + it('should submit a correspondence to workflow', async () => { + const mockResult = { instanceId: 'inst-1', currentState: 'IN_REVIEW' }; + mockWorkflowService.submitWorkflow.mockResolvedValue(mockResult); + const mockReq = { user: { user_id: 1, roles: [] } }; + mockCorrespondenceService.findOneByUuid.mockResolvedValue({ + id: 1, + uuid: 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11', + }); + const result = await controller.submit('a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11', { note: 'Test note' }, mockReq); + expect(mockWorkflowService.submitWorkflow).toHaveBeenCalledWith(1, 1, [], 'Test note'); + expect(result).toEqual(mockResult); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGNvcnJlc3BvbmRlbmNlLmNvbnRyb2xsZXIuc3BlYy50cyIsIm1hcHBpbmdzIjoiOztBQUFBLDZDQUFzRDtBQUN0RCwyRUFBdUU7QUFDdkUscUVBQWlFO0FBQ2pFLHVGQUFrRjtBQUNsRix1RUFBa0U7QUFDbEUsK0RBQTJEO0FBRTNELFFBQVEsQ0FBQywwQkFBMEIsRUFBRSxHQUFHLEVBQUU7SUFDeEMsSUFBSSxVQUFvQyxDQUFDO0lBQ3pDLElBQUkseUJBQXlELENBQUM7SUFDOUQsSUFBSSxtQkFBMkQsQ0FBQztJQUVoRSxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDcEIseUJBQXlCLEdBQUc7WUFDMUIsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDakIsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDbEIsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDbEIsYUFBYSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDeEIsWUFBWSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDdkIsZUFBZSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDMUIsYUFBYSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7U0FDekIsQ0FBQztRQUVGLG1CQUFtQixHQUFHO1lBQ3BCLGNBQWMsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ3pCLGFBQWEsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1NBQ3pCLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBa0IsTUFBTSxjQUFJLENBQUMsbUJBQW1CLENBQUM7WUFDM0QsV0FBVyxFQUFFLENBQUMsb0RBQXdCLENBQUM7WUFDdkMsU0FBUyxFQUFFO2dCQUNUO29CQUNFLE9BQU8sRUFBRSw4Q0FBcUI7b0JBQzlCLFFBQVEsRUFBRSx5QkFBeUI7aUJBQ3BDO2dCQUNEO29CQUNFLE9BQU8sRUFBRSwrREFBNkI7b0JB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QyxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsTUFBTSxDQUNwQyxzQ0FBc0MsRUFDdEMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEVBQ3JCLE9BQWtELENBQ25ELENBQUM7WUFFRixNQUFNLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUFDLENBQUMsb0JBQW9CLENBQzdELENBQUMsRUFDRCxDQUFDLEVBQ0QsRUFBRSxFQUNGLFdBQVcsQ0FDWixDQUFDO1lBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGNvcnJlc3BvbmRlbmNlLmNvbnRyb2xsZXIuc3BlYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZXN0LCBUZXN0aW5nTW9kdWxlIH0gZnJvbSAnQG5lc3Rqcy90ZXN0aW5nJztcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlQ29udHJvbGxlciB9IGZyb20gJy4vY29ycmVzcG9uZGVuY2UuY29udHJvbGxlcic7XG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVNlcnZpY2UgfSBmcm9tICcuL2NvcnJlc3BvbmRlbmNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VXb3JrZmxvd1NlcnZpY2UgfSBmcm9tICcuL2NvcnJlc3BvbmRlbmNlLXdvcmtmbG93LnNlcnZpY2UnO1xuaW1wb3J0IHsgSnd0QXV0aEd1YXJkIH0gZnJvbSAnLi4vLi4vY29tbW9uL2d1YXJkcy9qd3QtYXV0aC5ndWFyZCc7XG5pbXBvcnQgeyBSYmFjR3VhcmQgfSBmcm9tICcuLi8uLi9jb21tb24vZ3VhcmRzL3JiYWMuZ3VhcmQnO1xuXG5kZXNjcmliZSgnQ29ycmVzcG9uZGVuY2VDb250cm9sbGVyJywgKCkgPT4ge1xuICBsZXQgY29udHJvbGxlcjogQ29ycmVzcG9uZGVuY2VDb250cm9sbGVyO1xuICBsZXQgbW9ja0NvcnJlc3BvbmRlbmNlU2VydmljZTogUGFydGlhbDxDb3JyZXNwb25kZW5jZVNlcnZpY2U+O1xuICBsZXQgbW9ja1dvcmtmbG93U2VydmljZTogUGFydGlhbDxDb3JyZXNwb25kZW5jZVdvcmtmbG93U2VydmljZT47XG5cbiAgYmVmb3JlRWFjaChhc3luYyAoKSA9PiB7XG4gICAgbW9ja0NvcnJlc3BvbmRlbmNlU2VydmljZSA9IHtcbiAgICAgIGNyZWF0ZTogamVzdC5mbigpLFxuICAgICAgZmluZEFsbDogamVzdC5mbigpLFxuICAgICAgZmluZE9uZTogamVzdC5mbigpLFxuICAgICAgZ2V0UmVmZXJlbmNlczogamVzdC5mbigpLFxuICAgICAgYWRkUmVmZXJlbmNlOiBqZXN0LmZuKCksXG4gICAgICByZW1vdmVSZWZlcmVuY2U6IGplc3QuZm4oKSxcbiAgICAgIGZpbmRPbmVCeVV1aWQ6IGplc3QuZm4oKSxcbiAgICB9O1xuXG4gICAgbW9ja1dvcmtmbG93U2VydmljZSA9IHtcbiAgICAgIHN1Ym1pdFdvcmtmbG93OiBqZXN0LmZuKCksXG4gICAgICBwcm9jZXNzQWN0aW9uOiBqZXN0LmZuKCksXG4gICAgfTtcblxuICAgIGNvbnN0IG1vZHVsZTogVGVzdGluZ01vZHVsZSA9IGF3YWl0IFRlc3QuY3JlYXRlVGVzdGluZ01vZHVsZSh7XG4gICAgICBjb250cm9sbGVyczogW0NvcnJlc3BvbmRlbmNlQ29udHJvbGxlcl0sXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IENvcnJlc3BvbmRlbmNlU2VydmljZSxcbiAgICAgICAgICB1c2VWYWx1ZTogbW9ja0NvcnJlc3BvbmRlbmNlU2VydmljZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IENvcnJlc3BvbmRlbmNlV29ya2Zsb3dTZXJ2aWNlLFxuICAgICAgICAgIHVzZVZhbHVlOiBtb2NrV29ya2Zsb3dTZXJ2aWNlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KVxuICAgICAgLm92ZXJyaWRlR3VhcmQoSnd0QXV0aEd1YXJkKVxuICAgICAgLnVzZVZhbHVlKHsgY2FuQWN0aXZhdGU6ICgpID0+IHRydWUgfSlcbiAgICAgIC5vdmVycmlkZUd1YXJkKFJiYWNHdWFyZClcbiAgICAgIC51c2VWYWx1ZSh7IGNhbkFjdGl2YXRlOiAoKSA9PiB0cnVlIH0pXG4gICAgICAuY29tcGlsZSgpO1xuXG4gICAgY29udHJvbGxlciA9IG1vZHVsZS5nZXQ8Q29ycmVzcG9uZGVuY2VDb250cm9sbGVyPihDb3JyZXNwb25kZW5jZUNvbnRyb2xsZXIpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJlIGRlZmluZWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGNvbnRyb2xsZXIpLnRvQmVEZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmaW5kQWxsJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlc3BvbmRlbmNlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1vY2tSZXN1bHQgPSBbeyBpZDogMSB9XTtcbiAgICAgIChtb2NrQ29ycmVzcG9uZGVuY2VTZXJ2aWNlLmZpbmRBbGwgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZShcbiAgICAgICAgbW9ja1Jlc3VsdFxuICAgICAgKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29udHJvbGxlci5maW5kQWxsKHt9KTtcblxuICAgICAgZXhwZWN0KG1vY2tDb3JyZXNwb25kZW5jZVNlcnZpY2UuZmluZEFsbCkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChtb2NrUmVzdWx0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NyZWF0ZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNyZWF0ZSBhIGNvcnJlc3BvbmRlbmNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbW9ja0NvcnIgPSB7IGlkOiAxLCBjb3JyZXNwb25kZW5jZU51bWJlcjogJ1RFU1QtMDAxJyB9O1xuICAgICAgKG1vY2tDb3JyZXNwb25kZW5jZVNlcnZpY2UuY3JlYXRlIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoXG4gICAgICAgIG1vY2tDb3JyXG4gICAgICApO1xuXG4gICAgICBjb25zdCBtb2NrUmVxID0geyB1c2VyOiB7IHVzZXJfaWQ6IDEgfSB9O1xuICAgICAgY29uc3QgY3JlYXRlRHRvID0ge1xuICAgICAgICBwcm9qZWN0SWQ6IDEsXG4gICAgICAgIHR5cGVJZDogMSxcbiAgICAgICAgc3ViamVjdDogJ1Rlc3QgU3ViamVjdCcsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBfcmVzdWx0ID0gYXdhaXQgY29udHJvbGxlci5jcmVhdGUoXG4gICAgICAgIGNyZWF0ZUR0byBhcyBQYXJhbWV0ZXJzPHR5cGVvZiBjb250cm9sbGVyLmNyZWF0ZT5bMF0sXG4gICAgICAgIG1vY2tSZXEgYXMgUGFyYW1ldGVyczx0eXBlb2YgY29udHJvbGxlci5jcmVhdGU+WzFdXG4gICAgICApO1xuXG4gICAgICBleHBlY3QobW9ja0NvcnJlc3BvbmRlbmNlU2VydmljZS5jcmVhdGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBjcmVhdGVEdG8sXG4gICAgICAgIG1vY2tSZXEudXNlclxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3N1Ym1pdCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHN1Ym1pdCBhIGNvcnJlc3BvbmRlbmNlIHRvIHdvcmtmbG93JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbW9ja1Jlc3VsdCA9IHsgaW5zdGFuY2VJZDogJ2luc3QtMScsIGN1cnJlbnRTdGF0ZTogJ0lOX1JFVklFVycgfTtcbiAgICAgIChtb2NrV29ya2Zsb3dTZXJ2aWNlLnN1Ym1pdFdvcmtmbG93IGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoXG4gICAgICAgIG1vY2tSZXN1bHRcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IG1vY2tSZXEgPSB7IHVzZXI6IHsgdXNlcl9pZDogMSwgcm9sZXM6IFtdIH0gfTtcbiAgICAgIChtb2NrQ29ycmVzcG9uZGVuY2VTZXJ2aWNlLmZpbmRPbmVCeVV1aWQgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICAgIGlkOiAxLFxuICAgICAgICB1dWlkOiAnYTBlZWJjOTktOWMwYi00ZWY4LWJiNmQtNmJiOWJkMzgwYTExJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29udHJvbGxlci5zdWJtaXQoXG4gICAgICAgICdhMGVlYmM5OS05YzBiLTRlZjgtYmI2ZC02YmI5YmQzODBhMTEnLFxuICAgICAgICB7IG5vdGU6ICdUZXN0IG5vdGUnIH0sXG4gICAgICAgIG1vY2tSZXEgYXMgUGFyYW1ldGVyczx0eXBlb2YgY29udHJvbGxlci5zdWJtaXQ+WzJdXG4gICAgICApO1xuXG4gICAgICBleHBlY3QobW9ja1dvcmtmbG93U2VydmljZS5zdWJtaXRXb3JrZmxvdykudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgIDEsXG4gICAgICAgIDEsXG4gICAgICAgIFtdLFxuICAgICAgICAnVGVzdCBub3RlJ1xuICAgICAgKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwobW9ja1Jlc3VsdCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1d/correspondencecontrollerspec_1d2b7cbdae38dd21d83a8ac1ba20de2d.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1d/correspondencecontrollerspec_1d2b7cbdae38dd21d83a8ac1ba20de2d.map new file mode 100644 index 0000000..c02028c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1d/correspondencecontrollerspec_1d2b7cbdae38dd21d83a8ac1ba20de2d.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.controller.spec.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.controller.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\nimport { CorrespondenceController } from './correspondence.controller';\nimport { CorrespondenceService } from './correspondence.service';\nimport { CorrespondenceWorkflowService } from './correspondence-workflow.service';\nimport { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';\nimport { RbacGuard } from '../../common/guards/rbac.guard';\n\ndescribe('CorrespondenceController', () => {\n let controller: CorrespondenceController;\n let mockCorrespondenceService: Partial;\n let mockWorkflowService: Partial;\n\n beforeEach(async () => {\n mockCorrespondenceService = {\n create: jest.fn(),\n findAll: jest.fn(),\n findOne: jest.fn(),\n getReferences: jest.fn(),\n addReference: jest.fn(),\n removeReference: jest.fn(),\n findOneByUuid: jest.fn(),\n };\n\n mockWorkflowService = {\n submitWorkflow: jest.fn(),\n processAction: jest.fn(),\n };\n\n const module: TestingModule = await Test.createTestingModule({\n controllers: [CorrespondenceController],\n providers: [\n {\n provide: CorrespondenceService,\n useValue: mockCorrespondenceService,\n },\n {\n provide: CorrespondenceWorkflowService,\n useValue: mockWorkflowService,\n },\n ],\n })\n .overrideGuard(JwtAuthGuard)\n .useValue({ canActivate: () => true })\n .overrideGuard(RbacGuard)\n .useValue({ canActivate: () => true })\n .compile();\n\n controller = module.get(CorrespondenceController);\n });\n\n it('should be defined', () => {\n expect(controller).toBeDefined();\n });\n\n describe('findAll', () => {\n it('should return correspondences', async () => {\n const mockResult = [{ id: 1 }];\n (mockCorrespondenceService.findAll as jest.Mock).mockResolvedValue(\n mockResult\n );\n\n const result = await controller.findAll({});\n\n expect(mockCorrespondenceService.findAll).toHaveBeenCalled();\n expect(result).toEqual(mockResult);\n });\n });\n\n describe('create', () => {\n it('should create a correspondence', async () => {\n const mockCorr = { id: 1, correspondenceNumber: 'TEST-001' };\n (mockCorrespondenceService.create as jest.Mock).mockResolvedValue(\n mockCorr\n );\n\n const mockReq = { user: { user_id: 1 } };\n const createDto = {\n projectId: 1,\n typeId: 1,\n subject: 'Test Subject',\n };\n\n const _result = await controller.create(\n createDto as Parameters[0],\n mockReq as Parameters[1]\n );\n\n expect(mockCorrespondenceService.create).toHaveBeenCalledWith(\n createDto,\n mockReq.user\n );\n });\n });\n\n describe('submit', () => {\n it('should submit a correspondence to workflow', async () => {\n const mockResult = { instanceId: 'inst-1', currentState: 'IN_REVIEW' };\n (mockWorkflowService.submitWorkflow as jest.Mock).mockResolvedValue(\n mockResult\n );\n\n const mockReq = { user: { user_id: 1, roles: [] } };\n (mockCorrespondenceService.findOneByUuid as jest.Mock).mockResolvedValue({\n id: 1,\n uuid: 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11',\n });\n const result = await controller.submit(\n 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11',\n { note: 'Test note' },\n mockReq as Parameters[2]\n );\n\n expect(mockWorkflowService.submitWorkflow).toHaveBeenCalledWith(\n 1,\n 1,\n [],\n 'Test note'\n );\n expect(result).toEqual(mockResult);\n });\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1f/parserservicespec_1fc0fd62ff80c0c90d23cb4141ae6810 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1f/parserservicespec_1fc0fd62ff80c0c90d23cb4141ae6810 new file mode 100644 index 0000000..9886f6e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1f/parserservicespec_1fc0fd62ff80c0c90d23cb4141ae6810 @@ -0,0 +1,149 @@ +fbe207cf438ae8c1e5cd0a26f198ef30 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const testing_1 = require("@nestjs/testing"); +const typeorm_1 = require("@nestjs/typeorm"); +const parser_service_1 = require("./parser.service"); +const workflow_definition_entity_1 = require("../entities/workflow-definition.entity"); +const workflow_dsl_schema_1 = require("./workflow-dsl.schema"); +const common_1 = require("@nestjs/common"); +describe('WorkflowDslParser', () => { + let parser; + let mockRepository; + beforeEach(async () => { + mockRepository = { + save: jest.fn((def) => Promise.resolve(def)), + findOne: jest.fn(), + }; + const module = await testing_1.Test.createTestingModule({ + providers: [ + parser_service_1.WorkflowDslParser, + { + provide: (0, typeorm_1.getRepositoryToken)(workflow_definition_entity_1.WorkflowDefinition), + useValue: mockRepository, + }, + ], + }).compile(); + parser = module.get(parser_service_1.WorkflowDslParser); + }); + it('should be defined', () => { + expect(parser).toBeDefined(); + }); + describe('parse', () => { + it('should parse valid RFA workflow DSL', async () => { + const dslJson = JSON.stringify(workflow_dsl_schema_1.RFA_WORKFLOW_EXAMPLE); + const result = await parser.parse(dslJson); + expect(result).toBeDefined(); + expect(result.workflow_code).toBe('RFA_APPROVAL'); + expect(result.version).toBe(1); + expect(result.is_active).toBe(true); + expect(mockRepository.save).toHaveBeenCalled(); + }); + it('should reject invalid JSON', async () => { + const invalidJson = '{ invalid json }'; + await expect(parser.parse(invalidJson)).rejects.toThrow(common_1.BadRequestException); + }); + it('should reject workflow with invalid state reference', async () => { + const invalidDsl = { + name: 'INVALID', + version: '1.0.0', + states: ['DRAFT', 'APPROVED'], + initialState: 'DRAFT', + finalStates: ['APPROVED'], + transitions: [ + { + from: 'DRAFT', + to: 'NONEXISTENT_STATE', // Invalid state + trigger: 'SUBMIT', + }, + ], + }; + await expect(parser.parse(JSON.stringify(invalidDsl))).rejects.toThrow(common_1.BadRequestException); + }); + it('should reject workflow with invalid initial state', async () => { + const invalidDsl = { + name: 'INVALID', + version: '1.0.0', + states: ['DRAFT', 'APPROVED'], + initialState: 'NONEXISTENT', // Invalid + finalStates: ['APPROVED'], + transitions: [], + }; + await expect(parser.parse(JSON.stringify(invalidDsl))).rejects.toThrow(common_1.BadRequestException); + }); + it('should reject workflow with invalid final state', async () => { + const invalidDsl = { + name: 'INVALID', + version: '1.0.0', + states: ['DRAFT', 'APPROVED'], + initialState: 'DRAFT', + finalStates: ['NONEXISTENT'], // Invalid + transitions: [], + }; + await expect(parser.parse(JSON.stringify(invalidDsl))).rejects.toThrow(common_1.BadRequestException); + }); + it('should reject workflow with duplicate transitions', async () => { + const invalidDsl = { + name: 'INVALID', + version: '1.0.0', + states: ['DRAFT', 'SUBMITTED'], + initialState: 'DRAFT', + finalStates: ['SUBMITTED'], + transitions: [ + { from: 'DRAFT', to: 'SUBMITTED', trigger: 'SUBMIT' }, + { from: 'DRAFT', to: 'SUBMITTED', trigger: 'SUBMIT' }, // Duplicate + ], + }; + await expect(parser.parse(JSON.stringify(invalidDsl))).rejects.toThrow(common_1.BadRequestException); + }); + it('should reject workflow with invalid version format', async () => { + const invalidDsl = { + ...workflow_dsl_schema_1.RFA_WORKFLOW_EXAMPLE, + version: 'invalid-version', + }; + await expect(parser.parse(JSON.stringify(invalidDsl))).rejects.toThrow(common_1.BadRequestException); + }); + }); + describe('validateOnly', () => { + it('should validate correct DSL without saving', () => { + const dslJson = JSON.stringify(workflow_dsl_schema_1.RFA_WORKFLOW_EXAMPLE); + const result = parser.validateOnly(dslJson); + expect(result.valid).toBe(true); + expect(result.errors).toBeUndefined(); + expect(mockRepository.save).not.toHaveBeenCalled(); + }); + it('should return error for invalid DSL', () => { + const invalidDsl = { + name: 'INVALID', + version: '1.0.0', + states: ['DRAFT'], + initialState: 'NONEXISTENT', + finalStates: [], + transitions: [], + }; + const result = parser.validateOnly(JSON.stringify(invalidDsl)); + expect(result.valid).toBe(false); + expect(result.errors).toBeDefined(); + expect(result.errors?.length).toBeGreaterThan(0); + }); + }); + describe('getParsedDsl', () => { + it('should retrieve and parse stored DSL', async () => { + const storedDefinition = { + id: 1, + workflow_code: 'RFA_APPROVAL', + version: 1, + dsl: workflow_dsl_schema_1.RFA_WORKFLOW_EXAMPLE, + }; + mockRepository.findOne = jest.fn().mockResolvedValue(storedDefinition); + const result = await parser.getParsedDsl('1'); + expect(result).toBeDefined(); + expect(result.name).toBe('RFA_APPROVAL'); + }); + it('should throw error if definition not found', async () => { + mockRepository.findOne = jest.fn().mockResolvedValue(null); + await expect(parser.getParsedDsl('999')).rejects.toThrow(common_1.BadRequestException); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcd29ya2Zsb3ctZW5naW5lXFxkc2xcXHBhcnNlci5zZXJ2aWNlLnNwZWMudHMiLCJtYXBwaW5ncyI6Ijs7QUFBQSw2Q0FBc0Q7QUFFdEQsNkNBQXFEO0FBQ3JELHFEQUFxRDtBQUNyRCx1RkFBNEU7QUFDNUUsK0RBQTZEO0FBQzdELDJDQUFxRDtBQUVyRCxRQUFRLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxFQUFFO0lBQ2pDLElBQUksTUFBeUIsQ0FBQztJQUM5QixJQUFJLGNBQXVELENBQUM7SUFFNUQsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ3BCLGNBQWMsR0FBRztZQUNmLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUF5QjtZQUNwRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtTQUNuQixDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQWtCLE1BQU0sY0FBSSxDQUFDLG1CQUFtQixDQUFDO1lBQzNELFNBQVMsRUFBRTtnQkFDVCxrQ0FBaUI7Z0JBQ2pCO29CQUNFLE9BQU8sRUFBRSxJQUFBLDRCQUFrQixFQUFDLCtDQUFrQixDQUFDO29CQUMvQyxRQUFRLEVBQUUsY0FBYztpQkFDekI7YUFDRjtTQUNGLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUViLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFvQixrQ0FBaUIsQ0FBQyxDQUFDO0lBQzVELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtRQUMzQixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDL0IsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtRQUNyQixFQUFFLENBQUMscUNBQXFDLEVBQUUsS0FBSyxJ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QUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7UUFDNUIsRUFBRSxDQUFDLHNDQUFzQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3BELE1BQU0sZ0JBQWdCLEdBQUc7Z0JBQ3ZCLEVBQUUsRUFBRSxDQUFDO2dCQUNMLGFBQWEsRUFBRSxjQUFjO2dCQUM3QixPQUFPLEVBQUUsQ0FBQztnQkFDVixHQUFHLEVBQUUsMENBQW9CO2FBQzFCLENBQUM7WUFFRixjQUFjLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBRXZFLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUU5QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDN0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNENBQTRDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDMUQsY0FBYyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFM0QsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQ3RELDRCQUFtQixDQUNwQixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXHdvcmtmbG93LWVuZ2luZVxcZHNsXFxwYXJzZXIuc2VydmljZS5zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlc3QsIFRlc3RpbmdNb2R1bGUgfSBmcm9tICdAbmVzdGpzL3Rlc3RpbmcnO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gJ3R5cGVvcm0nO1xuaW1wb3J0IHsgZ2V0UmVwb3NpdG9yeVRva2VuIH0gZnJvbSAnQG5lc3Rqcy90eXBlb3JtJztcbmltcG9ydCB7IFdvcmtmbG93RHNsUGFyc2VyIH0gZnJvbSAnLi9wYXJzZXIuc2VydmljZSc7XG5pbXBvcnQgeyBXb3JrZmxvd0RlZmluaXRpb24gfSBmcm9tICcuLi9lbnRpdGllcy93b3JrZmxvdy1kZWZpbml0aW9uLmVudGl0eSc7XG5pbXBvcnQgeyBSRkFfV09SS0ZMT1dfRVhBTVBMRSB9IGZyb20gJy4vd29ya2Zsb3ctZHNsLnNjaGVtYSc7XG5pbXBvcnQgeyBCYWRSZXF1ZXN0RXhjZXB0aW9uIH0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xuXG5kZXNjcmliZSgnV29ya2Zsb3dEc2xQYXJzZXInLCAoKSA9PiB7XG4gIGxldCBwYXJzZXI6IFdvcmtmbG93RHNsUGFyc2VyO1xuICBsZXQgbW9ja1JlcG9zaXRvcnk6IFBhcnRpYWw8UmVwb3NpdG9yeTxXb3JrZmxvd0RlZmluaXRpb24+PjtcblxuICBiZWZvcmVFYWNoKGFzeW5jICgpID0+IHtcbiAgICBtb2NrUmVwb3NpdG9yeSA9IHtcbiAgICAgIHNhdmU6IGplc3QuZm4oKGRlZikgPT4gUHJvbWlzZS5yZXNvbHZlKGRlZikpIGFzIHVua25vd24gYXMgamVzdC5Nb2NrLFxuICAgICAgZmluZE9uZTogamVzdC5mbigpLFxuICAgIH07XG5cbiAgICBjb25zdCBtb2R1bGU6IFRlc3RpbmdNb2R1bGUgPSBhd2FpdCBUZXN0LmNyZWF0ZVRlc3RpbmdNb2R1bGUoe1xuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIFdvcmtmbG93RHNsUGFyc2VyLFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogZ2V0UmVwb3NpdG9yeVRva2VuKFdvcmtmbG93RGVmaW5pdGlvbiksXG4gICAgICAgICAgdXNlVmFsdWU6IG1vY2tSZXBvc2l0b3J5LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KS5jb21waWxlKCk7XG5cbiAgICBwYXJzZXIgPSBtb2R1bGUuZ2V0PFdvcmtmbG93RHNsUGFyc2VyPihXb3JrZmxvd0RzbFBhcnNlcik7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYmUgZGVmaW5lZCcsICgpID0+IHtcbiAgICBleHBlY3QocGFyc2VyKS50b0JlRGVmaW5lZCgpO1xuICB9KTtcblxuICBkZXNjcmliZSgncGFyc2UnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBwYXJzZSB2YWxpZCBSRkEgd29ya2Zsb3cgRFNMJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZHNsSnNvbiA9IEpTT04uc3RyaW5naWZ5KFJGQV9XT1JLRkxPV19FWEFNUExFKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFyc2VyLnBhcnNlKGRzbEpzb24pO1xuXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHJlc3VsdC53b3JrZmxvd19jb2RlKS50b0JlKCdSRkFfQVBQUk9WQUwnKTtcbiAgICAgIGV4cGVjdChyZXN1bHQudmVyc2lvbikudG9CZSgxKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuaXNfYWN0aXZlKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KG1vY2tSZXBvc2l0b3J5LnNhdmUpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGludmFsaWQgSlNPTicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGludmFsaWRKc29uID0gJ3sgaW52YWxpZCBqc29uIH0nO1xuXG4gICAgICBhd2FpdCBleHBlY3QocGFyc2VyLnBhcnNlKGludmFsaWRKc29uKSkucmVqZWN0cy50b1Rocm93KFxuICAgICAgICBCYWRSZXF1ZXN0RXhjZXB0aW9uXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgd29ya2Zsb3cgd2l0aCBpbnZhbGlkIHN0YXRlIHJlZmVyZW5jZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGludmFsaWREc2wgPSB7XG4gICAgICAgIG5hbWU6ICdJTlZBTElEJyxcbiAgICAgICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICAgICAgc3RhdGVzOiBbJ0RSQUZUJywgJ0FQUFJPVkVEJ10sXG4gICAgICAgIGluaXRpYWxTdGF0ZTogJ0RSQUZUJyxcbiAgICAgICAgZmluYWxTdGF0ZXM6IFsnQVBQUk9WRUQnXSxcbiAgICAgICAgdHJhbnNpdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmcm9tOiAnRFJBRlQnLFxuICAgICAgICAgICAgdG86ICdOT05FWElTVEVOVF9TVEFURScsIC8vIEludmFsaWQgc3RhdGVcbiAgICAgICAgICAgIHRyaWdnZXI6ICdTVUJNSVQnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBleHBlY3QocGFyc2VyLnBhcnNlKEpTT04uc3RyaW5naWZ5KGludmFsaWREc2wpKSkucmVqZWN0cy50b1Rocm93KFxuICAgICAgICBCYWRSZXF1ZXN0RXhjZXB0aW9uXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgd29ya2Zsb3cgd2l0aCBpbnZhbGlkIGluaXRpYWwgc3RhdGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBpbnZhbGlkRHNsID0ge1xuICAgICAgICBuYW1lOiAnSU5WQUxJRCcsXG4gICAgICAgIHZlcnNpb246ICcxLjAuMCcsXG4gICAgICAgIHN0YXRlczogWydEUkFGVCcsICdBUFBST1ZFRCddLFxuICAgICAgICBpbml0aWFsU3RhdGU6ICdOT05FWElTVEVOVCcsIC8vIEludmFsaWRcbiAgICAgICAgZmluYWxTdGF0ZXM6IFsnQVBQUk9WRUQnXSxcbiAgICAgICAgdHJhbnNpdGlvbnM6IFtdLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgZXhwZWN0KHBhcnNlci5wYXJzZShKU09OLnN0cmluZ2lmeShpbnZhbGlkRHNsKSkpLnJlamVjdHMudG9UaHJvdyhcbiAgICAgICAgQmFkUmVxdWVzdEV4Y2VwdGlvblxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHdvcmtmbG93IHdpdGggaW52YWxpZCBmaW5hbCBzdGF0ZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGludmFsaWREc2wgPSB7XG4gICAgICAgIG5hbWU6ICdJTlZBTElEJyxcbiAgICAgICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICAgICAgc3RhdGVzOiBbJ0RSQUZUJywgJ0FQUFJPVkVEJ10sXG4gICAgICAgIGluaXRpYWxTdGF0ZTogJ0RSQUZUJyxcbiAgICAgICAgZmluYWxTdGF0ZXM6IFsnTk9ORVhJU1RFTlQnXSwgLy8gSW52YWxpZFxuICAgICAgICB0cmFuc2l0aW9uczogW10sXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBleHBlY3QocGFyc2VyLnBhcnNlKEpTT04uc3RyaW5naWZ5KGludmFsaWREc2wpKSkucmVqZWN0cy50b1Rocm93KFxuICAgICAgICBCYWRSZXF1ZXN0RXhjZXB0aW9uXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgd29ya2Zsb3cgd2l0aCBkdXBsaWNhdGUgdHJhbnNpdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBpbnZhbGlkRHNsID0ge1xuICAgICAgICBuYW1lOiAnSU5WQUxJRCcsXG4gICAgICAgIHZlcnNpb246ICcxLjAuMCcsXG4gICAgICAgIHN0YXRlczogWydEUkFGVCcsICdTVUJNSVRURUQnXSxcbiAgICAgICAgaW5pdGlhbFN0YXRlOiAnRFJBRlQnLFxuICAgICAgICBmaW5hbFN0YXRlczogWydTVUJNSVRURUQnXSxcbiAgICAgICAgdHJhbnNpdGlvbnM6IFtcbiAgICAgICAgICB7IGZyb206ICdEUkFGVCcsIHRvOiAnU1VCTUlUVEVEJywgdHJpZ2dlcjogJ1NVQk1JVCcgfSxcbiAgICAgICAgICB7IGZyb206ICdEUkFGVCcsIHRvOiAnU1VCTUlUVEVEJywgdHJpZ2dlcjogJ1NVQk1JVCcgfSwgLy8gRHVwbGljYXRlXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBleHBlY3QocGFyc2VyLnBhcnNlKEpTT04uc3RyaW5naWZ5KGludmFsaWREc2wpKSkucmVqZWN0cy50b1Rocm93KFxuICAgICAgICBCYWRSZXF1ZXN0RXhjZXB0aW9uXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgd29ya2Zsb3cgd2l0aCBpbnZhbGlkIHZlcnNpb24gZm9ybWF0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgaW52YWxpZERzbCA9IHtcbiAgICAgICAgLi4uUkZBX1dPUktGTE9XX0VYQU1QTEUsXG4gICAgICAgIHZlcnNpb246ICdpbnZhbGlkLXZlcnNpb24nLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgZXhwZWN0KHBhcnNlci5wYXJzZShKU09OLnN0cmluZ2lmeShpbnZhbGlkRHNsKSkpLnJlamVjdHMudG9UaHJvdyhcbiAgICAgICAgQmFkUmVxdWVzdEV4Y2VwdGlvblxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZhbGlkYXRlT25seScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGNvcnJlY3QgRFNMIHdpdGhvdXQgc2F2aW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgZHNsSnNvbiA9IEpTT04uc3RyaW5naWZ5KFJGQV9XT1JLRkxPV19FWEFNUExFKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gcGFyc2VyLnZhbGlkYXRlT25seShkc2xKc29uKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdC52YWxpZCkudG9CZSh0cnVlKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgICBleHBlY3QobW9ja1JlcG9zaXRvcnkuc2F2ZSkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGVycm9yIGZvciBpbnZhbGlkIERTTCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGludmFsaWREc2wgPSB7XG4gICAgICAgIG5hbWU6ICdJTlZBTElEJyxcbiAgICAgICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICAgICAgc3RhdGVzOiBbJ0RSQUZUJ10sXG4gICAgICAgIGluaXRpYWxTdGF0ZTogJ05PTkVYSVNURU5UJyxcbiAgICAgICAgZmluYWxTdGF0ZXM6IFtdLFxuICAgICAgICB0cmFuc2l0aW9uczogW10sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBwYXJzZXIudmFsaWRhdGVPbmx5KEpTT04uc3RyaW5naWZ5KGludmFsaWREc2wpKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdC52YWxpZCkudG9CZShmYWxzZSk7XG4gICAgICBleHBlY3QocmVzdWx0LmVycm9ycykudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzPy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldFBhcnNlZERzbCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHJpZXZlIGFuZCBwYXJzZSBzdG9yZWQgRFNMJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RvcmVkRGVmaW5pdGlvbiA9IHtcbiAgICAgICAgaWQ6IDEsXG4gICAgICAgIHdvcmtmbG93X2NvZGU6ICdSRkFfQVBQUk9WQUwnLFxuICAgICAgICB2ZXJzaW9uOiAxLFxuICAgICAgICBkc2w6IFJGQV9XT1JLRkxPV19FWEFNUExFLFxuICAgICAgfTtcblxuICAgICAgbW9ja1JlcG9zaXRvcnkuZmluZE9uZSA9IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShzdG9yZWREZWZpbml0aW9uKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFyc2VyLmdldFBhcnNlZERzbCgnMScpO1xuXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHJlc3VsdC5uYW1lKS50b0JlKCdSRkFfQVBQUk9WQUwnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgaWYgZGVmaW5pdGlvbiBub3QgZm91bmQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBtb2NrUmVwb3NpdG9yeS5maW5kT25lID0gamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKG51bGwpO1xuXG4gICAgICBhd2FpdCBleHBlY3QocGFyc2VyLmdldFBhcnNlZERzbCgnOTk5JykpLnJlamVjdHMudG9UaHJvdyhcbiAgICAgICAgQmFkUmVxdWVzdEV4Y2VwdGlvblxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1f/parserservicespec_1fc0fd62ff80c0c90d23cb4141ae6810.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1f/parserservicespec_1fc0fd62ff80c0c90d23cb4141ae6810.map new file mode 100644 index 0000000..9819f3e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1f/parserservicespec_1fc0fd62ff80c0c90d23cb4141ae6810.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\dsl\\parser.service.spec.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\dsl\\parser.service.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\nimport { Repository } from 'typeorm';\nimport { getRepositoryToken } from '@nestjs/typeorm';\nimport { WorkflowDslParser } from './parser.service';\nimport { WorkflowDefinition } from '../entities/workflow-definition.entity';\nimport { RFA_WORKFLOW_EXAMPLE } from './workflow-dsl.schema';\nimport { BadRequestException } from '@nestjs/common';\n\ndescribe('WorkflowDslParser', () => {\n let parser: WorkflowDslParser;\n let mockRepository: Partial>;\n\n beforeEach(async () => {\n mockRepository = {\n save: jest.fn((def) => Promise.resolve(def)) as unknown as jest.Mock,\n findOne: jest.fn(),\n };\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n WorkflowDslParser,\n {\n provide: getRepositoryToken(WorkflowDefinition),\n useValue: mockRepository,\n },\n ],\n }).compile();\n\n parser = module.get(WorkflowDslParser);\n });\n\n it('should be defined', () => {\n expect(parser).toBeDefined();\n });\n\n describe('parse', () => {\n it('should parse valid RFA workflow DSL', async () => {\n const dslJson = JSON.stringify(RFA_WORKFLOW_EXAMPLE);\n\n const result = await parser.parse(dslJson);\n\n expect(result).toBeDefined();\n expect(result.workflow_code).toBe('RFA_APPROVAL');\n expect(result.version).toBe(1);\n expect(result.is_active).toBe(true);\n expect(mockRepository.save).toHaveBeenCalled();\n });\n\n it('should reject invalid JSON', async () => {\n const invalidJson = '{ invalid json }';\n\n await expect(parser.parse(invalidJson)).rejects.toThrow(\n BadRequestException\n );\n });\n\n it('should reject workflow with invalid state reference', async () => {\n const invalidDsl = {\n name: 'INVALID',\n version: '1.0.0',\n states: ['DRAFT', 'APPROVED'],\n initialState: 'DRAFT',\n finalStates: ['APPROVED'],\n transitions: [\n {\n from: 'DRAFT',\n to: 'NONEXISTENT_STATE', // Invalid state\n trigger: 'SUBMIT',\n },\n ],\n };\n\n await expect(parser.parse(JSON.stringify(invalidDsl))).rejects.toThrow(\n BadRequestException\n );\n });\n\n it('should reject workflow with invalid initial state', async () => {\n const invalidDsl = {\n name: 'INVALID',\n version: '1.0.0',\n states: ['DRAFT', 'APPROVED'],\n initialState: 'NONEXISTENT', // Invalid\n finalStates: ['APPROVED'],\n transitions: [],\n };\n\n await expect(parser.parse(JSON.stringify(invalidDsl))).rejects.toThrow(\n BadRequestException\n );\n });\n\n it('should reject workflow with invalid final state', async () => {\n const invalidDsl = {\n name: 'INVALID',\n version: '1.0.0',\n states: ['DRAFT', 'APPROVED'],\n initialState: 'DRAFT',\n finalStates: ['NONEXISTENT'], // Invalid\n transitions: [],\n };\n\n await expect(parser.parse(JSON.stringify(invalidDsl))).rejects.toThrow(\n BadRequestException\n );\n });\n\n it('should reject workflow with duplicate transitions', async () => {\n const invalidDsl = {\n name: 'INVALID',\n version: '1.0.0',\n states: ['DRAFT', 'SUBMITTED'],\n initialState: 'DRAFT',\n finalStates: ['SUBMITTED'],\n transitions: [\n { from: 'DRAFT', to: 'SUBMITTED', trigger: 'SUBMIT' },\n { from: 'DRAFT', to: 'SUBMITTED', trigger: 'SUBMIT' }, // Duplicate\n ],\n };\n\n await expect(parser.parse(JSON.stringify(invalidDsl))).rejects.toThrow(\n BadRequestException\n );\n });\n\n it('should reject workflow with invalid version format', async () => {\n const invalidDsl = {\n ...RFA_WORKFLOW_EXAMPLE,\n version: 'invalid-version',\n };\n\n await expect(parser.parse(JSON.stringify(invalidDsl))).rejects.toThrow(\n BadRequestException\n );\n });\n });\n\n describe('validateOnly', () => {\n it('should validate correct DSL without saving', () => {\n const dslJson = JSON.stringify(RFA_WORKFLOW_EXAMPLE);\n\n const result = parser.validateOnly(dslJson);\n\n expect(result.valid).toBe(true);\n expect(result.errors).toBeUndefined();\n expect(mockRepository.save).not.toHaveBeenCalled();\n });\n\n it('should return error for invalid DSL', () => {\n const invalidDsl = {\n name: 'INVALID',\n version: '1.0.0',\n states: ['DRAFT'],\n initialState: 'NONEXISTENT',\n finalStates: [],\n transitions: [],\n };\n\n const result = parser.validateOnly(JSON.stringify(invalidDsl));\n\n expect(result.valid).toBe(false);\n expect(result.errors).toBeDefined();\n expect(result.errors?.length).toBeGreaterThan(0);\n });\n });\n\n describe('getParsedDsl', () => {\n it('should retrieve and parse stored DSL', async () => {\n const storedDefinition = {\n id: 1,\n workflow_code: 'RFA_APPROVAL',\n version: 1,\n dsl: RFA_WORKFLOW_EXAMPLE,\n };\n\n mockRepository.findOne = jest.fn().mockResolvedValue(storedDefinition);\n\n const result = await parser.getParsedDsl('1');\n\n expect(result).toBeDefined();\n expect(result.name).toBe('RFA_APPROVAL');\n });\n\n it('should throw error if definition not found', async () => {\n mockRepository.findOne = jest.fn().mockResolvedValue(null);\n\n await expect(parser.getParsedDsl('999')).rejects.toThrow(\n BadRequestException\n );\n });\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1f/v35_1f4d6f999aa69769c492865b1396afbb b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1f/v35_1f4d6f999aa69769c492865b1396afbb new file mode 100644 index 0000000..b06e425 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1f/v35_1f4d6f999aa69769c492865b1396afbb @@ -0,0 +1,43 @@ +e91bf642a3fb0b03c2cbf457cc92db70 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.URL = exports.DNS = exports.stringToBytes = void 0; +const parse_js_1 = require("./parse.js"); +const stringify_js_1 = require("./stringify.js"); +function stringToBytes(str) { + str = unescape(encodeURIComponent(str)); + const bytes = new Uint8Array(str.length); + for (let i = 0; i < str.length; ++i) { + bytes[i] = str.charCodeAt(i); + } + return bytes; +} +exports.stringToBytes = stringToBytes; +exports.DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; +exports.URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; +function v35(version, hash, value, namespace, buf, offset) { + const valueBytes = typeof value === 'string' ? stringToBytes(value) : value; + const namespaceBytes = typeof namespace === 'string' ? (0, parse_js_1.default)(namespace) : namespace; + if (typeof namespace === 'string') { + namespace = (0, parse_js_1.default)(namespace); + } + if (namespace?.length !== 16) { + throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)'); + } + let bytes = new Uint8Array(16 + valueBytes.length); + bytes.set(namespaceBytes); + bytes.set(valueBytes, namespaceBytes.length); + bytes = hash(bytes); + bytes[6] = (bytes[6] & 0x0f) | version; + bytes[8] = (bytes[8] & 0x3f) | 0x80; + if (buf) { + offset = offset || 0; + for (let i = 0; i < 16; ++i) { + buf[offset + i] = bytes[i]; + } + return buf; + } + return (0, stringify_js_1.unsafeStringify)(bytes); +} +exports.default = v35; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdjM1LmpzIiwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUNiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlELE9BQU8sQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQzNELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUN6QyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUNqRCxTQUFTLGFBQWEsQ0FBQyxHQUFHO0lBQ3RCLEdBQUcsR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN4QyxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNsQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQztBQUNELE9BQU8sQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO0FBQ3RDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsc0NBQXNDLENBQUM7QUFDckQsT0FBTyxDQUFDLEdBQUcsR0FBRyxzQ0FBc0MsQ0FBQztBQUNyRCxTQUFTLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU07SUFDckQsTUFBTSxVQUFVLEdBQUcsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM1RSxNQUFNLGNBQWMsR0FBRyxPQUFPLFNBQVMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3RHLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDaEMsU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0QsSUFBSSxTQUFTLEVBQUUsTUFBTSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQzNCLE1BQU0sU0FBUyxDQUFDLGtFQUFrRSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUNELElBQUksS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMxQixLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0MsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQixLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDO0lBQ3ZDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDcEMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNOLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUMxQixHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUNELE9BQU8sQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxub2RlX21vZHVsZXNcXC5wbnBtXFx1dWlkQDExLjEuMFxcbm9kZV9tb2R1bGVzXFx1dWlkXFxkaXN0XFxjanNcXHYzNS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuVVJMID0gZXhwb3J0cy5ETlMgPSBleHBvcnRzLnN0cmluZ1RvQnl0ZXMgPSB2b2lkIDA7XG5jb25zdCBwYXJzZV9qc18xID0gcmVxdWlyZShcIi4vcGFyc2UuanNcIik7XG5jb25zdCBzdHJpbmdpZnlfanNfMSA9IHJlcXVpcmUoXCIuL3N0cmluZ2lmeS5qc1wiKTtcbmZ1bmN0aW9uIHN0cmluZ1RvQnl0ZXMoc3RyKSB7XG4gICAgc3RyID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpO1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoc3RyLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgYnl0ZXNbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVzO1xufVxuZXhwb3J0cy5zdHJpbmdUb0J5dGVzID0gc3RyaW5nVG9CeXRlcztcbmV4cG9ydHMuRE5TID0gJzZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCc7XG5leHBvcnRzLlVSTCA9ICc2YmE3YjgxMS05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnO1xuZnVuY3Rpb24gdjM1KHZlcnNpb24sIGhhc2gsIHZhbHVlLCBuYW1lc3BhY2UsIGJ1Ziwgb2Zmc2V0KSB7XG4gICAgY29uc3QgdmFsdWVCeXRlcyA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBzdHJpbmdUb0J5dGVzKHZhbHVlKSA6IHZhbHVlO1xuICAgIGNvbnN0IG5hbWVzcGFjZUJ5dGVzID0gdHlwZW9mIG5hbWVzcGFjZSA9PT0gJ3N0cmluZycgPyAoMCwgcGFyc2VfanNfMS5kZWZhdWx0KShuYW1lc3BhY2UpIDogbmFtZXNwYWNlO1xuICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlID09PSAnc3RyaW5nJykge1xuICAgICAgICBuYW1lc3BhY2UgPSAoMCwgcGFyc2VfanNfMS5kZWZhdWx0KShuYW1lc3BhY2UpO1xuICAgIH1cbiAgICBpZiAobmFtZXNwYWNlPy5sZW5ndGggIT09IDE2KSB7XG4gICAgICAgIHRocm93IFR5cGVFcnJvcignTmFtZXNwYWNlIG11c3QgYmUgYXJyYXktbGlrZSAoMTYgaXRlcmFibGUgaW50ZWdlciB2YWx1ZXMsIDAtMjU1KScpO1xuICAgIH1cbiAgICBsZXQgYnl0ZXMgPSBuZXcgVWludDhBcnJheSgxNiArIHZhbHVlQnl0ZXMubGVuZ3RoKTtcbiAgICBieXRlcy5zZXQobmFtZXNwYWNlQnl0ZXMpO1xuICAgIGJ5dGVzLnNldCh2YWx1ZUJ5dGVzLCBuYW1lc3BhY2VCeXRlcy5sZW5ndGgpO1xuICAgIGJ5dGVzID0gaGFzaChieXRlcyk7XG4gICAgYnl0ZXNbNl0gPSAoYnl0ZXNbNl0gJiAweDBmKSB8IHZlcnNpb247XG4gICAgYnl0ZXNbOF0gPSAoYnl0ZXNbOF0gJiAweDNmKSB8IDB4ODA7XG4gICAgaWYgKGJ1Zikge1xuICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICAgICAgICBidWZbb2Zmc2V0ICsgaV0gPSBieXRlc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVmO1xuICAgIH1cbiAgICByZXR1cm4gKDAsIHN0cmluZ2lmeV9qc18xLnVuc2FmZVN0cmluZ2lmeSkoYnl0ZXMpO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gdjM1O1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1f/v35_1f4d6f999aa69769c492865b1396afbb.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1f/v35_1f4d6f999aa69769c492865b1396afbb.map new file mode 100644 index 0000000..be77d0a --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/1f/v35_1f4d6f999aa69769c492865b1396afbb.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v35.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,aAAa,GAAG,KAAK,CAAC,CAAC;AAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;AACzC,MAAM,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AACjD,SAAS,aAAa,CAAC,GAAG;IACtB,GAAG,GAAG,QAAQ,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AACD,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC;AACtC,OAAO,CAAC,GAAG,GAAG,sCAAsC,CAAC;AACrD,OAAO,CAAC,GAAG,GAAG,sCAAsC,CAAC;AACrD,SAAS,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM;IACrD,MAAM,UAAU,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5E,MAAM,cAAc,GAAG,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtG,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAChC,SAAS,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,SAAS,EAAE,MAAM,KAAK,EAAE,EAAE,CAAC;QAC3B,MAAM,SAAS,CAAC,kEAAkE,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACnD,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1B,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC7C,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACpB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC;IACvC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACpC,IAAI,GAAG,EAAE,CAAC;QACN,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1B,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IACD,OAAO,CAAC,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,GAAG,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v35.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.URL = exports.DNS = exports.stringToBytes = void 0;\nconst parse_js_1 = require(\"./parse.js\");\nconst stringify_js_1 = require(\"./stringify.js\");\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str));\n const bytes = new Uint8Array(str.length);\n for (let i = 0; i < str.length; ++i) {\n bytes[i] = str.charCodeAt(i);\n }\n return bytes;\n}\nexports.stringToBytes = stringToBytes;\nexports.DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexports.URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nfunction v35(version, hash, value, namespace, buf, offset) {\n const valueBytes = typeof value === 'string' ? stringToBytes(value) : value;\n const namespaceBytes = typeof namespace === 'string' ? (0, parse_js_1.default)(namespace) : namespace;\n if (typeof namespace === 'string') {\n namespace = (0, parse_js_1.default)(namespace);\n }\n if (namespace?.length !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n }\n let bytes = new Uint8Array(16 + valueBytes.length);\n bytes.set(namespaceBytes);\n bytes.set(valueBytes, namespaceBytes.length);\n bytes = hash(bytes);\n bytes[6] = (bytes[6] & 0x0f) | version;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n return buf;\n }\n return (0, stringify_js_1.unsafeStringify)(bytes);\n}\nexports.default = v35;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/20/shopdrawingentity_20e539711485c87e198d35edab37d894 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/20/shopdrawingentity_20e539711485c87e198d35edab37d894 new file mode 100644 index 0000000..f99e17e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/20/shopdrawingentity_20e539711485c87e198d35edab37d894 @@ -0,0 +1,86 @@ +0c24b9f8be734e3fd27c98767cdcec9a +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e, _f; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ShopDrawing = void 0; +const typeorm_1 = require("typeorm"); +const shop_drawing_revision_entity_1 = require("./shop-drawing-revision.entity"); +const project_entity_1 = require("../../project/entities/project.entity"); +const shop_drawing_main_category_entity_1 = require("./shop-drawing-main-category.entity"); +const shop_drawing_sub_category_entity_1 = require("./shop-drawing-sub-category.entity"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const class_transformer_1 = require("class-transformer"); +let ShopDrawing = class ShopDrawing extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.ShopDrawing = ShopDrawing; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], ShopDrawing.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id' }), + __metadata("design:type", Number) +], ShopDrawing.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'drawing_number', length: 100, unique: true }), + __metadata("design:type", String) +], ShopDrawing.prototype, "drawingNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'main_category_id' }), + __metadata("design:type", Number) +], ShopDrawing.prototype, "mainCategoryId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sub_category_id' }), + __metadata("design:type", Number) +], ShopDrawing.prototype, "subCategoryId", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], ShopDrawing.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], ShopDrawing.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.DeleteDateColumn)({ name: 'deleted_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], ShopDrawing.prototype, "deletedAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'updated_by', nullable: true }), + __metadata("design:type", Number) +], ShopDrawing.prototype, "updatedBy", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => project_entity_1.Project), + (0, typeorm_1.JoinColumn)({ name: 'project_id' }), + __metadata("design:type", typeof (_d = typeof project_entity_1.Project !== "undefined" && project_entity_1.Project) === "function" ? _d : Object) +], ShopDrawing.prototype, "project", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => shop_drawing_main_category_entity_1.ShopDrawingMainCategory), + (0, typeorm_1.JoinColumn)({ name: 'main_category_id' }), + __metadata("design:type", typeof (_e = typeof shop_drawing_main_category_entity_1.ShopDrawingMainCategory !== "undefined" && shop_drawing_main_category_entity_1.ShopDrawingMainCategory) === "function" ? _e : Object) +], ShopDrawing.prototype, "mainCategory", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => shop_drawing_sub_category_entity_1.ShopDrawingSubCategory), + (0, typeorm_1.JoinColumn)({ name: 'sub_category_id' }), + __metadata("design:type", typeof (_f = typeof shop_drawing_sub_category_entity_1.ShopDrawingSubCategory !== "undefined" && shop_drawing_sub_category_entity_1.ShopDrawingSubCategory) === "function" ? _f : Object) +], ShopDrawing.prototype, "subCategory", void 0); +__decorate([ + (0, typeorm_1.OneToMany)(() => shop_drawing_revision_entity_1.ShopDrawingRevision, (revision) => revision.shopDrawing, { + cascade: true, + }), + __metadata("design:type", Array) +], ShopDrawing.prototype, "revisions", void 0); +exports.ShopDrawing = ShopDrawing = __decorate([ + (0, typeorm_1.Entity)('shop_drawings') +], ShopDrawing); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXHNob3AtZHJhd2luZy5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFDQVVpQjtBQUNqQixpRkFBcUU7QUFDckUsMEVBQWdFO0FBQ2hFLDJGQUE4RTtBQUM5RSx5RkFBNEU7QUFDNUUsZ0ZBQTJFO0FBQzNFLHlEQUE0QztBQUdyQyxJQUFNLFdBQVcsR0FBakIsTUFBTSxXQUFZLFNBQVEsaUNBQWM7Q0ErQzlDLENBQUE7QUEvQ1ksa0NBQVc7QUFHdEI7SUFGQyxJQUFBLGdDQUFzQixHQUFFO0lBQ3hCLElBQUEsMkJBQU8sR0FBRTs7dUNBQ0U7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7OENBQ1o7QUFHbkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7O2tEQUN2QztBQUd2QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDOzttREFDYjtBQUd4QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDOztrREFDYjtBQUd2QjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTs4Q0FBQztBQUdqQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTs4Q0FBQztBQUdqQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTs4Q0FBQztBQUdqQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzs4Q0FDNUI7QUFNbkI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsd0JBQU8sQ0FBQztJQUN4QixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLHdCQUFPLG9CQUFQLHdCQUFPOzRDQUFDO0FBSWxCO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLDJEQUF1QixDQUFDO0lBQ3hDLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDO2tEQUMxQiwyREFBdUIsb0JBQXZCLDJEQUF1QjtpREFBQztBQUl2QztJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyx5REFBc0IsQ0FBQztJQUN2QyxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztrREFDMUIseURBQXNCLG9CQUF0Qix5REFBc0I7Z0RBQUM7QUFLckM7SUFIQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsa0RBQW1CLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUU7UUFDeEUsT0FBTyxFQUFFLElBQUk7S0FDZCxDQUFDOzs4Q0FDZ0M7c0JBOUN2QixXQUFXO0lBRHZCLElBQUEsZ0JBQU0sRUFBQyxlQUFlLENBQUM7R0FDWCxXQUFXLENBK0N2QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxkcmF3aW5nXFxlbnRpdGllc1xcc2hvcC1kcmF3aW5nLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHksXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXG4gIENvbHVtbixcbiAgQ3JlYXRlRGF0ZUNvbHVtbixcbiAgVXBkYXRlRGF0ZUNvbHVtbixcbiAgRGVsZXRlRGF0ZUNvbHVtbixcbiAgT25lVG9NYW55LFxuICBNYW55VG9PbmUsXG4gIEpvaW5Db2x1bW4sXG59IGZyb20gJ3R5cGVvcm0nO1xuaW1wb3J0IHsgU2hvcERyYXdpbmdSZXZpc2lvbiB9IGZyb20gJy4vc2hvcC1kcmF3aW5nLXJldmlzaW9uLmVudGl0eSc7XG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC9lbnRpdGllcy9wcm9qZWN0LmVudGl0eSc7XG5pbXBvcnQgeyBTaG9wRHJhd2luZ01haW5DYXRlZ29yeSB9IGZyb20gJy4vc2hvcC1kcmF3aW5nLW1haW4tY2F0ZWdvcnkuZW50aXR5JztcbmltcG9ydCB7IFNob3BEcmF3aW5nU3ViQ2F0ZWdvcnkgfSBmcm9tICcuL3Nob3AtZHJhd2luZy1zdWItY2F0ZWdvcnkuZW50aXR5JztcbmltcG9ydCB7IFV1aWRCYXNlRW50aXR5IH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2VudGl0aWVzL3V1aWQtYmFzZS5lbnRpdHknO1xuaW1wb3J0IHsgRXhjbHVkZSB9IGZyb20gJ2NsYXNzLXRyYW5zZm9ybWVyJztcblxuQEVudGl0eSgnc2hvcF9kcmF3aW5ncycpXG5leHBvcnQgY2xhc3MgU2hvcERyYXdpbmcgZXh0ZW5kcyBVdWlkQmFzZUVudGl0eSB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKClcbiAgQEV4Y2x1ZGUoKVxuICBpZCE6IG51bWJlcjsgLy8g4LmA4LiV4Li04LihICFcblxuICBAQ29sdW1uKHsgbmFtZTogJ3Byb2plY3RfaWQnIH0pXG4gIHByb2plY3RJZCE6IG51bWJlcjsgLy8g4LmA4LiV4Li04LihICFcblxuICBAQ29sdW1uKHsgbmFtZTogJ2RyYXdpbmdfbnVtYmVyJywgbGVuZ3RoOiAxMDAsIHVuaXF1ZTogdHJ1ZSB9KVxuICBkcmF3aW5nTnVtYmVyITogc3RyaW5nOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBDb2x1bW4oeyBuYW1lOiAnbWFpbl9jYXRlZ29yeV9pZCcgfSlcbiAgbWFpbkNhdGVnb3J5SWQhOiBudW1iZXI7IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQENvbHVtbih7IG5hbWU6ICdzdWJfY2F0ZWdvcnlfaWQnIH0pXG4gIHN1YkNhdGVnb3J5SWQhOiBudW1iZXI7IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTsgLy8g4LmA4LiV4Li04LihICFcblxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxuICB1cGRhdGVkQXQhOiBEYXRlOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBEZWxldGVEYXRlQ29sdW1uKHsgbmFtZTogJ2RlbGV0ZWRfYXQnIH0pXG4gIGRlbGV0ZWRBdD86IERhdGU7IC8vIG51bGxhYmxlXG5cbiAgQENvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2J5JywgbnVsbGFibGU6IHRydWUgfSlcbiAgdXBkYXRlZEJ5PzogbnVtYmVyOyAvLyBudWxsYWJsZVxuXG4gIC8vIC0tLSBSZWxhdGlvbnMgLS0tXG5cbiAgQE1hbnlUb09uZSgoKSA9PiBQcm9qZWN0KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdwcm9qZWN0X2lkJyB9KVxuICBwcm9qZWN0ITogUHJvamVjdDsgLy8g4LmA4LiV4Li04LihICEgKOC4leC4seC4p+C4l+C4teC5iCBlcnJvcilcblxuICBATWFueVRvT25lKCgpID0+IFNob3BEcmF3aW5nTWFpbkNhdGVnb3J5KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdtYWluX2NhdGVnb3J5X2lkJyB9KVxuICBtYWluQ2F0ZWdvcnkhOiBTaG9wRHJhd2luZ01haW5DYXRlZ29yeTsgLy8g4LmA4LiV4Li04LihICFcblxuICBATWFueVRvT25lKCgpID0+IFNob3BEcmF3aW5nU3ViQ2F0ZWdvcnkpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3N1Yl9jYXRlZ29yeV9pZCcgfSlcbiAgc3ViQ2F0ZWdvcnkhOiBTaG9wRHJhd2luZ1N1YkNhdGVnb3J5OyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBPbmVUb01hbnkoKCkgPT4gU2hvcERyYXdpbmdSZXZpc2lvbiwgKHJldmlzaW9uKSA9PiByZXZpc2lvbi5zaG9wRHJhd2luZywge1xuICAgIGNhc2NhZGU6IHRydWUsXG4gIH0pXG4gIHJldmlzaW9ucyE6IFNob3BEcmF3aW5nUmV2aXNpb25bXTsgLy8g4LmA4LiV4Li04LihICFcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/20/shopdrawingentity_20e539711485c87e198d35edab37d894.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/20/shopdrawingentity_20e539711485c87e198d35edab37d894.map new file mode 100644 index 0000000..be80b4d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/20/shopdrawingentity_20e539711485c87e198d35edab37d894.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\shop-drawing.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAUiB;AACjB,iFAAqE;AACrE,0EAAgE;AAChE,2FAA8E;AAC9E,yFAA4E;AAC5E,gFAA2E;AAC3E,yDAA4C;AAGrC,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,iCAAc;CA+C9C,CAAA;AA/CY,kCAAW;AAGtB;IAFC,IAAA,gCAAsB,GAAE;IACxB,IAAA,2BAAO,GAAE;;uCACE;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;8CACZ;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;kDACvC;AAGvB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;;mDACb;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;;kDACb;AAGvB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;8CAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;8CAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;8CAAC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;8CAC5B;AAMnB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wBAAO,CAAC;IACxB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,wBAAO,oBAAP,wBAAO;4CAAC;AAIlB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,2DAAuB,CAAC;IACxC,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;kDAC1B,2DAAuB,oBAAvB,2DAAuB;iDAAC;AAIvC;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,yDAAsB,CAAC;IACvC,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;kDAC1B,yDAAsB,oBAAtB,yDAAsB;gDAAC;AAKrC;IAHC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kDAAmB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE;QACxE,OAAO,EAAE,IAAI;KACd,CAAC;;8CACgC;sBA9CvB,WAAW;IADvB,IAAA,gBAAM,EAAC,eAAe,CAAC;GACX,WAAW,CA+CvB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\shop-drawing.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n UpdateDateColumn,\n DeleteDateColumn,\n OneToMany,\n ManyToOne,\n JoinColumn,\n} from 'typeorm';\nimport { ShopDrawingRevision } from './shop-drawing-revision.entity';\nimport { Project } from '../../project/entities/project.entity';\nimport { ShopDrawingMainCategory } from './shop-drawing-main-category.entity';\nimport { ShopDrawingSubCategory } from './shop-drawing-sub-category.entity';\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\nimport { Exclude } from 'class-transformer';\n\n@Entity('shop_drawings')\nexport class ShopDrawing extends UuidBaseEntity {\n @PrimaryGeneratedColumn()\n @Exclude()\n id!: number; // เติม !\n\n @Column({ name: 'project_id' })\n projectId!: number; // เติม !\n\n @Column({ name: 'drawing_number', length: 100, unique: true })\n drawingNumber!: string; // เติม !\n\n @Column({ name: 'main_category_id' })\n mainCategoryId!: number; // เติม !\n\n @Column({ name: 'sub_category_id' })\n subCategoryId!: number; // เติม !\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date; // เติม !\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date; // เติม !\n\n @DeleteDateColumn({ name: 'deleted_at' })\n deletedAt?: Date; // nullable\n\n @Column({ name: 'updated_by', nullable: true })\n updatedBy?: number; // nullable\n\n // --- Relations ---\n\n @ManyToOne(() => Project)\n @JoinColumn({ name: 'project_id' })\n project!: Project; // เติม ! (ตัวที่ error)\n\n @ManyToOne(() => ShopDrawingMainCategory)\n @JoinColumn({ name: 'main_category_id' })\n mainCategory!: ShopDrawingMainCategory; // เติม !\n\n @ManyToOne(() => ShopDrawingSubCategory)\n @JoinColumn({ name: 'sub_category_id' })\n subCategory!: ShopDrawingSubCategory; // เติม !\n\n @OneToMany(() => ShopDrawingRevision, (revision) => revision.shopDrawing, {\n cascade: true,\n })\n revisions!: ShopDrawingRevision[]; // เติม !\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/21/appservice_21d326aab79b05aa0dedde1ceb161e5d b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/21/appservice_21d326aab79b05aa0dedde1ceb161e5d new file mode 100644 index 0000000..65ce872 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/21/appservice_21d326aab79b05aa0dedde1ceb161e5d @@ -0,0 +1,21 @@ +68e941c87426f2b14d7c08ba0f11173c +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AppService = void 0; +const common_1 = require("@nestjs/common"); +let AppService = class AppService { + getHello() { + return 'Hello World!'; + } +}; +exports.AppService = AppService; +exports.AppService = AppService = __decorate([ + (0, common_1.Injectable)() +], AppService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcYXBwLnNlcnZpY2UudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsMkNBQTRDO0FBR3JDLElBQU0sVUFBVSxHQUFoQixNQUFNLFVBQVU7SUFDckIsUUFBUTtRQUNOLE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7Q0FDRixDQUFBO0FBSlksZ0NBQVU7cUJBQVYsVUFBVTtJQUR0QixJQUFBLG1CQUFVLEdBQUU7R0FDQSxVQUFVLENBSXRCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXGFwcC5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBcHBTZXJ2aWNlIHtcbiAgZ2V0SGVsbG8oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ0hlbGxvIFdvcmxkISc7XG4gIH1cbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/21/appservice_21d326aab79b05aa0dedde1ceb161e5d.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/21/appservice_21d326aab79b05aa0dedde1ceb161e5d.map new file mode 100644 index 0000000..6a9e56b --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/21/appservice_21d326aab79b05aa0dedde1ceb161e5d.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\app.service.ts","mappings":";;;;;;;;;AAAA,2CAA4C;AAGrC,IAAM,UAAU,GAAhB,MAAM,UAAU;IACrB,QAAQ;QACN,OAAO,cAAc,CAAC;IACxB,CAAC;CACF,CAAA;AAJY,gCAAU;qBAAV,UAAU;IADtB,IAAA,mBAAU,GAAE;GACA,UAAU,CAItB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\app.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\n\n@Injectable()\nexport class AppService {\n getHello(): string {\n return 'Hello World!';\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/21/rfaworkflowtemplatestepentity_2156f3e58473799aa2a675a27211d118 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/21/rfaworkflowtemplatestepentity_2156f3e58473799aa2a675a27211d118 new file mode 100644 index 0000000..ac300a1 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/21/rfaworkflowtemplatestepentity_2156f3e58473799aa2a675a27211d118 @@ -0,0 +1,86 @@ +c07b913ced6df32d8826286c9d4d7c9e +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RfaWorkflowTemplateStep = exports.RfaActionType = void 0; +const typeorm_1 = require("typeorm"); +const rfa_workflow_template_entity_1 = require("./rfa-workflow-template.entity"); +const organization_entity_1 = require("../../organization/entities/organization.entity"); +const role_entity_1 = require("../../user/entities/role.entity"); +// ✅ 1. สร้าง Enum เพื่อให้ Type Safe +var RfaActionType; +(function (RfaActionType) { + RfaActionType["REVIEW"] = "REVIEW"; + RfaActionType["APPROVE"] = "APPROVE"; + RfaActionType["ACKNOWLEDGE"] = "ACKNOWLEDGE"; +})(RfaActionType || (exports.RfaActionType = RfaActionType = {})); +let RfaWorkflowTemplateStep = class RfaWorkflowTemplateStep { +}; +exports.RfaWorkflowTemplateStep = RfaWorkflowTemplateStep; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], RfaWorkflowTemplateStep.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'template_id' }), + __metadata("design:type", Number) +], RfaWorkflowTemplateStep.prototype, "templateId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'step_number' }), + __metadata("design:type", Number) +], RfaWorkflowTemplateStep.prototype, "stepNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'organization_id' }), + __metadata("design:type", Number) +], RfaWorkflowTemplateStep.prototype, "organizationId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'role_id', nullable: true }), + __metadata("design:type", Number) +], RfaWorkflowTemplateStep.prototype, "roleId", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'action_type', + type: 'enum', + enum: RfaActionType, // ✅ 2. ใช้ Enum ตรงนี้ + nullable: true, + }), + __metadata("design:type", String) +], RfaWorkflowTemplateStep.prototype, "actionType", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'duration_days', nullable: true }), + __metadata("design:type", Number) +], RfaWorkflowTemplateStep.prototype, "durationDays", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_optional', default: false }), + __metadata("design:type", Boolean) +], RfaWorkflowTemplateStep.prototype, "isOptional", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => rfa_workflow_template_entity_1.RfaWorkflowTemplate, (template) => template.steps, { + onDelete: 'CASCADE', + }), + (0, typeorm_1.JoinColumn)({ name: 'template_id' }), + __metadata("design:type", typeof (_a = typeof rfa_workflow_template_entity_1.RfaWorkflowTemplate !== "undefined" && rfa_workflow_template_entity_1.RfaWorkflowTemplate) === "function" ? _a : Object) +], RfaWorkflowTemplateStep.prototype, "template", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => organization_entity_1.Organization), + (0, typeorm_1.JoinColumn)({ name: 'organization_id' }), + __metadata("design:type", typeof (_b = typeof organization_entity_1.Organization !== "undefined" && organization_entity_1.Organization) === "function" ? _b : Object) +], RfaWorkflowTemplateStep.prototype, "organization", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => role_entity_1.Role), + (0, typeorm_1.JoinColumn)({ name: 'role_id' }), + __metadata("design:type", typeof (_c = typeof role_entity_1.Role !== "undefined" && role_entity_1.Role) === "function" ? _c : Object) +], RfaWorkflowTemplateStep.prototype, "role", void 0); +exports.RfaWorkflowTemplateStep = RfaWorkflowTemplateStep = __decorate([ + (0, typeorm_1.Entity)('rfa_workflow_template_steps') +], RfaWorkflowTemplateStep); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccmZhXFxlbnRpdGllc1xccmZhLXdvcmtmbG93LXRlbXBsYXRlLXN0ZXAuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FNaUI7QUFDakIsaUZBQXFFO0FBQ3JFLHlGQUErRTtBQUMvRSxpRUFBdUQ7QUFFdkQscUNBQXFDO0FBQ3JDLElBQVksYUFJWDtBQUpELFdBQVksYUFBYTtJQUN2QixrQ0FBaUIsQ0FBQTtJQUNqQixvQ0FBbUIsQ0FBQTtJQUNuQiw0Q0FBMkIsQ0FBQTtBQUM3QixDQUFDLEVBSlcsYUFBYSw2QkFBYixhQUFhLFFBSXhCO0FBR00sSUFBTSx1QkFBdUIsR0FBN0IsTUFBTSx1QkFBdUI7Q0E0Q25DLENBQUE7QUE1Q1ksMERBQXVCO0FBRWxDO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7bURBQ2I7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQzs7MkRBQ1o7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLENBQUM7OzJEQUNaO0FBR3BCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUM7OytEQUNaO0FBR3hCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O3VEQUM1QjtBQVFoQjtJQU5DLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSxhQUFhO1FBQ25CLElBQUksRUFBRSxNQUFNO1FBQ1osSUFBSSxFQUFFLGFBQWEsRUFBRSx1QkFBdUI7UUFDNUMsUUFBUSxFQUFFLElBQUk7S0FDZixDQUFDOzsyREFDeUI7QUFHM0I7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7NkRBQzVCO0FBR3RCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7OzJEQUMzQjtBQU9yQjtJQUpDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxrREFBbUIsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRTtRQUNsRSxRQUFRLEVBQUUsU0FBUztLQUNwQixDQUFDO0lBQ0QsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDO2tEQUN6QixrREFBbUIsb0JBQW5CLGtEQUFtQjt5REFBQztBQUkvQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxrQ0FBWSxDQUFDO0lBQzdCLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDO2tEQUN6QixrQ0FBWSxvQkFBWixrQ0FBWTs2REFBQztBQUk1QjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBSSxDQUFDO0lBQ3JCLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztrREFDekIsa0JBQUksb0JBQUosa0JBQUk7cURBQUM7a0NBM0NELHVCQUF1QjtJQURuQyxJQUFBLGdCQUFNLEVBQUMsNkJBQTZCLENBQUM7R0FDekIsdUJBQXVCLENBNENuQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxyZmFcXGVudGl0aWVzXFxyZmEtd29ya2Zsb3ctdGVtcGxhdGUtc3RlcC5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW50aXR5LFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBDb2x1bW4sXG4gIE1hbnlUb09uZSxcbiAgSm9pbkNvbHVtbixcbn0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBSZmFXb3JrZmxvd1RlbXBsYXRlIH0gZnJvbSAnLi9yZmEtd29ya2Zsb3ctdGVtcGxhdGUuZW50aXR5JztcbmltcG9ydCB7IE9yZ2FuaXphdGlvbiB9IGZyb20gJy4uLy4uL29yZ2FuaXphdGlvbi9lbnRpdGllcy9vcmdhbml6YXRpb24uZW50aXR5JztcbmltcG9ydCB7IFJvbGUgfSBmcm9tICcuLi8uLi91c2VyL2VudGl0aWVzL3JvbGUuZW50aXR5JztcblxuLy8g4pyFIDEuIOC4quC4o+C5ieC4suC4hyBFbnVtIOC5gOC4nuC4t+C5iOC4reC5g+C4q+C5iSBUeXBlIFNhZmVcbmV4cG9ydCBlbnVtIFJmYUFjdGlvblR5cGUge1xuICBSRVZJRVcgPSAnUkVWSUVXJyxcbiAgQVBQUk9WRSA9ICdBUFBST1ZFJyxcbiAgQUNLTk9XTEVER0UgPSAnQUNLTk9XTEVER0UnLFxufVxuXG5ARW50aXR5KCdyZmFfd29ya2Zsb3dfdGVtcGxhdGVfc3RlcHMnKVxuZXhwb3J0IGNsYXNzIFJmYVdvcmtmbG93VGVtcGxhdGVTdGVwIHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuICBpZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3RlbXBsYXRlX2lkJyB9KVxuICB0ZW1wbGF0ZUlkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnc3RlcF9udW1iZXInIH0pXG4gIHN0ZXBOdW1iZXIhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdvcmdhbml6YXRpb25faWQnIH0pXG4gIG9yZ2FuaXphdGlvbklkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncm9sZV9pZCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHJvbGVJZD86IG51bWJlcjtcblxuICBAQ29sdW1uKHtcbiAgICBuYW1lOiAnYWN0aW9uX3R5cGUnLFxuICAgIHR5cGU6ICdlbnVtJyxcbiAgICBlbnVtOiBSZmFBY3Rpb25UeXBlLCAvLyDinIUgMi4g4LmD4LiK4LmJIEVudW0g4LiV4Lij4LiH4LiZ4Li14LmJXG4gICAgbnVsbGFibGU6IHRydWUsXG4gIH0pXG4gIGFjdGlvblR5cGU/OiBSZmFBY3Rpb25UeXBlOyAvLyDinIUgMy4g4LmA4Lib4Lil4Li14LmI4Lii4LiZIHR5cGUg4LiI4Liy4LiBIHN0cmluZyDguYDguJvguYfguJkgRW51bVxuXG4gIEBDb2x1bW4oeyBuYW1lOiAnZHVyYXRpb25fZGF5cycsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGR1cmF0aW9uRGF5cz86IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2lzX29wdGlvbmFsJywgZGVmYXVsdDogZmFsc2UgfSlcbiAgaXNPcHRpb25hbCE6IGJvb2xlYW47XG5cbiAgLy8gUmVsYXRpb25zXG4gIEBNYW55VG9PbmUoKCkgPT4gUmZhV29ya2Zsb3dUZW1wbGF0ZSwgKHRlbXBsYXRlKSA9PiB0ZW1wbGF0ZS5zdGVwcywge1xuICAgIG9uRGVsZXRlOiAnQ0FTQ0FERScsXG4gIH0pXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3RlbXBsYXRlX2lkJyB9KVxuICB0ZW1wbGF0ZSE6IFJmYVdvcmtmbG93VGVtcGxhdGU7XG5cbiAgQE1hbnlUb09uZSgoKSA9PiBPcmdhbml6YXRpb24pXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ29yZ2FuaXphdGlvbl9pZCcgfSlcbiAgb3JnYW5pemF0aW9uITogT3JnYW5pemF0aW9uO1xuXG4gIEBNYW55VG9PbmUoKCkgPT4gUm9sZSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAncm9sZV9pZCcgfSlcbiAgcm9sZT86IFJvbGU7XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/21/rfaworkflowtemplatestepentity_2156f3e58473799aa2a675a27211d118.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/21/rfaworkflowtemplatestepentity_2156f3e58473799aa2a675a27211d118.map new file mode 100644 index 0000000..27d1363 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/21/rfaworkflowtemplatestepentity_2156f3e58473799aa2a675a27211d118.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-workflow-template-step.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAMiB;AACjB,iFAAqE;AACrE,yFAA+E;AAC/E,iEAAuD;AAEvD,qCAAqC;AACrC,IAAY,aAIX;AAJD,WAAY,aAAa;IACvB,kCAAiB,CAAA;IACjB,oCAAmB,CAAA;IACnB,4CAA2B,CAAA;AAC7B,CAAC,EAJW,aAAa,6BAAb,aAAa,QAIxB;AAGM,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;CA4CnC,CAAA;AA5CY,0DAAuB;AAElC;IADC,IAAA,gCAAsB,GAAE;;mDACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;2DACZ;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;2DACZ;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;;+DACZ;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;uDAC5B;AAQhB;IANC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,aAAa,EAAE,uBAAuB;QAC5C,QAAQ,EAAE,IAAI;KACf,CAAC;;2DACyB;AAG3B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;6DAC5B;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;2DAC3B;AAOrB;IAJC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kDAAmB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE;QAClE,QAAQ,EAAE,SAAS;KACpB,CAAC;IACD,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;kDACzB,kDAAmB,oBAAnB,kDAAmB;yDAAC;AAI/B;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kCAAY,CAAC;IAC7B,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;kDACzB,kCAAY,oBAAZ,kCAAY;6DAAC;AAI5B;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,CAAC;IACrB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;kDACzB,kBAAI,oBAAJ,kBAAI;qDAAC;kCA3CD,uBAAuB;IADnC,IAAA,gBAAM,EAAC,6BAA6B,CAAC;GACzB,uBAAuB,CA4CnC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-workflow-template-step.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n ManyToOne,\n JoinColumn,\n} from 'typeorm';\nimport { RfaWorkflowTemplate } from './rfa-workflow-template.entity';\nimport { Organization } from '../../organization/entities/organization.entity';\nimport { Role } from '../../user/entities/role.entity';\n\n// ✅ 1. สร้าง Enum เพื่อให้ Type Safe\nexport enum RfaActionType {\n REVIEW = 'REVIEW',\n APPROVE = 'APPROVE',\n ACKNOWLEDGE = 'ACKNOWLEDGE',\n}\n\n@Entity('rfa_workflow_template_steps')\nexport class RfaWorkflowTemplateStep {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'template_id' })\n templateId!: number;\n\n @Column({ name: 'step_number' })\n stepNumber!: number;\n\n @Column({ name: 'organization_id' })\n organizationId!: number;\n\n @Column({ name: 'role_id', nullable: true })\n roleId?: number;\n\n @Column({\n name: 'action_type',\n type: 'enum',\n enum: RfaActionType, // ✅ 2. ใช้ Enum ตรงนี้\n nullable: true,\n })\n actionType?: RfaActionType; // ✅ 3. เปลี่ยน type จาก string เป็น Enum\n\n @Column({ name: 'duration_days', nullable: true })\n durationDays?: number;\n\n @Column({ name: 'is_optional', default: false })\n isOptional!: boolean;\n\n // Relations\n @ManyToOne(() => RfaWorkflowTemplate, (template) => template.steps, {\n onDelete: 'CASCADE',\n })\n @JoinColumn({ name: 'template_id' })\n template!: RfaWorkflowTemplate;\n\n @ManyToOne(() => Organization)\n @JoinColumn({ name: 'organization_id' })\n organization!: Organization;\n\n @ManyToOne(() => Role)\n @JoinColumn({ name: 'role_id' })\n role?: Role;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/22/duedatereminderservice_2221293af5c9176ac31bf8fa020cdc5a b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/22/duedatereminderservice_2221293af5c9176ac31bf8fa020cdc5a new file mode 100644 index 0000000..775c56c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/22/duedatereminderservice_2221293af5c9176ac31bf8fa020cdc5a @@ -0,0 +1,88 @@ +44e675a368131d73a63042b53b7ae55b +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var DueDateReminderService_1; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DueDateReminderService = void 0; +const common_1 = require("@nestjs/common"); +const schedule_1 = require("@nestjs/schedule"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const correspondence_revision_entity_1 = require("./entities/correspondence-revision.entity"); +const notification_service_1 = require("../notification/notification.service"); +const user_service_1 = require("../user/user.service"); +let DueDateReminderService = DueDateReminderService_1 = class DueDateReminderService { + constructor(revisionRepo, notificationService, userService) { + this.revisionRepo = revisionRepo; + this.notificationService = notificationService; + this.userService = userService; + this.logger = new common_1.Logger(DueDateReminderService_1.name); + } + async sendDueDateReminders() { + this.logger.log('Running due date reminder check...'); + const now = new Date(); + const threeDaysLater = new Date(now); + threeDaysLater.setDate(threeDaysLater.getDate() + 3); + const revisions = await this.revisionRepo.find({ + where: { + isCurrent: true, + dueDate: (0, typeorm_2.Between)(now, threeDaysLater), + }, + relations: ['correspondence', 'correspondence.originator', 'status'], + }); + this.logger.log(`Found ${revisions.length} correspondences approaching due date`); + for (const revision of revisions) { + const corr = revision.correspondence; + if (!corr) + continue; + const statusCode = revision.status?.statusCode ?? ''; + if (statusCode === 'CANCELLED' || statusCode === 'CLBOWN') + continue; + if (!corr.originatorId) + continue; + try { + const targetUserId = await this.userService.findDocControlIdByOrg(corr.originatorId); + if (!targetUserId) + continue; + const daysLeft = Math.ceil((revision.dueDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24)); + await this.notificationService.send({ + userId: targetUserId, + title: 'Due Date Approaching', + message: `${corr.correspondenceNumber} — "${revision.subject}" is due in ${daysLeft} day${daysLeft === 1 ? '' : 's'}.`, + type: 'EMAIL', + entityType: 'correspondence', + entityId: corr.id, + link: `/correspondences/${corr.publicId}`, + }); + } + catch (err) { + this.logger.warn(`Due date reminder failed for ${corr.correspondenceNumber}: ${err.message}`); + } + } + } +}; +exports.DueDateReminderService = DueDateReminderService; +__decorate([ + (0, schedule_1.Cron)(schedule_1.CronExpression.EVERY_DAY_AT_8AM), + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", Promise) +], DueDateReminderService.prototype, "sendDueDateReminders", null); +exports.DueDateReminderService = DueDateReminderService = DueDateReminderService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(correspondence_revision_entity_1.CorrespondenceRevision)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object, typeof (_b = typeof notification_service_1.NotificationService !== "undefined" && notification_service_1.NotificationService) === "function" ? _b : Object, typeof (_c = typeof user_service_1.UserService !== "undefined" && user_service_1.UserService) === "function" ? _c : Object]) +], DueDateReminderService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGR1ZS1kYXRlLXJlbWluZGVyLnNlcnZpY2UudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBb0Q7QUFDcEQsK0NBQXdEO0FBQ3hELDZDQUFtRDtBQUNuRCxxQ0FBOEM7QUFDOUMsOEZBQW1GO0FBQ25GLCtFQUEyRTtBQUMzRSx1REFBbUQ7QUFHNUMsSUFBTSxzQkFBc0IsOEJBQTVCLE1BQU0sc0JBQXNCO0lBR2pDLFlBRUUsWUFBd0QsRUFDaEQsbUJBQXdDLEVBQ3hDLFdBQXdCO1FBRnhCLGlCQUFZLEdBQVosWUFBWSxDQUFvQztRQUNoRCx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBTmpCLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyx3QkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQU8vRCxDQUFDO0lBR0UsQUFBTixLQUFLLENBQUMsb0JBQW9CO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFFdEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixNQUFNLGNBQWMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxjQUFjLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVyRCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO1lBQzdDLEtBQUssRUFBRTtnQkFDTCxTQUFTLEVBQUUsSUFBSTtnQkFDZixPQUFPLEVBQUUsSUFBQSxpQkFBTyxFQUFDLEdBQUcsRUFBRSxjQUFjLENBQUM7YUFDdEM7WUFDRCxTQUFTLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSwyQkFBMkIsRUFBRSxRQUFRLENBQUM7U0FDckUsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQ2IsU0FBUyxTQUFTLENBQUMsTUFBTSx1Q0FBdUMsQ0FDakUsQ0FBQztRQUVGLEtBQUssTUFBTSxRQUFRLElBQUksU0FBUyxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQztZQUNyQyxJQUFJLENBQUMsSUFBSTtnQkFBRSxTQUFTO1lBRXBCLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQztZQUNyRCxJQUFJLFVBQVUsS0FBSyxXQUFXLElBQUksVUFBVSxLQUFLLFFBQVE7Z0JBQUUsU0FBUztZQUVwRSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVk7Z0JBQUUsU0FBUztZQUVqQyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixDQUMvRCxJQUFJLENBQUMsWUFBWSxDQUNsQixDQUFDO2dCQUNGLElBQUksQ0FBQyxZQUFZO29CQUFFLFNBQVM7Z0JBRTVCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQ3hCLENBQUMsUUFBUSxDQUFDLE9BQVEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUN0RSxDQUFDO2dCQUVGLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQztvQkFDbEMsTUFBTSxFQUFFLFlBQVk7b0JBQ3BCLEtBQUssRUFBRSxzQkFBc0I7b0JBQzdCLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsT0FBTyxRQUFRLENBQUMsT0FBTyxlQUFlLFFBQVEsT0FBTyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRztvQkFDdEgsSUFBSSxFQUFFLE9BQU87b0JBQ2IsVUFBVSxFQUFFLGdCQUFnQjtvQkFDNUIsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFO29CQUNqQixJQUFJLEVBQUUsb0JBQW9CLElBQUksQ0FBQyxRQUFRLEVBQUU7aUJBQzFDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNkLGdDQUFnQyxJQUFJLENBQUMsb0JBQW9CLEtBQU0sR0FBYSxDQUFDLE9BQU8sRUFBRSxDQUN2RixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0YsQ0FBQTtBQWpFWSx3REFBc0I7QUFXM0I7SUFETCxJQUFBLGVBQUksRUFBQyx5QkFBYyxDQUFDLGdCQUFnQixDQUFDOzs7O2tFQXNEckM7aUNBaEVVLHNCQUFzQjtJQURsQyxJQUFBLG1CQUFVLEdBQUU7SUFLUixXQUFBLElBQUEsMEJBQWdCLEVBQUMsdURBQXNCLENBQUMsQ0FBQTt5REFDbkIsb0JBQVUsb0JBQVYsb0JBQVUsb0RBQ0gsMENBQW1CLG9CQUFuQiwwQ0FBbUIsb0RBQzNCLDBCQUFXLG9CQUFYLDBCQUFXO0dBUHZCLHNCQUFzQixDQWlFbEMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGR1ZS1kYXRlLXJlbWluZGVyLnNlcnZpY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTG9nZ2VyIH0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xyXG5pbXBvcnQgeyBDcm9uLCBDcm9uRXhwcmVzc2lvbiB9IGZyb20gJ0BuZXN0anMvc2NoZWR1bGUnO1xyXG5pbXBvcnQgeyBJbmplY3RSZXBvc2l0b3J5IH0gZnJvbSAnQG5lc3Rqcy90eXBlb3JtJztcclxuaW1wb3J0IHsgUmVwb3NpdG9yeSwgQmV0d2VlbiB9IGZyb20gJ3R5cGVvcm0nO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJldmlzaW9uIH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS1yZXZpc2lvbi5lbnRpdHknO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLi91c2VyL3VzZXIuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBEdWVEYXRlUmVtaW5kZXJTZXJ2aWNlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoRHVlRGF0ZVJlbWluZGVyU2VydmljZS5uYW1lKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShDb3JyZXNwb25kZW5jZVJldmlzaW9uKVxyXG4gICAgcHJpdmF0ZSByZXZpc2lvblJlcG86IFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VSZXZpc2lvbj4sXHJcbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZVxyXG4gICkge31cclxuXHJcbiAgQENyb24oQ3JvbkV4cHJlc3Npb24uRVZFUllfREFZX0FUXzhBTSlcclxuICBhc3luYyBzZW5kRHVlRGF0ZVJlbWluZGVycygpIHtcclxuICAgIHRoaXMubG9nZ2VyLmxvZygnUnVubmluZyBkdWUgZGF0ZSByZW1pbmRlciBjaGVjay4uLicpO1xyXG5cclxuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XHJcbiAgICBjb25zdCB0aHJlZURheXNMYXRlciA9IG5ldyBEYXRlKG5vdyk7XHJcbiAgICB0aHJlZURheXNMYXRlci5zZXREYXRlKHRocmVlRGF5c0xhdGVyLmdldERhdGUoKSArIDMpO1xyXG5cclxuICAgIGNvbnN0IHJldmlzaW9ucyA9IGF3YWl0IHRoaXMucmV2aXNpb25SZXBvLmZpbmQoe1xyXG4gICAgICB3aGVyZToge1xyXG4gICAgICAgIGlzQ3VycmVudDogdHJ1ZSxcclxuICAgICAgICBkdWVEYXRlOiBCZXR3ZWVuKG5vdywgdGhyZWVEYXlzTGF0ZXIpLFxyXG4gICAgICB9LFxyXG4gICAgICByZWxhdGlvbnM6IFsnY29ycmVzcG9uZGVuY2UnLCAnY29ycmVzcG9uZGVuY2Uub3JpZ2luYXRvcicsICdzdGF0dXMnXSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMubG9nZ2VyLmxvZyhcclxuICAgICAgYEZvdW5kICR7cmV2aXNpb25zLmxlbmd0aH0gY29ycmVzcG9uZGVuY2VzIGFwcHJvYWNoaW5nIGR1ZSBkYXRlYFxyXG4gICAgKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHJldmlzaW9uIG9mIHJldmlzaW9ucykge1xyXG4gICAgICBjb25zdCBjb3JyID0gcmV2aXNpb24uY29ycmVzcG9uZGVuY2U7XHJcbiAgICAgIGlmICghY29ycikgY29udGludWU7XHJcblxyXG4gICAgICBjb25zdCBzdGF0dXNDb2RlID0gcmV2aXNpb24uc3RhdHVzPy5zdGF0dXNDb2RlID8/ICcnO1xyXG4gICAgICBpZiAoc3RhdHVzQ29kZSA9PT0gJ0NBTkNFTExFRCcgfHwgc3RhdHVzQ29kZSA9PT0gJ0NMQk9XTicpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgaWYgKCFjb3JyLm9yaWdpbmF0b3JJZCkgY29udGludWU7XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldFVzZXJJZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZmluZERvY0NvbnRyb2xJZEJ5T3JnKFxyXG4gICAgICAgICAgY29yci5vcmlnaW5hdG9ySWRcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmICghdGFyZ2V0VXNlcklkKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgY29uc3QgZGF5c0xlZnQgPSBNYXRoLmNlaWwoXHJcbiAgICAgICAgICAocmV2aXNpb24uZHVlRGF0ZSEuZ2V0VGltZSgpIC0gbm93LmdldFRpbWUoKSkgLyAoMTAwMCAqIDYwICogNjAgKiAyNClcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2VuZCh7XHJcbiAgICAgICAgICB1c2VySWQ6IHRhcmdldFVzZXJJZCxcclxuICAgICAgICAgIHRpdGxlOiAnRHVlIERhdGUgQXBwcm9hY2hpbmcnLFxyXG4gICAgICAgICAgbWVzc2FnZTogYCR7Y29yci5jb3JyZXNwb25kZW5jZU51bWJlcn0g4oCUIFwiJHtyZXZpc2lvbi5zdWJqZWN0fVwiIGlzIGR1ZSBpbiAke2RheXNMZWZ0fSBkYXkke2RheXNMZWZ0ID09PSAxID8gJycgOiAncyd9LmAsXHJcbiAgICAgICAgICB0eXBlOiAnRU1BSUwnLFxyXG4gICAgICAgICAgZW50aXR5VHlwZTogJ2NvcnJlc3BvbmRlbmNlJyxcclxuICAgICAgICAgIGVudGl0eUlkOiBjb3JyLmlkLFxyXG4gICAgICAgICAgbGluazogYC9jb3JyZXNwb25kZW5jZXMvJHtjb3JyLnB1YmxpY0lkfWAsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXHJcbiAgICAgICAgICBgRHVlIGRhdGUgcmVtaW5kZXIgZmFpbGVkIGZvciAke2NvcnIuY29ycmVzcG9uZGVuY2VOdW1iZXJ9OiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/22/duedatereminderservice_2221293af5c9176ac31bf8fa020cdc5a.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/22/duedatereminderservice_2221293af5c9176ac31bf8fa020cdc5a.map new file mode 100644 index 0000000..3dca5df --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/22/duedatereminderservice_2221293af5c9176ac31bf8fa020cdc5a.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\due-date-reminder.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\due-date-reminder.service.ts"],"sourcesContent":["import { Injectable, Logger } from '@nestjs/common';\r\nimport { Cron, CronExpression } from '@nestjs/schedule';\r\nimport { InjectRepository } from '@nestjs/typeorm';\r\nimport { Repository, Between } from 'typeorm';\r\nimport { CorrespondenceRevision } from './entities/correspondence-revision.entity';\r\nimport { NotificationService } from '../notification/notification.service';\r\nimport { UserService } from '../user/user.service';\r\n\r\n@Injectable()\r\nexport class DueDateReminderService {\r\n private readonly logger = new Logger(DueDateReminderService.name);\r\n\r\n constructor(\r\n @InjectRepository(CorrespondenceRevision)\r\n private revisionRepo: Repository,\r\n private notificationService: NotificationService,\r\n private userService: UserService\r\n ) {}\r\n\r\n @Cron(CronExpression.EVERY_DAY_AT_8AM)\r\n async sendDueDateReminders() {\r\n this.logger.log('Running due date reminder check...');\r\n\r\n const now = new Date();\r\n const threeDaysLater = new Date(now);\r\n threeDaysLater.setDate(threeDaysLater.getDate() + 3);\r\n\r\n const revisions = await this.revisionRepo.find({\r\n where: {\r\n isCurrent: true,\r\n dueDate: Between(now, threeDaysLater),\r\n },\r\n relations: ['correspondence', 'correspondence.originator', 'status'],\r\n });\r\n\r\n this.logger.log(\r\n `Found ${revisions.length} correspondences approaching due date`\r\n );\r\n\r\n for (const revision of revisions) {\r\n const corr = revision.correspondence;\r\n if (!corr) continue;\r\n\r\n const statusCode = revision.status?.statusCode ?? '';\r\n if (statusCode === 'CANCELLED' || statusCode === 'CLBOWN') continue;\r\n\r\n if (!corr.originatorId) continue;\r\n\r\n try {\r\n const targetUserId = await this.userService.findDocControlIdByOrg(\r\n corr.originatorId\r\n );\r\n if (!targetUserId) continue;\r\n\r\n const daysLeft = Math.ceil(\r\n (revision.dueDate!.getTime() - now.getTime()) / (1000 * 60 * 60 * 24)\r\n );\r\n\r\n await this.notificationService.send({\r\n userId: targetUserId,\r\n title: 'Due Date Approaching',\r\n message: `${corr.correspondenceNumber} — \"${revision.subject}\" is due in ${daysLeft} day${daysLeft === 1 ? '' : 's'}.`,\r\n type: 'EMAIL',\r\n entityType: 'correspondence',\r\n entityId: corr.id,\r\n link: `/correspondences/${corr.publicId}`,\r\n });\r\n } catch (err) {\r\n this.logger.warn(\r\n `Due date reminder failed for ${corr.correspondenceNumber}: ${(err as Error).message}`\r\n );\r\n }\r\n }\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/26/commitbatchdto_262c393514cbdebc3944d447aa32fed5 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/26/commitbatchdto_262c393514cbdebc3944d447aa32fed5 new file mode 100644 index 0000000..5c71800 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/26/commitbatchdto_262c393514cbdebc3944d447aa32fed5 @@ -0,0 +1,44 @@ +b94c9f56f6c087f382d7a351eebbbf92 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CommitBatchDto = exports.CommitBatchItemDto = void 0; +const class_validator_1 = require("class-validator"); +const class_transformer_1 = require("class-transformer"); +const import_correspondence_dto_1 = require("./import-correspondence.dto"); +class CommitBatchItemDto { +} +exports.CommitBatchItemDto = CommitBatchItemDto; +__decorate([ + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", Number) +], CommitBatchItemDto.prototype, "queueId", void 0); +__decorate([ + (0, class_validator_1.ValidateNested)(), + (0, class_transformer_1.Type)(() => import_correspondence_dto_1.ImportCorrespondenceDto), + __metadata("design:type", typeof (_a = typeof import_correspondence_dto_1.ImportCorrespondenceDto !== "undefined" && import_correspondence_dto_1.ImportCorrespondenceDto) === "function" ? _a : Object) +], CommitBatchItemDto.prototype, "dto", void 0); +class CommitBatchDto { +} +exports.CommitBatchDto = CommitBatchDto; +__decorate([ + (0, class_validator_1.IsArray)(), + (0, class_validator_1.ValidateNested)({ each: true }), + (0, class_transformer_1.Type)(() => CommitBatchItemDto), + __metadata("design:type", Array) +], CommitBatchDto.prototype, "items", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], CommitBatchDto.prototype, "batchId", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxkdG9cXGNvbW1pdC1iYXRjaC5kdG8udHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFEQUFnRjtBQUNoRix5REFBeUM7QUFDekMsMkVBQXNFO0FBRXRFLE1BQWEsa0JBQWtCO0NBTzlCO0FBUEQsZ0RBT0M7QUFMQztJQURDLElBQUEsNEJBQVUsR0FBRTs7bURBQ0k7QUFJakI7SUFGQyxJQUFBLGdDQUFjLEdBQUU7SUFDaEIsSUFBQSx3QkFBSSxFQUFDLEdBQUcsRUFBRSxDQUFDLG1EQUF1QixDQUFDO2tEQUM5QixtREFBdUIsb0JBQXZCLG1EQUF1QjsrQ0FBQztBQUdoQyxNQUFhLGNBQWM7Q0FTMUI7QUFURCx3Q0FTQztBQUxDO0lBSEMsSUFBQSx5QkFBTyxHQUFFO0lBQ1QsSUFBQSxnQ0FBYyxFQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzlCLElBQUEsd0JBQUksRUFBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQzs7NkNBQ0Y7QUFJN0I7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7OytDQUNJIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXG1pZ3JhdGlvblxcZHRvXFxjb21taXQtYmF0Y2guZHRvLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElzQXJyYXksIFZhbGlkYXRlTmVzdGVkLCBJc1N0cmluZywgSXNOb3RFbXB0eSB9IGZyb20gJ2NsYXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgeyBUeXBlIH0gZnJvbSAnY2xhc3MtdHJhbnNmb3JtZXInO1xuaW1wb3J0IHsgSW1wb3J0Q29ycmVzcG9uZGVuY2VEdG8gfSBmcm9tICcuL2ltcG9ydC1jb3JyZXNwb25kZW5jZS5kdG8nO1xuXG5leHBvcnQgY2xhc3MgQ29tbWl0QmF0Y2hJdGVtRHRvIHtcbiAgQElzTm90RW1wdHkoKVxuICBxdWV1ZUlkITogbnVtYmVyO1xuXG4gIEBWYWxpZGF0ZU5lc3RlZCgpXG4gIEBUeXBlKCgpID0+IEltcG9ydENvcnJlc3BvbmRlbmNlRHRvKVxuICBkdG8hOiBJbXBvcnRDb3JyZXNwb25kZW5jZUR0bztcbn1cblxuZXhwb3J0IGNsYXNzIENvbW1pdEJhdGNoRHRvIHtcbiAgQElzQXJyYXkoKVxuICBAVmFsaWRhdGVOZXN0ZWQoeyBlYWNoOiB0cnVlIH0pXG4gIEBUeXBlKCgpID0+IENvbW1pdEJhdGNoSXRlbUR0bylcbiAgaXRlbXMhOiBDb21taXRCYXRjaEl0ZW1EdG9bXTtcblxuICBASXNTdHJpbmcoKVxuICBASXNOb3RFbXB0eSgpXG4gIGJhdGNoSWQhOiBzdHJpbmc7XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/26/commitbatchdto_262c393514cbdebc3944d447aa32fed5.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/26/commitbatchdto_262c393514cbdebc3944d447aa32fed5.map new file mode 100644 index 0000000..be088a6 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/26/commitbatchdto_262c393514cbdebc3944d447aa32fed5.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\dto\\commit-batch.dto.ts","mappings":";;;;;;;;;;;;;AAAA,qDAAgF;AAChF,yDAAyC;AACzC,2EAAsE;AAEtE,MAAa,kBAAkB;CAO9B;AAPD,gDAOC;AALC;IADC,IAAA,4BAAU,GAAE;;mDACI;AAIjB;IAFC,IAAA,gCAAc,GAAE;IAChB,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,mDAAuB,CAAC;kDAC9B,mDAAuB,oBAAvB,mDAAuB;+CAAC;AAGhC,MAAa,cAAc;CAS1B;AATD,wCASC;AALC;IAHC,IAAA,yBAAO,GAAE;IACT,IAAA,gCAAc,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC;;6CACF;AAI7B;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;+CACI","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\dto\\commit-batch.dto.ts"],"sourcesContent":["import { IsArray, ValidateNested, IsString, IsNotEmpty } from 'class-validator';\nimport { Type } from 'class-transformer';\nimport { ImportCorrespondenceDto } from './import-correspondence.dto';\n\nexport class CommitBatchItemDto {\n @IsNotEmpty()\n queueId!: number;\n\n @ValidateNested()\n @Type(() => ImportCorrespondenceDto)\n dto!: ImportCorrespondenceDto;\n}\n\nexport class CommitBatchDto {\n @IsArray()\n @ValidateNested({ each: true })\n @Type(() => CommitBatchItemDto)\n items!: CommitBatchItemDto[];\n\n @IsString()\n @IsNotEmpty()\n batchId!: string;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/29/permissionentity_29b10ac40c51596f01411c0936261f7d b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/29/permissionentity_29b10ac40c51596f01411c0936261f7d new file mode 100644 index 0000000..30b2607 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/29/permissionentity_29b10ac40c51596f01411c0936261f7d @@ -0,0 +1,50 @@ +4dc6995f8803356fdeda634f4e7937a5 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Permission = void 0; +const typeorm_1 = require("typeorm"); +let Permission = class Permission { +}; +exports.Permission = Permission; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)({ name: 'permission_id' }), + __metadata("design:type", Number) +], Permission.prototype, "permissionId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'permission_name', length: 100, unique: true }), + __metadata("design:type", String) +], Permission.prototype, "permissionName", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], Permission.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ length: 50, nullable: true }), + __metadata("design:type", String) +], Permission.prototype, "module", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'scope_level', + type: 'enum', + enum: ['GLOBAL', 'ORG', 'PROJECT'], + nullable: true, + }), + __metadata("design:type", String) +], Permission.prototype, "scopeLevel", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true }), + __metadata("design:type", Boolean) +], Permission.prototype, "isActive", void 0); +exports.Permission = Permission = __decorate([ + (0, typeorm_1.Entity)('permissions') +], Permission); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcdXNlclxcZW50aXRpZXNcXHBlcm1pc3Npb24uZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLHFDQUFpRTtBQUcxRCxJQUFNLFVBQVUsR0FBaEIsTUFBTSxVQUFVO0NBdUJ0QixDQUFBO0FBdkJZLGdDQUFVO0FBRXJCO0lBREMsSUFBQSxnQ0FBc0IsRUFBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQzs7Z0RBQzVCO0FBR3RCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDOztrREFDdkM7QUFHeEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7K0NBQ3BCO0FBR3JCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7OzBDQUN2QjtBQVFoQjtJQU5DLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSxhQUFhO1FBQ25CLElBQUksRUFBRSxNQUFNO1FBQ1osSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUM7UUFDbEMsUUFBUSxFQUFFLElBQUk7S0FDZixDQUFDOzs4Q0FDa0I7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7NENBQzFCO3FCQXRCUixVQUFVO0lBRHRCLElBQUEsZ0JBQU0sRUFBQyxhQUFhLENBQUM7R0FDVCxVQUFVLENBdUJ0QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFx1c2VyXFxlbnRpdGllc1xccGVybWlzc2lvbi5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5LCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLCBDb2x1bW4gfSBmcm9tICd0eXBlb3JtJztcblxuQEVudGl0eSgncGVybWlzc2lvbnMnKVxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb24ge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbih7IG5hbWU6ICdwZXJtaXNzaW9uX2lkJyB9KVxuICBwZXJtaXNzaW9uSWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdwZXJtaXNzaW9uX25hbWUnLCBsZW5ndGg6IDEwMCwgdW5pcXVlOiB0cnVlIH0pXG4gIHBlcm1pc3Npb25OYW1lITogc3RyaW5nOyAvLyBlLmcuLCAncmZhLmNyZWF0ZSdcblxuICBAQ29sdW1uKHsgdHlwZTogJ3RleHQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICBAQ29sdW1uKHsgbGVuZ3RoOiA1MCwgbnVsbGFibGU6IHRydWUgfSlcbiAgbW9kdWxlPzogc3RyaW5nOyAvLyBlLmcuLCAncmZhJywgJ3VzZXInXG5cbiAgQENvbHVtbih7XG4gICAgbmFtZTogJ3Njb3BlX2xldmVsJyxcbiAgICB0eXBlOiAnZW51bScsXG4gICAgZW51bTogWydHTE9CQUwnLCAnT1JHJywgJ1BST0pFQ1QnXSxcbiAgICBudWxsYWJsZTogdHJ1ZSxcbiAgfSlcbiAgc2NvcGVMZXZlbD86IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ2lzX2FjdGl2ZScsIGRlZmF1bHQ6IHRydWUgfSlcbiAgaXNBY3RpdmUhOiBib29sZWFuO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/29/permissionentity_29b10ac40c51596f01411c0936261f7d.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/29/permissionentity_29b10ac40c51596f01411c0936261f7d.map new file mode 100644 index 0000000..6290667 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/29/permissionentity_29b10ac40c51596f01411c0936261f7d.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\entities\\permission.entity.ts","mappings":";;;;;;;;;;;;AAAA,qCAAiE;AAG1D,IAAM,UAAU,GAAhB,MAAM,UAAU;CAuBtB,CAAA;AAvBY,gCAAU;AAErB;IADC,IAAA,gCAAsB,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;;gDAC5B;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;kDACvC;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;+CACpB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;0CACvB;AAQhB;IANC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC;QAClC,QAAQ,EAAE,IAAI;KACf,CAAC;;8CACkB;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;4CAC1B;qBAtBR,UAAU;IADtB,IAAA,gBAAM,EAAC,aAAa,CAAC;GACT,UAAU,CAuBtB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\entities\\permission.entity.ts"],"sourcesContent":["import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';\n\n@Entity('permissions')\nexport class Permission {\n @PrimaryGeneratedColumn({ name: 'permission_id' })\n permissionId!: number;\n\n @Column({ name: 'permission_name', length: 100, unique: true })\n permissionName!: string; // e.g., 'rfa.create'\n\n @Column({ type: 'text', nullable: true })\n description?: string;\n\n @Column({ length: 50, nullable: true })\n module?: string; // e.g., 'rfa', 'user'\n\n @Column({\n name: 'scope_level',\n type: 'enum',\n enum: ['GLOBAL', 'ORG', 'PROJECT'],\n nullable: true,\n })\n scopeLevel?: string;\n\n @Column({ name: 'is_active', default: true })\n isActive!: boolean;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2e/contractdrawingsubcatcatmapentity_2e85b81ca8f336f48097bfe5f99d35ce b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2e/contractdrawingsubcatcatmapentity_2e85b81ca8f336f48097bfe5f99d35ce new file mode 100644 index 0000000..c8e94b4 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2e/contractdrawingsubcatcatmapentity_2e85b81ca8f336f48097bfe5f99d35ce @@ -0,0 +1,56 @@ +074e5ba9ce3fabac4b472060929f5b51 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ContractDrawingSubcatCatMap = void 0; +const typeorm_1 = require("typeorm"); +const project_entity_1 = require("../../project/entities/project.entity"); +const contract_drawing_category_entity_1 = require("./contract-drawing-category.entity"); +const contract_drawing_sub_category_entity_1 = require("./contract-drawing-sub-category.entity"); +let ContractDrawingSubcatCatMap = class ContractDrawingSubcatCatMap { +}; +exports.ContractDrawingSubcatCatMap = ContractDrawingSubcatCatMap; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], ContractDrawingSubcatCatMap.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id', nullable: true }), + __metadata("design:type", Number) +], ContractDrawingSubcatCatMap.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sub_cat_id', nullable: true }), + __metadata("design:type", Number) +], ContractDrawingSubcatCatMap.prototype, "subCategoryId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'cat_id', nullable: true }), + __metadata("design:type", Number) +], ContractDrawingSubcatCatMap.prototype, "categoryId", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => project_entity_1.Project), + (0, typeorm_1.JoinColumn)({ name: 'project_id' }), + __metadata("design:type", typeof (_a = typeof project_entity_1.Project !== "undefined" && project_entity_1.Project) === "function" ? _a : Object) +], ContractDrawingSubcatCatMap.prototype, "project", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => contract_drawing_sub_category_entity_1.ContractDrawingSubCategory), + (0, typeorm_1.JoinColumn)({ name: 'sub_cat_id' }), + __metadata("design:type", typeof (_b = typeof contract_drawing_sub_category_entity_1.ContractDrawingSubCategory !== "undefined" && contract_drawing_sub_category_entity_1.ContractDrawingSubCategory) === "function" ? _b : Object) +], ContractDrawingSubcatCatMap.prototype, "subCategory", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => contract_drawing_category_entity_1.ContractDrawingCategory), + (0, typeorm_1.JoinColumn)({ name: 'cat_id' }), + __metadata("design:type", typeof (_c = typeof contract_drawing_category_entity_1.ContractDrawingCategory !== "undefined" && contract_drawing_category_entity_1.ContractDrawingCategory) === "function" ? _c : Object) +], ContractDrawingSubcatCatMap.prototype, "category", void 0); +exports.ContractDrawingSubcatCatMap = ContractDrawingSubcatCatMap = __decorate([ + (0, typeorm_1.Entity)('contract_drawing_subcat_cat_maps') +], ContractDrawingSubcatCatMap); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXGNvbnRyYWN0LWRyYXdpbmctc3ViY2F0LWNhdC1tYXAuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FNaUI7QUFDakIsMEVBQWdFO0FBQ2hFLHlGQUE2RTtBQUM3RSxpR0FBb0Y7QUFHN0UsSUFBTSwyQkFBMkIsR0FBakMsTUFBTSwyQkFBMkI7Q0F3QnZDLENBQUE7QUF4Qlksa0VBQTJCO0FBRXRDO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7dURBQ2I7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzs4REFDNUI7QUFHbkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7a0VBQ3hCO0FBR3ZCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7OytEQUN2QjtBQUlwQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyx3QkFBTyxDQUFDO0lBQ3hCLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDekIsd0JBQU8sb0JBQVAsd0JBQU87NERBQUM7QUFJbEI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsaUVBQTBCLENBQUM7SUFDM0MsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUNyQixpRUFBMEIsb0JBQTFCLGlFQUEwQjtnRUFBQztBQUl6QztJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQywwREFBdUIsQ0FBQztJQUN4QyxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7a0RBQ3BCLDBEQUF1QixvQkFBdkIsMERBQXVCOzZEQUFDO3NDQXZCeEIsMkJBQTJCO0lBRHZDLElBQUEsZ0JBQU0sRUFBQyxrQ0FBa0MsQ0FBQztHQUM5QiwyQkFBMkIsQ0F3QnZDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGRyYXdpbmdcXGVudGl0aWVzXFxjb250cmFjdC1kcmF3aW5nLXN1YmNhdC1jYXQtbWFwLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHksXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXG4gIENvbHVtbixcbiAgTWFueVRvT25lLFxuICBKb2luQ29sdW1uLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0L2VudGl0aWVzL3Byb2plY3QuZW50aXR5JztcbmltcG9ydCB7IENvbnRyYWN0RHJhd2luZ0NhdGVnb3J5IH0gZnJvbSAnLi9jb250cmFjdC1kcmF3aW5nLWNhdGVnb3J5LmVudGl0eSc7XG5pbXBvcnQgeyBDb250cmFjdERyYXdpbmdTdWJDYXRlZ29yeSB9IGZyb20gJy4vY29udHJhY3QtZHJhd2luZy1zdWItY2F0ZWdvcnkuZW50aXR5JztcblxuQEVudGl0eSgnY29udHJhY3RfZHJhd2luZ19zdWJjYXRfY2F0X21hcHMnKVxuZXhwb3J0IGNsYXNzIENvbnRyYWN0RHJhd2luZ1N1YmNhdENhdE1hcCB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKClcbiAgaWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdwcm9qZWN0X2lkJywgbnVsbGFibGU6IHRydWUgfSlcbiAgcHJvamVjdElkPzogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnc3ViX2NhdF9pZCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHN1YkNhdGVnb3J5SWQ/OiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdjYXRfaWQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBjYXRlZ29yeUlkPzogbnVtYmVyO1xuXG4gIEBNYW55VG9PbmUoKCkgPT4gUHJvamVjdClcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAncHJvamVjdF9pZCcgfSlcbiAgcHJvamVjdD86IFByb2plY3Q7XG5cbiAgQE1hbnlUb09uZSgoKSA9PiBDb250cmFjdERyYXdpbmdTdWJDYXRlZ29yeSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAnc3ViX2NhdF9pZCcgfSlcbiAgc3ViQ2F0ZWdvcnk/OiBDb250cmFjdERyYXdpbmdTdWJDYXRlZ29yeTtcblxuICBATWFueVRvT25lKCgpID0+IENvbnRyYWN0RHJhd2luZ0NhdGVnb3J5KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdjYXRfaWQnIH0pXG4gIGNhdGVnb3J5PzogQ29udHJhY3REcmF3aW5nQ2F0ZWdvcnk7XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2e/contractdrawingsubcatcatmapentity_2e85b81ca8f336f48097bfe5f99d35ce.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2e/contractdrawingsubcatcatmapentity_2e85b81ca8f336f48097bfe5f99d35ce.map new file mode 100644 index 0000000..cfdfaf9 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/2e/contractdrawingsubcatcatmapentity_2e85b81ca8f336f48097bfe5f99d35ce.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\contract-drawing-subcat-cat-map.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAMiB;AACjB,0EAAgE;AAChE,yFAA6E;AAC7E,iGAAoF;AAG7E,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;CAwBvC,CAAA;AAxBY,kEAA2B;AAEtC;IADC,IAAA,gCAAsB,GAAE;;uDACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;8DAC5B;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kEACxB;AAGvB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;+DACvB;AAIpB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wBAAO,CAAC;IACxB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,wBAAO,oBAAP,wBAAO;4DAAC;AAIlB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,iEAA0B,CAAC;IAC3C,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACrB,iEAA0B,oBAA1B,iEAA0B;gEAAC;AAIzC;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,0DAAuB,CAAC;IACxC,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;kDACpB,0DAAuB,oBAAvB,0DAAuB;6DAAC;sCAvBxB,2BAA2B;IADvC,IAAA,gBAAM,EAAC,kCAAkC,CAAC;GAC9B,2BAA2B,CAwBvC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\contract-drawing-subcat-cat-map.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n ManyToOne,\n JoinColumn,\n} from 'typeorm';\nimport { Project } from '../../project/entities/project.entity';\nimport { ContractDrawingCategory } from './contract-drawing-category.entity';\nimport { ContractDrawingSubCategory } from './contract-drawing-sub-category.entity';\n\n@Entity('contract_drawing_subcat_cat_maps')\nexport class ContractDrawingSubcatCatMap {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'project_id', nullable: true })\n projectId?: number;\n\n @Column({ name: 'sub_cat_id', nullable: true })\n subCategoryId?: number;\n\n @Column({ name: 'cat_id', nullable: true })\n categoryId?: number;\n\n @ManyToOne(() => Project)\n @JoinColumn({ name: 'project_id' })\n project?: Project;\n\n @ManyToOne(() => ContractDrawingSubCategory)\n @JoinColumn({ name: 'sub_cat_id' })\n subCategory?: ContractDrawingSubCategory;\n\n @ManyToOne(() => ContractDrawingCategory)\n @JoinColumn({ name: 'cat_id' })\n category?: ContractDrawingCategory;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/30/documentnumberinglockservice_30afd2380f9ec6310699d91060265631 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/30/documentnumberinglockservice_30afd2380f9ec6310699d91060265631 new file mode 100644 index 0000000..344c0ad --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/30/documentnumberinglockservice_30afd2380f9ec6310699d91060265631 @@ -0,0 +1,71 @@ +9b5fd4168cdbfbc97853f7ddca5b5c25 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +var DocumentNumberingLockService_1; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DocumentNumberingLockService = void 0; +const common_1 = require("@nestjs/common"); +const ioredis_1 = require("@nestjs-modules/ioredis"); +const ioredis_2 = __importDefault(require("ioredis")); +const redlock_1 = __importDefault(require("redlock")); +let DocumentNumberingLockService = DocumentNumberingLockService_1 = class DocumentNumberingLockService { + constructor(redis) { + this.redis = redis; + this.logger = new common_1.Logger(DocumentNumberingLockService_1.name); + this.redlock = new redlock_1.default([redis], { + driftFactor: 0.01, + retryCount: 5, + retryDelay: 100, + retryJitter: 50, + }); + } + async acquireLock(key) { + const lockKey = this.buildLockKey(key); + const ttl = 5000; // 5 seconds + try { + const lock = await this.redlock.acquire([lockKey], ttl); + this.logger.debug(`Acquired lock: ${lockKey}`); + return lock; + } + catch (error) { + this.logger.error(`Failed to acquire lock: ${lockKey}`, error); + throw error; + } + } + async releaseLock(lock) { + try { + await lock.release(); + this.logger.debug(`Released lock`); + } + catch (error) { + this.logger.warn('Failed to release lock (may have expired)', error); + } + } + buildLockKey(key) { + return (`lock:docnum:${key.projectId}:${key.originatorOrgId}:` + + `${key.recipientOrgId ?? 0}:${key.correspondenceTypeId}:` + + `${key.subTypeId}:${key.rfaTypeId}:${key.disciplineId}:${key.resetScope}`); + } +}; +exports.DocumentNumberingLockService = DocumentNumberingLockService; +exports.DocumentNumberingLockService = DocumentNumberingLockService = DocumentNumberingLockService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, ioredis_1.InjectRedis)()), + __metadata("design:paramtypes", [typeof (_a = typeof ioredis_2.default !== "undefined" && ioredis_2.default) === "function" ? _a : Object]) +], DocumentNumberingLockService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxzZXJ2aWNlc1xcZG9jdW1lbnQtbnVtYmVyaW5nLWxvY2suc2VydmljZS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUFvRDtBQUNwRCxxREFBc0Q7QUFDdEQsc0RBQTRCO0FBQzVCLHNEQUF3QztBQWNqQyxJQUFNLDRCQUE0QixvQ0FBbEMsTUFBTSw0QkFBNEI7SUFJdkMsWUFBMkIsS0FBNkI7UUFBWixVQUFLLEdBQUwsS0FBSyxDQUFPO1FBSHZDLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyw4QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUl0RSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksaUJBQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2xDLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFVBQVUsRUFBRSxDQUFDO1lBQ2IsVUFBVSxFQUFFLEdBQUc7WUFDZixXQUFXLEVBQUUsRUFBRTtTQUNoQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFtQjtRQUNuQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLFlBQVk7UUFFOUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGtCQUFrQixPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsT0FBTyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBVTtRQUMxQixJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDJDQUEyQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7SUFDSCxDQUFDO0lBRU8sWUFBWSxDQUFDLEdBQW1CO1FBQ3RDLE9BQU8sQ0FDTCxlQUFlLEdBQUcsQ0FBQyxTQUFTLElBQUksR0FBRyxDQUFDLGVBQWUsR0FBRztZQUN0RCxHQUFHLEdBQUcsQ0FBQyxjQUFjLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxvQkFBb0IsR0FBRztZQUN6RCxHQUFHLEdBQUcsQ0FBQyxTQUFTLElBQUksR0FBRyxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUMsWUFBWSxJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FDMUUsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFBO0FBM0NZLG9FQUE0Qjt1Q0FBNUIsNEJBQTRCO0lBRHhDLElBQUEsbUJBQVUsR0FBRTtJQUtFLFdBQUEsSUFBQSxxQkFBVyxHQUFFLENBQUE7eURBQXlCLGlCQUFLLG9CQUFMLGlCQUFLO0dBSjdDLDRCQUE0QixDQTJDeEMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxzZXJ2aWNlc1xcZG9jdW1lbnQtbnVtYmVyaW5nLWxvY2suc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBMb2dnZXIgfSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3RSZWRpcyB9IGZyb20gJ0BuZXN0anMtbW9kdWxlcy9pb3JlZGlzJztcbmltcG9ydCBSZWRpcyBmcm9tICdpb3JlZGlzJztcbmltcG9ydCBSZWRsb2NrLCB7IExvY2sgfSBmcm9tICdyZWRsb2NrJztcblxuaW50ZXJmYWNlIExvY2tDb3VudGVyS2V5IHtcbiAgcHJvamVjdElkOiBudW1iZXI7XG4gIG9yaWdpbmF0b3JPcmdJZDogbnVtYmVyO1xuICByZWNpcGllbnRPcmdJZDogbnVtYmVyO1xuICBjb3JyZXNwb25kZW5jZVR5cGVJZDogbnVtYmVyO1xuICBzdWJUeXBlSWQ6IG51bWJlcjtcbiAgcmZhVHlwZUlkOiBudW1iZXI7XG4gIGRpc2NpcGxpbmVJZDogbnVtYmVyO1xuICByZXNldFNjb3BlOiBzdHJpbmc7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEb2N1bWVudE51bWJlcmluZ0xvY2tTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKERvY3VtZW50TnVtYmVyaW5nTG9ja1NlcnZpY2UubmFtZSk7XG4gIHByaXZhdGUgcmVkbG9jazogUmVkbG9jaztcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0UmVkaXMoKSBwcml2YXRlIHJlYWRvbmx5IHJlZGlzOiBSZWRpcykge1xuICAgIHRoaXMucmVkbG9jayA9IG5ldyBSZWRsb2NrKFtyZWRpc10sIHtcbiAgICAgIGRyaWZ0RmFjdG9yOiAwLjAxLFxuICAgICAgcmV0cnlDb3VudDogNSxcbiAgICAgIHJldHJ5RGVsYXk6IDEwMCxcbiAgICAgIHJldHJ5Sml0dGVyOiA1MCxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGFjcXVpcmVMb2NrKGtleTogTG9ja0NvdW50ZXJLZXkpOiBQcm9taXNlPExvY2s+IHtcbiAgICBjb25zdCBsb2NrS2V5ID0gdGhpcy5idWlsZExvY2tLZXkoa2V5KTtcbiAgICBjb25zdCB0dGwgPSA1MDAwOyAvLyA1IHNlY29uZHNcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBsb2NrID0gYXdhaXQgdGhpcy5yZWRsb2NrLmFjcXVpcmUoW2xvY2tLZXldLCB0dGwpO1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYEFjcXVpcmVkIGxvY2s6ICR7bG9ja0tleX1gKTtcbiAgICAgIHJldHVybiBsb2NrO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgbG9jazogJHtsb2NrS2V5fWAsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlbGVhc2VMb2NrKGxvY2s6IExvY2spOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbG9jay5yZWxlYXNlKCk7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgUmVsZWFzZWQgbG9ja2ApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCdGYWlsZWQgdG8gcmVsZWFzZSBsb2NrIChtYXkgaGF2ZSBleHBpcmVkKScsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTG9ja0tleShrZXk6IExvY2tDb3VudGVyS2V5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgYGxvY2s6ZG9jbnVtOiR7a2V5LnByb2plY3RJZH06JHtrZXkub3JpZ2luYXRvck9yZ0lkfTpgICtcbiAgICAgIGAke2tleS5yZWNpcGllbnRPcmdJZCA/PyAwfToke2tleS5jb3JyZXNwb25kZW5jZVR5cGVJZH06YCArXG4gICAgICBgJHtrZXkuc3ViVHlwZUlkfToke2tleS5yZmFUeXBlSWR9OiR7a2V5LmRpc2NpcGxpbmVJZH06JHtrZXkucmVzZXRTY29wZX1gXG4gICAgKTtcbiAgfVxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/30/documentnumberinglockservice_30afd2380f9ec6310699d91060265631.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/30/documentnumberinglockservice_30afd2380f9ec6310699d91060265631.map new file mode 100644 index 0000000..f406c0e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/30/documentnumberinglockservice_30afd2380f9ec6310699d91060265631.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\document-numbering-lock.service.ts","mappings":";;;;;;;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,qDAAsD;AACtD,sDAA4B;AAC5B,sDAAwC;AAcjC,IAAM,4BAA4B,oCAAlC,MAAM,4BAA4B;IAIvC,YAA2B,KAA6B;QAAZ,UAAK,GAAL,KAAK,CAAO;QAHvC,WAAM,GAAG,IAAI,eAAM,CAAC,8BAA4B,CAAC,IAAI,CAAC,CAAC;QAItE,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAO,CAAC,CAAC,KAAK,CAAC,EAAE;YAClC,WAAW,EAAE,IAAI;YACjB,UAAU,EAAE,CAAC;YACb,UAAU,EAAE,GAAG;YACf,WAAW,EAAE,EAAE;SAChB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAmB;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,YAAY;QAE9B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;YACxD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC;YAC/C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;YAC/D,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAU;QAC1B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2CAA2C,EAAE,KAAK,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,GAAmB;QACtC,OAAO,CACL,eAAe,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,eAAe,GAAG;YACtD,GAAG,GAAG,CAAC,cAAc,IAAI,CAAC,IAAI,GAAG,CAAC,oBAAoB,GAAG;YACzD,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,UAAU,EAAE,CAC1E,CAAC;IACJ,CAAC;CACF,CAAA;AA3CY,oEAA4B;uCAA5B,4BAA4B;IADxC,IAAA,mBAAU,GAAE;IAKE,WAAA,IAAA,qBAAW,GAAE,CAAA;yDAAyB,iBAAK,oBAAL,iBAAK;GAJ7C,4BAA4B,CA2CxC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\document-numbering-lock.service.ts"],"sourcesContent":["import { Injectable, Logger } from '@nestjs/common';\nimport { InjectRedis } from '@nestjs-modules/ioredis';\nimport Redis from 'ioredis';\nimport Redlock, { Lock } from 'redlock';\n\ninterface LockCounterKey {\n projectId: number;\n originatorOrgId: number;\n recipientOrgId: number;\n correspondenceTypeId: number;\n subTypeId: number;\n rfaTypeId: number;\n disciplineId: number;\n resetScope: string;\n}\n\n@Injectable()\nexport class DocumentNumberingLockService {\n private readonly logger = new Logger(DocumentNumberingLockService.name);\n private redlock: Redlock;\n\n constructor(@InjectRedis() private readonly redis: Redis) {\n this.redlock = new Redlock([redis], {\n driftFactor: 0.01,\n retryCount: 5,\n retryDelay: 100,\n retryJitter: 50,\n });\n }\n\n async acquireLock(key: LockCounterKey): Promise {\n const lockKey = this.buildLockKey(key);\n const ttl = 5000; // 5 seconds\n\n try {\n const lock = await this.redlock.acquire([lockKey], ttl);\n this.logger.debug(`Acquired lock: ${lockKey}`);\n return lock;\n } catch (error) {\n this.logger.error(`Failed to acquire lock: ${lockKey}`, error);\n throw error;\n }\n }\n\n async releaseLock(lock: Lock): Promise {\n try {\n await lock.release();\n this.logger.debug(`Released lock`);\n } catch (error) {\n this.logger.warn('Failed to release lock (may have expired)', error);\n }\n }\n\n private buildLockKey(key: LockCounterKey): string {\n return (\n `lock:docnum:${key.projectId}:${key.originatorOrgId}:` +\n `${key.recipientOrgId ?? 0}:${key.correspondenceTypeId}:` +\n `${key.subTypeId}:${key.rfaTypeId}:${key.disciplineId}:${key.resetScope}`\n );\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/31/jwtauthguard_31560c3664d1bca2e28678e96d013ae5 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/31/jwtauthguard_31560c3664d1bca2e28678e96d013ae5 new file mode 100644 index 0000000..dce5304 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/31/jwtauthguard_31560c3664d1bca2e28678e96d013ae5 @@ -0,0 +1,19 @@ +76462e3f16c9fb6f334e9c92b0ede8e0 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.JwtAuthGuard = void 0; +const common_1 = require("@nestjs/common"); +const passport_1 = require("@nestjs/passport"); +let JwtAuthGuard = class JwtAuthGuard extends (0, passport_1.AuthGuard)('jwt') { +}; +exports.JwtAuthGuard = JwtAuthGuard; +exports.JwtAuthGuard = JwtAuthGuard = __decorate([ + (0, common_1.Injectable)() +], JwtAuthGuard); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxndWFyZHNcXGp3dC1hdXRoLmd1YXJkLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLDJDQUE0QztBQUM1QywrQ0FBNkM7QUFHdEMsSUFBTSxZQUFZLEdBQWxCLE1BQU0sWUFBYSxTQUFRLElBQUEsb0JBQVMsRUFBQyxLQUFLLENBQUM7Q0FBRyxDQUFBO0FBQXhDLG9DQUFZO3VCQUFaLFlBQVk7SUFEeEIsSUFBQSxtQkFBVSxHQUFFO0dBQ0EsWUFBWSxDQUE0QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxjb21tb25cXGd1YXJkc1xcand0LWF1dGguZ3VhcmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcbmltcG9ydCB7IEF1dGhHdWFyZCB9IGZyb20gJ0BuZXN0anMvcGFzc3BvcnQnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSnd0QXV0aEd1YXJkIGV4dGVuZHMgQXV0aEd1YXJkKCdqd3QnKSB7fVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/31/jwtauthguard_31560c3664d1bca2e28678e96d013ae5.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/31/jwtauthguard_31560c3664d1bca2e28678e96d013ae5.map new file mode 100644 index 0000000..061f854 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/31/jwtauthguard_31560c3664d1bca2e28678e96d013ae5.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\guards\\jwt-auth.guard.ts","mappings":";;;;;;;;;AAAA,2CAA4C;AAC5C,+CAA6C;AAGtC,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,IAAA,oBAAS,EAAC,KAAK,CAAC;CAAG,CAAA;AAAxC,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;GACA,YAAY,CAA4B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\guards\\jwt-auth.guard.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { AuthGuard } from '@nestjs/passport';\n\n@Injectable()\nexport class JwtAuthGuard extends AuthGuard('jwt') {}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/32/index_325e14fedb3b9296fc130d25f9109c49 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/32/index_325e14fedb3b9296fc130d25f9109c49 new file mode 100644 index 0000000..07583e4 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/32/index_325e14fedb3b9296fc130d25f9109c49 @@ -0,0 +1,33 @@ +5019cdf67797e6ff2434d8ead1f7c696 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.version = exports.validate = exports.v7 = exports.v6ToV1 = exports.v6 = exports.v5 = exports.v4 = exports.v3 = exports.v1ToV6 = exports.v1 = exports.stringify = exports.parse = exports.NIL = exports.MAX = void 0; +var max_js_1 = require("./max.js"); +Object.defineProperty(exports, "MAX", { enumerable: true, get: function () { return max_js_1.default; } }); +var nil_js_1 = require("./nil.js"); +Object.defineProperty(exports, "NIL", { enumerable: true, get: function () { return nil_js_1.default; } }); +var parse_js_1 = require("./parse.js"); +Object.defineProperty(exports, "parse", { enumerable: true, get: function () { return parse_js_1.default; } }); +var stringify_js_1 = require("./stringify.js"); +Object.defineProperty(exports, "stringify", { enumerable: true, get: function () { return stringify_js_1.default; } }); +var v1_js_1 = require("./v1.js"); +Object.defineProperty(exports, "v1", { enumerable: true, get: function () { return v1_js_1.default; } }); +var v1ToV6_js_1 = require("./v1ToV6.js"); +Object.defineProperty(exports, "v1ToV6", { enumerable: true, get: function () { return v1ToV6_js_1.default; } }); +var v3_js_1 = require("./v3.js"); +Object.defineProperty(exports, "v3", { enumerable: true, get: function () { return v3_js_1.default; } }); +var v4_js_1 = require("./v4.js"); +Object.defineProperty(exports, "v4", { enumerable: true, get: function () { return v4_js_1.default; } }); +var v5_js_1 = require("./v5.js"); +Object.defineProperty(exports, "v5", { enumerable: true, get: function () { return v5_js_1.default; } }); +var v6_js_1 = require("./v6.js"); +Object.defineProperty(exports, "v6", { enumerable: true, get: function () { return v6_js_1.default; } }); +var v6ToV1_js_1 = require("./v6ToV1.js"); +Object.defineProperty(exports, "v6ToV1", { enumerable: true, get: function () { return v6ToV1_js_1.default; } }); +var v7_js_1 = require("./v7.js"); +Object.defineProperty(exports, "v7", { enumerable: true, get: function () { return v7_js_1.default; } }); +var validate_js_1 = require("./validate.js"); +Object.defineProperty(exports, "validate", { enumerable: true, get: function () { return validate_js_1.default; } }); +var version_js_1 = require("./version.js"); +Object.defineProperty(exports, "version", { enumerable: true, get: function () { return version_js_1.default; } }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcaW5kZXguanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDO0FBQ2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUQsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQzVOLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNuQyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxjQUFjLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDM0csSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLGNBQWMsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMzRyxJQUFJLFVBQVUsR0FBRyxPQUFP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ekcsSUFBSSxhQUFhLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQzdDLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLGNBQWMsT0FBTyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNySCxJQUFJLFlBQVksR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDM0MsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsY0FBYyxPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxub2RlX21vZHVsZXNcXC5wbnBtXFx1dWlkQDExLjEuMFxcbm9kZV9tb2R1bGVzXFx1dWlkXFxkaXN0XFxjanNcXGluZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy52ZXJzaW9uID0gZXhwb3J0cy52YWxpZGF0ZSA9IGV4cG9ydHMudjcgPSBleHBvcnRzLnY2VG9WMSA9IGV4cG9ydHMudjYgPSBleHBvcnRzLnY1ID0gZXhwb3J0cy52NCA9IGV4cG9ydHMudjMgPSBleHBvcnRzLnYxVG9WNiA9IGV4cG9ydHMudjEgPSBleHBvcnRzLnN0cmluZ2lmeSA9IGV4cG9ydHMucGFyc2UgPSBleHBvcnRzLk5JTCA9IGV4cG9ydHMuTUFYID0gdm9pZCAwO1xudmFyIG1heF9qc18xID0gcmVxdWlyZShcIi4vbWF4LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTUFYXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtYXhfanNfMS5kZWZhdWx0OyB9IH0pO1xudmFyIG5pbF9qc18xID0gcmVxdWlyZShcIi4vbmlsLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTklMXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBuaWxfanNfMS5kZWZhdWx0OyB9IH0pO1xudmFyIHBhcnNlX2pzXzEgPSByZXF1aXJlKFwiLi9wYXJzZS5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInBhcnNlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBwYXJzZV9qc18xLmRlZmF1bHQ7IH0gfSk7XG52YXIgc3RyaW5naWZ5X2pzXzEgPSByZXF1aXJlKFwiLi9zdHJpbmdpZnkuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJzdHJpbmdpZnlcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN0cmluZ2lmeV9qc18xLmRlZmF1bHQ7IH0gfSk7XG52YXIgdjFfanNfMSA9IHJlcXVpcmUoXCIuL3YxLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidjFcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHYxX2pzXzEuZGVmYXVsdDsgfSB9KTtcbnZhciB2MVRvVjZfanNfMSA9IHJlcXVpcmUoXCIuL3YxVG9WNi5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInYxVG9WNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdjFUb1Y2X2pzXzEuZGVmYXVsdDsgfSB9KTtcbnZhciB2M19qc18xID0gcmVxdWlyZShcIi4vdjMuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2M1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdjNfanNfMS5kZWZhdWx0OyB9IH0pO1xudmFyIHY0X2pzXzEgPSByZXF1aXJlKFwiLi92NC5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInY0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB2NF9qc18xLmRlZmF1bHQ7IH0gfSk7XG52YXIgdjVfanNfMSA9IHJlcXVpcmUoXCIuL3Y1LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidjVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHY1X2pzXzEuZGVmYXVsdDsgfSB9KTtcbnZhciB2Nl9qc18xID0gcmVxdWlyZShcIi4vdjYuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2NlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdjZfanNfMS5kZWZhdWx0OyB9IH0pO1xudmFyIHY2VG9WMV9qc18xID0gcmVxdWlyZShcIi4vdjZUb1YxLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidjZUb1YxXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB2NlRvVjFfanNfMS5kZWZhdWx0OyB9IH0pO1xudmFyIHY3X2pzXzEgPSByZXF1aXJlKFwiLi92Ny5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInY3XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB2N19qc18xLmRlZmF1bHQ7IH0gfSk7XG52YXIgdmFsaWRhdGVfanNfMSA9IHJlcXVpcmUoXCIuL3ZhbGlkYXRlLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidmFsaWRhdGVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhbGlkYXRlX2pzXzEuZGVmYXVsdDsgfSB9KTtcbnZhciB2ZXJzaW9uX2pzXzEgPSByZXF1aXJlKFwiLi92ZXJzaW9uLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidmVyc2lvblwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdmVyc2lvbl9qc18xLmRlZmF1bHQ7IH0gfSk7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/32/index_325e14fedb3b9296fc130d25f9109c49.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/32/index_325e14fedb3b9296fc130d25f9109c49.map new file mode 100644 index 0000000..be5922b --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/32/index_325e14fedb3b9296fc130d25f9109c49.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\index.js","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\index.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.version = exports.validate = exports.v7 = exports.v6ToV1 = exports.v6 = exports.v5 = exports.v4 = exports.v3 = exports.v1ToV6 = exports.v1 = exports.stringify = exports.parse = exports.NIL = exports.MAX = void 0;\nvar max_js_1 = require(\"./max.js\");\nObject.defineProperty(exports, \"MAX\", { enumerable: true, get: function () { return max_js_1.default; } });\nvar nil_js_1 = require(\"./nil.js\");\nObject.defineProperty(exports, \"NIL\", { enumerable: true, get: function () { return nil_js_1.default; } });\nvar parse_js_1 = require(\"./parse.js\");\nObject.defineProperty(exports, \"parse\", { enumerable: true, get: function () { return parse_js_1.default; } });\nvar stringify_js_1 = require(\"./stringify.js\");\nObject.defineProperty(exports, \"stringify\", { enumerable: true, get: function () { return stringify_js_1.default; } });\nvar v1_js_1 = require(\"./v1.js\");\nObject.defineProperty(exports, \"v1\", { enumerable: true, get: function () { return v1_js_1.default; } });\nvar v1ToV6_js_1 = require(\"./v1ToV6.js\");\nObject.defineProperty(exports, \"v1ToV6\", { enumerable: true, get: function () { return v1ToV6_js_1.default; } });\nvar v3_js_1 = require(\"./v3.js\");\nObject.defineProperty(exports, \"v3\", { enumerable: true, get: function () { return v3_js_1.default; } });\nvar v4_js_1 = require(\"./v4.js\");\nObject.defineProperty(exports, \"v4\", { enumerable: true, get: function () { return v4_js_1.default; } });\nvar v5_js_1 = require(\"./v5.js\");\nObject.defineProperty(exports, \"v5\", { enumerable: true, get: function () { return v5_js_1.default; } });\nvar v6_js_1 = require(\"./v6.js\");\nObject.defineProperty(exports, \"v6\", { enumerable: true, get: function () { return v6_js_1.default; } });\nvar v6ToV1_js_1 = require(\"./v6ToV1.js\");\nObject.defineProperty(exports, \"v6ToV1\", { enumerable: true, get: function () { return v6ToV1_js_1.default; } });\nvar v7_js_1 = require(\"./v7.js\");\nObject.defineProperty(exports, \"v7\", { enumerable: true, get: function () { return v7_js_1.default; } });\nvar validate_js_1 = require(\"./validate.js\");\nObject.defineProperty(exports, \"validate\", { enumerable: true, get: function () { return validate_js_1.default; } });\nvar version_js_1 = require(\"./version.js\");\nObject.defineProperty(exports, \"version\", { enumerable: true, get: function () { return version_js_1.default; } });\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/33/correspondencerevisionattachmententity_33bf9c7c6638ef3cf8ad77bbdeea9a1c b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/33/correspondencerevisionattachmententity_33bf9c7c6638ef3cf8ad77bbdeea9a1c new file mode 100644 index 0000000..11f67d7 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/33/correspondencerevisionattachmententity_33bf9c7c6638ef3cf8ad77bbdeea9a1c @@ -0,0 +1,54 @@ +4b5cbb5bf5451f06bb72b25c9c1d277c +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceRevisionAttachment = void 0; +// File: src/modules/correspondence/entities/correspondence-revision-attachment.entity.ts +const typeorm_1 = require("typeorm"); +const correspondence_revision_entity_1 = require("./correspondence-revision.entity"); +const attachment_entity_1 = require("../../../common/file-storage/entities/attachment.entity"); +/** + * CorrespondenceRevisionAttachment + * + * ตารางเชื่อม correspondence_revisions กับ attachments (M:N) + * [FIX v1.8.1] FK ชี้ไป correspondence_revisions.id ไม่ใช่ correspondences.id + * เหตุผล: ไฟล์แนบผูกกับ revision เพื่อรองรับไฟล์ที่ต่างกันในแต่ละ revision + */ +let CorrespondenceRevisionAttachment = class CorrespondenceRevisionAttachment { +}; +exports.CorrespondenceRevisionAttachment = CorrespondenceRevisionAttachment; +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'correspondence_revision_id' }), + __metadata("design:type", Number) +], CorrespondenceRevisionAttachment.prototype, "correspondenceRevisionId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'attachment_id' }), + __metadata("design:type", Number) +], CorrespondenceRevisionAttachment.prototype, "attachmentId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_main_document', default: false }), + __metadata("design:type", Boolean) +], CorrespondenceRevisionAttachment.prototype, "isMainDocument", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => correspondence_revision_entity_1.CorrespondenceRevision, (revision) => revision.attachmentLinks, { onDelete: 'CASCADE' }), + (0, typeorm_1.JoinColumn)({ name: 'correspondence_revision_id' }), + __metadata("design:type", typeof (_a = typeof correspondence_revision_entity_1.CorrespondenceRevision !== "undefined" && correspondence_revision_entity_1.CorrespondenceRevision) === "function" ? _a : Object) +], CorrespondenceRevisionAttachment.prototype, "revision", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => attachment_entity_1.Attachment, { onDelete: 'CASCADE', eager: false }), + (0, typeorm_1.JoinColumn)({ name: 'attachment_id' }), + __metadata("design:type", typeof (_b = typeof attachment_entity_1.Attachment !== "undefined" && attachment_entity_1.Attachment) === "function" ? _b : Object) +], CorrespondenceRevisionAttachment.prototype, "attachment", void 0); +exports.CorrespondenceRevisionAttachment = CorrespondenceRevisionAttachment = __decorate([ + (0, typeorm_1.Entity)('correspondence_revision_attachments') +], CorrespondenceRevisionAttachment); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGVudGl0aWVzXFxjb3JyZXNwb25kZW5jZS1yZXZpc2lvbi1hdHRhY2htZW50LmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEseUZBQXlGO0FBQ3pGLHFDQUErRTtBQUMvRSxxRkFBMEU7QUFDMUUsK0ZBQXFGO0FBRXJGOzs7Ozs7R0FNRztBQUVJLElBQU0sZ0NBQWdDLEdBQXRDLE1BQU0sZ0NBQWdDO0NBMEI1QyxDQUFBO0FBMUJZLDRFQUFnQztBQUczQztJQURDLElBQUEsdUJBQWEsRUFBQyxFQUFFLElBQUksRUFBRSw0QkFBNEIsRUFBRSxDQUFDOztrRkFDcEI7QUFJbEM7SUFEQyxJQUFBLHVCQUFhLEVBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLENBQUM7O3NFQUNuQjtBQUl0QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7O3dFQUM1QjtBQVN6QjtJQU5DLElBQUEsbUJBQVMsRUFDUixHQUFHLEVBQUUsQ0FBQyx1REFBc0IsRUFDNUIsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQ3RDLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUN4QjtJQUNBLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSw0QkFBNEIsRUFBRSxDQUFDO2tEQUN4Qyx1REFBc0Isb0JBQXRCLHVEQUFzQjtrRUFBQztBQUtsQztJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyw4QkFBVSxFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDbEUsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxDQUFDO2tEQUN6Qiw4QkFBVSxvQkFBViw4QkFBVTtvRUFBQzsyQ0F6QmIsZ0NBQWdDO0lBRDVDLElBQUEsZ0JBQU0sRUFBQyxxQ0FBcUMsQ0FBQztHQUNqQyxnQ0FBZ0MsQ0EwQjVDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGNvcnJlc3BvbmRlbmNlXFxlbnRpdGllc1xcY29ycmVzcG9uZGVuY2UtcmV2aXNpb24tYXR0YWNobWVudC5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRmlsZTogc3JjL21vZHVsZXMvY29ycmVzcG9uZGVuY2UvZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtcmV2aXNpb24tYXR0YWNobWVudC5lbnRpdHkudHNcbmltcG9ydCB7IEVudGl0eSwgQ29sdW1uLCBNYW55VG9PbmUsIEpvaW5Db2x1bW4sIFByaW1hcnlDb2x1bW4gfSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlUmV2aXNpb24gfSBmcm9tICcuL2NvcnJlc3BvbmRlbmNlLXJldmlzaW9uLmVudGl0eSc7XG5pbXBvcnQgeyBBdHRhY2htZW50IH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2ZpbGUtc3RvcmFnZS9lbnRpdGllcy9hdHRhY2htZW50LmVudGl0eSc7XG5cbi8qKlxuICogQ29ycmVzcG9uZGVuY2VSZXZpc2lvbkF0dGFjaG1lbnRcbiAqXG4gKiDguJXguLLguKPguLLguIfguYDguIrguLfguYjguK3guKEgY29ycmVzcG9uZGVuY2VfcmV2aXNpb25zIOC4geC4seC4miBhdHRhY2htZW50cyAoTTpOKVxuICogW0ZJWCB2MS44LjFdIEZLIOC4iuC4teC5ieC5hOC4myBjb3JyZXNwb25kZW5jZV9yZXZpc2lvbnMuaWQg4LmE4Lih4LmI4LmD4LiK4LmIIGNvcnJlc3BvbmRlbmNlcy5pZFxuICog4LmA4Lir4LiV4Li44Lic4LilOiDguYTguJ/guKXguYzguYHguJnguJrguJzguLnguIHguIHguLHguJogcmV2aXNpb24g4LmA4Lie4Li34LmI4Lit4Lij4Lit4LiH4Lij4Lix4Lia4LmE4Lif4Lil4LmM4LiX4Li14LmI4LiV4LmI4Liy4LiH4LiB4Lix4LiZ4LmD4LiZ4LmB4LiV4LmI4Lil4LiwIHJldmlzaW9uXG4gKi9cbkBFbnRpdHkoJ2NvcnJlc3BvbmRlbmNlX3JldmlzaW9uX2F0dGFjaG1lbnRzJylcbmV4cG9ydCBjbGFzcyBDb3JyZXNwb25kZW5jZVJldmlzaW9uQXR0YWNobWVudCB7XG4gIC8vIOC4hOC4teC4ouC5jOC4q+C4peC4seC4geC4guC4reC4hyByZXZpc2lvbiDguJfguLXguYjguJzguLnguIHguYTguJ/guKXguYzguJnguLXguYlcbiAgQFByaW1hcnlDb2x1bW4oeyBuYW1lOiAnY29ycmVzcG9uZGVuY2VfcmV2aXNpb25faWQnIH0pXG4gIGNvcnJlc3BvbmRlbmNlUmV2aXNpb25JZCE6IG51bWJlcjtcblxuICAvLyDguITguLXguKLguYzguKvguKXguLHguIHguILguK3guIcgYXR0YWNobWVudFxuICBAUHJpbWFyeUNvbHVtbih7IG5hbWU6ICdhdHRhY2htZW50X2lkJyB9KVxuICBhdHRhY2htZW50SWQhOiBudW1iZXI7XG5cbiAgLy8g4LmE4Lif4Lil4LmM4Lir4Lil4Lix4LiB4LiC4Lit4LiHIHJldmlzaW9uIOC4meC4teC5iSAo4LmA4LiK4LmI4LiZIFBERiDguKvguKXguLHguIEpXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXNfbWFpbl9kb2N1bWVudCcsIGRlZmF1bHQ6IGZhbHNlIH0pXG4gIGlzTWFpbkRvY3VtZW50ITogYm9vbGVhbjtcblxuICAvLyBSZWxhdGlvbjog4Lir4Lil4Liy4LiiIENvcnJlc3BvbmRlbmNlUmV2aXNpb25BdHRhY2htZW50IOKGkiDguKvguJnguLbguYjguIcgQ29ycmVzcG9uZGVuY2VSZXZpc2lvblxuICBATWFueVRvT25lKFxuICAgICgpID0+IENvcnJlc3BvbmRlbmNlUmV2aXNpb24sXG4gICAgKHJldmlzaW9uKSA9PiByZXZpc2lvbi5hdHRhY2htZW50TGlua3MsXG4gICAgeyBvbkRlbGV0ZTogJ0NBU0NBREUnIH1cbiAgKVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdjb3JyZXNwb25kZW5jZV9yZXZpc2lvbl9pZCcgfSlcbiAgcmV2aXNpb24/OiBDb3JyZXNwb25kZW5jZVJldmlzaW9uO1xuXG4gIC8vIFJlbGF0aW9uOiDguKvguKXguLLguKIgQ29ycmVzcG9uZGVuY2VSZXZpc2lvbkF0dGFjaG1lbnQg4oaSIOC4q+C4meC4tuC5iOC4hyBBdHRhY2htZW50XG4gIEBNYW55VG9PbmUoKCkgPT4gQXR0YWNobWVudCwgeyBvbkRlbGV0ZTogJ0NBU0NBREUnLCBlYWdlcjogZmFsc2UgfSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAnYXR0YWNobWVudF9pZCcgfSlcbiAgYXR0YWNobWVudD86IEF0dGFjaG1lbnQ7XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/33/correspondencerevisionattachmententity_33bf9c7c6638ef3cf8ad77bbdeea9a1c.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/33/correspondencerevisionattachmententity_33bf9c7c6638ef3cf8ad77bbdeea9a1c.map new file mode 100644 index 0000000..4c7a837 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/33/correspondencerevisionattachmententity_33bf9c7c6638ef3cf8ad77bbdeea9a1c.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-revision-attachment.entity.ts","mappings":";;;;;;;;;;;;;AAAA,yFAAyF;AACzF,qCAA+E;AAC/E,qFAA0E;AAC1E,+FAAqF;AAErF;;;;;;GAMG;AAEI,IAAM,gCAAgC,GAAtC,MAAM,gCAAgC;CA0B5C,CAAA;AA1BY,4EAAgC;AAG3C;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC;;kFACpB;AAIlC;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;;sEACnB;AAItB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;wEAC5B;AASzB;IANC,IAAA,mBAAS,EACR,GAAG,EAAE,CAAC,uDAAsB,EAC5B,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,eAAe,EACtC,EAAE,QAAQ,EAAE,SAAS,EAAE,CACxB;IACA,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC;kDACxC,uDAAsB,oBAAtB,uDAAsB;kEAAC;AAKlC;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,8BAAU,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAClE,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;kDACzB,8BAAU,oBAAV,8BAAU;oEAAC;2CAzBb,gCAAgC;IAD5C,IAAA,gBAAM,EAAC,qCAAqC,CAAC;GACjC,gCAAgC,CA0B5C","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-revision-attachment.entity.ts"],"sourcesContent":["// File: src/modules/correspondence/entities/correspondence-revision-attachment.entity.ts\nimport { Entity, Column, ManyToOne, JoinColumn, PrimaryColumn } from 'typeorm';\nimport { CorrespondenceRevision } from './correspondence-revision.entity';\nimport { Attachment } from '../../../common/file-storage/entities/attachment.entity';\n\n/**\n * CorrespondenceRevisionAttachment\n *\n * ตารางเชื่อม correspondence_revisions กับ attachments (M:N)\n * [FIX v1.8.1] FK ชี้ไป correspondence_revisions.id ไม่ใช่ correspondences.id\n * เหตุผล: ไฟล์แนบผูกกับ revision เพื่อรองรับไฟล์ที่ต่างกันในแต่ละ revision\n */\n@Entity('correspondence_revision_attachments')\nexport class CorrespondenceRevisionAttachment {\n // คีย์หลักของ revision ที่ผูกไฟล์นี้\n @PrimaryColumn({ name: 'correspondence_revision_id' })\n correspondenceRevisionId!: number;\n\n // คีย์หลักของ attachment\n @PrimaryColumn({ name: 'attachment_id' })\n attachmentId!: number;\n\n // ไฟล์หลักของ revision นี้ (เช่น PDF หลัก)\n @Column({ name: 'is_main_document', default: false })\n isMainDocument!: boolean;\n\n // Relation: หลาย CorrespondenceRevisionAttachment → หนึ่ง CorrespondenceRevision\n @ManyToOne(\n () => CorrespondenceRevision,\n (revision) => revision.attachmentLinks,\n { onDelete: 'CASCADE' }\n )\n @JoinColumn({ name: 'correspondence_revision_id' })\n revision?: CorrespondenceRevision;\n\n // Relation: หลาย CorrespondenceRevisionAttachment → หนึ่ง Attachment\n @ManyToOne(() => Attachment, { onDelete: 'CASCADE', eager: false })\n @JoinColumn({ name: 'attachment_id' })\n attachment?: Attachment;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/34/abilityfactoryspec_34511f78c6a357cf9f9762795d4af8e9 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/34/abilityfactoryspec_34511f78c6a357cf9f9762795d4af8e9 new file mode 100644 index 0000000..93d4874 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/34/abilityfactoryspec_34511f78c6a357cf9f9762795d4af8e9 @@ -0,0 +1,137 @@ +6ef243843e54cfd458347f468119e046 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const testing_1 = require("@nestjs/testing"); +const ability_factory_1 = require("./ability.factory"); +const user_entity_1 = require("../../../modules/user/entities/user.entity"); +const user_assignment_entity_1 = require("../../../modules/user/entities/user-assignment.entity"); +describe('AbilityFactory', () => { + let factory; + beforeEach(async () => { + const module = await testing_1.Test.createTestingModule({ + providers: [ability_factory_1.AbilityFactory], + }).compile(); + factory = module.get(ability_factory_1.AbilityFactory); + }); + it('should be defined', () => { + expect(factory).toBeDefined(); + }); + describe('Global Admin', () => { + it('should grant all permissions for global admin', () => { + const user = createMockUser({ + assignments: [ + createMockAssignment({ + organizationId: undefined, + projectId: undefined, + contractId: undefined, + permissionNames: ['system.manage_all'], + }), + ], + }); + const ability = factory.createForUser(user, {}); + expect(ability.can('manage', 'all')).toBe(true); + }); + }); + describe('Organization Level', () => { + it('should grant permissions for matching organization', () => { + const user = createMockUser({ + assignments: [ + createMockAssignment({ + organizationId: 1, + permissionNames: ['correspondence.create', 'correspondence.read'], + }), + ], + }); + const context = { organizationId: 1 }; + const ability = factory.createForUser(user, context); + expect(ability.can('create', 'correspondence')).toBe(true); + expect(ability.can('read', 'correspondence')).toBe(true); + }); + it('should deny permissions for non-matching organization', () => { + const user = createMockUser({ + assignments: [ + createMockAssignment({ + organizationId: 1, + permissionNames: ['correspondence.create'], + }), + ], + }); + const context = { organizationId: 2 }; + const ability = factory.createForUser(user, context); + expect(ability.can('create', 'correspondence')).toBe(false); + }); + }); + describe('Project Level', () => { + it('should grant permissions for matching project', () => { + const user = createMockUser({ + assignments: [ + createMockAssignment({ + projectId: 10, + permissionNames: ['rfa.create'], + }), + ], + }); + const context = { projectId: 10 }; + const ability = factory.createForUser(user, context); + expect(ability.can('create', 'rfa')).toBe(true); + }); + }); + describe('Contract Level', () => { + it('should grant permissions for matching contract', () => { + const user = createMockUser({ + assignments: [ + createMockAssignment({ + contractId: 5, + permissionNames: ['drawing.create'], + }), + ], + }); + const context = { contractId: 5 }; + const ability = factory.createForUser(user, context); + expect(ability.can('create', 'drawing')).toBe(true); + }); + }); + describe('Multiple Assignments', () => { + it('should combine permissions from multiple assignments', () => { + const user = createMockUser({ + assignments: [ + createMockAssignment({ + organizationId: 1, + permissionNames: ['correspondence.create'], + }), + createMockAssignment({ + projectId: 10, + permissionNames: ['rfa.create'], + }), + ], + }); + const orgAbility = factory.createForUser(user, { organizationId: 1 }); + expect(orgAbility.can('create', 'correspondence')).toBe(true); + const projectAbility = factory.createForUser(user, { projectId: 10 }); + expect(projectAbility.can('create', 'rfa')).toBe(true); + }); + }); +}); +// Helper functions using mock objects +function createMockUser(props) { + const user = new user_entity_1.User(); + user.user_id = 1; + user.username = 'testuser'; + user.email = 'test@example.com'; + user.assignments = props.assignments; + return user; +} +function createMockAssignment(props) { + const assignment = new user_assignment_entity_1.UserAssignment(); + assignment.organizationId = props.organizationId; + assignment.projectId = props.projectId; + assignment.contractId = props.contractId; + // Create mock role with permissions + assignment.role = { + permissions: props.permissionNames.map((name) => ({ + permissionName: name, + })), + }; + return assignment; +} +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxhdXRoXFxjYXNsXFxhYmlsaXR5LmZhY3Rvcnkuc3BlYy50cyIsIm1hcHBpbmdzIjoiOztBQUFBLDZDQUFzRDtBQUN0RCx1REFBaUU7QUFDakUsNEVBQWtFO0FBQ2xFLGtHQUF1RjtBQUd2RixRQUFRLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFO0lBQzlCLElBQUksT0FBdUIsQ0FBQztJQUU1QixVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDcEIsTUFBTSxNQUFNLEdBQWtCLE1BQU0sY0FBSSxDQUFDLG1CQUFtQixDQUFDO1lBQzNELFNBQVMsRUFBRSxDQUFDLGdDQUFjLENBQUM7U0FDNUIsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRWIsT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQWlCLGdDQUFjLENBQUMsQ0FBQztJQUN2RCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUU7UUFDM0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7UUFDNUIsRUFBRSxDQUFDLCtDQUErQyxFQUFFLEdBQUcsRUFBRTtZQUN2RCxNQUFNLElBQUksR0FBRyxjQUFjLENBQUM7Z0JBQzFCLFdBQVcsRUFBRTtvQkFDWCxvQkFBb0IsQ0FBQzt3QkFDbkIsY0FBYyxFQUFFLFNBQVM7d0JBQ3pCLFNBQVMsRUFBRSxTQUFTO3dCQUNwQixVQUFVLEVBQUUsU0FBUzt3QkFDckIsZUFBZSxFQUFFLENBQUMsbUJBQW1CLENBQUM7cUJBQ3ZDLENBQUM7aUJBQ0g7YUFDRixDQUFDLENBQUM7WUFFSCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUVoRCxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcs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Q0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsc0NBQXNDO0FBQ3RDLFNBQVMsY0FBYyxDQUFDLEtBQXdDO0lBQzlELE1BQU0sSUFBSSxHQUFHLElBQUksa0JBQUksRUFBRSxDQUFDO0lBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsa0JBQWtCLENBQUM7SUFDaEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO0lBQ3JDLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQUMsS0FLN0I7SUFDQyxNQUFNLFVBQVUsR0FBRyxJQUFJLHVDQUFjLEVBQUUsQ0FBQztJQUN4QyxVQUFVLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7SUFDakQsVUFBVSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO0lBQ3ZDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztJQUV6QyxvQ0FBb0M7SUFDcEMsVUFBVSxDQUFDLElBQUksR0FBRztRQUNoQixXQUFXLEVBQUUsS0FBSyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDaEQsY0FBYyxFQUFFLElBQUk7U0FDckIsQ0FBQyxDQUFDO0tBQ3FCLENBQUM7SUFFM0IsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxjb21tb25cXGF1dGhcXGNhc2xcXGFiaWxpdHkuZmFjdG9yeS5zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlc3QsIFRlc3RpbmdNb2R1bGUgfSBmcm9tICdAbmVzdGpzL3Rlc3RpbmcnO1xuaW1wb3J0IHsgQWJpbGl0eUZhY3RvcnksIFNjb3BlQ29udGV4dCB9IGZyb20gJy4vYWJpbGl0eS5mYWN0b3J5JztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi8uLi8uLi9tb2R1bGVzL3VzZXIvZW50aXRpZXMvdXNlci5lbnRpdHknO1xuaW1wb3J0IHsgVXNlckFzc2lnbm1lbnQgfSBmcm9tICcuLi8uLi8uLi9tb2R1bGVzL3VzZXIvZW50aXRpZXMvdXNlci1hc3NpZ25tZW50LmVudGl0eSc7XG5pbXBvcnQgeyBSb2xlIH0gZnJvbSAnLi4vLi4vLi4vbW9kdWxlcy9hdXRoL2VudGl0aWVzL3JvbGUuZW50aXR5JztcblxuZGVzY3JpYmUoJ0FiaWxpdHlGYWN0b3J5JywgKCkgPT4ge1xuICBsZXQgZmFjdG9yeTogQWJpbGl0eUZhY3Rvcnk7XG5cbiAgYmVmb3JlRWFjaChhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbW9kdWxlOiBUZXN0aW5nTW9kdWxlID0gYXdhaXQgVGVzdC5jcmVhdGVUZXN0aW5nTW9kdWxlKHtcbiAgICAgIHByb3ZpZGVyczogW0FiaWxpdHlGYWN0b3J5XSxcbiAgICB9KS5jb21waWxlKCk7XG5cbiAgICBmYWN0b3J5ID0gbW9kdWxlLmdldDxBYmlsaXR5RmFjdG9yeT4oQWJpbGl0eUZhY3RvcnkpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJlIGRlZmluZWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGZhY3RvcnkpLnRvQmVEZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdHbG9iYWwgQWRtaW4nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBncmFudCBhbGwgcGVybWlzc2lvbnMgZm9yIGdsb2JhbCBhZG1pbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSBjcmVhdGVNb2NrVXNlcih7XG4gICAgICAgIGFzc2lnbm1lbnRzOiBbXG4gICAgICAgICAgY3JlYXRlTW9ja0Fzc2lnbm1lbnQoe1xuICAgICAgICAgICAgb3JnYW5pemF0aW9uSWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHByb2plY3RJZDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29udHJhY3RJZDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcGVybWlzc2lvbk5hbWVzOiBbJ3N5c3RlbS5tYW5hZ2VfYWxsJ10sXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYWJpbGl0eSA9IGZhY3RvcnkuY3JlYXRlRm9yVXNlcih1c2VyLCB7fSk7XG5cbiAgICAgIGV4cGVjdChhYmlsaXR5LmNhbignbWFuYWdlJywgJ2FsbCcpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnT3JnYW5pemF0aW9uIExldmVsJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZ3JhbnQgcGVybWlzc2lvbnMgZm9yIG1hdGNoaW5nIG9yZ2FuaXphdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSBjcmVhdGVNb2NrVXNlcih7XG4gICAgICAgIGFzc2lnbm1lbnRzOiBbXG4gICAgICAgICAgY3JlYXRlTW9ja0Fzc2lnbm1lbnQoe1xuICAgICAgICAgICAgb3JnYW5pemF0aW9uSWQ6IDEsXG4gICAgICAgICAgICBwZXJtaXNzaW9uTmFtZXM6IFsnY29ycmVzcG9uZGVuY2UuY3JlYXRlJywgJ2NvcnJlc3BvbmRlbmNlLnJlYWQnXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBjb250ZXh0OiBTY29wZUNvbnRleHQgPSB7IG9yZ2FuaXphdGlvbklkOiAxIH07XG4gICAgICBjb25zdCBhYmlsaXR5ID0gZmFjdG9yeS5jcmVhdGVGb3JVc2VyKHVzZXIsIGNvbnRleHQpO1xuXG4gICAgICBleHBlY3QoYWJpbGl0eS5jYW4oJ2NyZWF0ZScsICdjb3JyZXNwb25kZW5jZScpKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KGFiaWxpdHkuY2FuKCdyZWFkJywgJ2NvcnJlc3BvbmRlbmNlJykpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRlbnkgcGVybWlzc2lvbnMgZm9yIG5vbi1tYXRjaGluZyBvcmdhbml6YXRpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gY3JlYXRlTW9ja1VzZXIoe1xuICAgICAgICBhc3NpZ25tZW50czogW1xuICAgICAgICAgIGNyZWF0ZU1vY2tBc3NpZ25tZW50KHtcbiAgICAgICAgICAgIG9yZ2FuaXphdGlvbklkOiAxLFxuICAgICAgICAgICAgcGVybWlzc2lvbk5hbWVzOiBbJ2NvcnJlc3BvbmRlbmNlLmNyZWF0ZSddLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGNvbnRleHQ6IFNjb3BlQ29udGV4dCA9IHsgb3JnYW5pemF0aW9uSWQ6IDIgfTtcbiAgICAgIGNvbnN0IGFiaWxpdHkgPSBmYWN0b3J5LmNyZWF0ZUZvclVzZXIodXNlciwgY29udGV4dCk7XG5cbiAgICAgIGV4cGVjdChhYmlsaXR5LmNhbignY3JlYXRlJywgJ2NvcnJlc3BvbmRlbmNlJykpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUHJvamVjdCBMZXZlbCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGdyYW50IHBlcm1pc3Npb25zIGZvciBtYXRjaGluZyBwcm9qZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IGNyZWF0ZU1vY2tVc2VyKHtcbiAgICAgICAgYXNzaWdubWVudHM6IFtcbiAgICAgICAgICBjcmVhdGVNb2NrQXNzaWdubWVudCh7XG4gICAgICAgICAgICBwcm9qZWN0SWQ6IDEwLFxuICAgICAgICAgICAgcGVybWlzc2lvbk5hbWVzOiBbJ3JmYS5jcmVhdGUnXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBjb250ZXh0OiBTY29wZUNvbnRleHQgPSB7IHByb2plY3RJZDogMTAgfTtcbiAgICAgIGNvbnN0IGFiaWxpdHkgPSBmYWN0b3J5LmNyZWF0ZUZvclVzZXIodXNlciwgY29udGV4dCk7XG5cbiAgICAgIGV4cGVjdChhYmlsaXR5LmNhbignY3JlYXRlJywgJ3JmYScpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ29udHJhY3QgTGV2ZWwnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBncmFudCBwZXJtaXNzaW9ucyBmb3IgbWF0Y2hpbmcgY29udHJhY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gY3JlYXRlTW9ja1VzZXIoe1xuICAgICAgICBhc3NpZ25tZW50czogW1xuICAgICAgICAgIGNyZWF0ZU1vY2tBc3NpZ25tZW50KHtcbiAgICAgICAgICAgIGNvbnRyYWN0SWQ6IDUsXG4gICAgICAgICAgICBwZXJtaXNzaW9uTmFtZXM6IFsnZHJhd2luZy5jcmVhdGUnXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBjb250ZXh0OiBTY29wZUNvbnRleHQgPSB7IGNvbnRyYWN0SWQ6IDUgfTtcbiAgICAgIGNvbnN0IGFiaWxpdHkgPSBmYWN0b3J5LmNyZWF0ZUZvclVzZXIodXNlciwgY29udGV4dCk7XG5cbiAgICAgIGV4cGVjdChhYmlsaXR5LmNhbignY3JlYXRlJywgJ2RyYXdpbmcnKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ011bHRpcGxlIEFzc2lnbm1lbnRzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY29tYmluZSBwZXJtaXNzaW9ucyBmcm9tIG11bHRpcGxlIGFzc2lnbm1lbnRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IGNyZWF0ZU1vY2tVc2VyKHtcbiAgICAgICAgYXNzaWdubWVudHM6IFtcbiAgICAgICAgICBjcmVhdGVNb2NrQXNzaWdubWVudCh7XG4gICAgICAgICAgICBvcmdhbml6YXRpb25JZDogMSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25OYW1lczogWydjb3JyZXNwb25kZW5jZS5jcmVhdGUnXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBjcmVhdGVNb2NrQXNzaWdubWVudCh7XG4gICAgICAgICAgICBwcm9qZWN0SWQ6IDEwLFxuICAgICAgICAgICAgcGVybWlzc2lvbk5hbWVzOiBbJ3JmYS5jcmVhdGUnXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBvcmdBYmlsaXR5ID0gZmFjdG9yeS5jcmVhdGVGb3JVc2VyKHVzZXIsIHsgb3JnYW5pemF0aW9uSWQ6IDEgfSk7XG4gICAgICBleHBlY3Qob3JnQWJpbGl0eS5jYW4oJ2NyZWF0ZScsICdjb3JyZXNwb25kZW5jZScpKS50b0JlKHRydWUpO1xuXG4gICAgICBjb25zdCBwcm9qZWN0QWJpbGl0eSA9IGZhY3RvcnkuY3JlYXRlRm9yVXNlcih1c2VyLCB7IHByb2plY3RJZDogMTAgfSk7XG4gICAgICBleHBlY3QocHJvamVjdEFiaWxpdHkuY2FuKCdjcmVhdGUnLCAncmZhJykpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbi8vIEhlbHBlciBmdW5jdGlvbnMgdXNpbmcgbW9jayBvYmplY3RzXG5mdW5jdGlvbiBjcmVhdGVNb2NrVXNlcihwcm9wczogeyBhc3NpZ25tZW50czogVXNlckFzc2lnbm1lbnRbXSB9KTogVXNlciB7XG4gIGNvbnN0IHVzZXIgPSBuZXcgVXNlcigpO1xuICB1c2VyLnVzZXJfaWQgPSAxO1xuICB1c2VyLnVzZXJuYW1lID0gJ3Rlc3R1c2VyJztcbiAgdXNlci5lbWFpbCA9ICd0ZXN0QGV4YW1wbGUuY29tJztcbiAgdXNlci5hc3NpZ25tZW50cyA9IHByb3BzLmFzc2lnbm1lbnRzO1xuICByZXR1cm4gdXNlcjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTW9ja0Fzc2lnbm1lbnQocHJvcHM6IHtcbiAgb3JnYW5pemF0aW9uSWQ/OiBudW1iZXI7XG4gIHByb2plY3RJZD86IG51bWJlcjtcbiAgY29udHJhY3RJZD86IG51bWJlcjtcbiAgcGVybWlzc2lvbk5hbWVzOiBzdHJpbmdbXTtcbn0pOiBVc2VyQXNzaWdubWVudCB7XG4gIGNvbnN0IGFzc2lnbm1lbnQgPSBuZXcgVXNlckFzc2lnbm1lbnQoKTtcbiAgYXNzaWdubWVudC5vcmdhbml6YXRpb25JZCA9IHByb3BzLm9yZ2FuaXphdGlvbklkO1xuICBhc3NpZ25tZW50LnByb2plY3RJZCA9IHByb3BzLnByb2plY3RJZDtcbiAgYXNzaWdubWVudC5jb250cmFjdElkID0gcHJvcHMuY29udHJhY3RJZDtcblxuICAvLyBDcmVhdGUgbW9jayByb2xlIHdpdGggcGVybWlzc2lvbnNcbiAgYXNzaWdubWVudC5yb2xlID0ge1xuICAgIHBlcm1pc3Npb25zOiBwcm9wcy5wZXJtaXNzaW9uTmFtZXMubWFwKChuYW1lKSA9PiAoe1xuICAgICAgcGVybWlzc2lvbk5hbWU6IG5hbWUsXG4gICAgfSkpLFxuICB9IGFzIFBhcnRpYWw8Um9sZT4gYXMgUm9sZTtcblxuICByZXR1cm4gYXNzaWdubWVudDtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/34/abilityfactoryspec_34511f78c6a357cf9f9762795d4af8e9.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/34/abilityfactoryspec_34511f78c6a357cf9f9762795d4af8e9.map new file mode 100644 index 0000000..060161f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/34/abilityfactoryspec_34511f78c6a357cf9f9762795d4af8e9.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\auth\\casl\\ability.factory.spec.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\auth\\casl\\ability.factory.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\nimport { AbilityFactory, ScopeContext } from './ability.factory';\nimport { User } from '../../../modules/user/entities/user.entity';\nimport { UserAssignment } from '../../../modules/user/entities/user-assignment.entity';\nimport { Role } from '../../../modules/auth/entities/role.entity';\n\ndescribe('AbilityFactory', () => {\n let factory: AbilityFactory;\n\n beforeEach(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [AbilityFactory],\n }).compile();\n\n factory = module.get(AbilityFactory);\n });\n\n it('should be defined', () => {\n expect(factory).toBeDefined();\n });\n\n describe('Global Admin', () => {\n it('should grant all permissions for global admin', () => {\n const user = createMockUser({\n assignments: [\n createMockAssignment({\n organizationId: undefined,\n projectId: undefined,\n contractId: undefined,\n permissionNames: ['system.manage_all'],\n }),\n ],\n });\n\n const ability = factory.createForUser(user, {});\n\n expect(ability.can('manage', 'all')).toBe(true);\n });\n });\n\n describe('Organization Level', () => {\n it('should grant permissions for matching organization', () => {\n const user = createMockUser({\n assignments: [\n createMockAssignment({\n organizationId: 1,\n permissionNames: ['correspondence.create', 'correspondence.read'],\n }),\n ],\n });\n\n const context: ScopeContext = { organizationId: 1 };\n const ability = factory.createForUser(user, context);\n\n expect(ability.can('create', 'correspondence')).toBe(true);\n expect(ability.can('read', 'correspondence')).toBe(true);\n });\n\n it('should deny permissions for non-matching organization', () => {\n const user = createMockUser({\n assignments: [\n createMockAssignment({\n organizationId: 1,\n permissionNames: ['correspondence.create'],\n }),\n ],\n });\n\n const context: ScopeContext = { organizationId: 2 };\n const ability = factory.createForUser(user, context);\n\n expect(ability.can('create', 'correspondence')).toBe(false);\n });\n });\n\n describe('Project Level', () => {\n it('should grant permissions for matching project', () => {\n const user = createMockUser({\n assignments: [\n createMockAssignment({\n projectId: 10,\n permissionNames: ['rfa.create'],\n }),\n ],\n });\n\n const context: ScopeContext = { projectId: 10 };\n const ability = factory.createForUser(user, context);\n\n expect(ability.can('create', 'rfa')).toBe(true);\n });\n });\n\n describe('Contract Level', () => {\n it('should grant permissions for matching contract', () => {\n const user = createMockUser({\n assignments: [\n createMockAssignment({\n contractId: 5,\n permissionNames: ['drawing.create'],\n }),\n ],\n });\n\n const context: ScopeContext = { contractId: 5 };\n const ability = factory.createForUser(user, context);\n\n expect(ability.can('create', 'drawing')).toBe(true);\n });\n });\n\n describe('Multiple Assignments', () => {\n it('should combine permissions from multiple assignments', () => {\n const user = createMockUser({\n assignments: [\n createMockAssignment({\n organizationId: 1,\n permissionNames: ['correspondence.create'],\n }),\n createMockAssignment({\n projectId: 10,\n permissionNames: ['rfa.create'],\n }),\n ],\n });\n\n const orgAbility = factory.createForUser(user, { organizationId: 1 });\n expect(orgAbility.can('create', 'correspondence')).toBe(true);\n\n const projectAbility = factory.createForUser(user, { projectId: 10 });\n expect(projectAbility.can('create', 'rfa')).toBe(true);\n });\n });\n});\n\n// Helper functions using mock objects\nfunction createMockUser(props: { assignments: UserAssignment[] }): User {\n const user = new User();\n user.user_id = 1;\n user.username = 'testuser';\n user.email = 'test@example.com';\n user.assignments = props.assignments;\n return user;\n}\n\nfunction createMockAssignment(props: {\n organizationId?: number;\n projectId?: number;\n contractId?: number;\n permissionNames: string[];\n}): UserAssignment {\n const assignment = new UserAssignment();\n assignment.organizationId = props.organizationId;\n assignment.projectId = props.projectId;\n assignment.contractId = props.contractId;\n\n // Create mock role with permissions\n assignment.role = {\n permissions: props.permissionNames.map((name) => ({\n permissionName: name,\n })),\n } as Partial as Role;\n\n return assignment;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/35/counterkeydto_351a47cc29bea6f1e2bda8734f0052a3 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/35/counterkeydto_351a47cc29bea6f1e2bda8734f0052a3 new file mode 100644 index 0000000..10500af --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/35/counterkeydto_351a47cc29bea6f1e2bda8734f0052a3 @@ -0,0 +1,22 @@ +24b511d71d21304c1d719b743bba89fe +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CounterKeyDto = void 0; +exports.buildCounterKey = buildCounterKey; +class CounterKeyDto { +} +exports.CounterKeyDto = CounterKeyDto; +function buildCounterKey(context) { + const currentYear = context.year || new Date().getFullYear(); + return { + projectId: context.projectId, + originatorOrganizationId: context.originatorOrgId, + recipientOrganizationId: context.recipientOrgId || 0, + correspondenceTypeId: context.correspondenceTypeId, + subTypeId: context.subTypeId || 0, + rfaTypeId: context.rfaTypeId || 0, + disciplineId: context.disciplineId || 0, + resetScope: context.isRFA ? 'NONE' : `YEAR_${currentYear + 543}`, // Buddhist year + }; +} +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxkdG9cXGNvdW50ZXIta2V5LmR0by50cyIsIm1hcHBpbmdzIjoiOzs7QUFXQSwwQ0F1QkM7QUFsQ0QsTUFBYSxhQUFhO0NBU3pCO0FBVEQsc0NBU0M7QUFFRCxTQUFnQixlQUFlLENBQUMsT0FVL0I7SUFDQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7SUFFN0QsT0FBTztRQUNMLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztRQUM1Qix3QkFBd0IsRUFBRSxPQUFPLENBQUMsZUFBZTtRQUNqRCx1QkFBdUIsRUFBRSxPQUFPLENBQUMsY0FBYyxJQUFJLENBQUM7UUFDcEQsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLG9CQUFvQjtRQUNsRCxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsSUFBSSxDQUFDO1FBQ2pDLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxJQUFJLENBQUM7UUFDakMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZLElBQUksQ0FBQztRQUN2QyxVQUFVLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLFdBQVcsR0FBRyxHQUFHLEVBQUUsRUFBRSxnQkFBZ0I7S0FDbkYsQ0FBQztBQUNKLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxkdG9cXGNvdW50ZXIta2V5LmR0by50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgQ291bnRlcktleUR0byB7XG4gIHByb2plY3RJZCE6IG51bWJlcjtcbiAgb3JpZ2luYXRvck9yZ2FuaXphdGlvbklkITogbnVtYmVyO1xuICByZWNpcGllbnRPcmdhbml6YXRpb25JZCE6IG51bWJlcjtcbiAgY29ycmVzcG9uZGVuY2VUeXBlSWQhOiBudW1iZXI7XG4gIHN1YlR5cGVJZCE6IG51bWJlcjtcbiAgcmZhVHlwZUlkITogbnVtYmVyO1xuICBkaXNjaXBsaW5lSWQhOiBudW1iZXI7XG4gIHJlc2V0U2NvcGUhOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENvdW50ZXJLZXkoY29udGV4dDoge1xuICBwcm9qZWN0SWQ6IG51bWJlcjtcbiAgb3JpZ2luYXRvck9yZ0lkOiBudW1iZXI7XG4gIHJlY2lwaWVudE9yZ0lkPzogbnVtYmVyO1xuICBjb3JyZXNwb25kZW5jZVR5cGVJZDogbnVtYmVyO1xuICBzdWJUeXBlSWQ/OiBudW1iZXI7XG4gIHJmYVR5cGVJZD86IG51bWJlcjtcbiAgZGlzY2lwbGluZUlkPzogbnVtYmVyO1xuICB5ZWFyPzogbnVtYmVyO1xuICBpc1JGQT86IGJvb2xlYW47XG59KTogQ291bnRlcktleUR0byB7XG4gIGNvbnN0IGN1cnJlbnRZZWFyID0gY29udGV4dC55ZWFyIHx8IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcblxuICByZXR1cm4ge1xuICAgIHByb2plY3RJZDogY29udGV4dC5wcm9qZWN0SWQsXG4gICAgb3JpZ2luYXRvck9yZ2FuaXphdGlvbklkOiBjb250ZXh0Lm9yaWdpbmF0b3JPcmdJZCxcbiAgICByZWNpcGllbnRPcmdhbml6YXRpb25JZDogY29udGV4dC5yZWNpcGllbnRPcmdJZCB8fCAwLFxuICAgIGNvcnJlc3BvbmRlbmNlVHlwZUlkOiBjb250ZXh0LmNvcnJlc3BvbmRlbmNlVHlwZUlkLFxuICAgIHN1YlR5cGVJZDogY29udGV4dC5zdWJUeXBlSWQgfHwgMCxcbiAgICByZmFUeXBlSWQ6IGNvbnRleHQucmZhVHlwZUlkIHx8IDAsXG4gICAgZGlzY2lwbGluZUlkOiBjb250ZXh0LmRpc2NpcGxpbmVJZCB8fCAwLFxuICAgIHJlc2V0U2NvcGU6IGNvbnRleHQuaXNSRkEgPyAnTk9ORScgOiBgWUVBUl8ke2N1cnJlbnRZZWFyICsgNTQzfWAsIC8vIEJ1ZGRoaXN0IHllYXJcbiAgfTtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/35/counterkeydto_351a47cc29bea6f1e2bda8734f0052a3.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/35/counterkeydto_351a47cc29bea6f1e2bda8734f0052a3.map new file mode 100644 index 0000000..dd9b542 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/35/counterkeydto_351a47cc29bea6f1e2bda8734f0052a3.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\dto\\counter-key.dto.ts","mappings":";;;AAWA,0CAuBC;AAlCD,MAAa,aAAa;CASzB;AATD,sCASC;AAED,SAAgB,eAAe,CAAC,OAU/B;IACC,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE7D,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,wBAAwB,EAAE,OAAO,CAAC,eAAe;QACjD,uBAAuB,EAAE,OAAO,CAAC,cAAc,IAAI,CAAC;QACpD,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;QAClD,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,CAAC;QACjC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,CAAC;QACjC,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,CAAC;QACvC,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,WAAW,GAAG,GAAG,EAAE,EAAE,gBAAgB;KACnF,CAAC;AACJ,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\dto\\counter-key.dto.ts"],"sourcesContent":["export class CounterKeyDto {\n projectId!: number;\n originatorOrganizationId!: number;\n recipientOrganizationId!: number;\n correspondenceTypeId!: number;\n subTypeId!: number;\n rfaTypeId!: number;\n disciplineId!: number;\n resetScope!: string;\n}\n\nexport function buildCounterKey(context: {\n projectId: number;\n originatorOrgId: number;\n recipientOrgId?: number;\n correspondenceTypeId: number;\n subTypeId?: number;\n rfaTypeId?: number;\n disciplineId?: number;\n year?: number;\n isRFA?: boolean;\n}): CounterKeyDto {\n const currentYear = context.year || new Date().getFullYear();\n\n return {\n projectId: context.projectId,\n originatorOrganizationId: context.originatorOrgId,\n recipientOrganizationId: context.recipientOrgId || 0,\n correspondenceTypeId: context.correspondenceTypeId,\n subTypeId: context.subTypeId || 0,\n rfaTypeId: context.rfaTypeId || 0,\n disciplineId: context.disciplineId || 0,\n resetScope: context.isRFA ? 'NONE' : `YEAR_${currentYear + 543}`, // Buddhist year\n };\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/36/contractentity_368e2e62d8d219a68fded59440a670e8 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/36/contractentity_368e2e62d8d219a68fded59440a670e8 new file mode 100644 index 0000000..d8b4875 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/36/contractentity_368e2e62d8d219a68fded59440a670e8 @@ -0,0 +1,63 @@ +a037f6e7bc5eae493261cbf389adbc7e +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Contract = void 0; +const typeorm_1 = require("typeorm"); +const class_transformer_1 = require("class-transformer"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const project_entity_1 = require("../../project/entities/project.entity"); +let Contract = class Contract extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.Contract = Contract; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], Contract.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id' }), + __metadata("design:type", Number) +], Contract.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'contract_code', unique: true, length: 50 }), + __metadata("design:type", String) +], Contract.prototype, "contractCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'contract_name', length: 255 }), + __metadata("design:type", String) +], Contract.prototype, "contractName", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], Contract.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'start_date', type: 'date', nullable: true }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], Contract.prototype, "startDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'end_date', type: 'date', nullable: true }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], Contract.prototype, "endDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true }), + __metadata("design:type", Boolean) +], Contract.prototype, "isActive", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => project_entity_1.Project), + (0, typeorm_1.JoinColumn)({ name: 'project_id' }), + __metadata("design:type", typeof (_c = typeof project_entity_1.Project !== "undefined" && project_entity_1.Project) === "function" ? _c : Object) +], Contract.prototype, "project", void 0); +exports.Contract = Contract = __decorate([ + (0, typeorm_1.Entity)('contracts') +], Contract); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29udHJhY3RcXGVudGl0aWVzXFxjb250cmFjdC5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFDQU1pQjtBQUNqQix5REFBNEM7QUFDNUMsZ0ZBQTJFO0FBQzNFLDBFQUFnRTtBQUd6RCxJQUFNLFFBQVEsR0FBZCxNQUFNLFFBQVMsU0FBUSxpQ0FBYztDQWdDM0MsQ0FBQTtBQWhDWSw0QkFBUTtBQUduQjtJQUZDLElBQUEsZ0NBQXNCLEdBQUU7SUFDeEIsSUFBQSwyQkFBTyxHQUFFOztvQ0FDRTtBQUtaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDOzsyQ0FDWjtBQUduQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7OzhDQUN0QztBQUd0QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOzs4Q0FDekI7QUFHdEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7NkNBQ3BCO0FBR3JCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztrREFDakQsSUFBSSxvQkFBSixJQUFJOzJDQUFDO0FBR2pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztrREFDakQsSUFBSSxvQkFBSixJQUFJO3lDQUFDO0FBR2Y7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7MENBQzFCO0FBS25CO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLHdCQUFPLENBQUM7SUFDeEIsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUN6Qix3QkFBTyxvQkFBUCx3QkFBTzt5Q0FBQzttQkEvQlAsUUFBUTtJQURwQixJQUFBLGdCQUFNLEVBQUMsV0FBVyxDQUFDO0dBQ1AsUUFBUSxDQWdDcEIiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29udHJhY3RcXGVudGl0aWVzXFxjb250cmFjdC5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBFbnRpdHksXHJcbiAgQ29sdW1uLFxyXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXHJcbiAgTWFueVRvT25lLFxyXG4gIEpvaW5Db2x1bW4sXHJcbn0gZnJvbSAndHlwZW9ybSc7XHJcbmltcG9ydCB7IEV4Y2x1ZGUgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XHJcbmltcG9ydCB7IFV1aWRCYXNlRW50aXR5IH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2VudGl0aWVzL3V1aWQtYmFzZS5lbnRpdHknO1xyXG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC9lbnRpdGllcy9wcm9qZWN0LmVudGl0eSc7XHJcblxyXG5ARW50aXR5KCdjb250cmFjdHMnKVxyXG5leHBvcnQgY2xhc3MgQ29udHJhY3QgZXh0ZW5kcyBVdWlkQmFzZUVudGl0eSB7XHJcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxyXG4gIEBFeGNsdWRlKClcclxuICBpZCE6IG51bWJlcjtcclxuXHJcbiAgLy8gcHVibGljSWQgaW5oZXJpdGVkIGZyb20gVXVpZEJhc2VFbnRpdHkgKERCIGNvbHVtbjogdXVpZClcclxuXHJcbiAgQENvbHVtbih7IG5hbWU6ICdwcm9qZWN0X2lkJyB9KVxyXG4gIHByb2plY3RJZCE6IG51bWJlcjtcclxuXHJcbiAgQENvbHVtbih7IG5hbWU6ICdjb250cmFjdF9jb2RlJywgdW5pcXVlOiB0cnVlLCBsZW5ndGg6IDUwIH0pXHJcbiAgY29udHJhY3RDb2RlITogc3RyaW5nO1xyXG5cclxuICBAQ29sdW1uKHsgbmFtZTogJ2NvbnRyYWN0X25hbWUnLCBsZW5ndGg6IDI1NSB9KVxyXG4gIGNvbnRyYWN0TmFtZSE6IHN0cmluZztcclxuXHJcbiAgQENvbHVtbih7IHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcclxuICBkZXNjcmlwdGlvbj86IHN0cmluZztcclxuXHJcbiAgQENvbHVtbih7IG5hbWU6ICdzdGFydF9kYXRlJywgdHlwZTogJ2RhdGUnLCBudWxsYWJsZTogdHJ1ZSB9KVxyXG4gIHN0YXJ0RGF0ZT86IERhdGU7XHJcblxyXG4gIEBDb2x1bW4oeyBuYW1lOiAnZW5kX2RhdGUnLCB0eXBlOiAnZGF0ZScsIG51bGxhYmxlOiB0cnVlIH0pXHJcbiAgZW5kRGF0ZT86IERhdGU7XHJcblxyXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXNfYWN0aXZlJywgZGVmYXVsdDogdHJ1ZSB9KVxyXG4gIGlzQWN0aXZlITogYm9vbGVhbjtcclxuXHJcbiAgLy8gUmVsYXRpb25cclxuICBATWFueVRvT25lKCgpID0+IFByb2plY3QpXHJcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAncHJvamVjdF9pZCcgfSlcclxuICBwcm9qZWN0PzogUHJvamVjdDtcclxufVxyXG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/36/contractentity_368e2e62d8d219a68fded59440a670e8.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/36/contractentity_368e2e62d8d219a68fded59440a670e8.map new file mode 100644 index 0000000..1b2d1fe --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/36/contractentity_368e2e62d8d219a68fded59440a670e8.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\contract\\entities\\contract.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAMiB;AACjB,yDAA4C;AAC5C,gFAA2E;AAC3E,0EAAgE;AAGzD,IAAM,QAAQ,GAAd,MAAM,QAAS,SAAQ,iCAAc;CAgC3C,CAAA;AAhCY,4BAAQ;AAGnB;IAFC,IAAA,gCAAsB,GAAE;IACxB,IAAA,2BAAO,GAAE;;oCACE;AAKZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;2CACZ;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;8CACtC;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;8CACzB;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;6CACpB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACjD,IAAI,oBAAJ,IAAI;2CAAC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACjD,IAAI,oBAAJ,IAAI;yCAAC;AAGf;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;0CAC1B;AAKnB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wBAAO,CAAC;IACxB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,wBAAO,oBAAP,wBAAO;yCAAC;mBA/BP,QAAQ;IADpB,IAAA,gBAAM,EAAC,WAAW,CAAC;GACP,QAAQ,CAgCpB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\contract\\entities\\contract.entity.ts"],"sourcesContent":["import {\r\n Entity,\r\n Column,\r\n PrimaryGeneratedColumn,\r\n ManyToOne,\r\n JoinColumn,\r\n} from 'typeorm';\r\nimport { Exclude } from 'class-transformer';\r\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\r\nimport { Project } from '../../project/entities/project.entity';\r\n\r\n@Entity('contracts')\r\nexport class Contract extends UuidBaseEntity {\r\n @PrimaryGeneratedColumn()\r\n @Exclude()\r\n id!: number;\r\n\r\n // publicId inherited from UuidBaseEntity (DB column: uuid)\r\n\r\n @Column({ name: 'project_id' })\r\n projectId!: number;\r\n\r\n @Column({ name: 'contract_code', unique: true, length: 50 })\r\n contractCode!: string;\r\n\r\n @Column({ name: 'contract_name', length: 255 })\r\n contractName!: string;\r\n\r\n @Column({ type: 'text', nullable: true })\r\n description?: string;\r\n\r\n @Column({ name: 'start_date', type: 'date', nullable: true })\r\n startDate?: Date;\r\n\r\n @Column({ name: 'end_date', type: 'date', nullable: true })\r\n endDate?: Date;\r\n\r\n @Column({ name: 'is_active', default: true })\r\n isActive!: boolean;\r\n\r\n // Relation\r\n @ManyToOne(() => Project)\r\n @JoinColumn({ name: 'project_id' })\r\n project?: Project;\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/39/schemamigrationservice_399aa855c7775eaa61d46c3a49de20bb b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/39/schemamigrationservice_399aa855c7775eaa61d46c3a49de20bb new file mode 100644 index 0000000..25521ff --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/39/schemamigrationservice_399aa855c7775eaa61d46c3a49de20bb @@ -0,0 +1,172 @@ +1f07df2069b04ca3bc8a94f244d65baa +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var SchemaMigrationService_1; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SchemaMigrationService = void 0; +// File: src/modules/json-schema/services/schema-migration.service.ts +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("typeorm"); +const json_schema_service_1 = require("../json-schema.service"); +let SchemaMigrationService = SchemaMigrationService_1 = class SchemaMigrationService { + constructor(dataSource, jsonSchemaService) { + this.dataSource = dataSource; + this.jsonSchemaService = jsonSchemaService; + this.logger = new common_1.Logger(SchemaMigrationService_1.name); + } + /** + * Migrate data for a specific entity to a target schema version + */ + async migrateData(entityType, // e.g., 'rfa_revisions', 'correspondence_revisions' + entityId, targetSchemaCode, targetVersion) { + const queryRunner = this.dataSource.createQueryRunner(); + await queryRunner.connect(); + await queryRunner.startTransaction(); + try { + // 1. Get Target Schema + let targetSchema; + if (targetVersion) { + targetSchema = await this.jsonSchemaService.findOneByCodeAndVersion(targetSchemaCode, targetVersion); + } + else { + targetSchema = + await this.jsonSchemaService.findLatestByCode(targetSchemaCode); + } + // 2. Fetch Entity Data & Current Version + // Note: This assumes the entity table has 'details' (json) and 'schema_version' (int) columns + // If schema_version is not present, we assume version 1 + const entities = await queryRunner.manager.query(`SELECT details, schema_version FROM ${entityType} WHERE id = ?`, [ + entityId, + ]); + if (!entities || entities.length === 0) { + throw new common_1.BadRequestException(`Entity ${entityType} with ID ${entityId} not found.`); + } + const entity = entities[0]; + const currentData = entity.details || {}; + const currentVersion = entity.schema_version || 1; + if (currentVersion >= targetSchema.version) { + return { + success: true, + fromVersion: currentVersion, + toVersion: currentVersion, + migratedFields: [], // No migration needed + }; + } + // 3. Find Migration Path (Iterative Upgrade) + let migratedData = JSON.parse(JSON.stringify(currentData)); + const migratedFields = []; + // Loop from current version up to target version + for (let v = currentVersion + 1; v <= targetSchema.version; v++) { + const schemaVer = await this.jsonSchemaService.findOneByCodeAndVersion(targetSchemaCode, v); + if (schemaVer && schemaVer.migrationScript) { + this.logger.log(`Applying migration script for ${targetSchemaCode} v${v}...`); + const script = schemaVer.migrationScript; + // Apply steps defined in migrationScript + if (Array.isArray(script.steps)) { + for (const step of script.steps) { + migratedData = this.applyMigrationStep(step, migratedData); + const config = step.config; + if (config.field || config.new_field) { + migratedFields.push(config.new_field || config.field); + } + } + } + } + } + // 4. Validate Migrated Data against Target Schema + const validation = await this.jsonSchemaService.validateData(targetSchema.schemaCode, migratedData); + if (!validation.isValid) { + throw new common_1.BadRequestException(`Migration failed: Resulting data does not match target schema v${targetSchema.version}. Errors: ${JSON.stringify(validation.errors)}`); + } + // 5. Save Migrated Data + // Update details AND schema_version + await queryRunner.manager.query(`UPDATE ${entityType} SET details = ?, schema_version = ? WHERE id = ?`, [ + JSON.stringify(validation.sanitizedData), + targetSchema.version, + entityId, + ]); + await queryRunner.commitTransaction(); + return { + success: true, + fromVersion: currentVersion, + toVersion: targetSchema.version, + migratedFields: [...new Set(migratedFields)], + }; + } + catch (err) { + await queryRunner.rollbackTransaction(); + this.logger.error(`Migration failed: ${err instanceof Error ? err.message : String(err)}`, err instanceof Error ? err.stack : undefined); + throw err; + } + finally { + await queryRunner.release(); + } + } + /** + * Apply a single migration step + */ + applyMigrationStep(step, data) { + const newData = { ...data }; + const field = step.config.field; + const oldField = step.config.old_field; + const newField = step.config.new_field; + switch (step.type) { + case 'FIELD_RENAME': + if (newData[oldField] !== undefined) { + newData[newField] = newData[oldField]; + delete newData[oldField]; + } + break; + case 'FIELD_ADD': + if (newData[field] === undefined) { + newData[field] = step.config.default_value; + } + break; + case 'FIELD_REMOVE': + delete newData[field]; + break; + case 'FIELD_TRANSFORM': + if (newData[field] !== undefined) { + // Simple transform logic (e.g., map values) + if (step.config.transform === 'MAP_VALUES' && step.config.mapping) { + const val = newData[field]; + const oldVal = typeof val === 'string' || typeof val === 'number' + ? String(val) + : JSON.stringify(val); + const mapping = step.config.mapping; + newData[field] = mapping[oldVal] || newData[field]; + } + // Type casting + else if (step.config.transform === 'TO_NUMBER') { + newData[field] = Number(newData[field]); + } + else if (step.config.transform === 'TO_STRING') { + const val = newData[field]; + newData[field] = + typeof val === 'string' || typeof val === 'number' + ? String(val) + : JSON.stringify(val); + } + } + break; + default: + this.logger.warn(`Unknown migration step type: ${step.type}`); + } + return newData; + } +}; +exports.SchemaMigrationService = SchemaMigrationService; +exports.SchemaMigrationService = SchemaMigrationService = SchemaMigrationService_1 = __decorate([ + (0, common_1.Injectable)(), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_1.DataSource !== "undefined" && typeorm_1.DataSource) === "function" ? _a : Object, typeof (_b = typeof json_schema_service_1.JsonSchemaService !== "undefined" && json_schema_service_1.JsonSchemaService) === "function" ? _b : Object]) +], SchemaMigrationService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcanNvbi1zY2hlbWFcXHNlcnZpY2VzXFxzY2hlbWEtbWlncmF0aW9uLnNlcnZpY2UudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxRUFBcUU7QUFDckUsMkNBQXlFO0FBQ3pFLHFDQUFxQztBQUNyQyxnRUFBMkQ7QUFxQnBELElBQU0sc0JBQXNCLDhCQUE1QixNQUFNLHNCQUFzQjtJQUdqQyxZQUNtQixVQUFzQixFQUN0QixpQkFBb0M7UUFEcEMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBSnRDLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyx3QkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUsvRCxDQUFDO0lBRUo7O09BRUc7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUNmLFVBQWtCLEVBQUUsb0RBQW9EO0lBQ3hFLFFBQWdCLEVBQ2hCLGdCQUF3QixFQUN4QixhQUFzQjtRQUV0QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDeEQsTUFBTSxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUIsTUFBTSxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUVyQyxJQUFJLENBQUM7WUFDSCx1QkFBdUI7WUFDdkIsSUFBSSxZQUFZLENBQUM7WUFDakIsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDbEIsWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLHVCQUF1QixDQUNqRSxnQkFBZ0IsRUFDaEIsYUFBYSxDQUNkLENBQUM7WUFDSixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sWUFBWTtvQkFDVixNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7WUFFRCx5Q0FBeUM7WUFDekMsOEZBQThGO1lBQzlGLHdEQUF3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QUFrQyxDQUFDO3dCQUMvRCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDckQsQ0FBQztvQkFDRCxlQUFlO3lCQUNWLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEtBQUssV0FBVyxFQUFFLENBQUM7d0JBQy9DLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQzFDLENBQUM7eUJBQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsS0FBSyxXQUFXLEVBQUUsQ0FBQzt3QkFDakQsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUMzQixPQUFPLENBQUMsS0FBSyxDQUFDOzRCQUNaLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO2dDQUNoRCxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztnQ0FDYixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDNUIsQ0FBQztnQkFDSCxDQUFDO2dCQUNELE1BQU07WUFFUjtnQkFDRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7Q0FDRixDQUFBO0FBek1ZLHdEQUFzQjtpQ0FBdEIsc0JBQXNCO0lBRGxDLElBQUEsbUJBQVUsR0FBRTt5REFLb0Isb0JBQVUsb0JBQVYsb0JBQVUsb0RBQ0gsdUNBQWlCLG9CQUFqQix1Q0FBaUI7R0FMNUMsc0JBQXNCLENBeU1sQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxqc29uLXNjaGVtYVxcc2VydmljZXNcXHNjaGVtYS1taWdyYXRpb24uc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGaWxlOiBzcmMvbW9kdWxlcy9qc29uLXNjaGVtYS9zZXJ2aWNlcy9zY2hlbWEtbWlncmF0aW9uLnNlcnZpY2UudHNcbmltcG9ydCB7IEluamVjdGFibGUsIExvZ2dlciwgQmFkUmVxdWVzdEV4Y2VwdGlvbiB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcbmltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IEpzb25TY2hlbWFTZXJ2aWNlIH0gZnJvbSAnLi4vanNvbi1zY2hlbWEuc2VydmljZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWlncmF0aW9uU3RlcCB7XG4gIHR5cGU6XG4gICAgfCAnRklFTERfUkVOQU1FJ1xuICAgIHwgJ0ZJRUxEX1RSQU5TRk9STSdcbiAgICB8ICdGSUVMRF9BREQnXG4gICAgfCAnRklFTERfUkVNT1ZFJ1xuICAgIHwgJ1NUUlVDVFVSRV9DSEFOR0UnO1xuICBjb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1pZ3JhdGlvblJlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIGZyb21WZXJzaW9uOiBudW1iZXI7XG4gIHRvVmVyc2lvbjogbnVtYmVyO1xuICBtaWdyYXRlZEZpZWxkczogc3RyaW5nW107XG4gIGVycm9yPzogc3RyaW5nO1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2NoZW1hTWlncmF0aW9uU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IExvZ2dlcihTY2hlbWFNaWdyYXRpb25TZXJ2aWNlLm5hbWUpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGpzb25TY2hlbWFTZXJ2aWNlOiBKc29uU2NoZW1hU2VydmljZVxuICApIHt9XG5cbiAgLyoqXG4gICAqIE1pZ3JhdGUgZGF0YSBmb3IgYSBzcGVjaWZpYyBlbnRpdHkgdG8gYSB0YXJnZXQgc2NoZW1hIHZlcnNpb25cbiAgICovXG4gIGFzeW5jIG1pZ3JhdGVEYXRhKFxuICAgIGVudGl0eVR5cGU6IHN0cmluZywgLy8gZS5nLiwgJ3JmYV9yZXZpc2lvbnMnLCAnY29ycmVzcG9uZGVuY2VfcmV2aXNpb25zJ1xuICAgIGVudGl0eUlkOiBudW1iZXIsXG4gICAgdGFyZ2V0U2NoZW1hQ29kZTogc3RyaW5nLFxuICAgIHRhcmdldFZlcnNpb24/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCBxdWVyeVJ1bm5lciA9IHRoaXMuZGF0YVNvdXJjZS5jcmVhdGVRdWVyeVJ1bm5lcigpO1xuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbm5lY3QoKTtcbiAgICBhd2FpdCBxdWVyeVJ1bm5lci5zdGFydFRyYW5zYWN0aW9uKCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gMS4gR2V0IFRhcmdldCBTY2hlbWFcbiAgICAgIGxldCB0YXJnZXRTY2hlbWE7XG4gICAgICBpZiAodGFyZ2V0VmVyc2lvbikge1xuICAgICAgICB0YXJnZXRTY2hlbWEgPSBhd2FpdCB0aGlzLmpzb25TY2hlbWFTZXJ2aWNlLmZpbmRPbmVCeUNvZGVBbmRWZXJzaW9uKFxuICAgICAgICAgIHRhcmdldFNjaGVtYUNvZGUsXG4gICAgICAgICAgdGFyZ2V0VmVyc2lvblxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0U2NoZW1hID1cbiAgICAgICAgICBhd2FpdCB0aGlzLmpzb25TY2hlbWFTZXJ2aWNlLmZpbmRMYXRlc3RCeUNvZGUodGFyZ2V0U2NoZW1hQ29kZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIEZldGNoIEVudGl0eSBEYXRhICYgQ3VycmVudCBWZXJzaW9uXG4gICAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgdGhlIGVudGl0eSB0YWJsZSBoYXMgJ2RldGFpbHMnIChqc29uKSBhbmQgJ3NjaGVtYV92ZXJzaW9uJyAoaW50KSBjb2x1bW5zXG4gICAgICAvLyBJZiBzY2hlbWFfdmVyc2lvbiBpcyBub3QgcHJlc2VudCwgd2UgYXNzdW1lIHZlcnNpb24gMVxuICAgICAgY29uc3QgZW50aXRpZXMgPSBhd2FpdCBxdWVyeVJ1bm5lci5tYW5hZ2VyLnF1ZXJ5PFxuICAgICAgICB7IGRldGFpbHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBzY2hlbWFfdmVyc2lvbjogbnVtYmVyIH1bXVxuICAgICAgPihgU0VMRUNUIGRldGFpbHMsIHNjaGVtYV92ZXJzaW9uIEZST00gJHtlbnRpdHlUeXBlfSBXSEVSRSBpZCA9ID9gLCBbXG4gICAgICAgIGVudGl0eUlkLFxuICAgICAgXSk7XG5cbiAgICAgIGlmICghZW50aXRpZXMgfHwgZW50aXRpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICAgIGBFbnRpdHkgJHtlbnRpdHlUeXBlfSB3aXRoIElEICR7ZW50aXR5SWR9IG5vdCBmb3VuZC5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVudGl0eSA9IGVudGl0aWVzWzBdO1xuICAgICAgY29uc3QgY3VycmVudERhdGEgPSBlbnRpdHkuZGV0YWlscyB8fCB7fTtcbiAgICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gZW50aXR5LnNjaGVtYV92ZXJzaW9uIHx8IDE7XG5cbiAgICAgIGlmIChjdXJyZW50VmVyc2lvbiA+PSB0YXJnZXRTY2hlbWEudmVyc2lvbikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgZnJvbVZlcnNpb246IGN1cnJlbnRWZXJzaW9uLFxuICAgICAgICAgIHRvVmVyc2lvbjogY3VycmVudFZlcnNpb24sXG4gICAgICAgICAgbWlncmF0ZWRGaWVsZHM6IFtdLCAvLyBObyBtaWdyYXRpb24gbmVlZGVkXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIEZpbmQgTWlncmF0aW9uIFBhdGggKEl0ZXJhdGl2ZSBVcGdyYWRlKVxuICAgICAgbGV0IG1pZ3JhdGVkRGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoY3VycmVudERhdGEpKSBhcyBSZWNvcmQ8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgdW5rbm93blxuICAgICAgPjtcbiAgICAgIGNvbnN0IG1pZ3JhdGVkRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAvLyBMb29wIGZyb20gY3VycmVudCB2ZXJzaW9uIHVwIHRvIHRhcmdldCB2ZXJzaW9uXG4gICAgICBmb3IgKGxldCB2ID0gY3VycmVudFZlcnNpb24gKyAxOyB2IDw9IHRhcmdldFNjaGVtYS52ZXJzaW9uOyB2KyspIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hVmVyID0gYXdhaXQgdGhpcy5qc29uU2NoZW1hU2VydmljZS5maW5kT25lQnlDb2RlQW5kVmVyc2lvbihcbiAgICAgICAgICB0YXJnZXRTY2hlbWFDb2RlLFxuICAgICAgICAgIHZcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoc2NoZW1hVmVyICYmIHNjaGVtYVZlci5taWdyYXRpb25TY3JpcHQpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXG4gICAgICAgICAgICBgQXBwbHlpbmcgbWlncmF0aW9uIHNjcmlwdCBmb3IgJHt0YXJnZXRTY2hlbWFDb2RlfSB2JHt2fS4uLmBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3Qgc2NyaXB0ID0gc2NoZW1hVmVyLm1pZ3JhdGlvblNjcmlwdDtcblxuICAgICAgICAgIC8vIEFwcGx5IHN0ZXBzIGRlZmluZWQgaW4gbWlncmF0aW9uU2NyaXB0XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2NyaXB0LnN0ZXBzKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHNjcmlwdC5zdGVwcyBhcyBNaWdyYXRpb25TdGVwW10pIHtcbiAgICAgICAgICAgICAgbWlncmF0ZWREYXRhID0gdGhpcy5hcHBseU1pZ3JhdGlvblN0ZXAoc3RlcCwgbWlncmF0ZWREYXRhKTtcbiAgICAgICAgICAgICAgY29uc3QgY29uZmlnID0gc3RlcC5jb25maWcgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgICAgICAgaWYgKGNvbmZpZy5maWVsZCB8fCBjb25maWcubmV3X2ZpZWxkKSB7XG4gICAgICAgICAgICAgICAgbWlncmF0ZWRGaWVsZHMucHVzaChjb25maWcubmV3X2ZpZWxkIHx8IGNvbmZpZy5maWVsZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gNC4gVmFsaWRhdGUgTWlncmF0ZWQgRGF0YSBhZ2FpbnN0IFRhcmdldCBTY2hlbWFcbiAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSBhd2FpdCB0aGlzLmpzb25TY2hlbWFTZXJ2aWNlLnZhbGlkYXRlRGF0YShcbiAgICAgICAgdGFyZ2V0U2NoZW1hLnNjaGVtYUNvZGUsXG4gICAgICAgIG1pZ3JhdGVkRGF0YVxuICAgICAgKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgICAgYE1pZ3JhdGlvbiBmYWlsZWQ6IFJlc3VsdGluZyBkYXRhIGRvZXMgbm90IG1hdGNoIHRhcmdldCBzY2hlbWEgdiR7dGFyZ2V0U2NoZW1hLnZlcnNpb259LiBFcnJvcnM6ICR7SlNPTi5zdHJpbmdpZnkodmFsaWRhdGlvbi5lcnJvcnMpfWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gNS4gU2F2ZSBNaWdyYXRlZCBEYXRhXG4gICAgICAvLyBVcGRhdGUgZGV0YWlscyBBTkQgc2NoZW1hX3ZlcnNpb25cbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIucXVlcnkoXG4gICAgICAgIGBVUERBVEUgJHtlbnRpdHlUeXBlfSBTRVQgZGV0YWlscyA9ID8sIHNjaGVtYV92ZXJzaW9uID0gPyBXSEVSRSBpZCA9ID9gLFxuICAgICAgICBbXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkodmFsaWRhdGlvbi5zYW5pdGl6ZWREYXRhKSxcbiAgICAgICAgICB0YXJnZXRTY2hlbWEudmVyc2lvbixcbiAgICAgICAgICBlbnRpdHlJZCxcbiAgICAgICAgXVxuICAgICAgKTtcblxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgZnJvbVZlcnNpb246IGN1cnJlbnRWZXJzaW9uLFxuICAgICAgICB0b1ZlcnNpb246IHRhcmdldFNjaGVtYS52ZXJzaW9uLFxuICAgICAgICBtaWdyYXRlZEZpZWxkczogWy4uLm5ldyBTZXQobWlncmF0ZWRGaWVsZHMpXSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKCk7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYE1pZ3JhdGlvbiBmYWlsZWQ6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWAsXG4gICAgICAgIGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLnN0YWNrIDogdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yZWxlYXNlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGEgc2luZ2xlIG1pZ3JhdGlvbiBzdGVwXG4gICAqL1xuICBwcml2YXRlIGFwcGx5TWlncmF0aW9uU3RlcChcbiAgICBzdGVwOiBNaWdyYXRpb25TdGVwLFxuICAgIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCBuZXdEYXRhID0geyAuLi5kYXRhIH07XG5cbiAgICBjb25zdCBmaWVsZCA9IHN0ZXAuY29uZmlnLmZpZWxkIGFzIHN0cmluZztcbiAgICBjb25zdCBvbGRGaWVsZCA9IHN0ZXAuY29uZmlnLm9sZF9maWVsZCBhcyBzdHJpbmc7XG4gICAgY29uc3QgbmV3RmllbGQgPSBzdGVwLmNvbmZpZy5uZXdfZmllbGQgYXMgc3RyaW5nO1xuXG4gICAgc3dpdGNoIChzdGVwLnR5cGUpIHtcbiAgICAgIGNhc2UgJ0ZJRUxEX1JFTkFNRSc6XG4gICAgICAgIGlmIChuZXdEYXRhW29sZEZpZWxkXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmV3RGF0YVtuZXdGaWVsZF0gPSBuZXdEYXRhW29sZEZpZWxkXTtcbiAgICAgICAgICBkZWxldGUgbmV3RGF0YVtvbGRGaWVsZF07XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0ZJRUxEX0FERCc6XG4gICAgICAgIGlmIChuZXdEYXRhW2ZpZWxkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmV3RGF0YVtmaWVsZF0gPSBzdGVwLmNvbmZpZy5kZWZhdWx0X3ZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdGSUVMRF9SRU1PVkUnOlxuICAgICAgICBkZWxldGUgbmV3RGF0YVtmaWVsZF07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdGSUVMRF9UUkFOU0ZPUk0nOlxuICAgICAgICBpZiAobmV3RGF0YVtmaWVsZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFNpbXBsZSB0cmFuc2Zvcm0gbG9naWMgKGUuZy4sIG1hcCB2YWx1ZXMpXG4gICAgICAgICAgaWYgKHN0ZXAuY29uZmlnLnRyYW5zZm9ybSA9PT0gJ01BUF9WQUxVRVMnICYmIHN0ZXAuY29uZmlnLm1hcHBpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IG5ld0RhdGFbZmllbGRdO1xuICAgICAgICAgICAgY29uc3Qgb2xkVmFsID1cbiAgICAgICAgICAgICAgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbCA9PT0gJ251bWJlcidcbiAgICAgICAgICAgICAgICA/IFN0cmluZyh2YWwpXG4gICAgICAgICAgICAgICAgOiBKU09OLnN0cmluZ2lmeSh2YWwpO1xuICAgICAgICAgICAgY29uc3QgbWFwcGluZyA9IHN0ZXAuY29uZmlnLm1hcHBpbmcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgICBuZXdEYXRhW2ZpZWxkXSA9IG1hcHBpbmdbb2xkVmFsXSB8fCBuZXdEYXRhW2ZpZWxkXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVHlwZSBjYXN0aW5nXG4gICAgICAgICAgZWxzZSBpZiAoc3RlcC5jb25maWcudHJhbnNmb3JtID09PSAnVE9fTlVNQkVSJykge1xuICAgICAgICAgICAgbmV3RGF0YVtmaWVsZF0gPSBOdW1iZXIobmV3RGF0YVtmaWVsZF0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3RlcC5jb25maWcudHJhbnNmb3JtID09PSAnVE9fU1RSSU5HJykge1xuICAgICAgICAgICAgY29uc3QgdmFsID0gbmV3RGF0YVtmaWVsZF07XG4gICAgICAgICAgICBuZXdEYXRhW2ZpZWxkXSA9XG4gICAgICAgICAgICAgIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWwgPT09ICdudW1iZXInXG4gICAgICAgICAgICAgICAgPyBTdHJpbmcodmFsKVxuICAgICAgICAgICAgICAgIDogSlNPTi5zdHJpbmdpZnkodmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFVua25vd24gbWlncmF0aW9uIHN0ZXAgdHlwZTogJHtzdGVwLnR5cGV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0RhdGE7XG4gIH1cbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/39/schemamigrationservice_399aa855c7775eaa61d46c3a49de20bb.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/39/schemamigrationservice_399aa855c7775eaa61d46c3a49de20bb.map new file mode 100644 index 0000000..4014976 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/39/schemamigrationservice_399aa855c7775eaa61d46c3a49de20bb.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\services\\schema-migration.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\services\\schema-migration.service.ts"],"sourcesContent":["// File: src/modules/json-schema/services/schema-migration.service.ts\nimport { Injectable, Logger, BadRequestException } from '@nestjs/common';\nimport { DataSource } from 'typeorm';\nimport { JsonSchemaService } from '../json-schema.service';\n\nexport interface MigrationStep {\n type:\n | 'FIELD_RENAME'\n | 'FIELD_TRANSFORM'\n | 'FIELD_ADD'\n | 'FIELD_REMOVE'\n | 'STRUCTURE_CHANGE';\n config: Record;\n}\n\nexport interface MigrationResult {\n success: boolean;\n fromVersion: number;\n toVersion: number;\n migratedFields: string[];\n error?: string;\n}\n\n@Injectable()\nexport class SchemaMigrationService {\n private readonly logger = new Logger(SchemaMigrationService.name);\n\n constructor(\n private readonly dataSource: DataSource,\n private readonly jsonSchemaService: JsonSchemaService\n ) {}\n\n /**\n * Migrate data for a specific entity to a target schema version\n */\n async migrateData(\n entityType: string, // e.g., 'rfa_revisions', 'correspondence_revisions'\n entityId: number,\n targetSchemaCode: string,\n targetVersion?: number\n ): Promise {\n const queryRunner = this.dataSource.createQueryRunner();\n await queryRunner.connect();\n await queryRunner.startTransaction();\n\n try {\n // 1. Get Target Schema\n let targetSchema;\n if (targetVersion) {\n targetSchema = await this.jsonSchemaService.findOneByCodeAndVersion(\n targetSchemaCode,\n targetVersion\n );\n } else {\n targetSchema =\n await this.jsonSchemaService.findLatestByCode(targetSchemaCode);\n }\n\n // 2. Fetch Entity Data & Current Version\n // Note: This assumes the entity table has 'details' (json) and 'schema_version' (int) columns\n // If schema_version is not present, we assume version 1\n const entities = await queryRunner.manager.query<\n { details: Record; schema_version: number }[]\n >(`SELECT details, schema_version FROM ${entityType} WHERE id = ?`, [\n entityId,\n ]);\n\n if (!entities || entities.length === 0) {\n throw new BadRequestException(\n `Entity ${entityType} with ID ${entityId} not found.`\n );\n }\n\n const entity = entities[0];\n const currentData = entity.details || {};\n const currentVersion = entity.schema_version || 1;\n\n if (currentVersion >= targetSchema.version) {\n return {\n success: true,\n fromVersion: currentVersion,\n toVersion: currentVersion,\n migratedFields: [], // No migration needed\n };\n }\n\n // 3. Find Migration Path (Iterative Upgrade)\n let migratedData = JSON.parse(JSON.stringify(currentData)) as Record<\n string,\n unknown\n >;\n const migratedFields: string[] = [];\n\n // Loop from current version up to target version\n for (let v = currentVersion + 1; v <= targetSchema.version; v++) {\n const schemaVer = await this.jsonSchemaService.findOneByCodeAndVersion(\n targetSchemaCode,\n v\n );\n\n if (schemaVer && schemaVer.migrationScript) {\n this.logger.log(\n `Applying migration script for ${targetSchemaCode} v${v}...`\n );\n\n const script = schemaVer.migrationScript;\n\n // Apply steps defined in migrationScript\n if (Array.isArray(script.steps)) {\n for (const step of script.steps as MigrationStep[]) {\n migratedData = this.applyMigrationStep(step, migratedData);\n const config = step.config as Record;\n if (config.field || config.new_field) {\n migratedFields.push(config.new_field || config.field);\n }\n }\n }\n }\n }\n\n // 4. Validate Migrated Data against Target Schema\n const validation = await this.jsonSchemaService.validateData(\n targetSchema.schemaCode,\n migratedData\n );\n\n if (!validation.isValid) {\n throw new BadRequestException(\n `Migration failed: Resulting data does not match target schema v${targetSchema.version}. Errors: ${JSON.stringify(validation.errors)}`\n );\n }\n\n // 5. Save Migrated Data\n // Update details AND schema_version\n await queryRunner.manager.query(\n `UPDATE ${entityType} SET details = ?, schema_version = ? WHERE id = ?`,\n [\n JSON.stringify(validation.sanitizedData),\n targetSchema.version,\n entityId,\n ]\n );\n\n await queryRunner.commitTransaction();\n\n return {\n success: true,\n fromVersion: currentVersion,\n toVersion: targetSchema.version,\n migratedFields: [...new Set(migratedFields)],\n };\n } catch (err: unknown) {\n await queryRunner.rollbackTransaction();\n this.logger.error(\n `Migration failed: ${err instanceof Error ? err.message : String(err)}`,\n err instanceof Error ? err.stack : undefined\n );\n throw err;\n } finally {\n await queryRunner.release();\n }\n }\n\n /**\n * Apply a single migration step\n */\n private applyMigrationStep(\n step: MigrationStep,\n data: Record\n ): Record {\n const newData = { ...data };\n\n const field = step.config.field as string;\n const oldField = step.config.old_field as string;\n const newField = step.config.new_field as string;\n\n switch (step.type) {\n case 'FIELD_RENAME':\n if (newData[oldField] !== undefined) {\n newData[newField] = newData[oldField];\n delete newData[oldField];\n }\n break;\n\n case 'FIELD_ADD':\n if (newData[field] === undefined) {\n newData[field] = step.config.default_value;\n }\n break;\n\n case 'FIELD_REMOVE':\n delete newData[field];\n break;\n\n case 'FIELD_TRANSFORM':\n if (newData[field] !== undefined) {\n // Simple transform logic (e.g., map values)\n if (step.config.transform === 'MAP_VALUES' && step.config.mapping) {\n const val = newData[field];\n const oldVal =\n typeof val === 'string' || typeof val === 'number'\n ? String(val)\n : JSON.stringify(val);\n const mapping = step.config.mapping as Record;\n newData[field] = mapping[oldVal] || newData[field];\n }\n // Type casting\n else if (step.config.transform === 'TO_NUMBER') {\n newData[field] = Number(newData[field]);\n } else if (step.config.transform === 'TO_STRING') {\n const val = newData[field];\n newData[field] =\n typeof val === 'string' || typeof val === 'number'\n ? String(val)\n : JSON.stringify(val);\n }\n }\n break;\n\n default:\n this.logger.warn(`Unknown migration step type: ${step.type}`);\n }\n\n return newData;\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/39/updatejsonschemadto_394841aa52929518040f7b49d36f3fb5 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/39/updatejsonschemadto_394841aa52929518040f7b49d36f3fb5 new file mode 100644 index 0000000..b247687 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/39/updatejsonschemadto_394841aa52929518040f7b49d36f3fb5 @@ -0,0 +1,10 @@ +d099cb5a737674d57be07d3581495e9a +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UpdateJsonSchemaDto = void 0; +const swagger_1 = require("@nestjs/swagger"); +const create_json_schema_dto_1 = require("./create-json-schema.dto"); +class UpdateJsonSchemaDto extends (0, swagger_1.PartialType)(create_json_schema_dto_1.CreateJsonSchemaDto) { +} +exports.UpdateJsonSchemaDto = UpdateJsonSchemaDto; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcanNvbi1zY2hlbWFcXGR0b1xcdXBkYXRlLWpzb24tc2NoZW1hLmR0by50cyIsIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBOEM7QUFDOUMscUVBQStEO0FBRS9ELE1BQWEsbUJBQW9CLFNBQVEsSUFBQSxxQkFBVyxFQUFDLDRDQUFtQixDQUFDO0NBQUc7QUFBNUUsa0RBQTRFIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGpzb24tc2NoZW1hXFxkdG9cXHVwZGF0ZS1qc29uLXNjaGVtYS5kdG8udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGFydGlhbFR5cGUgfSBmcm9tICdAbmVzdGpzL3N3YWdnZXInO1xuaW1wb3J0IHsgQ3JlYXRlSnNvblNjaGVtYUR0byB9IGZyb20gJy4vY3JlYXRlLWpzb24tc2NoZW1hLmR0byc7XG5cbmV4cG9ydCBjbGFzcyBVcGRhdGVKc29uU2NoZW1hRHRvIGV4dGVuZHMgUGFydGlhbFR5cGUoQ3JlYXRlSnNvblNjaGVtYUR0bykge31cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/39/updatejsonschemadto_394841aa52929518040f7b49d36f3fb5.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/39/updatejsonschemadto_394841aa52929518040f7b49d36f3fb5.map new file mode 100644 index 0000000..0bbc260 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/39/updatejsonschemadto_394841aa52929518040f7b49d36f3fb5.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\dto\\update-json-schema.dto.ts","mappings":";;;AAAA,6CAA8C;AAC9C,qEAA+D;AAE/D,MAAa,mBAAoB,SAAQ,IAAA,qBAAW,EAAC,4CAAmB,CAAC;CAAG;AAA5E,kDAA4E","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\dto\\update-json-schema.dto.ts"],"sourcesContent":["import { PartialType } from '@nestjs/swagger';\nimport { CreateJsonSchemaDto } from './create-json-schema.dto';\n\nexport class UpdateJsonSchemaDto extends PartialType(CreateJsonSchemaDto) {}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3b/contractdrawingvolumeentity_3b2f36c013c1b54da2256e298156fa0c b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3b/contractdrawingvolumeentity_3b2f36c013c1b54da2256e298156fa0c new file mode 100644 index 0000000..33af9f6 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3b/contractdrawingvolumeentity_3b2f36c013c1b54da2256e298156fa0c @@ -0,0 +1,60 @@ +54b3d231c625a5d63d6782fc95c10ab9 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ContractDrawingVolume = void 0; +const typeorm_1 = require("typeorm"); +const project_entity_1 = require("../../project/entities/project.entity"); +let ContractDrawingVolume = class ContractDrawingVolume { +}; +exports.ContractDrawingVolume = ContractDrawingVolume; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], ContractDrawingVolume.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id' }), + __metadata("design:type", Number) +], ContractDrawingVolume.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'volume_code', length: 50 }), + __metadata("design:type", String) +], ContractDrawingVolume.prototype, "volumeCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'volume_name', length: 255 }), + __metadata("design:type", String) +], ContractDrawingVolume.prototype, "volumeName", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], ContractDrawingVolume.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sort_order', default: 0 }), + __metadata("design:type", Number) +], ContractDrawingVolume.prototype, "sortOrder", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], ContractDrawingVolume.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], ContractDrawingVolume.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => project_entity_1.Project), + (0, typeorm_1.JoinColumn)({ name: 'project_id' }), + __metadata("design:type", typeof (_c = typeof project_entity_1.Project !== "undefined" && project_entity_1.Project) === "function" ? _c : Object) +], ContractDrawingVolume.prototype, "project", void 0); +exports.ContractDrawingVolume = ContractDrawingVolume = __decorate([ + (0, typeorm_1.Entity)('contract_drawing_volumes') +], ContractDrawingVolume); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXGNvbnRyYWN0LWRyYXdpbmctdm9sdW1lLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBUWlCO0FBQ2pCLDBFQUFnRTtBQUd6RCxJQUFNLHFCQUFxQixHQUEzQixNQUFNLHFCQUFxQjtDQTRCakMsQ0FBQTtBQTVCWSxzREFBcUI7QUFFaEM7SUFEQyxJQUFBLGdDQUFzQixHQUFFOztpREFDYjtBQUdaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDOzt3REFDWjtBQUduQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDOzt5REFDeEI7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7eURBQ3pCO0FBR3BCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7OzBEQUNwQjtBQUdyQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDOzt3REFDeEI7QUFHbkI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7d0RBQUM7QUFHakI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7d0RBQUM7QUFJakI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsd0JBQU8sQ0FBQztJQUN4QixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLHdCQUFPLG9CQUFQLHdCQUFPO3NEQUFDO2dDQTNCUCxxQkFBcUI7SUFEakMsSUFBQSxnQkFBTSxFQUFDLDBCQUEwQixDQUFDO0dBQ3RCLHFCQUFxQixDQTRCakMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXGNvbnRyYWN0LWRyYXdpbmctdm9sdW1lLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHksXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXG4gIENvbHVtbixcbiAgQ3JlYXRlRGF0ZUNvbHVtbixcbiAgVXBkYXRlRGF0ZUNvbHVtbixcbiAgTWFueVRvT25lLFxuICBKb2luQ29sdW1uLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0L2VudGl0aWVzL3Byb2plY3QuZW50aXR5JztcblxuQEVudGl0eSgnY29udHJhY3RfZHJhd2luZ192b2x1bWVzJylcbmV4cG9ydCBjbGFzcyBDb250cmFjdERyYXdpbmdWb2x1bWUge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIGlkITogbnVtYmVyOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBDb2x1bW4oeyBuYW1lOiAncHJvamVjdF9pZCcgfSlcbiAgcHJvamVjdElkITogbnVtYmVyOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBDb2x1bW4oeyBuYW1lOiAndm9sdW1lX2NvZGUnLCBsZW5ndGg6IDUwIH0pXG4gIHZvbHVtZUNvZGUhOiBzdHJpbmc7IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQENvbHVtbih7IG5hbWU6ICd2b2x1bWVfbmFtZScsIGxlbmd0aDogMjU1IH0pXG4gIHZvbHVtZU5hbWUhOiBzdHJpbmc7IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQENvbHVtbih7IHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7IC8vIE51bGxhYmxlIOC5g+C4iuC5iSA/XG5cbiAgQENvbHVtbih7IG5hbWU6ICdzb3J0X29yZGVyJywgZGVmYXVsdDogMCB9KVxuICBzb3J0T3JkZXIhOiBudW1iZXI7IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTsgLy8g4LmA4LiV4Li04LihICFcblxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxuICB1cGRhdGVkQXQhOiBEYXRlOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBNYW55VG9PbmUoKCkgPT4gUHJvamVjdClcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAncHJvamVjdF9pZCcgfSlcbiAgcHJvamVjdCE6IFByb2plY3Q7IC8vIOC5gOC4leC4tOC4oSAhICjguJXguLHguKfguJfguLXguYggRXJyb3IpXG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3b/contractdrawingvolumeentity_3b2f36c013c1b54da2256e298156fa0c.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3b/contractdrawingvolumeentity_3b2f36c013c1b54da2256e298156fa0c.map new file mode 100644 index 0000000..ad203e2 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3b/contractdrawingvolumeentity_3b2f36c013c1b54da2256e298156fa0c.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\contract-drawing-volume.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAQiB;AACjB,0EAAgE;AAGzD,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;CA4BjC,CAAA;AA5BY,sDAAqB;AAEhC;IADC,IAAA,gCAAsB,GAAE;;iDACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;wDACZ;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;yDACxB;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;yDACzB;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;0DACpB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;wDACxB;AAGnB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;wDAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;wDAAC;AAIjB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wBAAO,CAAC;IACxB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,wBAAO,oBAAP,wBAAO;sDAAC;gCA3BP,qBAAqB;IADjC,IAAA,gBAAM,EAAC,0BAA0B,CAAC;GACtB,qBAAqB,CA4BjC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\contract-drawing-volume.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n UpdateDateColumn,\n ManyToOne,\n JoinColumn,\n} from 'typeorm';\nimport { Project } from '../../project/entities/project.entity';\n\n@Entity('contract_drawing_volumes')\nexport class ContractDrawingVolume {\n @PrimaryGeneratedColumn()\n id!: number; // เติม !\n\n @Column({ name: 'project_id' })\n projectId!: number; // เติม !\n\n @Column({ name: 'volume_code', length: 50 })\n volumeCode!: string; // เติม !\n\n @Column({ name: 'volume_name', length: 255 })\n volumeName!: string; // เติม !\n\n @Column({ type: 'text', nullable: true })\n description?: string; // Nullable ใช้ ?\n\n @Column({ name: 'sort_order', default: 0 })\n sortOrder!: number; // เติม !\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date; // เติม !\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date; // เติม !\n\n @ManyToOne(() => Project)\n @JoinColumn({ name: 'project_id' })\n project!: Project; // เติม ! (ตัวที่ Error)\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3c/uuidresolverservice_3cb5b5fe1dbdff0417bdda978e024234 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3c/uuidresolverservice_3cb5b5fe1dbdff0417bdda978e024234 new file mode 100644 index 0000000..82103d0 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3c/uuidresolverservice_3cb5b5fe1dbdff0417bdda978e024234 @@ -0,0 +1,111 @@ +f6da0085c94bbbe103bac7886b88e668 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UuidResolverService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("typeorm"); +const uuid_1 = require("uuid"); +/** + * Shared service to resolve hybrid identifiers (INT | UUID string) to internal INT IDs. + * Eliminates duplicated resolveId helpers across 8+ services. + * + * @see ADR-019 Hybrid Identifier Strategy + */ +let UuidResolverService = class UuidResolverService { + constructor(dataSource) { + this.dataSource = dataSource; + } + /** + * Checks if a string value is a numeric string (not UUID). + * Returns the parsed number or null if not numeric. + */ + tryParseInt(value) { + const num = Number(value); + return isNaN(num) ? null : num; + } + /** + * Low-level UUID lookup: find entity by uuid column, return pkColumn value. + */ + async lookupByUuid(entityName, tableName, pkColumn, uuid) { + if (!(0, uuid_1.validate)(uuid)) { + throw new common_1.NotFoundException(`Invalid identifier for ${entityName}: ${uuid}`); + } + const rows = await this.dataSource.manager.query(`SELECT \`${pkColumn}\` FROM \`${tableName}\` WHERE \`uuid\` = ? LIMIT 1`, [uuid]); + if (!rows.length) { + throw new common_1.NotFoundException(`${entityName} with UUID ${uuid} not found`); + } + return rows[0][pkColumn]; + } + /** + * Generic resolver: accepts INT or UUID string, returns internal INT ID. + * - If value is a number, returns it directly. + * - If value is a numeric string, parses and returns it. + * - If value is a UUID string, looks up the entity by uuid column. + */ + async resolve(entityName, tableName, pkColumn, value) { + if (typeof value === 'number') + return value; + const num = this.tryParseInt(value); + if (num !== null) + return num; + return this.lookupByUuid(entityName, tableName, pkColumn, value); + } + /** + * Resolve projectId (INT or UUID string) to internal INT ID. + */ + async resolveProjectId(projectId) { + return this.resolve('Project', 'projects', 'id', projectId); + } + /** + * Resolve organizationId (INT or UUID string) to internal INT ID. + */ + async resolveOrganizationId(orgId) { + return this.resolve('Organization', 'organizations', 'id', orgId); + } + /** + * Resolve correspondenceId (INT or UUID string) to internal INT ID. + */ + async resolveCorrespondenceId(corrId) { + return this.resolve('Correspondence', 'correspondences', 'id', corrId); + } + /** + * Resolve userId (INT or UUID string) to internal user_id. + */ + async resolveUserId(userId) { + return this.resolve('User', 'users', 'user_id', userId); + } + /** + * Resolve contractId (INT or UUID string) to internal INT ID. + */ + async resolveContractId(contractId) { + return this.resolve('Contract', 'contracts', 'id', contractId); + } + /** + * Resolve shopDrawingRevisionId (INT or UUID string) to internal INT ID. + */ + async resolveShopDrawingRevisionId(shopDrawingRevisionId) { + return this.resolve('Shop Drawing Revision', 'shop_drawing_revisions', 'id', shopDrawingRevisionId); + } + /** + * Resolve asBuiltDrawingRevisionId (INT or UUID string) to internal INT ID. + */ + async resolveAsBuiltDrawingRevisionId(asBuiltDrawingRevisionId) { + return this.resolve('As-Built Drawing Revision', 'asbuilt_drawing_revisions', 'id', asBuiltDrawingRevisionId); + } +}; +exports.UuidResolverService = UuidResolverService; +exports.UuidResolverService = UuidResolverService = __decorate([ + (0, common_1.Injectable)(), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_1.DataSource !== "undefined" && typeorm_1.DataSource) === "function" ? _a : Object]) +], UuidResolverService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxzZXJ2aWNlc1xcdXVpZC1yZXNvbHZlci5zZXJ2aWNlLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBK0Q7QUFDL0QscUNBQXFDO0FBQ3JDLCtCQUFnRDtBQUVoRDs7Ozs7R0FLRztBQUVJLElBQU0sbUJBQW1CLEdBQXpCLE1BQU0sbUJBQW1CO0lBQzlCLFlBQTZCLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7SUFBRyxDQUFDO0lBRXZEOzs7T0FHRztJQUNLLFdBQVcsQ0FBQyxLQUFhO1FBQy9CLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDakMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFlBQVksQ0FDeEIsVUFBa0IsRUFDbEIsU0FBaUIsRUFDakIsUUFBZ0IsRUFDaEIsSUFBWTtRQUVaLElBQUksQ0FBQyxJQUFBLGVBQVksRUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSwwQkFBaUIsQ0FDekIsMEJBQTBCLFVBQVUsS0FBSyxJQUFJLEVBQUUsQ0FDaEQsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLElBQUksR0FBNkIsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQ3hFLFlBQVksUUFBUSxhQUFhLFNBQVMsK0JBQStCLEVBQ3pFLENBQUMsSUFBSSxDQUFDLENBQ1AsQ0FBQztRQUVGLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLDBCQUFpQixDQUFDLEdBQUcsVUFBVSxjQUFjLElBQUksWUFBWSxDQUFDLENBQUM7UUFDM0UsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQ1gsVUFBa0IsRUFDbEIsU0FBaUIsRUFDakIsUUFBZ0IsRUFDaEIsS0FBc0I7UUFFdEIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFNUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxJQUFJLEdBQUcsS0FBSyxJQUFJO1lBQUUsT0FBTyxHQUFHLENBQUM7UUFFN0IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxTQUEwQjtRQUMvQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLHFCQUFxQixDQUFDLEtBQXNCO1FBQ2hELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsdUJBQXVCLENBQUMsTUFBdUI7UUFDbkQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQXVCO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsaUJBQWlCLENBQUMsVUFBMkI7UUFDakQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyw0QkFBNEIsQ0FDaEMscUJBQXNDO1FBRXRDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FDakIsdUJBQXVCLEVBQ3ZCLHdCQUF3QixFQUN4QixJQUFJLEVBQ0oscUJBQXFCLENBQ3RCLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsK0JBQStCLENBQ25DLHdCQUF5QztRQUV6QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQ2pCLDJCQUEyQixFQUMzQiwyQkFBMkIsRUFDM0IsSUFBSSxFQUNKLHdCQUF3QixDQUN6QixDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUE7QUF6SFksa0RBQW1COzhCQUFuQixtQkFBbUI7SUFEL0IsSUFBQSxtQkFBVSxHQUFFO3lEQUU4QixvQkFBVSxvQkFBVixvQkFBVTtHQUR4QyxtQkFBbUIsQ0F5SC9CIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXGNvbW1vblxcc2VydmljZXNcXHV1aWQtcmVzb2x2ZXIuc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOb3RGb3VuZEV4Y2VwdGlvbiB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcbmltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IHZhbGlkYXRlIGFzIHV1aWRWYWxpZGF0ZSB9IGZyb20gJ3V1aWQnO1xuXG4vKipcbiAqIFNoYXJlZCBzZXJ2aWNlIHRvIHJlc29sdmUgaHlicmlkIGlkZW50aWZpZXJzIChJTlQgfCBVVUlEIHN0cmluZykgdG8gaW50ZXJuYWwgSU5UIElEcy5cbiAqIEVsaW1pbmF0ZXMgZHVwbGljYXRlZCByZXNvbHZlSWQgaGVscGVycyBhY3Jvc3MgOCsgc2VydmljZXMuXG4gKlxuICogQHNlZSBBRFItMDE5IEh5YnJpZCBJZGVudGlmaWVyIFN0cmF0ZWd5XG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBVdWlkUmVzb2x2ZXJTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkYXRhU291cmNlOiBEYXRhU291cmNlKSB7fVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBzdHJpbmcgdmFsdWUgaXMgYSBudW1lcmljIHN0cmluZyAobm90IFVVSUQpLlxuICAgKiBSZXR1cm5zIHRoZSBwYXJzZWQgbnVtYmVyIG9yIG51bGwgaWYgbm90IG51bWVyaWMuXG4gICAqL1xuICBwcml2YXRlIHRyeVBhcnNlSW50KHZhbHVlOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBudW0gPSBOdW1iZXIodmFsdWUpO1xuICAgIHJldHVybiBpc05hTihudW0pID8gbnVsbCA6IG51bTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb3ctbGV2ZWwgVVVJRCBsb29rdXA6IGZpbmQgZW50aXR5IGJ5IHV1aWQgY29sdW1uLCByZXR1cm4gcGtDb2x1bW4gdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxvb2t1cEJ5VXVpZChcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgcGtDb2x1bW46IHN0cmluZyxcbiAgICB1dWlkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAoIXV1aWRWYWxpZGF0ZSh1dWlkKSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFxuICAgICAgICBgSW52YWxpZCBpZGVudGlmaWVyIGZvciAke2VudGl0eU5hbWV9OiAke3V1aWR9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCByb3dzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+W10gPSBhd2FpdCB0aGlzLmRhdGFTb3VyY2UubWFuYWdlci5xdWVyeShcbiAgICAgIGBTRUxFQ1QgXFxgJHtwa0NvbHVtbn1cXGAgRlJPTSBcXGAke3RhYmxlTmFtZX1cXGAgV0hFUkUgXFxgdXVpZFxcYCA9ID8gTElNSVQgMWAsXG4gICAgICBbdXVpZF1cbiAgICApO1xuXG4gICAgaWYgKCFyb3dzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKGAke2VudGl0eU5hbWV9IHdpdGggVVVJRCAke3V1aWR9IG5vdCBmb3VuZGApO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzWzBdW3BrQ29sdW1uXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmljIHJlc29sdmVyOiBhY2NlcHRzIElOVCBvciBVVUlEIHN0cmluZywgcmV0dXJucyBpbnRlcm5hbCBJTlQgSUQuXG4gICAqIC0gSWYgdmFsdWUgaXMgYSBudW1iZXIsIHJldHVybnMgaXQgZGlyZWN0bHkuXG4gICAqIC0gSWYgdmFsdWUgaXMgYSBudW1lcmljIHN0cmluZywgcGFyc2VzIGFuZCByZXR1cm5zIGl0LlxuICAgKiAtIElmIHZhbHVlIGlzIGEgVVVJRCBzdHJpbmcsIGxvb2tzIHVwIHRoZSBlbnRpdHkgYnkgdXVpZCBjb2x1bW4uXG4gICAqL1xuICBhc3luYyByZXNvbHZlKFxuICAgIGVudGl0eU5hbWU6IHN0cmluZyxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBwa0NvbHVtbjogc3RyaW5nLFxuICAgIHZhbHVlOiBudW1iZXIgfCBzdHJpbmdcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIHZhbHVlO1xuXG4gICAgY29uc3QgbnVtID0gdGhpcy50cnlQYXJzZUludCh2YWx1ZSk7XG4gICAgaWYgKG51bSAhPT0gbnVsbCkgcmV0dXJuIG51bTtcblxuICAgIHJldHVybiB0aGlzLmxvb2t1cEJ5VXVpZChlbnRpdHlOYW1lLCB0YWJsZU5hbWUsIHBrQ29sdW1uLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBwcm9qZWN0SWQgKElOVCBvciBVVUlEIHN0cmluZykgdG8gaW50ZXJuYWwgSU5UIElELlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZVByb2plY3RJZChwcm9qZWN0SWQ6IG51bWJlciB8IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZSgnUHJvamVjdCcsICdwcm9qZWN0cycsICdpZCcsIHByb2plY3RJZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBvcmdhbml6YXRpb25JZCAoSU5UIG9yIFVVSUQgc3RyaW5nKSB0byBpbnRlcm5hbCBJTlQgSUQuXG4gICAqL1xuICBhc3luYyByZXNvbHZlT3JnYW5pemF0aW9uSWQob3JnSWQ6IG51bWJlciB8IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZSgnT3JnYW5pemF0aW9uJywgJ29yZ2FuaXphdGlvbnMnLCAnaWQnLCBvcmdJZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBjb3JyZXNwb25kZW5jZUlkIChJTlQgb3IgVVVJRCBzdHJpbmcpIHRvIGludGVybmFsIElOVCBJRC5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVDb3JyZXNwb25kZW5jZUlkKGNvcnJJZDogbnVtYmVyIHwgc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlKCdDb3JyZXNwb25kZW5jZScsICdjb3JyZXNwb25kZW5jZXMnLCAnaWQnLCBjb3JySWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdXNlcklkIChJTlQgb3IgVVVJRCBzdHJpbmcpIHRvIGludGVybmFsIHVzZXJfaWQuXG4gICAqL1xuICBhc3luYyByZXNvbHZlVXNlcklkKHVzZXJJZDogbnVtYmVyIHwgc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlKCdVc2VyJywgJ3VzZXJzJywgJ3VzZXJfaWQnLCB1c2VySWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgY29udHJhY3RJZCAoSU5UIG9yIFVVSUQgc3RyaW5nKSB0byBpbnRlcm5hbCBJTlQgSUQuXG4gICAqL1xuICBhc3luYyByZXNvbHZlQ29udHJhY3RJZChjb250cmFjdElkOiBudW1iZXIgfCBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmUoJ0NvbnRyYWN0JywgJ2NvbnRyYWN0cycsICdpZCcsIGNvbnRyYWN0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgc2hvcERyYXdpbmdSZXZpc2lvbklkIChJTlQgb3IgVVVJRCBzdHJpbmcpIHRvIGludGVybmFsIElOVCBJRC5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVTaG9wRHJhd2luZ1JldmlzaW9uSWQoXG4gICAgc2hvcERyYXdpbmdSZXZpc2lvbklkOiBudW1iZXIgfCBzdHJpbmdcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlKFxuICAgICAgJ1Nob3AgRHJhd2luZyBSZXZpc2lvbicsXG4gICAgICAnc2hvcF9kcmF3aW5nX3JldmlzaW9ucycsXG4gICAgICAnaWQnLFxuICAgICAgc2hvcERyYXdpbmdSZXZpc2lvbklkXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGFzQnVpbHREcmF3aW5nUmV2aXNpb25JZCAoSU5UIG9yIFVVSUQgc3RyaW5nKSB0byBpbnRlcm5hbCBJTlQgSUQuXG4gICAqL1xuICBhc3luYyByZXNvbHZlQXNCdWlsdERyYXdpbmdSZXZpc2lvbklkKFxuICAgIGFzQnVpbHREcmF3aW5nUmV2aXNpb25JZDogbnVtYmVyIHwgc3RyaW5nXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZShcbiAgICAgICdBcy1CdWlsdCBEcmF3aW5nIFJldmlzaW9uJyxcbiAgICAgICdhc2J1aWx0X2RyYXdpbmdfcmV2aXNpb25zJyxcbiAgICAgICdpZCcsXG4gICAgICBhc0J1aWx0RHJhd2luZ1JldmlzaW9uSWRcbiAgICApO1xuICB9XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3c/uuidresolverservice_3cb5b5fe1dbdff0417bdda978e024234.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3c/uuidresolverservice_3cb5b5fe1dbdff0417bdda978e024234.map new file mode 100644 index 0000000..eda7c4c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/3c/uuidresolverservice_3cb5b5fe1dbdff0417bdda978e024234.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\services\\uuid-resolver.service.ts","mappings":";;;;;;;;;;;;;AAAA,2CAA+D;AAC/D,qCAAqC;AACrC,+BAAgD;AAEhD;;;;;GAKG;AAEI,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAC9B,YAA6B,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAEvD;;;OAGG;IACK,WAAW,CAAC,KAAa;QAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IACjC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CACxB,UAAkB,EAClB,SAAiB,EACjB,QAAgB,EAChB,IAAY;QAEZ,IAAI,CAAC,IAAA,eAAY,EAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,0BAAiB,CACzB,0BAA0B,UAAU,KAAK,IAAI,EAAE,CAChD,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAA6B,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CACxE,YAAY,QAAQ,aAAa,SAAS,+BAA+B,EACzE,CAAC,IAAI,CAAC,CACP,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,0BAAiB,CAAC,GAAG,UAAU,cAAc,IAAI,YAAY,CAAC,CAAC;QAC3E,CAAC;QAED,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,OAAO,CACX,UAAkB,EAClB,SAAiB,EACjB,QAAgB,EAChB,KAAsB;QAEtB,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAE5C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,GAAG,CAAC;QAE7B,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACnE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,SAA0B;QAC/C,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,qBAAqB,CAAC,KAAsB;QAChD,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,eAAe,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACpE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,uBAAuB,CAAC,MAAuB;QACnD,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACzE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,MAAuB;QACzC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,UAA2B;QACjD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACjE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,4BAA4B,CAChC,qBAAsC;QAEtC,OAAO,IAAI,CAAC,OAAO,CACjB,uBAAuB,EACvB,wBAAwB,EACxB,IAAI,EACJ,qBAAqB,CACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,+BAA+B,CACnC,wBAAyC;QAEzC,OAAO,IAAI,CAAC,OAAO,CACjB,2BAA2B,EAC3B,2BAA2B,EAC3B,IAAI,EACJ,wBAAwB,CACzB,CAAC;IACJ,CAAC;CACF,CAAA;AAzHY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,mBAAU,GAAE;yDAE8B,oBAAU,oBAAV,oBAAU;GADxC,mBAAmB,CAyH/B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\services\\uuid-resolver.service.ts"],"sourcesContent":["import { Injectable, NotFoundException } from '@nestjs/common';\nimport { DataSource } from 'typeorm';\nimport { validate as uuidValidate } from 'uuid';\n\n/**\n * Shared service to resolve hybrid identifiers (INT | UUID string) to internal INT IDs.\n * Eliminates duplicated resolveId helpers across 8+ services.\n *\n * @see ADR-019 Hybrid Identifier Strategy\n */\n@Injectable()\nexport class UuidResolverService {\n constructor(private readonly dataSource: DataSource) {}\n\n /**\n * Checks if a string value is a numeric string (not UUID).\n * Returns the parsed number or null if not numeric.\n */\n private tryParseInt(value: string): number | null {\n const num = Number(value);\n return isNaN(num) ? null : num;\n }\n\n /**\n * Low-level UUID lookup: find entity by uuid column, return pkColumn value.\n */\n private async lookupByUuid(\n entityName: string,\n tableName: string,\n pkColumn: string,\n uuid: string\n ): Promise {\n if (!uuidValidate(uuid)) {\n throw new NotFoundException(\n `Invalid identifier for ${entityName}: ${uuid}`\n );\n }\n\n const rows: Record[] = await this.dataSource.manager.query(\n `SELECT \\`${pkColumn}\\` FROM \\`${tableName}\\` WHERE \\`uuid\\` = ? LIMIT 1`,\n [uuid]\n );\n\n if (!rows.length) {\n throw new NotFoundException(`${entityName} with UUID ${uuid} not found`);\n }\n\n return rows[0][pkColumn];\n }\n\n /**\n * Generic resolver: accepts INT or UUID string, returns internal INT ID.\n * - If value is a number, returns it directly.\n * - If value is a numeric string, parses and returns it.\n * - If value is a UUID string, looks up the entity by uuid column.\n */\n async resolve(\n entityName: string,\n tableName: string,\n pkColumn: string,\n value: number | string\n ): Promise {\n if (typeof value === 'number') return value;\n\n const num = this.tryParseInt(value);\n if (num !== null) return num;\n\n return this.lookupByUuid(entityName, tableName, pkColumn, value);\n }\n\n /**\n * Resolve projectId (INT or UUID string) to internal INT ID.\n */\n async resolveProjectId(projectId: number | string): Promise {\n return this.resolve('Project', 'projects', 'id', projectId);\n }\n\n /**\n * Resolve organizationId (INT or UUID string) to internal INT ID.\n */\n async resolveOrganizationId(orgId: number | string): Promise {\n return this.resolve('Organization', 'organizations', 'id', orgId);\n }\n\n /**\n * Resolve correspondenceId (INT or UUID string) to internal INT ID.\n */\n async resolveCorrespondenceId(corrId: number | string): Promise {\n return this.resolve('Correspondence', 'correspondences', 'id', corrId);\n }\n\n /**\n * Resolve userId (INT or UUID string) to internal user_id.\n */\n async resolveUserId(userId: number | string): Promise {\n return this.resolve('User', 'users', 'user_id', userId);\n }\n\n /**\n * Resolve contractId (INT or UUID string) to internal INT ID.\n */\n async resolveContractId(contractId: number | string): Promise {\n return this.resolve('Contract', 'contracts', 'id', contractId);\n }\n\n /**\n * Resolve shopDrawingRevisionId (INT or UUID string) to internal INT ID.\n */\n async resolveShopDrawingRevisionId(\n shopDrawingRevisionId: number | string\n ): Promise {\n return this.resolve(\n 'Shop Drawing Revision',\n 'shop_drawing_revisions',\n 'id',\n shopDrawingRevisionId\n );\n }\n\n /**\n * Resolve asBuiltDrawingRevisionId (INT or UUID string) to internal INT ID.\n */\n async resolveAsBuiltDrawingRevisionId(\n asBuiltDrawingRevisionId: number | string\n ): Promise {\n return this.resolve(\n 'As-Built Drawing Revision',\n 'asbuilt_drawing_revisions',\n 'id',\n asBuiltDrawingRevisionId\n );\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/45/jestsetup_454824338728b276d821dbd4aebb4c28 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/45/jestsetup_454824338728b276d821dbd4aebb4c28 new file mode 100644 index 0000000..96f7f0c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/45/jestsetup_454824338728b276d821dbd4aebb4c28 @@ -0,0 +1,40 @@ +d591a39eb268253e7b6d6e7cfd633e9b +"use strict"; +/** + * Jest Global Setup + * + * ตั้งค่า global สำหรับทุก test file + * @see specs/05-Engineering-Guidelines/05-04-testing-strategy.md + */ +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +// Global test timeout (30 วินาที) +jest.setTimeout(30000); +// Mock console methods ใน test environment +// ลด noise ใน test output แต่ยังเก็บ error ไว้ +const originalConsole = { + log: console.log, + info: console.info, + warn: console.warn, +}; +global.beforeAll(() => { + // Suppress console.log ใน test (ยกเว้น error) + console.log = jest.fn(); + console.info = jest.fn(); + console.warn = jest.fn(); +}); +global.afterAll(() => { + // Restore original console methods + console.log = originalConsole.log; + console.info = originalConsole.info; + console.warn = originalConsole.warn; +}); +// Clean up mocks หลังจากแต่ละ test +afterEach(() => { + jest.clearAllMocks(); +}); +// Global error handler สำหรับ unhandled promises +process.on('unhandledRejection', (reason) => { + console.error('Unhandled Promise Rejection:', reason); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHRlc3RcXGplc3Quc2V0dXAudHMiLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOztBQUVILDRCQUEwQjtBQUUxQixrQ0FBa0M7QUFDbEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUV2QiwyQ0FBMkM7QUFDM0MsK0NBQStDO0FBQy9DLE1BQU0sZUFBZSxHQUFHO0lBQ3RCLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRztJQUNoQixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7SUFDbEIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO0NBQ25CLENBQUM7QUFFRixNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtJQUNwQiw4Q0FBOEM7SUFDOUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDeEIsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDekIsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7QUFDM0IsQ0FBQyxDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRTtJQUNuQixtQ0FBbUM7SUFDbkMsT0FBTyxDQUFDLEdBQUcsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDO0lBQ2xDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQztJQUNwQyxPQUFPLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUM7QUFDdEMsQ0FBQyxDQUFDLENBQUM7QUFFSCxtQ0FBbUM7QUFDbkMsU0FBUyxDQUFDLEdBQUcsRUFBRTtJQUNiLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztBQUN2QixDQUFDLENBQUMsQ0FBQztBQUVILGlEQUFpRDtBQUNqRCxPQUFPLENBQUMsRUFBRSxDQUFDLG9CQUFvQixFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7SUFDMUMsT0FBTyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN4RCxDQUFDLENBQUMsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcdGVzdFxcamVzdC5zZXR1cC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogSmVzdCBHbG9iYWwgU2V0dXBcclxuICpcclxuICog4LiV4Lix4LmJ4LiH4LiE4LmI4LiyIGdsb2JhbCDguKrguLPguKvguKPguLHguJrguJfguLjguIEgdGVzdCBmaWxlXHJcbiAqIEBzZWUgc3BlY3MvMDUtRW5naW5lZXJpbmctR3VpZGVsaW5lcy8wNS0wNC10ZXN0aW5nLXN0cmF0ZWd5Lm1kXHJcbiAqL1xyXG5cclxuaW1wb3J0ICdyZWZsZWN0LW1ldGFkYXRhJztcclxuXHJcbi8vIEdsb2JhbCB0ZXN0IHRpbWVvdXQgKDMwIOC4p+C4tOC4meC4suC4l+C4tSlcclxuamVzdC5zZXRUaW1lb3V0KDMwMDAwKTtcclxuXHJcbi8vIE1vY2sgY29uc29sZSBtZXRob2RzIOC5g+C4mSB0ZXN0IGVudmlyb25tZW50XHJcbi8vIOC4peC4lCBub2lzZSDguYPguJkgdGVzdCBvdXRwdXQg4LmB4LiV4LmI4Lii4Lix4LiH4LmA4LiB4LmH4LiaIGVycm9yIOC5hOC4p+C5iVxyXG5jb25zdCBvcmlnaW5hbENvbnNvbGUgPSB7XHJcbiAgbG9nOiBjb25zb2xlLmxvZyxcclxuICBpbmZvOiBjb25zb2xlLmluZm8sXHJcbiAgd2FybjogY29uc29sZS53YXJuLFxyXG59O1xyXG5cclxuZ2xvYmFsLmJlZm9yZUFsbCgoKSA9PiB7XHJcbiAgLy8gU3VwcHJlc3MgY29uc29sZS5sb2cg4LmD4LiZIHRlc3QgKOC4ouC4geC5gOC4p+C5ieC4mSBlcnJvcilcclxuICBjb25zb2xlLmxvZyA9IGplc3QuZm4oKTtcclxuICBjb25zb2xlLmluZm8gPSBqZXN0LmZuKCk7XHJcbiAgY29uc29sZS53YXJuID0gamVzdC5mbigpO1xyXG59KTtcclxuXHJcbmdsb2JhbC5hZnRlckFsbCgoKSA9PiB7XHJcbiAgLy8gUmVzdG9yZSBvcmlnaW5hbCBjb25zb2xlIG1ldGhvZHNcclxuICBjb25zb2xlLmxvZyA9IG9yaWdpbmFsQ29uc29sZS5sb2c7XHJcbiAgY29uc29sZS5pbmZvID0gb3JpZ2luYWxDb25zb2xlLmluZm87XHJcbiAgY29uc29sZS53YXJuID0gb3JpZ2luYWxDb25zb2xlLndhcm47XHJcbn0pO1xyXG5cclxuLy8gQ2xlYW4gdXAgbW9ja3Mg4Lir4Lil4Lix4LiH4LiI4Liy4LiB4LmB4LiV4LmI4Lil4LiwIHRlc3RcclxuYWZ0ZXJFYWNoKCgpID0+IHtcclxuICBqZXN0LmNsZWFyQWxsTW9ja3MoKTtcclxufSk7XHJcblxyXG4vLyBHbG9iYWwgZXJyb3IgaGFuZGxlciDguKrguLPguKvguKPguLHguJogdW5oYW5kbGVkIHByb21pc2VzXHJcbnByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsIChyZWFzb24pID0+IHtcclxuICBjb25zb2xlLmVycm9yKCdVbmhhbmRsZWQgUHJvbWlzZSBSZWplY3Rpb246JywgcmVhc29uKTtcclxufSk7XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/45/jestsetup_454824338728b276d821dbd4aebb4c28.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/45/jestsetup_454824338728b276d821dbd4aebb4c28.map new file mode 100644 index 0000000..67a8884 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/45/jestsetup_454824338728b276d821dbd4aebb4c28.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\test\\jest.setup.ts","mappings":";AAAA;;;;;GAKG;;AAEH,4BAA0B;AAE1B,kCAAkC;AAClC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAEvB,2CAA2C;AAC3C,+CAA+C;AAC/C,MAAM,eAAe,GAAG;IACtB,GAAG,EAAE,OAAO,CAAC,GAAG;IAChB,IAAI,EAAE,OAAO,CAAC,IAAI;IAClB,IAAI,EAAE,OAAO,CAAC,IAAI;CACnB,CAAC;AAEF,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE;IACpB,8CAA8C;IAC9C,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IACxB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IACzB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE;IACnB,mCAAmC;IACnC,OAAO,CAAC,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC;IAClC,OAAO,CAAC,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC;IACpC,OAAO,CAAC,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC;AACtC,CAAC,CAAC,CAAC;AAEH,mCAAmC;AACnC,SAAS,CAAC,GAAG,EAAE;IACb,IAAI,CAAC,aAAa,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,iDAAiD;AACjD,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;IAC1C,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,MAAM,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\test\\jest.setup.ts"],"sourcesContent":["/**\r\n * Jest Global Setup\r\n *\r\n * ตั้งค่า global สำหรับทุก test file\r\n * @see specs/05-Engineering-Guidelines/05-04-testing-strategy.md\r\n */\r\n\r\nimport 'reflect-metadata';\r\n\r\n// Global test timeout (30 วินาที)\r\njest.setTimeout(30000);\r\n\r\n// Mock console methods ใน test environment\r\n// ลด noise ใน test output แต่ยังเก็บ error ไว้\r\nconst originalConsole = {\r\n log: console.log,\r\n info: console.info,\r\n warn: console.warn,\r\n};\r\n\r\nglobal.beforeAll(() => {\r\n // Suppress console.log ใน test (ยกเว้น error)\r\n console.log = jest.fn();\r\n console.info = jest.fn();\r\n console.warn = jest.fn();\r\n});\r\n\r\nglobal.afterAll(() => {\r\n // Restore original console methods\r\n console.log = originalConsole.log;\r\n console.info = originalConsole.info;\r\n console.warn = originalConsole.warn;\r\n});\r\n\r\n// Clean up mocks หลังจากแต่ละ test\r\nafterEach(() => {\r\n jest.clearAllMocks();\r\n});\r\n\r\n// Global error handler สำหรับ unhandled promises\r\nprocess.on('unhandledRejection', (reason) => {\r\n console.error('Unhandled Promise Rejection:', reason);\r\n});\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/46/duedatereminderservicespec_4619003876a0356c456881bcac752b3f b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/46/duedatereminderservicespec_4619003876a0356c456881bcac752b3f new file mode 100644 index 0000000..2c29059 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/46/duedatereminderservicespec_4619003876a0356c456881bcac752b3f @@ -0,0 +1,201 @@ +eef37cfa9b4ca3b7e0bb60d18781ecd4 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const testing_1 = require("@nestjs/testing"); +const typeorm_1 = require("@nestjs/typeorm"); +const due_date_reminder_service_1 = require("./due-date-reminder.service"); +const correspondence_revision_entity_1 = require("./entities/correspondence-revision.entity"); +const notification_service_1 = require("../notification/notification.service"); +const user_service_1 = require("../user/user.service"); +describe('DueDateReminderService', () => { + let service; + let revisionRepo; + let notificationService; + let userService; + const mockRevisionRepo = () => ({ + find: jest.fn(), + }); + const mockNotificationService = () => ({ + send: jest.fn().mockResolvedValue(undefined), + }); + const mockUserService = () => ({ + findDocControlIdByOrg: jest.fn(), + }); + beforeEach(async () => { + const module = await testing_1.Test.createTestingModule({ + providers: [ + due_date_reminder_service_1.DueDateReminderService, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_revision_entity_1.CorrespondenceRevision), + useFactory: mockRevisionRepo, + }, + { + provide: notification_service_1.NotificationService, + useFactory: mockNotificationService, + }, + { + provide: user_service_1.UserService, + useFactory: mockUserService, + }, + ], + }).compile(); + service = module.get(due_date_reminder_service_1.DueDateReminderService); + revisionRepo = module.get((0, typeorm_1.getRepositoryToken)(correspondence_revision_entity_1.CorrespondenceRevision)); + notificationService = module.get(notification_service_1.NotificationService); + userService = module.get(user_service_1.UserService); + }); + afterEach(() => { + jest.clearAllMocks(); + }); + describe('sendDueDateReminders', () => { + it('should do nothing when no revisions are approaching due date', async () => { + revisionRepo.find.mockResolvedValue([]); + await service.sendDueDateReminders(); + expect(notificationService.send).not.toHaveBeenCalled(); + }); + it('should skip revisions with no correspondence', async () => { + revisionRepo.find.mockResolvedValue([ + { + correspondence: null, + status: { statusCode: 'DRAFT' }, + dueDate: new Date(), + }, + ]); + await service.sendDueDateReminders(); + expect(notificationService.send).not.toHaveBeenCalled(); + }); + it('should skip cancelled correspondences', async () => { + revisionRepo.find.mockResolvedValue([ + { + correspondence: { + id: 1, + publicId: 'uuid-1', + correspondenceNumber: 'LC-001', + originatorId: 10, + }, + status: { statusCode: 'CANCELLED' }, + subject: 'Test', + dueDate: new Date(Date.now() + 86400000), + }, + ]); + await service.sendDueDateReminders(); + expect(notificationService.send).not.toHaveBeenCalled(); + }); + it('should skip closed (CLBOWN) correspondences', async () => { + revisionRepo.find.mockResolvedValue([ + { + correspondence: { + id: 1, + publicId: 'uuid-1', + correspondenceNumber: 'LC-001', + originatorId: 10, + }, + status: { statusCode: 'CLBOWN' }, + subject: 'Test', + dueDate: new Date(Date.now() + 86400000), + }, + ]); + await service.sendDueDateReminders(); + expect(notificationService.send).not.toHaveBeenCalled(); + }); + it('should skip when no doc-control user found for org', async () => { + revisionRepo.find.mockResolvedValue([ + { + correspondence: { + id: 1, + publicId: 'uuid-1', + correspondenceNumber: 'LC-001', + originatorId: 10, + }, + status: { statusCode: 'DRAFT' }, + subject: 'Test Subject', + dueDate: new Date(Date.now() + 86400000), + }, + ]); + userService.findDocControlIdByOrg.mockResolvedValue(null); + await service.sendDueDateReminders(); + expect(notificationService.send).not.toHaveBeenCalled(); + }); + it('should send EMAIL notification for a valid approaching due date', async () => { + const dueDate = new Date(Date.now() + 86400000 * 2); // 2 days later + revisionRepo.find.mockResolvedValue([ + { + correspondence: { + id: 5, + publicId: 'corr-uuid-1', + correspondenceNumber: 'LC-TEST-001', + originatorId: 10, + }, + status: { statusCode: 'SUBOWN' }, + subject: 'Design Review Request', + dueDate, + }, + ]); + userService.findDocControlIdByOrg.mockResolvedValue(42); + await service.sendDueDateReminders(); + expect(userService.findDocControlIdByOrg).toHaveBeenCalledWith(10); + expect(notificationService.send).toHaveBeenCalledWith(expect.objectContaining({ + userId: 42, + title: 'Due Date Approaching', + type: 'EMAIL', + entityType: 'correspondence', + entityId: 5, + link: '/correspondences/corr-uuid-1', + })); + }); + it('should handle errors per revision without stopping other notifications', async () => { + const dueDate = new Date(Date.now() + 86400000); + revisionRepo.find.mockResolvedValue([ + { + correspondence: { + id: 1, + publicId: 'uuid-1', + correspondenceNumber: 'LC-001', + originatorId: 10, + }, + status: { statusCode: 'SUBOWN' }, + subject: 'First', + dueDate, + }, + { + correspondence: { + id: 2, + publicId: 'uuid-2', + correspondenceNumber: 'LC-002', + originatorId: 20, + }, + status: { statusCode: 'SUBOWN' }, + subject: 'Second', + dueDate, + }, + ]); + userService.findDocControlIdByOrg + .mockResolvedValueOnce(42) + .mockRejectedValueOnce(new Error('DB error')); + await service.sendDueDateReminders(); + expect(notificationService.send).toHaveBeenCalledTimes(1); + }); + it('should correctly calculate daysLeft in the message', async () => { + const dueDate = new Date(Date.now() + 86400000); // exactly 1 day + revisionRepo.find.mockResolvedValue([ + { + correspondence: { + id: 3, + publicId: 'uuid-3', + correspondenceNumber: 'LC-003', + originatorId: 5, + }, + status: { statusCode: 'DRAFT' }, + subject: 'Urgent Document', + dueDate, + }, + ]); + userService.findDocControlIdByOrg.mockResolvedValue(99); + await service.sendDueDateReminders(); + expect(notificationService.send).toHaveBeenCalledWith(expect.objectContaining({ + message: expect.stringContaining('1 day'), + })); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGR1ZS1kYXRlLXJlbWluZGVyLnNlcnZpY2Uuc3BlYy50cyIsIm1hcHBpbmdzIjoiOztBQUFBLDZDQUFzRDtBQUN0RCw2Q0FBcUQ7QUFDckQsMkVBQXFFO0FBQ3JFLDhGQUFtRjtBQUNuRiwrRUFBMkU7QUFDM0UsdURBQW1EO0FBRW5ELFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUU7SUFDdEMsSUFBSSxPQUErQixDQUFDO0lBQ3BDLElBQUksWUFBaUMsQ0FBQztJQUN0QyxJQUFJLG1CQUF3QyxDQUFDO0lBQzdDLElBQUksV0FBaUQsQ0FBQztJQUV0RCxNQUFNLGdCQUFnQixHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDOUIsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7S0FDaEIsQ0FBQyxDQUFDO0lBRUgsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDO0tBQzdDLENBQUMsQ0FBQztJQUVILE1BQU0sZUFBZSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDN0IscUJBQXFCLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtLQUNqQyxDQUFDLENBQUM7SUFFSCxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDcEIsTUFBTSxNQUFNLEdBQWtCLE1BQU0sY0FBSSxDQUFDLG1CQUFtQixDQUFDO1lBQzNELFNBQVMsRUFBRTtnQkFDVCxrREFBc0I7Z0JBQ3RCO29CQUNFLE9BQU8sRUFBRSxJQUFBLDRCQUFrQixFQUFDLHVEQUFzQixDQUFDO29CQUNuRCxVQUFVLEVBQUUsZ0JBQWdCO2lCQUM3QjtnQkFDRDtvQkFDRSxPQUFPLEVBQUUsMENBQW1CO29CQUM1QixVQUFVLEVBQUUsdUJBQXVCO2lCQUNwQztnQkFDRDtvQkFDRSxPQUFPLEVB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QixDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRXhELE1BQU0sT0FBTyxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFFckMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLG9CQUFvQixDQUNuRCxNQUFNLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ3RCLE9BQU8sRUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDO2FBQzFDLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGNvcnJlc3BvbmRlbmNlXFxkdWUtZGF0ZS1yZW1pbmRlci5zZXJ2aWNlLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVzdCwgVGVzdGluZ01vZHVsZSB9IGZyb20gJ0BuZXN0anMvdGVzdGluZyc7XHJcbmltcG9ydCB7IGdldFJlcG9zaXRvcnlUb2tlbiB9IGZyb20gJ0BuZXN0anMvdHlwZW9ybSc7XHJcbmltcG9ydCB7IER1ZURhdGVSZW1pbmRlclNlcnZpY2UgfSBmcm9tICcuL2R1ZS1kYXRlLXJlbWluZGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJldmlzaW9uIH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS1yZXZpc2lvbi5lbnRpdHknO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLi91c2VyL3VzZXIuc2VydmljZSc7XHJcblxyXG5kZXNjcmliZSgnRHVlRGF0ZVJlbWluZGVyU2VydmljZScsICgpID0+IHtcclxuICBsZXQgc2VydmljZTogRHVlRGF0ZVJlbWluZGVyU2VydmljZTtcclxuICBsZXQgcmV2aXNpb25SZXBvOiB7IGZpbmQ6IGplc3QuTW9jayB9O1xyXG4gIGxldCBub3RpZmljYXRpb25TZXJ2aWNlOiB7IHNlbmQ6IGplc3QuTW9jayB9O1xyXG4gIGxldCB1c2VyU2VydmljZTogeyBmaW5kRG9jQ29udHJvbElkQnlPcmc6IGplc3QuTW9jayB9O1xyXG5cclxuICBjb25zdCBtb2NrUmV2aXNpb25SZXBvID0gKCkgPT4gKHtcclxuICAgIGZpbmQ6IGplc3QuZm4oKSxcclxuICB9KTtcclxuXHJcbiAgY29uc3QgbW9ja05vdGlmaWNhdGlvblNlcnZpY2UgPSAoKSA9PiAoe1xyXG4gICAgc2VuZDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZCksXHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IG1vY2tVc2VyU2VydmljZSA9ICgpID0+ICh7XHJcbiAgICBmaW5kRG9jQ29udHJvbElkQnlPcmc6IGplc3QuZm4oKSxcclxuICB9KTtcclxuXHJcbiAgYmVmb3JlRWFjaChhc3luYyAoKSA9PiB7XHJcbiAgICBjb25zdCBtb2R1bGU6IFRlc3RpbmdNb2R1bGUgPSBhd2FpdCBUZXN0LmNyZWF0ZVRlc3RpbmdNb2R1bGUoe1xyXG4gICAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICBEdWVEYXRlUmVtaW5kZXJTZXJ2aWNlLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHByb3ZpZGU6IGdldFJlcG9zaXRvcnlUb2tlbihDb3JyZXNwb25kZW5jZVJldmlzaW9uKSxcclxuICAgICAgICAgIHVzZUZhY3Rvcnk6IG1vY2tSZXZpc2lvblJlcG8sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm92aWRlOiBOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgICAgICAgdXNlRmFjdG9yeTogbW9ja05vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm92aWRlOiBVc2VyU2VydmljZSxcclxuICAgICAgICAgIHVzZUZhY3Rvcnk6IG1vY2tVc2VyU2VydmljZSxcclxuICAgICAgICB9LFxyXG4gICAgICBdLFxyXG4gICAgfSkuY29tcGlsZSgpO1xyXG5cclxuICAgIHNlcnZpY2UgPSBtb2R1bGUuZ2V0PER1ZURhdGVSZW1pbmRlclNlcnZpY2U+KER1ZURhdGVSZW1pbmRlclNlcnZpY2UpO1xyXG4gICAgcmV2aXNpb25SZXBvID0gbW9kdWxlLmdldChnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VSZXZpc2lvbikpO1xyXG4gICAgbm90aWZpY2F0aW9uU2VydmljZSA9IG1vZHVsZS5nZXQoTm90aWZpY2F0aW9uU2VydmljZSk7XHJcbiAgICB1c2VyU2VydmljZSA9IG1vZHVsZS5nZXQoVXNlclNlcnZpY2UpO1xyXG4gIH0pO1xyXG5cclxuICBhZnRlckVhY2goKCkgPT4ge1xyXG4gICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XHJcbiAgfSk7XHJcblxyXG4gIGRlc2NyaWJlKCdzZW5kRHVlRGF0ZVJlbWluZGVycycsICgpID0+IHtcclxuICAgIGl0KCdzaG91bGQgZG8gbm90aGluZyB3aGVuIG5vIHJldmlzaW9ucyBhcmUgYXBwcm9hY2hpbmcgZHVlIGRhdGUnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIHJldmlzaW9uUmVwby5maW5kLm1vY2tSZXNvbHZlZFZhbHVlKFtdKTtcclxuXHJcbiAgICAgIGF3YWl0IHNlcnZpY2Uuc2VuZER1ZURhdGVSZW1pbmRlcnMoKTtcclxuXHJcbiAgICAgIGV4cGVjdChub3RpZmljYXRpb25TZXJ2aWNlLnNlbmQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnc2hvdWxkIHNraXAgcmV2aXNpb25zIHdpdGggbm8gY29ycmVzcG9uZGVuY2UnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIHJldmlzaW9uUmVwby5maW5kLm1vY2tSZXNvbHZlZFZhbHVlKFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjb3JyZXNwb25kZW5jZTogbnVsbCxcclxuICAgICAgICAgIHN0YXR1czogeyBzdGF0dXNDb2RlOiAnRFJBRlQnIH0sXHJcbiAgICAgICAgICBkdWVEYXRlOiBuZXcgRGF0ZSgpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0pO1xyXG5cclxuICAgICAgYXdhaXQgc2VydmljZS5zZW5kRHVlRGF0ZVJlbWluZGVycygpO1xyXG5cclxuICAgICAgZXhwZWN0KG5vdGlmaWNhdGlvblNlcnZpY2Uuc2VuZCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdzaG91bGQgc2tpcCBjYW5jZWxsZWQgY29ycmVzcG9uZGVuY2VzJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICByZXZpc2lvblJlcG8uZmluZC5tb2NrUmVzb2x2ZWRWYWx1ZShbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29ycmVzcG9uZGVuY2U6IHtcclxuICAgICAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgICAgIHB1YmxpY0lkOiAndXVpZC0xJyxcclxuICAgICAgICAgICAgY29ycmVzcG9uZGVuY2VOdW1iZXI6ICdMQy0wMDEnLFxyXG4gICAgICAgICAgICBvcmlnaW5hdG9ySWQ6IDEwLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHN0YXR1czogeyBzdGF0dXNDb2RlOiAnQ0FOQ0VMTEVEJyB9LFxyXG4gICAgICAgICAgc3ViamVjdDogJ1Rlc3QnLFxyXG4gICAgICAgICAgZHVlRGF0ZTogbmV3IERhdGUoRGF0ZS5ub3coKSArIDg2NDAwMDAwKSxcclxuICAgICAgICB9LFxyXG4gICAgICBdKTtcclxuXHJcbiAgICAgIGF3YWl0IHNlcnZpY2Uuc2VuZER1ZURhdGVSZW1pbmRlcnMoKTtcclxuXHJcbiAgICAgIGV4cGVjdChub3RpZmljYXRpb25TZXJ2aWNlLnNlbmQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnc2hvdWxkIHNraXAgY2xvc2VkIChDTEJPV04pIGNvcnJlc3BvbmRlbmNlcycsIGFzeW5jICgpID0+IHtcclxuICAgICAgcmV2aXNpb25SZXBvLmZpbmQubW9ja1Jlc29sdmVkVmFsdWUoW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNvcnJlc3BvbmRlbmNlOiB7XHJcbiAgICAgICAgICAgIGlkOiAxLFxyXG4gICAgICAgICAgICBwdWJsaWNJZDogJ3V1aWQtMScsXHJcbiAgICAgICAgICAgIGNvcnJlc3BvbmRlbmNlTnVtYmVyOiAnTEMtMDAxJyxcclxuICAgICAgICAgICAgb3JpZ2luYXRvcklkOiAxMCxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBzdGF0dXM6IHsgc3RhdHVzQ29kZTogJ0NMQk9XTicgfSxcclxuICAgICAgICAgIHN1YmplY3Q6ICdUZXN0JyxcclxuICAgICAgICAgIGR1ZURhdGU6IG5ldyBEYXRlKERhdGUubm93KCkgKyA4NjQwMDAwMCksXHJcbiAgICAgICAgfSxcclxuICAgICAgXSk7XHJcblxyXG4gICAgICBhd2FpdCBzZXJ2aWNlLnNlbmREdWVEYXRlUmVtaW5kZXJzKCk7XHJcblxyXG4gICAgICBleHBlY3Qobm90aWZpY2F0aW9uU2VydmljZS5zZW5kKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ3Nob3VsZCBza2lwIHdoZW4gbm8gZG9jLWNvbnRyb2wgdXNlciBmb3VuZCBmb3Igb3JnJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICByZXZpc2lvblJlcG8uZmluZC5tb2NrUmVzb2x2ZWRWYWx1ZShbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29ycmVzcG9uZGVuY2U6IHtcclxuICAgICAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgICAgIHB1YmxpY0lkOiAndXVpZC0xJyxcclxuICAgICAgICAgICAgY29ycmVzcG9uZGVuY2VOdW1iZXI6ICdMQy0wMDEnLFxyXG4gICAgICAgICAgICBvcmlnaW5hdG9ySWQ6IDEwLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHN0YXR1czogeyBzdGF0dXNDb2RlOiAnRFJBRlQnIH0sXHJcbiAgICAgICAgICBzdWJqZWN0OiAnVGVzdCBTdWJqZWN0JyxcclxuICAgICAgICAgIGR1ZURhdGU6IG5ldyBEYXRlKERhdGUubm93KCkgKyA4NjQwMDAwMCksXHJcbiAgICAgICAgfSxcclxuICAgICAgXSk7XHJcbiAgICAgIHVzZXJTZXJ2aWNlLmZpbmREb2NDb250cm9sSWRCeU9yZy5tb2NrUmVzb2x2ZWRWYWx1ZShudWxsKTtcclxuXHJcbiAgICAgIGF3YWl0IHNlcnZpY2Uuc2VuZER1ZURhdGVSZW1pbmRlcnMoKTtcclxuXHJcbiAgICAgIGV4cGVjdChub3RpZmljYXRpb25TZXJ2aWNlLnNlbmQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnc2hvdWxkIHNlbmQgRU1BSUwgbm90aWZpY2F0aW9uIGZvciBhIHZhbGlkIGFwcHJvYWNoaW5nIGR1ZSBkYXRlJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBkdWVEYXRlID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIDg2NDAwMDAwICogMik7IC8vIDIgZGF5cyBsYXRlclxyXG4gICAgICByZXZpc2lvblJlcG8uZmluZC5tb2NrUmVzb2x2ZWRWYWx1ZShbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29ycmVzcG9uZGVuY2U6IHtcclxuICAgICAgICAgICAgaWQ6IDUsXHJcbiAgICAgICAgICAgIHB1YmxpY0lkOiAnY29yci11dWlkLTEnLFxyXG4gICAgICAgICAgICBjb3JyZXNwb25kZW5jZU51bWJlcjogJ0xDLVRFU1QtMDAxJyxcclxuICAgICAgICAgICAgb3JpZ2luYXRvcklkOiAxMCxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBzdGF0dXM6IHsgc3RhdHVzQ29kZTogJ1NVQk9XTicgfSxcclxuICAgICAgICAgIHN1YmplY3Q6ICdEZXNpZ24gUmV2aWV3IFJlcXVlc3QnLFxyXG4gICAgICAgICAgZHVlRGF0ZSxcclxuICAgICAgICB9LFxyXG4gICAgICBdKTtcclxuICAgICAgdXNlclNlcnZpY2UuZmluZERvY0NvbnRyb2xJZEJ5T3JnLm1vY2tSZXNvbHZlZFZhbHVlKDQyKTtcclxuXHJcbiAgICAgIGF3YWl0IHNlcnZpY2Uuc2VuZER1ZURhdGVSZW1pbmRlcnMoKTtcclxuXHJcbiAgICAgIGV4cGVjdCh1c2VyU2VydmljZS5maW5kRG9jQ29udHJvbElkQnlPcmcpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDEwKTtcclxuICAgICAgZXhwZWN0KG5vdGlmaWNhdGlvblNlcnZpY2Uuc2VuZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xyXG4gICAgICAgICAgdXNlcklkOiA0MixcclxuICAgICAgICAgIHRpdGxlOiAnRHVlIERhdGUgQXBwcm9hY2hpbmcnLFxyXG4gICAgICAgICAgdHlwZTogJ0VNQUlMJyxcclxuICAgICAgICAgIGVudGl0eVR5cGU6ICdjb3JyZXNwb25kZW5jZScsXHJcbiAgICAgICAgICBlbnRpdHlJZDogNSxcclxuICAgICAgICAgIGxpbms6ICcvY29ycmVzcG9uZGVuY2VzL2NvcnItdXVpZC0xJyxcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgZXJyb3JzIHBlciByZXZpc2lvbiB3aXRob3V0IHN0b3BwaW5nIG90aGVyIG5vdGlmaWNhdGlvbnMnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGR1ZURhdGUgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgODY0MDAwMDApO1xyXG4gICAgICByZXZpc2lvblJlcG8uZmluZC5tb2NrUmVzb2x2ZWRWYWx1ZShbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29ycmVzcG9uZGVuY2U6IHtcclxuICAgICAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgICAgIHB1YmxpY0lkOiAndXVpZC0xJyxcclxuICAgICAgICAgICAgY29ycmVzcG9uZGVuY2VOdW1iZXI6ICdMQy0wMDEnLFxyXG4gICAgICAgICAgICBvcmlnaW5hdG9ySWQ6IDEwLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHN0YXR1czogeyBzdGF0dXNDb2RlOiAnU1VCT1dOJyB9LFxyXG4gICAgICAgICAgc3ViamVjdDogJ0ZpcnN0JyxcclxuICAgICAgICAgIGR1ZURhdGUsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjb3JyZXNwb25kZW5jZToge1xyXG4gICAgICAgICAgICBpZDogMixcclxuICAgICAgICAgICAgcHVibGljSWQ6ICd1dWlkLTInLFxyXG4gICAgICAgICAgICBjb3JyZXNwb25kZW5jZU51bWJlcjogJ0xDLTAwMicsXHJcbiAgICAgICAgICAgIG9yaWdpbmF0b3JJZDogMjAsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgc3RhdHVzOiB7IHN0YXR1c0NvZGU6ICdTVUJPV04nIH0sXHJcbiAgICAgICAgICBzdWJqZWN0OiAnU2Vjb25kJyxcclxuICAgICAgICAgIGR1ZURhdGUsXHJcbiAgICAgICAgfSxcclxuICAgICAgXSk7XHJcbiAgICAgIHVzZXJTZXJ2aWNlLmZpbmREb2NDb250cm9sSWRCeU9yZ1xyXG4gICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoNDIpXHJcbiAgICAgICAgLm1vY2tSZWplY3RlZFZhbHVlT25jZShuZXcgRXJyb3IoJ0RCIGVycm9yJykpO1xyXG5cclxuICAgICAgYXdhaXQgc2VydmljZS5zZW5kRHVlRGF0ZVJlbWluZGVycygpO1xyXG5cclxuICAgICAgZXhwZWN0KG5vdGlmaWNhdGlvblNlcnZpY2Uuc2VuZCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgY2FsY3VsYXRlIGRheXNMZWZ0IGluIHRoZSBtZXNzYWdlJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBkdWVEYXRlID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIDg2NDAwMDAwKTsgLy8gZXhhY3RseSAxIGRheVxyXG4gICAgICByZXZpc2lvblJlcG8uZmluZC5tb2NrUmVzb2x2ZWRWYWx1ZShbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29ycmVzcG9uZGVuY2U6IHtcclxuICAgICAgICAgICAgaWQ6IDMsXHJcbiAgICAgICAgICAgIHB1YmxpY0lkOiAndXVpZC0zJyxcclxuICAgICAgICAgICAgY29ycmVzcG9uZGVuY2VOdW1iZXI6ICdMQy0wMDMnLFxyXG4gICAgICAgICAgICBvcmlnaW5hdG9ySWQ6IDUsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgc3RhdHVzOiB7IHN0YXR1c0NvZGU6ICdEUkFGVCcgfSxcclxuICAgICAgICAgIHN1YmplY3Q6ICdVcmdlbnQgRG9jdW1lbnQnLFxyXG4gICAgICAgICAgZHVlRGF0ZSxcclxuICAgICAgICB9LFxyXG4gICAgICBdKTtcclxuICAgICAgdXNlclNlcnZpY2UuZmluZERvY0NvbnRyb2xJZEJ5T3JnLm1vY2tSZXNvbHZlZFZhbHVlKDk5KTtcclxuXHJcbiAgICAgIGF3YWl0IHNlcnZpY2Uuc2VuZER1ZURhdGVSZW1pbmRlcnMoKTtcclxuXHJcbiAgICAgIGV4cGVjdChub3RpZmljYXRpb25TZXJ2aWNlLnNlbmQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxyXG4gICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcclxuICAgICAgICAgIG1lc3NhZ2U6IGV4cGVjdC5zdHJpbmdDb250YWluaW5nKCcxIGRheScpLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9KTtcclxufSk7XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/46/duedatereminderservicespec_4619003876a0356c456881bcac752b3f.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/46/duedatereminderservicespec_4619003876a0356c456881bcac752b3f.map new file mode 100644 index 0000000..62921bb --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/46/duedatereminderservicespec_4619003876a0356c456881bcac752b3f.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\due-date-reminder.service.spec.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\due-date-reminder.service.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\r\nimport { getRepositoryToken } from '@nestjs/typeorm';\r\nimport { DueDateReminderService } from './due-date-reminder.service';\r\nimport { CorrespondenceRevision } from './entities/correspondence-revision.entity';\r\nimport { NotificationService } from '../notification/notification.service';\r\nimport { UserService } from '../user/user.service';\r\n\r\ndescribe('DueDateReminderService', () => {\r\n let service: DueDateReminderService;\r\n let revisionRepo: { find: jest.Mock };\r\n let notificationService: { send: jest.Mock };\r\n let userService: { findDocControlIdByOrg: jest.Mock };\r\n\r\n const mockRevisionRepo = () => ({\r\n find: jest.fn(),\r\n });\r\n\r\n const mockNotificationService = () => ({\r\n send: jest.fn().mockResolvedValue(undefined),\r\n });\r\n\r\n const mockUserService = () => ({\r\n findDocControlIdByOrg: jest.fn(),\r\n });\r\n\r\n beforeEach(async () => {\r\n const module: TestingModule = await Test.createTestingModule({\r\n providers: [\r\n DueDateReminderService,\r\n {\r\n provide: getRepositoryToken(CorrespondenceRevision),\r\n useFactory: mockRevisionRepo,\r\n },\r\n {\r\n provide: NotificationService,\r\n useFactory: mockNotificationService,\r\n },\r\n {\r\n provide: UserService,\r\n useFactory: mockUserService,\r\n },\r\n ],\r\n }).compile();\r\n\r\n service = module.get(DueDateReminderService);\r\n revisionRepo = module.get(getRepositoryToken(CorrespondenceRevision));\r\n notificationService = module.get(NotificationService);\r\n userService = module.get(UserService);\r\n });\r\n\r\n afterEach(() => {\r\n jest.clearAllMocks();\r\n });\r\n\r\n describe('sendDueDateReminders', () => {\r\n it('should do nothing when no revisions are approaching due date', async () => {\r\n revisionRepo.find.mockResolvedValue([]);\r\n\r\n await service.sendDueDateReminders();\r\n\r\n expect(notificationService.send).not.toHaveBeenCalled();\r\n });\r\n\r\n it('should skip revisions with no correspondence', async () => {\r\n revisionRepo.find.mockResolvedValue([\r\n {\r\n correspondence: null,\r\n status: { statusCode: 'DRAFT' },\r\n dueDate: new Date(),\r\n },\r\n ]);\r\n\r\n await service.sendDueDateReminders();\r\n\r\n expect(notificationService.send).not.toHaveBeenCalled();\r\n });\r\n\r\n it('should skip cancelled correspondences', async () => {\r\n revisionRepo.find.mockResolvedValue([\r\n {\r\n correspondence: {\r\n id: 1,\r\n publicId: 'uuid-1',\r\n correspondenceNumber: 'LC-001',\r\n originatorId: 10,\r\n },\r\n status: { statusCode: 'CANCELLED' },\r\n subject: 'Test',\r\n dueDate: new Date(Date.now() + 86400000),\r\n },\r\n ]);\r\n\r\n await service.sendDueDateReminders();\r\n\r\n expect(notificationService.send).not.toHaveBeenCalled();\r\n });\r\n\r\n it('should skip closed (CLBOWN) correspondences', async () => {\r\n revisionRepo.find.mockResolvedValue([\r\n {\r\n correspondence: {\r\n id: 1,\r\n publicId: 'uuid-1',\r\n correspondenceNumber: 'LC-001',\r\n originatorId: 10,\r\n },\r\n status: { statusCode: 'CLBOWN' },\r\n subject: 'Test',\r\n dueDate: new Date(Date.now() + 86400000),\r\n },\r\n ]);\r\n\r\n await service.sendDueDateReminders();\r\n\r\n expect(notificationService.send).not.toHaveBeenCalled();\r\n });\r\n\r\n it('should skip when no doc-control user found for org', async () => {\r\n revisionRepo.find.mockResolvedValue([\r\n {\r\n correspondence: {\r\n id: 1,\r\n publicId: 'uuid-1',\r\n correspondenceNumber: 'LC-001',\r\n originatorId: 10,\r\n },\r\n status: { statusCode: 'DRAFT' },\r\n subject: 'Test Subject',\r\n dueDate: new Date(Date.now() + 86400000),\r\n },\r\n ]);\r\n userService.findDocControlIdByOrg.mockResolvedValue(null);\r\n\r\n await service.sendDueDateReminders();\r\n\r\n expect(notificationService.send).not.toHaveBeenCalled();\r\n });\r\n\r\n it('should send EMAIL notification for a valid approaching due date', async () => {\r\n const dueDate = new Date(Date.now() + 86400000 * 2); // 2 days later\r\n revisionRepo.find.mockResolvedValue([\r\n {\r\n correspondence: {\r\n id: 5,\r\n publicId: 'corr-uuid-1',\r\n correspondenceNumber: 'LC-TEST-001',\r\n originatorId: 10,\r\n },\r\n status: { statusCode: 'SUBOWN' },\r\n subject: 'Design Review Request',\r\n dueDate,\r\n },\r\n ]);\r\n userService.findDocControlIdByOrg.mockResolvedValue(42);\r\n\r\n await service.sendDueDateReminders();\r\n\r\n expect(userService.findDocControlIdByOrg).toHaveBeenCalledWith(10);\r\n expect(notificationService.send).toHaveBeenCalledWith(\r\n expect.objectContaining({\r\n userId: 42,\r\n title: 'Due Date Approaching',\r\n type: 'EMAIL',\r\n entityType: 'correspondence',\r\n entityId: 5,\r\n link: '/correspondences/corr-uuid-1',\r\n })\r\n );\r\n });\r\n\r\n it('should handle errors per revision without stopping other notifications', async () => {\r\n const dueDate = new Date(Date.now() + 86400000);\r\n revisionRepo.find.mockResolvedValue([\r\n {\r\n correspondence: {\r\n id: 1,\r\n publicId: 'uuid-1',\r\n correspondenceNumber: 'LC-001',\r\n originatorId: 10,\r\n },\r\n status: { statusCode: 'SUBOWN' },\r\n subject: 'First',\r\n dueDate,\r\n },\r\n {\r\n correspondence: {\r\n id: 2,\r\n publicId: 'uuid-2',\r\n correspondenceNumber: 'LC-002',\r\n originatorId: 20,\r\n },\r\n status: { statusCode: 'SUBOWN' },\r\n subject: 'Second',\r\n dueDate,\r\n },\r\n ]);\r\n userService.findDocControlIdByOrg\r\n .mockResolvedValueOnce(42)\r\n .mockRejectedValueOnce(new Error('DB error'));\r\n\r\n await service.sendDueDateReminders();\r\n\r\n expect(notificationService.send).toHaveBeenCalledTimes(1);\r\n });\r\n\r\n it('should correctly calculate daysLeft in the message', async () => {\r\n const dueDate = new Date(Date.now() + 86400000); // exactly 1 day\r\n revisionRepo.find.mockResolvedValue([\r\n {\r\n correspondence: {\r\n id: 3,\r\n publicId: 'uuid-3',\r\n correspondenceNumber: 'LC-003',\r\n originatorId: 5,\r\n },\r\n status: { statusCode: 'DRAFT' },\r\n subject: 'Urgent Document',\r\n dueDate,\r\n },\r\n ]);\r\n userService.findDocControlIdByOrg.mockResolvedValue(99);\r\n\r\n await service.sendDueDateReminders();\r\n\r\n expect(notificationService.send).toHaveBeenCalledWith(\r\n expect.objectContaining({\r\n message: expect.stringContaining('1 day'),\r\n })\r\n );\r\n });\r\n });\r\n});\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/47/correspondencecontroller_47b6657e09337a2e65746953c9dcefc6 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/47/correspondencecontroller_47b6657e09337a2e65746953c9dcefc6 new file mode 100644 index 0000000..5cfadb4 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/47/correspondencecontroller_47b6657e09337a2e65746953c9dcefc6 @@ -0,0 +1,319 @@ +61be6db69145c358b9e7a0e99a2198a0 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceController = void 0; +const common_1 = require("@nestjs/common"); +const swagger_1 = require("@nestjs/swagger"); +const correspondence_service_1 = require("./correspondence.service"); +const correspondence_workflow_service_1 = require("./correspondence-workflow.service"); +const create_correspondence_dto_1 = require("./dto/create-correspondence.dto"); +const update_correspondence_dto_1 = require("./dto/update-correspondence.dto"); +const submit_correspondence_dto_1 = require("./dto/submit-correspondence.dto"); +const workflow_action_dto_1 = require("./dto/workflow-action.dto"); +const add_reference_dto_1 = require("./dto/add-reference.dto"); +const search_correspondence_dto_1 = require("./dto/search-correspondence.dto"); +const cancel_correspondence_dto_1 = require("./dto/cancel-correspondence.dto"); +const bulk_cancel_dto_1 = require("./dto/bulk-cancel.dto"); +const jwt_auth_guard_1 = require("../../common/guards/jwt-auth.guard"); +const rbac_guard_1 = require("../../common/guards/rbac.guard"); +const require_permission_decorator_1 = require("../../common/decorators/require-permission.decorator"); +const audit_decorator_1 = require("../../common/decorators/audit.decorator"); +const parse_uuid_pipe_1 = require("../../common/pipes/parse-uuid.pipe"); +let CorrespondenceController = class CorrespondenceController { + constructor(correspondenceService, workflowService) { + this.correspondenceService = correspondenceService; + this.workflowService = workflowService; + } + processAction(actionDto, req) { + // Extract roles from user assignments for DSL requirements check + const userRoles = req.user.assignments?.map((a) => a.role?.roleName).filter(Boolean) || []; + // Use Unified Workflow Engine via CorrespondenceWorkflowService + if (!actionDto.instanceId) { + throw new Error('instanceId is required for workflow action'); + } + return this.workflowService.processAction(actionDto.instanceId, req.user.user_id, { + action: actionDto.action, + comment: actionDto.comment, + payload: { ...actionDto.payload, roles: userRoles }, + }); + } + create(createDto, req) { + return this.correspondenceService.create(createDto, req.user); + } + previewNumber(createDto, req) { + return this.correspondenceService.previewDocumentNumber(createDto, req.user); + } + findAll(searchDto) { + return this.correspondenceService.findAll(searchDto); + } + async submit(uuid, submitDto, req) { + const corr = await this.correspondenceService.findOneByUuid(uuid); + // Extract roles from user assignments + const userRoles = req.user.assignments?.map((a) => a.role?.roleName).filter(Boolean) || []; + // Use Unified Workflow Engine - pass user roles for DSL requirements check + return this.workflowService.submitWorkflow(corr.id, req.user.user_id, userRoles, submitDto.note); + } + findOne(uuid) { + return this.correspondenceService.findOneByUuid(uuid); + } + async update(uuid, updateDto, req) { + const corr = await this.correspondenceService.findOneByUuid(uuid); + return this.correspondenceService.update(corr.id, updateDto, req.user); + } + async getReferences(uuid) { + const corr = await this.correspondenceService.findOneByUuid(uuid); + return this.correspondenceService.getReferences(corr.id); + } + async addReference(uuid, dto) { + const corr = await this.correspondenceService.findOneByUuid(uuid); + return this.correspondenceService.addReference(corr.id, dto); + } + async removeReference(uuid, targetUuid) { + const corr = await this.correspondenceService.findOneByUuid(uuid); + const target = await this.correspondenceService.findOneByUuid(targetUuid); + return this.correspondenceService.removeReference(corr.id, target.id); + } + async getTags(uuid) { + const corr = await this.correspondenceService.findOneByUuid(uuid); + return this.correspondenceService.getTags(corr.id); + } + async addTag(uuid, tagId) { + const corr = await this.correspondenceService.findOneByUuid(uuid); + return this.correspondenceService.addTag(corr.id, tagId); + } + async removeTag(uuid, tagId) { + const corr = await this.correspondenceService.findOneByUuid(uuid); + return this.correspondenceService.removeTag(corr.id, tagId); + } + async bulkCancel(dto, req) { + return this.correspondenceService.bulkCancel(dto.uuids, dto.reason, req.user); + } + async exportCsv(searchDto, res) { + const csv = await this.correspondenceService.exportCsv(searchDto); + const filename = `correspondences-${new Date().toISOString().split('T')[0]}.csv`; + res.setHeader('Content-Type', 'text/csv; charset=utf-8'); + res.setHeader('Content-Disposition', `attachment; filename="${filename}"`); + res.send('\uFEFF' + csv); + } + async cancel(uuid, cancelDto, req) { + return this.correspondenceService.cancel(uuid, cancelDto.reason, req.user); + } +}; +exports.CorrespondenceController = CorrespondenceController; +__decorate([ + (0, common_1.Post)(':uuid/workflow/action'), + (0, swagger_1.ApiOperation)({ summary: 'Process workflow action (Approve/Reject/Review)' }), + (0, swagger_1.ApiResponse)({ status: 201, description: 'Action processed successfully.' }), + (0, require_permission_decorator_1.RequirePermission)('workflow.action_review'), + __param(0, (0, common_1.Body)()), + __param(1, (0, common_1.Request)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_c = typeof workflow_action_dto_1.WorkflowActionDto !== "undefined" && workflow_action_dto_1.WorkflowActionDto) === "function" ? _c : Object, Object]), + __metadata("design:returntype", void 0) +], CorrespondenceController.prototype, "processAction", null); +__decorate([ + (0, common_1.Post)(), + (0, swagger_1.ApiOperation)({ summary: 'Create new correspondence' }), + (0, swagger_1.ApiResponse)({ + status: 201, + description: 'Correspondence created successfully.', + type: create_correspondence_dto_1.CreateCorrespondenceDto, + }), + (0, require_permission_decorator_1.RequirePermission)('correspondence.create'), + (0, audit_decorator_1.Audit)('correspondence.create', 'correspondence'), + __param(0, (0, common_1.Body)()), + __param(1, (0, common_1.Request)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_d = typeof create_correspondence_dto_1.CreateCorrespondenceDto !== "undefined" && create_correspondence_dto_1.CreateCorrespondenceDto) === "function" ? _d : Object, Object]), + __metadata("design:returntype", void 0) +], CorrespondenceController.prototype, "create", null); +__decorate([ + (0, common_1.Post)('preview-number'), + (0, swagger_1.ApiOperation)({ summary: 'Preview next document number' }), + (0, swagger_1.ApiResponse)({ + status: 200, + description: 'Return preview number and status.', + }), + (0, require_permission_decorator_1.RequirePermission)('correspondence.create'), + __param(0, (0, common_1.Body)()), + __param(1, (0, common_1.Request)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_e = typeof create_correspondence_dto_1.CreateCorrespondenceDto !== "undefined" && create_correspondence_dto_1.CreateCorrespondenceDto) === "function" ? _e : Object, Object]), + __metadata("design:returntype", void 0) +], CorrespondenceController.prototype, "previewNumber", null); +__decorate([ + (0, common_1.Get)(), + (0, swagger_1.ApiOperation)({ summary: 'Search correspondences' }), + (0, swagger_1.ApiResponse)({ status: 200, description: 'Return list of correspondences.' }), + (0, require_permission_decorator_1.RequirePermission)('document.view'), + __param(0, (0, common_1.Query)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_f = typeof search_correspondence_dto_1.SearchCorrespondenceDto !== "undefined" && search_correspondence_dto_1.SearchCorrespondenceDto) === "function" ? _f : Object]), + __metadata("design:returntype", void 0) +], CorrespondenceController.prototype, "findAll", null); +__decorate([ + (0, common_1.Post)(':uuid/submit'), + (0, swagger_1.ApiOperation)({ summary: 'Submit correspondence to Unified Workflow Engine' }), + (0, swagger_1.ApiResponse)({ + status: 201, + description: 'Correspondence submitted successfully.', + }), + (0, require_permission_decorator_1.RequirePermission)('correspondence.create'), + (0, audit_decorator_1.Audit)('correspondence.submit', 'correspondence'), + __param(0, (0, common_1.Param)('uuid', parse_uuid_pipe_1.ParseUuidPipe)), + __param(1, (0, common_1.Body)()), + __param(2, (0, common_1.Request)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, typeof (_g = typeof submit_correspondence_dto_1.SubmitCorrespondenceDto !== "undefined" && submit_correspondence_dto_1.SubmitCorrespondenceDto) === "function" ? _g : Object, Object]), + __metadata("design:returntype", Promise) +], CorrespondenceController.prototype, "submit", null); +__decorate([ + (0, common_1.Get)(':uuid'), + (0, swagger_1.ApiOperation)({ summary: 'Get correspondence by UUID' }), + (0, swagger_1.ApiResponse)({ status: 200, description: 'Return correspondence details.' }), + (0, require_permission_decorator_1.RequirePermission)('document.view'), + __param(0, (0, common_1.Param)('uuid', parse_uuid_pipe_1.ParseUuidPipe)), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String]), + __metadata("design:returntype", void 0) +], CorrespondenceController.prototype, "findOne", null); +__decorate([ + (0, common_1.Put)(':uuid'), + (0, swagger_1.ApiOperation)({ summary: 'Update correspondence (Draft only)' }), + (0, swagger_1.ApiResponse)({ + status: 200, + description: 'Correspondence updated successfully.', + }), + (0, require_permission_decorator_1.RequirePermission)('correspondence.create') // Assuming create permission is enough for draft update, or add 'correspondence.edit' + , + (0, audit_decorator_1.Audit)('correspondence.update', 'correspondence'), + __param(0, (0, common_1.Param)('uuid', parse_uuid_pipe_1.ParseUuidPipe)), + __param(1, (0, common_1.Body)()), + __param(2, (0, common_1.Request)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, typeof (_h = typeof update_correspondence_dto_1.UpdateCorrespondenceDto !== "undefined" && update_correspondence_dto_1.UpdateCorrespondenceDto) === "function" ? _h : Object, Object]), + __metadata("design:returntype", Promise) +], CorrespondenceController.prototype, "update", null); +__decorate([ + (0, common_1.Get)(':uuid/references'), + (0, swagger_1.ApiOperation)({ summary: 'Get referenced documents' }), + (0, swagger_1.ApiResponse)({ + status: 200, + description: 'Return list of referenced documents.', + }), + (0, require_permission_decorator_1.RequirePermission)('document.view'), + __param(0, (0, common_1.Param)('uuid', parse_uuid_pipe_1.ParseUuidPipe)), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String]), + __metadata("design:returntype", Promise) +], CorrespondenceController.prototype, "getReferences", null); +__decorate([ + (0, common_1.Post)(':uuid/references'), + (0, swagger_1.ApiOperation)({ summary: 'Add reference to another document' }), + (0, swagger_1.ApiResponse)({ status: 201, description: 'Reference added successfully.' }), + (0, require_permission_decorator_1.RequirePermission)('document.edit'), + __param(0, (0, common_1.Param)('uuid', parse_uuid_pipe_1.ParseUuidPipe)), + __param(1, (0, common_1.Body)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, typeof (_j = typeof add_reference_dto_1.AddReferenceDto !== "undefined" && add_reference_dto_1.AddReferenceDto) === "function" ? _j : Object]), + __metadata("design:returntype", Promise) +], CorrespondenceController.prototype, "addReference", null); +__decorate([ + (0, common_1.Delete)(':uuid/references/:targetUuid'), + (0, swagger_1.ApiOperation)({ summary: 'Remove reference' }), + (0, swagger_1.ApiResponse)({ status: 200, description: 'Reference removed successfully.' }), + (0, require_permission_decorator_1.RequirePermission)('document.edit'), + __param(0, (0, common_1.Param)('uuid', parse_uuid_pipe_1.ParseUuidPipe)), + __param(1, (0, common_1.Param)('targetUuid', parse_uuid_pipe_1.ParseUuidPipe)), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, String]), + __metadata("design:returntype", Promise) +], CorrespondenceController.prototype, "removeReference", null); +__decorate([ + (0, common_1.Get)(':uuid/tags'), + (0, swagger_1.ApiOperation)({ summary: 'Get tags for a correspondence' }), + (0, require_permission_decorator_1.RequirePermission)('document.view'), + __param(0, (0, common_1.Param)('uuid', parse_uuid_pipe_1.ParseUuidPipe)), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String]), + __metadata("design:returntype", Promise) +], CorrespondenceController.prototype, "getTags", null); +__decorate([ + (0, common_1.Post)(':uuid/tags/:tagId'), + (0, swagger_1.ApiOperation)({ summary: 'Add tag to a correspondence' }), + (0, require_permission_decorator_1.RequirePermission)('document.edit'), + __param(0, (0, common_1.Param)('uuid', parse_uuid_pipe_1.ParseUuidPipe)), + __param(1, (0, common_1.Param)('tagId', common_1.ParseIntPipe)), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, Number]), + __metadata("design:returntype", Promise) +], CorrespondenceController.prototype, "addTag", null); +__decorate([ + (0, common_1.Delete)(':uuid/tags/:tagId'), + (0, swagger_1.ApiOperation)({ summary: 'Remove tag from a correspondence' }), + (0, require_permission_decorator_1.RequirePermission)('document.edit'), + __param(0, (0, common_1.Param)('uuid', parse_uuid_pipe_1.ParseUuidPipe)), + __param(1, (0, common_1.Param)('tagId', common_1.ParseIntPipe)), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, Number]), + __metadata("design:returntype", Promise) +], CorrespondenceController.prototype, "removeTag", null); +__decorate([ + (0, common_1.Post)('bulk-cancel'), + (0, common_1.HttpCode)(200), + (0, swagger_1.ApiOperation)({ summary: 'Bulk cancel correspondences (Org Admin+)' }), + (0, require_permission_decorator_1.RequirePermission)('correspondence.cancel'), + (0, audit_decorator_1.Audit)('correspondence.bulk_cancel', 'correspondence'), + __param(0, (0, common_1.Body)()), + __param(1, (0, common_1.Request)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_k = typeof bulk_cancel_dto_1.BulkCancelDto !== "undefined" && bulk_cancel_dto_1.BulkCancelDto) === "function" ? _k : Object, Object]), + __metadata("design:returntype", Promise) +], CorrespondenceController.prototype, "bulkCancel", null); +__decorate([ + (0, common_1.Get)('export-csv'), + (0, swagger_1.ApiOperation)({ summary: 'Export correspondence list as CSV' }), + (0, require_permission_decorator_1.RequirePermission)('document.view'), + __param(0, (0, common_1.Query)()), + __param(1, (0, common_1.Res)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_l = typeof search_correspondence_dto_1.SearchCorrespondenceDto !== "undefined" && search_correspondence_dto_1.SearchCorrespondenceDto) === "function" ? _l : Object, Object]), + __metadata("design:returntype", Promise) +], CorrespondenceController.prototype, "exportCsv", null); +__decorate([ + (0, common_1.Delete)(':uuid'), + (0, swagger_1.ApiOperation)({ summary: 'Cancel correspondence (Admin only)' }), + (0, swagger_1.ApiResponse)({ + status: 200, + description: 'Correspondence cancelled successfully.', + }), + (0, require_permission_decorator_1.RequirePermission)('correspondence.cancel'), + (0, audit_decorator_1.Audit)('correspondence.cancel', 'correspondence'), + __param(0, (0, common_1.Param)('uuid', parse_uuid_pipe_1.ParseUuidPipe)), + __param(1, (0, common_1.Body)()), + __param(2, (0, common_1.Request)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, typeof (_m = typeof cancel_correspondence_dto_1.CancelCorrespondenceDto !== "undefined" && cancel_correspondence_dto_1.CancelCorrespondenceDto) === "function" ? _m : Object, Object]), + __metadata("design:returntype", Promise) +], CorrespondenceController.prototype, "cancel", null); +exports.CorrespondenceController = CorrespondenceController = __decorate([ + (0, swagger_1.ApiTags)('Correspondences'), + (0, common_1.Controller)('correspondences'), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard, rbac_guard_1.RbacGuard), + (0, swagger_1.ApiBearerAuth)(), + __metadata("design:paramtypes", [typeof (_a = typeof correspondence_service_1.CorrespondenceService !== "undefined" && correspondence_service_1.CorrespondenceService) === "function" ? _a : Object, typeof (_b = typeof correspondence_workflow_service_1.CorrespondenceWorkflowService !== "undefined" && correspondence_workflow_service_1.CorrespondenceWorkflowService) === "function" ? _b : Object]) +], CorrespondenceController); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGNvcnJlc3BvbmRlbmNlLmNvbnRyb2xsZXIudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQWN3QjtBQUV4Qiw2Q0FLeUI7QUFDekIscUVBQWlFO0FBQ2pFLHVGQUFrRjtBQUNsRiwrRUFBMEU7QUFDMUUsK0VBQTBFO0FBQzFFLCtFQUEwRTtBQUMxRSxtRUFBOEQ7QUFDOUQsK0RBQTBEO0FBQzFELCtFQUEwRTtBQUMxRSwrRUFBMEU7QUFDMUUsMkRBQXNEO0FBRXRELHVFQUFrRTtBQUNsRSwrREFBMkQ7QUFDM0QsdUdBQXlGO0FBQ3pGLDZFQUFnRTtBQUNoRSx3RUFBbUU7QUFPNUQsSUFBTSx3QkFBd0IsR0FBOUIsTUFBTSx3QkFBd0I7SUFDbkMsWUFDbUIscUJBQTRDLEVBQzVDLGVBQThDO1FBRDlDLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBdUI7UUFDNUMsb0JBQWUsR0FBZixlQUFlLENBQStCO0lBQzlELENBQUM7SUFNSixhQUFhLENBQ0gsU0FBNEIsRUFDekIsR0FBb0I7UUFFL0IsaUVBQWlFO1FBQ2pFLE1BQU0sU0FBUyxHQUNiLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRTNFLGdFQUFnRTtRQUNoRSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FDdkMsU0FBUyxDQUFDLFVBQVUsRUFDcEIsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQ2hCO1lBQ0UsTUFBTSxFQUFF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QyxpQkFBaUIsQ0FBQztJQUM3QixJQUFBLGtCQUFTLEVBQUMsNkJBQVksRUFBRSxzQkFBUyxDQUFDO0lBQ2xDLElBQUEsdUJBQWEsR0FBRTt5REFHNEIsOENBQXFCLG9CQUFyQiw4Q0FBcUIsb0RBQzNCLCtEQUE2QixvQkFBN0IsK0RBQTZCO0dBSHRELHdCQUF3QixDQStPcEMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGNvcnJlc3BvbmRlbmNlLmNvbnRyb2xsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb250cm9sbGVyLFxyXG4gIEdldCxcclxuICBQb3N0LFxyXG4gIEJvZHksXHJcbiAgVXNlR3VhcmRzLFxyXG4gIFJlcXVlc3QsXHJcbiAgUGFyYW0sXHJcbiAgUXVlcnksXHJcbiAgRGVsZXRlLFxyXG4gIFB1dCxcclxuICBQYXJzZUludFBpcGUsXHJcbiAgUmVzLFxyXG4gIEh0dHBDb2RlLFxyXG59IGZyb20gJ0BuZXN0anMvY29tbW9uJztcclxuaW1wb3J0IHR5cGUgeyBSZXNwb25zZSB9IGZyb20gJ2V4cHJlc3MnO1xyXG5pbXBvcnQge1xyXG4gIEFwaVRhZ3MsXHJcbiAgQXBpT3BlcmF0aW9uLFxyXG4gIEFwaVJlc3BvbnNlLFxyXG4gIEFwaUJlYXJlckF1dGgsXHJcbn0gZnJvbSAnQG5lc3Rqcy9zd2FnZ2VyJztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VTZXJ2aWNlIH0gZnJvbSAnLi9jb3JyZXNwb25kZW5jZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VXb3JrZmxvd1NlcnZpY2UgfSBmcm9tICcuL2NvcnJlc3BvbmRlbmNlLXdvcmtmbG93LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDcmVhdGVDb3JyZXNwb25kZW5jZUR0byB9IGZyb20gJy4vZHRvL2NyZWF0ZS1jb3JyZXNwb25kZW5jZS5kdG8nO1xyXG5pbXBvcnQgeyBVcGRhdGVDb3JyZXNwb25kZW5jZUR0byB9IGZyb20gJy4vZHRvL3VwZGF0ZS1jb3JyZXNwb25kZW5jZS5kdG8nO1xyXG5pbXBvcnQgeyBTdWJtaXRDb3JyZXNwb25kZW5jZUR0byB9IGZyb20gJy4vZHRvL3N1Ym1pdC1jb3JyZXNwb25kZW5jZS5kdG8nO1xyXG5pbXBvcnQgeyBXb3JrZmxvd0FjdGlvbkR0byB9IGZyb20gJy4vZHRvL3dvcmtmbG93LWFjdGlvbi5kdG8nO1xyXG5pbXBvcnQgeyBBZGRSZWZlcmVuY2VEdG8gfSBmcm9tICcuL2R0by9hZGQtcmVmZXJlbmNlLmR0byc7XHJcbmltcG9ydCB7IFNlYXJjaENvcnJlc3BvbmRlbmNlRHRvIH0gZnJvbSAnLi9kdG8vc2VhcmNoLWNvcnJlc3BvbmRlbmNlLmR0byc7XHJcbmltcG9ydCB7IENhbmNlbENvcnJlc3BvbmRlbmNlRHRvIH0gZnJvbSAnLi9kdG8vY2FuY2VsLWNvcnJlc3BvbmRlbmNlLmR0byc7XHJcbmltcG9ydCB7IEJ1bGtDYW5jZWxEdG8gfSBmcm9tICcuL2R0by9idWxrLWNhbmNlbC5kdG8nO1xyXG5cclxuaW1wb3J0IHsgSnd0QXV0aEd1YXJkIH0gZnJvbSAnLi4vLi4vY29tbW9uL2d1YXJkcy9qd3QtYXV0aC5ndWFyZCc7XHJcbmltcG9ydCB7IFJiYWNHdWFyZCB9IGZyb20gJy4uLy4uL2NvbW1vbi9ndWFyZHMvcmJhYy5ndWFyZCc7XHJcbmltcG9ydCB7IFJlcXVpcmVQZXJtaXNzaW9uIH0gZnJvbSAnLi4vLi4vY29tbW9uL2RlY29yYXRvcnMvcmVxdWlyZS1wZXJtaXNzaW9uLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IEF1ZGl0IH0gZnJvbSAnLi4vLi4vY29tbW9uL2RlY29yYXRvcnMvYXVkaXQuZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgUGFyc2VVdWlkUGlwZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9waXBlcy9wYXJzZS11dWlkLnBpcGUnO1xyXG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RXaXRoVXNlciB9IGZyb20gJy4uLy4uL2NvbW1vbi9pbnRlcmZhY2VzL3JlcXVlc3Qtd2l0aC11c2VyLmludGVyZmFjZSc7XHJcblxyXG5AQXBpVGFncygnQ29ycmVzcG9uZGVuY2VzJylcclxuQENvbnRyb2xsZXIoJ2NvcnJlc3BvbmRlbmNlcycpXHJcbkBVc2VHdWFyZHMoSnd0QXV0aEd1YXJkLCBSYmFjR3VhcmQpXHJcbkBBcGlCZWFyZXJBdXRoKClcclxuZXhwb3J0IGNsYXNzIENvcnJlc3BvbmRlbmNlQ29udHJvbGxlciB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvcnJlc3BvbmRlbmNlU2VydmljZTogQ29ycmVzcG9uZGVuY2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB3b3JrZmxvd1NlcnZpY2U6IENvcnJlc3BvbmRlbmNlV29ya2Zsb3dTZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICBAUG9zdCgnOnV1aWQvd29ya2Zsb3cvYWN0aW9uJylcclxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ1Byb2Nlc3Mgd29ya2Zsb3cgYWN0aW9uIChBcHByb3ZlL1JlamVjdC9SZXZpZXcpJyB9KVxyXG4gIEBBcGlSZXNwb25zZSh7IHN0YXR1czogMjAxLCBkZXNjcmlwdGlvbjogJ0FjdGlvbiBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5LicgfSlcclxuICBAUmVxdWlyZVBlcm1pc3Npb24oJ3dvcmtmbG93LmFjdGlvbl9yZXZpZXcnKVxyXG4gIHByb2Nlc3NBY3Rpb24oXHJcbiAgICBAQm9keSgpIGFjdGlvbkR0bzogV29ya2Zsb3dBY3Rpb25EdG8sXHJcbiAgICBAUmVxdWVzdCgpIHJlcTogUmVxdWVzdFdpdGhVc2VyXHJcbiAgKSB7XHJcbiAgICAvLyBFeHRyYWN0IHJvbGVzIGZyb20gdXNlciBhc3NpZ25tZW50cyBmb3IgRFNMIHJlcXVpcmVtZW50cyBjaGVja1xyXG4gICAgY29uc3QgdXNlclJvbGVzID1cclxuICAgICAgcmVxLnVzZXIuYXNzaWdubWVudHM/Lm1hcCgoYSkgPT4gYS5yb2xlPy5yb2xlTmFtZSkuZmlsdGVyKEJvb2xlYW4pIHx8IFtdO1xyXG5cclxuICAgIC8vIFVzZSBVbmlmaWVkIFdvcmtmbG93IEVuZ2luZSB2aWEgQ29ycmVzcG9uZGVuY2VXb3JrZmxvd1NlcnZpY2VcclxuICAgIGlmICghYWN0aW9uRHRvLmluc3RhbmNlSWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnN0YW5jZUlkIGlzIHJlcXVpcmVkIGZvciB3b3JrZmxvdyBhY3Rpb24nKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy53b3JrZmxvd1NlcnZpY2UucHJvY2Vzc0FjdGlvbihcclxuICAgICAgYWN0aW9uRHRvLmluc3RhbmNlSWQsXHJcbiAgICAgIHJlcS51c2VyLnVzZXJfaWQsXHJcbiAgICAgIHtcclxuICAgICAgICBhY3Rpb246IGFjdGlvbkR0by5hY3Rpb24sXHJcbiAgICAgICAgY29tbWVudDogYWN0aW9uRHRvLmNvbW1lbnQsXHJcbiAgICAgICAgcGF5bG9hZDogeyAuLi5hY3Rpb25EdG8ucGF5bG9hZCwgcm9sZXM6IHVzZXJSb2xlcyB9LFxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgQFBvc3QoKVxyXG4gIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiAnQ3JlYXRlIG5ldyBjb3JyZXNwb25kZW5jZScgfSlcclxuICBAQXBpUmVzcG9uc2Uoe1xyXG4gICAgc3RhdHVzOiAyMDEsXHJcbiAgICBkZXNjcmlwdGlvbjogJ0NvcnJlc3BvbmRlbmNlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LicsXHJcbiAgICB0eXBlOiBDcmVhdGVDb3JyZXNwb25kZW5jZUR0byxcclxuICB9KVxyXG4gIEBSZXF1aXJlUGVybWlzc2lvbignY29ycmVzcG9uZGVuY2UuY3JlYXRlJylcclxuICBAQXVkaXQoJ2NvcnJlc3BvbmRlbmNlLmNyZWF0ZScsICdjb3JyZXNwb25kZW5jZScpXHJcbiAgY3JlYXRlKFxyXG4gICAgQEJvZHkoKSBjcmVhdGVEdG86IENyZWF0ZUNvcnJlc3BvbmRlbmNlRHRvLFxyXG4gICAgQFJlcXVlc3QoKSByZXE6IFJlcXVlc3RXaXRoVXNlclxyXG4gICkge1xyXG4gICAgcmV0dXJuIHRoaXMuY29ycmVzcG9uZGVuY2VTZXJ2aWNlLmNyZWF0ZShjcmVhdGVEdG8sIHJlcS51c2VyKTtcclxuICB9XHJcblxyXG4gIEBQb3N0KCdwcmV2aWV3LW51bWJlcicpXHJcbiAgQEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6ICdQcmV2aWV3IG5leHQgZG9jdW1lbnQgbnVtYmVyJyB9KVxyXG4gIEBBcGlSZXNwb25zZSh7XHJcbiAgICBzdGF0dXM6IDIwMCxcclxuICAgIGRlc2NyaXB0aW9uOiAnUmV0dXJuIHByZXZpZXcgbnVtYmVyIGFuZCBzdGF0dXMuJyxcclxuICB9KVxyXG4gIEBSZXF1aXJlUGVybWlzc2lvbignY29ycmVzcG9uZGVuY2UuY3JlYXRlJylcclxuICBwcmV2aWV3TnVtYmVyKFxyXG4gICAgQEJvZHkoKSBjcmVhdGVEdG86IENyZWF0ZUNvcnJlc3BvbmRlbmNlRHRvLFxyXG4gICAgQFJlcXVlc3QoKSByZXE6IFJlcXVlc3RXaXRoVXNlclxyXG4gICkge1xyXG4gICAgcmV0dXJuIHRoaXMuY29ycmVzcG9uZGVuY2VTZXJ2aWNlLnByZXZpZXdEb2N1bWVudE51bWJlcihcclxuICAgICAgY3JlYXRlRHRvLFxyXG4gICAgICByZXEudXNlclxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIEBHZXQoKVxyXG4gIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiAnU2VhcmNoIGNvcnJlc3BvbmRlbmNlcycgfSlcclxuICBAQXBpUmVzcG9uc2UoeyBzdGF0dXM6IDIwMCwgZGVzY3JpcHRpb246ICdSZXR1cm4gbGlzdCBvZiBjb3JyZXNwb25kZW5jZXMuJyB9KVxyXG4gIEBSZXF1aXJlUGVybWlzc2lvbignZG9jdW1lbnQudmlldycpXHJcbiAgZmluZEFsbChAUXVlcnkoKSBzZWFyY2hEdG86IFNlYXJjaENvcnJlc3BvbmRlbmNlRHRvKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb3JyZXNwb25kZW5jZVNlcnZpY2UuZmluZEFsbChzZWFyY2hEdG8pO1xyXG4gIH1cclxuXHJcbiAgQFBvc3QoJzp1dWlkL3N1Ym1pdCcpXHJcbiAgQEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6ICdTdWJtaXQgY29ycmVzcG9uZGVuY2UgdG8gVW5pZmllZCBXb3JrZmxvdyBFbmdpbmUnIH0pXHJcbiAgQEFwaVJlc3BvbnNlKHtcclxuICAgIHN0YXR1czogMjAxLFxyXG4gICAgZGVzY3JpcHRpb246ICdDb3JyZXNwb25kZW5jZSBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5LicsXHJcbiAgfSlcclxuICBAUmVxdWlyZVBlcm1pc3Npb24oJ2NvcnJlc3BvbmRlbmNlLmNyZWF0ZScpXHJcbiAgQEF1ZGl0KCdjb3JyZXNwb25kZW5jZS5zdWJtaXQnLCAnY29ycmVzcG9uZGVuY2UnKVxyXG4gIGFzeW5jIHN1Ym1pdChcclxuICAgIEBQYXJhbSgndXVpZCcsIFBhcnNlVXVpZFBpcGUpIHV1aWQ6IHN0cmluZyxcclxuICAgIEBCb2R5KCkgc3VibWl0RHRvOiBTdWJtaXRDb3JyZXNwb25kZW5jZUR0byxcclxuICAgIEBSZXF1ZXN0KCkgcmVxOiBSZXF1ZXN0V2l0aFVzZXJcclxuICApIHtcclxuICAgIGNvbnN0IGNvcnIgPSBhd2FpdCB0aGlzLmNvcnJlc3BvbmRlbmNlU2VydmljZS5maW5kT25lQnlVdWlkKHV1aWQpO1xyXG4gICAgLy8gRXh0cmFjdCByb2xlcyBmcm9tIHVzZXIgYXNzaWdubWVudHNcclxuICAgIGNvbnN0IHVzZXJSb2xlcyA9XHJcbiAgICAgIHJlcS51c2VyLmFzc2lnbm1lbnRzPy5tYXAoKGEpID0+IGEucm9sZT8ucm9sZU5hbWUpLmZpbHRlcihCb29sZWFuKSB8fCBbXTtcclxuXHJcbiAgICAvLyBVc2UgVW5pZmllZCBXb3JrZmxvdyBFbmdpbmUgLSBwYXNzIHVzZXIgcm9sZXMgZm9yIERTTCByZXF1aXJlbWVudHMgY2hlY2tcclxuICAgIHJldHVybiB0aGlzLndvcmtmbG93U2VydmljZS5zdWJtaXRXb3JrZmxvdyhcclxuICAgICAgY29yci5pZCxcclxuICAgICAgcmVxLnVzZXIudXNlcl9pZCxcclxuICAgICAgdXNlclJvbGVzLFxyXG4gICAgICBzdWJtaXREdG8ubm90ZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIEBHZXQoJzp1dWlkJylcclxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ0dldCBjb3JyZXNwb25kZW5jZSBieSBVVUlEJyB9KVxyXG4gIEBBcGlSZXNwb25zZSh7IHN0YXR1czogMjAwLCBkZXNjcmlwdGlvbjogJ1JldHVybiBjb3JyZXNwb25kZW5jZSBkZXRhaWxzLicgfSlcclxuICBAUmVxdWlyZVBlcm1pc3Npb24oJ2RvY3VtZW50LnZpZXcnKVxyXG4gIGZpbmRPbmUoQFBhcmFtKCd1dWlkJywgUGFyc2VVdWlkUGlwZSkgdXVpZDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb3JyZXNwb25kZW5jZVNlcnZpY2UuZmluZE9uZUJ5VXVpZCh1dWlkKTtcclxuICB9XHJcblxyXG4gIEBQdXQoJzp1dWlkJylcclxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ1VwZGF0ZSBjb3JyZXNwb25kZW5jZSAoRHJhZnQgb25seSknIH0pXHJcbiAgQEFwaVJlc3BvbnNlKHtcclxuICAgIHN0YXR1czogMjAwLFxyXG4gICAgZGVzY3JpcHRpb246ICdDb3JyZXNwb25kZW5jZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseS4nLFxyXG4gIH0pXHJcbiAgQFJlcXVpcmVQZXJtaXNzaW9uKCdjb3JyZXNwb25kZW5jZS5jcmVhdGUnKSAvLyBBc3N1bWluZyBjcmVhdGUgcGVybWlzc2lvbiBpcyBlbm91Z2ggZm9yIGRyYWZ0IHVwZGF0ZSwgb3IgYWRkICdjb3JyZXNwb25kZW5jZS5lZGl0J1xyXG4gIEBBdWRpdCgnY29ycmVzcG9uZGVuY2UudXBkYXRlJywgJ2NvcnJlc3BvbmRlbmNlJylcclxuICBhc3luYyB1cGRhdGUoXHJcbiAgICBAUGFyYW0oJ3V1aWQnLCBQYXJzZVV1aWRQaXBlKSB1dWlkOiBzdHJpbmcsXHJcbiAgICBAQm9keSgpIHVwZGF0ZUR0bzogVXBkYXRlQ29ycmVzcG9uZGVuY2VEdG8sXHJcbiAgICBAUmVxdWVzdCgpIHJlcTogUmVxdWVzdFdpdGhVc2VyXHJcbiAgKSB7XHJcbiAgICBjb25zdCBjb3JyID0gYXdhaXQgdGhpcy5jb3JyZXNwb25kZW5jZVNlcnZpY2UuZmluZE9uZUJ5VXVpZCh1dWlkKTtcclxuICAgIHJldHVybiB0aGlzLmNvcnJlc3BvbmRlbmNlU2VydmljZS51cGRhdGUoY29yci5pZCwgdXBkYXRlRHRvLCByZXEudXNlcik7XHJcbiAgfVxyXG5cclxuICBAR2V0KCc6dXVpZC9yZWZlcmVuY2VzJylcclxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ0dldCByZWZlcmVuY2VkIGRvY3VtZW50cycgfSlcclxuICBAQXBpUmVzcG9uc2Uoe1xyXG4gICAgc3RhdHVzOiAyMDAsXHJcbiAgICBkZXNjcmlwdGlvbjogJ1JldHVybiBsaXN0IG9mIHJlZmVyZW5jZWQgZG9jdW1lbnRzLicsXHJcbiAgfSlcclxuICBAUmVxdWlyZVBlcm1pc3Npb24oJ2RvY3VtZW50LnZpZXcnKVxyXG4gIGFzeW5jIGdldFJlZmVyZW5jZXMoQFBhcmFtKCd1dWlkJywgUGFyc2VVdWlkUGlwZSkgdXVpZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBjb3JyID0gYXdhaXQgdGhpcy5jb3JyZXNwb25kZW5jZVNlcnZpY2UuZmluZE9uZUJ5VXVpZCh1dWlkKTtcclxuICAgIHJldHVybiB0aGlzLmNvcnJlc3BvbmRlbmNlU2VydmljZS5nZXRSZWZlcmVuY2VzKGNvcnIuaWQpO1xyXG4gIH1cclxuXHJcbiAgQFBvc3QoJzp1dWlkL3JlZmVyZW5jZXMnKVxyXG4gIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiAnQWRkIHJlZmVyZW5jZSB0byBhbm90aGVyIGRvY3VtZW50JyB9KVxyXG4gIEBBcGlSZXNwb25zZSh7IHN0YXR1czogMjAxLCBkZXNjcmlwdGlvbjogJ1JlZmVyZW5jZSBhZGRlZCBzdWNjZXNzZnVsbHkuJyB9KVxyXG4gIEBSZXF1aXJlUGVybWlzc2lvbignZG9jdW1lbnQuZWRpdCcpXHJcbiAgYXN5bmMgYWRkUmVmZXJlbmNlKFxyXG4gICAgQFBhcmFtKCd1dWlkJywgUGFyc2VVdWlkUGlwZSkgdXVpZDogc3RyaW5nLFxyXG4gICAgQEJvZHkoKSBkdG86IEFkZFJlZmVyZW5jZUR0b1xyXG4gICkge1xyXG4gICAgY29uc3QgY29yciA9IGF3YWl0IHRoaXMuY29ycmVzcG9uZGVuY2VTZXJ2aWNlLmZpbmRPbmVCeVV1aWQodXVpZCk7XHJcbiAgICByZXR1cm4gdGhpcy5jb3JyZXNwb25kZW5jZVNlcnZpY2UuYWRkUmVmZXJlbmNlKGNvcnIuaWQsIGR0byk7XHJcbiAgfVxyXG5cclxuICBARGVsZXRlKCc6dXVpZC9yZWZlcmVuY2VzLzp0YXJnZXRVdWlkJylcclxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ1JlbW92ZSByZWZlcmVuY2UnIH0pXHJcbiAgQEFwaVJlc3BvbnNlKHsgc3RhdHVzOiAyMDAsIGRlc2NyaXB0aW9uOiAnUmVmZXJlbmNlIHJlbW92ZWQgc3VjY2Vzc2Z1bGx5LicgfSlcclxuICBAUmVxdWlyZVBlcm1pc3Npb24oJ2RvY3VtZW50LmVkaXQnKVxyXG4gIGFzeW5jIHJlbW92ZVJlZmVyZW5jZShcclxuICAgIEBQYXJhbSgndXVpZCcsIFBhcnNlVXVpZFBpcGUpIHV1aWQ6IHN0cmluZyxcclxuICAgIEBQYXJhbSgndGFyZ2V0VXVpZCcsIFBhcnNlVXVpZFBpcGUpIHRhcmdldFV1aWQ6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgY29uc3QgY29yciA9IGF3YWl0IHRoaXMuY29ycmVzcG9uZGVuY2VTZXJ2aWNlLmZpbmRPbmVCeVV1aWQodXVpZCk7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBhd2FpdCB0aGlzLmNvcnJlc3BvbmRlbmNlU2VydmljZS5maW5kT25lQnlVdWlkKHRhcmdldFV1aWQpO1xyXG4gICAgcmV0dXJuIHRoaXMuY29ycmVzcG9uZGVuY2VTZXJ2aWNlLnJlbW92ZVJlZmVyZW5jZShjb3JyLmlkLCB0YXJnZXQuaWQpO1xyXG4gIH1cclxuXHJcbiAgQEdldCgnOnV1aWQvdGFncycpXHJcbiAgQEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6ICdHZXQgdGFncyBmb3IgYSBjb3JyZXNwb25kZW5jZScgfSlcclxuICBAUmVxdWlyZVBlcm1pc3Npb24oJ2RvY3VtZW50LnZpZXcnKVxyXG4gIGFzeW5jIGdldFRhZ3MoQFBhcmFtKCd1dWlkJywgUGFyc2VVdWlkUGlwZSkgdXVpZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBjb3JyID0gYXdhaXQgdGhpcy5jb3JyZXNwb25kZW5jZVNlcnZpY2UuZmluZE9uZUJ5VXVpZCh1dWlkKTtcclxuICAgIHJldHVybiB0aGlzLmNvcnJlc3BvbmRlbmNlU2VydmljZS5nZXRUYWdzKGNvcnIuaWQpO1xyXG4gIH1cclxuXHJcbiAgQFBvc3QoJzp1dWlkL3RhZ3MvOnRhZ0lkJylcclxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ0FkZCB0YWcgdG8gYSBjb3JyZXNwb25kZW5jZScgfSlcclxuICBAUmVxdWlyZVBlcm1pc3Npb24oJ2RvY3VtZW50LmVkaXQnKVxyXG4gIGFzeW5jIGFkZFRhZyhcclxuICAgIEBQYXJhbSgndXVpZCcsIFBhcnNlVXVpZFBpcGUpIHV1aWQ6IHN0cmluZyxcclxuICAgIEBQYXJhbSgndGFnSWQnLCBQYXJzZUludFBpcGUpIHRhZ0lkOiBudW1iZXJcclxuICApIHtcclxuICAgIGNvbnN0IGNvcnIgPSBhd2FpdCB0aGlzLmNvcnJlc3BvbmRlbmNlU2VydmljZS5maW5kT25lQnlVdWlkKHV1aWQpO1xyXG4gICAgcmV0dXJuIHRoaXMuY29ycmVzcG9uZGVuY2VTZXJ2aWNlLmFkZFRhZyhjb3JyLmlkLCB0YWdJZCk7XHJcbiAgfVxyXG5cclxuICBARGVsZXRlKCc6dXVpZC90YWdzLzp0YWdJZCcpXHJcbiAgQEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6ICdSZW1vdmUgdGFnIGZyb20gYSBjb3JyZXNwb25kZW5jZScgfSlcclxuICBAUmVxdWlyZVBlcm1pc3Npb24oJ2RvY3VtZW50LmVkaXQnKVxyXG4gIGFzeW5jIHJlbW92ZVRhZyhcclxuICAgIEBQYXJhbSgndXVpZCcsIFBhcnNlVXVpZFBpcGUpIHV1aWQ6IHN0cmluZyxcclxuICAgIEBQYXJhbSgndGFnSWQnLCBQYXJzZUludFBpcGUpIHRhZ0lkOiBudW1iZXJcclxuICApIHtcclxuICAgIGNvbnN0IGNvcnIgPSBhd2FpdCB0aGlzLmNvcnJlc3BvbmRlbmNlU2VydmljZS5maW5kT25lQnlVdWlkKHV1aWQpO1xyXG4gICAgcmV0dXJuIHRoaXMuY29ycmVzcG9uZGVuY2VTZXJ2aWNlLnJlbW92ZVRhZyhjb3JyLmlkLCB0YWdJZCk7XHJcbiAgfVxyXG5cclxuICBAUG9zdCgnYnVsay1jYW5jZWwnKVxyXG4gIEBIdHRwQ29kZSgyMDApXHJcbiAgQEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6ICdCdWxrIGNhbmNlbCBjb3JyZXNwb25kZW5jZXMgKE9yZyBBZG1pbispJyB9KVxyXG4gIEBSZXF1aXJlUGVybWlzc2lvbignY29ycmVzcG9uZGVuY2UuY2FuY2VsJylcclxuICBAQXVkaXQoJ2NvcnJlc3BvbmRlbmNlLmJ1bGtfY2FuY2VsJywgJ2NvcnJlc3BvbmRlbmNlJylcclxuICBhc3luYyBidWxrQ2FuY2VsKFxyXG4gICAgQEJvZHkoKSBkdG86IEJ1bGtDYW5jZWxEdG8sXHJcbiAgICBAUmVxdWVzdCgpIHJlcTogUmVxdWVzdFdpdGhVc2VyXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb3JyZXNwb25kZW5jZVNlcnZpY2UuYnVsa0NhbmNlbChcclxuICAgICAgZHRvLnV1aWRzLFxyXG4gICAgICBkdG8ucmVhc29uLFxyXG4gICAgICByZXEudXNlclxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIEBHZXQoJ2V4cG9ydC1jc3YnKVxyXG4gIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiAnRXhwb3J0IGNvcnJlc3BvbmRlbmNlIGxpc3QgYXMgQ1NWJyB9KVxyXG4gIEBSZXF1aXJlUGVybWlzc2lvbignZG9jdW1lbnQudmlldycpXHJcbiAgYXN5bmMgZXhwb3J0Q3N2KFxyXG4gICAgQFF1ZXJ5KCkgc2VhcmNoRHRvOiBTZWFyY2hDb3JyZXNwb25kZW5jZUR0byxcclxuICAgIEBSZXMoKSByZXM6IFJlc3BvbnNlXHJcbiAgKSB7XHJcbiAgICBjb25zdCBjc3YgPSBhd2FpdCB0aGlzLmNvcnJlc3BvbmRlbmNlU2VydmljZS5leHBvcnRDc3Yoc2VhcmNoRHRvKTtcclxuICAgIGNvbnN0IGZpbGVuYW1lID0gYGNvcnJlc3BvbmRlbmNlcy0ke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdfS5jc3ZgO1xyXG4gICAgcmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvY3N2OyBjaGFyc2V0PXV0Zi04Jyk7XHJcbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgYGF0dGFjaG1lbnQ7IGZpbGVuYW1lPVwiJHtmaWxlbmFtZX1cImApO1xyXG4gICAgcmVzLnNlbmQoJ1xcdUZFRkYnICsgY3N2KTtcclxuICB9XHJcblxyXG4gIEBEZWxldGUoJzp1dWlkJylcclxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ0NhbmNlbCBjb3JyZXNwb25kZW5jZSAoQWRtaW4gb25seSknIH0pXHJcbiAgQEFwaVJlc3BvbnNlKHtcclxuICAgIHN0YXR1czogMjAwLFxyXG4gICAgZGVzY3JpcHRpb246ICdDb3JyZXNwb25kZW5jZSBjYW5jZWxsZWQgc3VjY2Vzc2Z1bGx5LicsXHJcbiAgfSlcclxuICBAUmVxdWlyZVBlcm1pc3Npb24oJ2NvcnJlc3BvbmRlbmNlLmNhbmNlbCcpXHJcbiAgQEF1ZGl0KCdjb3JyZXNwb25kZW5jZS5jYW5jZWwnLCAnY29ycmVzcG9uZGVuY2UnKVxyXG4gIGFzeW5jIGNhbmNlbChcclxuICAgIEBQYXJhbSgndXVpZCcsIFBhcnNlVXVpZFBpcGUpIHV1aWQ6IHN0cmluZyxcclxuICAgIEBCb2R5KCkgY2FuY2VsRHRvOiBDYW5jZWxDb3JyZXNwb25kZW5jZUR0byxcclxuICAgIEBSZXF1ZXN0KCkgcmVxOiBSZXF1ZXN0V2l0aFVzZXJcclxuICApIHtcclxuICAgIHJldHVybiB0aGlzLmNvcnJlc3BvbmRlbmNlU2VydmljZS5jYW5jZWwodXVpZCwgY2FuY2VsRHRvLnJlYXNvbiwgcmVxLnVzZXIpO1xyXG4gIH1cclxufVxyXG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/47/correspondencecontroller_47b6657e09337a2e65746953c9dcefc6.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/47/correspondencecontroller_47b6657e09337a2e65746953c9dcefc6.map new file mode 100644 index 0000000..03b64b2 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/47/correspondencecontroller_47b6657e09337a2e65746953c9dcefc6.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.controller.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.controller.ts"],"sourcesContent":["import {\r\n Controller,\r\n Get,\r\n Post,\r\n Body,\r\n UseGuards,\r\n Request,\r\n Param,\r\n Query,\r\n Delete,\r\n Put,\r\n ParseIntPipe,\r\n Res,\r\n HttpCode,\r\n} from '@nestjs/common';\r\nimport type { Response } from 'express';\r\nimport {\r\n ApiTags,\r\n ApiOperation,\r\n ApiResponse,\r\n ApiBearerAuth,\r\n} from '@nestjs/swagger';\r\nimport { CorrespondenceService } from './correspondence.service';\r\nimport { CorrespondenceWorkflowService } from './correspondence-workflow.service';\r\nimport { CreateCorrespondenceDto } from './dto/create-correspondence.dto';\r\nimport { UpdateCorrespondenceDto } from './dto/update-correspondence.dto';\r\nimport { SubmitCorrespondenceDto } from './dto/submit-correspondence.dto';\r\nimport { WorkflowActionDto } from './dto/workflow-action.dto';\r\nimport { AddReferenceDto } from './dto/add-reference.dto';\r\nimport { SearchCorrespondenceDto } from './dto/search-correspondence.dto';\r\nimport { CancelCorrespondenceDto } from './dto/cancel-correspondence.dto';\r\nimport { BulkCancelDto } from './dto/bulk-cancel.dto';\r\n\r\nimport { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';\r\nimport { RbacGuard } from '../../common/guards/rbac.guard';\r\nimport { RequirePermission } from '../../common/decorators/require-permission.decorator';\r\nimport { Audit } from '../../common/decorators/audit.decorator';\r\nimport { ParseUuidPipe } from '../../common/pipes/parse-uuid.pipe';\r\nimport type { RequestWithUser } from '../../common/interfaces/request-with-user.interface';\r\n\r\n@ApiTags('Correspondences')\r\n@Controller('correspondences')\r\n@UseGuards(JwtAuthGuard, RbacGuard)\r\n@ApiBearerAuth()\r\nexport class CorrespondenceController {\r\n constructor(\r\n private readonly correspondenceService: CorrespondenceService,\r\n private readonly workflowService: CorrespondenceWorkflowService\r\n ) {}\r\n\r\n @Post(':uuid/workflow/action')\r\n @ApiOperation({ summary: 'Process workflow action (Approve/Reject/Review)' })\r\n @ApiResponse({ status: 201, description: 'Action processed successfully.' })\r\n @RequirePermission('workflow.action_review')\r\n processAction(\r\n @Body() actionDto: WorkflowActionDto,\r\n @Request() req: RequestWithUser\r\n ) {\r\n // Extract roles from user assignments for DSL requirements check\r\n const userRoles =\r\n req.user.assignments?.map((a) => a.role?.roleName).filter(Boolean) || [];\r\n\r\n // Use Unified Workflow Engine via CorrespondenceWorkflowService\r\n if (!actionDto.instanceId) {\r\n throw new Error('instanceId is required for workflow action');\r\n }\r\n\r\n return this.workflowService.processAction(\r\n actionDto.instanceId,\r\n req.user.user_id,\r\n {\r\n action: actionDto.action,\r\n comment: actionDto.comment,\r\n payload: { ...actionDto.payload, roles: userRoles },\r\n }\r\n );\r\n }\r\n\r\n @Post()\r\n @ApiOperation({ summary: 'Create new correspondence' })\r\n @ApiResponse({\r\n status: 201,\r\n description: 'Correspondence created successfully.',\r\n type: CreateCorrespondenceDto,\r\n })\r\n @RequirePermission('correspondence.create')\r\n @Audit('correspondence.create', 'correspondence')\r\n create(\r\n @Body() createDto: CreateCorrespondenceDto,\r\n @Request() req: RequestWithUser\r\n ) {\r\n return this.correspondenceService.create(createDto, req.user);\r\n }\r\n\r\n @Post('preview-number')\r\n @ApiOperation({ summary: 'Preview next document number' })\r\n @ApiResponse({\r\n status: 200,\r\n description: 'Return preview number and status.',\r\n })\r\n @RequirePermission('correspondence.create')\r\n previewNumber(\r\n @Body() createDto: CreateCorrespondenceDto,\r\n @Request() req: RequestWithUser\r\n ) {\r\n return this.correspondenceService.previewDocumentNumber(\r\n createDto,\r\n req.user\r\n );\r\n }\r\n\r\n @Get()\r\n @ApiOperation({ summary: 'Search correspondences' })\r\n @ApiResponse({ status: 200, description: 'Return list of correspondences.' })\r\n @RequirePermission('document.view')\r\n findAll(@Query() searchDto: SearchCorrespondenceDto) {\r\n return this.correspondenceService.findAll(searchDto);\r\n }\r\n\r\n @Post(':uuid/submit')\r\n @ApiOperation({ summary: 'Submit correspondence to Unified Workflow Engine' })\r\n @ApiResponse({\r\n status: 201,\r\n description: 'Correspondence submitted successfully.',\r\n })\r\n @RequirePermission('correspondence.create')\r\n @Audit('correspondence.submit', 'correspondence')\r\n async submit(\r\n @Param('uuid', ParseUuidPipe) uuid: string,\r\n @Body() submitDto: SubmitCorrespondenceDto,\r\n @Request() req: RequestWithUser\r\n ) {\r\n const corr = await this.correspondenceService.findOneByUuid(uuid);\r\n // Extract roles from user assignments\r\n const userRoles =\r\n req.user.assignments?.map((a) => a.role?.roleName).filter(Boolean) || [];\r\n\r\n // Use Unified Workflow Engine - pass user roles for DSL requirements check\r\n return this.workflowService.submitWorkflow(\r\n corr.id,\r\n req.user.user_id,\r\n userRoles,\r\n submitDto.note\r\n );\r\n }\r\n\r\n @Get(':uuid')\r\n @ApiOperation({ summary: 'Get correspondence by UUID' })\r\n @ApiResponse({ status: 200, description: 'Return correspondence details.' })\r\n @RequirePermission('document.view')\r\n findOne(@Param('uuid', ParseUuidPipe) uuid: string) {\r\n return this.correspondenceService.findOneByUuid(uuid);\r\n }\r\n\r\n @Put(':uuid')\r\n @ApiOperation({ summary: 'Update correspondence (Draft only)' })\r\n @ApiResponse({\r\n status: 200,\r\n description: 'Correspondence updated successfully.',\r\n })\r\n @RequirePermission('correspondence.create') // Assuming create permission is enough for draft update, or add 'correspondence.edit'\r\n @Audit('correspondence.update', 'correspondence')\r\n async update(\r\n @Param('uuid', ParseUuidPipe) uuid: string,\r\n @Body() updateDto: UpdateCorrespondenceDto,\r\n @Request() req: RequestWithUser\r\n ) {\r\n const corr = await this.correspondenceService.findOneByUuid(uuid);\r\n return this.correspondenceService.update(corr.id, updateDto, req.user);\r\n }\r\n\r\n @Get(':uuid/references')\r\n @ApiOperation({ summary: 'Get referenced documents' })\r\n @ApiResponse({\r\n status: 200,\r\n description: 'Return list of referenced documents.',\r\n })\r\n @RequirePermission('document.view')\r\n async getReferences(@Param('uuid', ParseUuidPipe) uuid: string) {\r\n const corr = await this.correspondenceService.findOneByUuid(uuid);\r\n return this.correspondenceService.getReferences(corr.id);\r\n }\r\n\r\n @Post(':uuid/references')\r\n @ApiOperation({ summary: 'Add reference to another document' })\r\n @ApiResponse({ status: 201, description: 'Reference added successfully.' })\r\n @RequirePermission('document.edit')\r\n async addReference(\r\n @Param('uuid', ParseUuidPipe) uuid: string,\r\n @Body() dto: AddReferenceDto\r\n ) {\r\n const corr = await this.correspondenceService.findOneByUuid(uuid);\r\n return this.correspondenceService.addReference(corr.id, dto);\r\n }\r\n\r\n @Delete(':uuid/references/:targetUuid')\r\n @ApiOperation({ summary: 'Remove reference' })\r\n @ApiResponse({ status: 200, description: 'Reference removed successfully.' })\r\n @RequirePermission('document.edit')\r\n async removeReference(\r\n @Param('uuid', ParseUuidPipe) uuid: string,\r\n @Param('targetUuid', ParseUuidPipe) targetUuid: string\r\n ) {\r\n const corr = await this.correspondenceService.findOneByUuid(uuid);\r\n const target = await this.correspondenceService.findOneByUuid(targetUuid);\r\n return this.correspondenceService.removeReference(corr.id, target.id);\r\n }\r\n\r\n @Get(':uuid/tags')\r\n @ApiOperation({ summary: 'Get tags for a correspondence' })\r\n @RequirePermission('document.view')\r\n async getTags(@Param('uuid', ParseUuidPipe) uuid: string) {\r\n const corr = await this.correspondenceService.findOneByUuid(uuid);\r\n return this.correspondenceService.getTags(corr.id);\r\n }\r\n\r\n @Post(':uuid/tags/:tagId')\r\n @ApiOperation({ summary: 'Add tag to a correspondence' })\r\n @RequirePermission('document.edit')\r\n async addTag(\r\n @Param('uuid', ParseUuidPipe) uuid: string,\r\n @Param('tagId', ParseIntPipe) tagId: number\r\n ) {\r\n const corr = await this.correspondenceService.findOneByUuid(uuid);\r\n return this.correspondenceService.addTag(corr.id, tagId);\r\n }\r\n\r\n @Delete(':uuid/tags/:tagId')\r\n @ApiOperation({ summary: 'Remove tag from a correspondence' })\r\n @RequirePermission('document.edit')\r\n async removeTag(\r\n @Param('uuid', ParseUuidPipe) uuid: string,\r\n @Param('tagId', ParseIntPipe) tagId: number\r\n ) {\r\n const corr = await this.correspondenceService.findOneByUuid(uuid);\r\n return this.correspondenceService.removeTag(corr.id, tagId);\r\n }\r\n\r\n @Post('bulk-cancel')\r\n @HttpCode(200)\r\n @ApiOperation({ summary: 'Bulk cancel correspondences (Org Admin+)' })\r\n @RequirePermission('correspondence.cancel')\r\n @Audit('correspondence.bulk_cancel', 'correspondence')\r\n async bulkCancel(\r\n @Body() dto: BulkCancelDto,\r\n @Request() req: RequestWithUser\r\n ) {\r\n return this.correspondenceService.bulkCancel(\r\n dto.uuids,\r\n dto.reason,\r\n req.user\r\n );\r\n }\r\n\r\n @Get('export-csv')\r\n @ApiOperation({ summary: 'Export correspondence list as CSV' })\r\n @RequirePermission('document.view')\r\n async exportCsv(\r\n @Query() searchDto: SearchCorrespondenceDto,\r\n @Res() res: Response\r\n ) {\r\n const csv = await this.correspondenceService.exportCsv(searchDto);\r\n const filename = `correspondences-${new Date().toISOString().split('T')[0]}.csv`;\r\n res.setHeader('Content-Type', 'text/csv; charset=utf-8');\r\n res.setHeader('Content-Disposition', `attachment; filename=\"${filename}\"`);\r\n res.send('\\uFEFF' + csv);\r\n }\r\n\r\n @Delete(':uuid')\r\n @ApiOperation({ summary: 'Cancel correspondence (Admin only)' })\r\n @ApiResponse({\r\n status: 200,\r\n description: 'Correspondence cancelled successfully.',\r\n })\r\n @RequirePermission('correspondence.cancel')\r\n @Audit('correspondence.cancel', 'correspondence')\r\n async cancel(\r\n @Param('uuid', ParseUuidPipe) uuid: string,\r\n @Body() cancelDto: CancelCorrespondenceDto,\r\n @Request() req: RequestWithUser\r\n ) {\r\n return this.correspondenceService.cancel(uuid, cancelDto.reason, req.user);\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/48/v3_48f32482646a4d7525289af85f0ce07d b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/48/v3_48f32482646a4d7525289af85f0ce07d new file mode 100644 index 0000000..242d724 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/48/v3_48f32482646a4d7525289af85f0ce07d @@ -0,0 +1,16 @@ +3bd675d66c9db29f86a7660a0ecc0925 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.URL = exports.DNS = void 0; +const md5_js_1 = require("./md5.js"); +const v35_js_1 = require("./v35.js"); +var v35_js_2 = require("./v35.js"); +Object.defineProperty(exports, "DNS", { enumerable: true, get: function () { return v35_js_2.DNS; } }); +Object.defineProperty(exports, "URL", { enumerable: true, get: function () { return v35_js_2.URL; } }); +function v3(value, namespace, buf, offset) { + return (0, v35_js_1.default)(0x30, md5_js_1.default, value, namespace, buf, offset); +} +v3.DNS = v35_js_1.DNS; +v3.URL = v35_js_1.URL; +exports.default = v3; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdjMuanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDO0FBQ2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUQsT0FBTyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQ25DLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNyQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDckMsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLGNBQWMsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN2RyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxjQUFjLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdkcsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTTtJQUNyQyxPQUFPLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN4RixDQUFDO0FBQ0QsRUFBRSxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDO0FBQ3RCLEVBQUUsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQztBQUN0QixPQUFPLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcbm9kZV9tb2R1bGVzXFwucG5wbVxcdXVpZEAxMS4xLjBcXG5vZGVfbW9kdWxlc1xcdXVpZFxcZGlzdFxcY2pzXFx2My5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuVVJMID0gZXhwb3J0cy5ETlMgPSB2b2lkIDA7XG5jb25zdCBtZDVfanNfMSA9IHJlcXVpcmUoXCIuL21kNS5qc1wiKTtcbmNvbnN0IHYzNV9qc18xID0gcmVxdWlyZShcIi4vdjM1LmpzXCIpO1xudmFyIHYzNV9qc18yID0gcmVxdWlyZShcIi4vdjM1LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRE5TXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB2MzVfanNfMi5ETlM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJVUkxcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHYzNV9qc18yLlVSTDsgfSB9KTtcbmZ1bmN0aW9uIHYzKHZhbHVlLCBuYW1lc3BhY2UsIGJ1Ziwgb2Zmc2V0KSB7XG4gICAgcmV0dXJuICgwLCB2MzVfanNfMS5kZWZhdWx0KSgweDMwLCBtZDVfanNfMS5kZWZhdWx0LCB2YWx1ZSwgbmFtZXNwYWNlLCBidWYsIG9mZnNldCk7XG59XG52My5ETlMgPSB2MzVfanNfMS5ETlM7XG52My5VUkwgPSB2MzVfanNfMS5VUkw7XG5leHBvcnRzLmRlZmF1bHQgPSB2MztcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/48/v3_48f32482646a4d7525289af85f0ce07d.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/48/v3_48f32482646a4d7525289af85f0ce07d.map new file mode 100644 index 0000000..90dc485 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/48/v3_48f32482646a4d7525289af85f0ce07d.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v3.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC;AACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACrC,IAAI,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACnC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACvG,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACvG,SAAS,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM;IACrC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AACxF,CAAC;AACD,EAAE,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;AACtB,EAAE,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;AACtB,OAAO,CAAC,OAAO,GAAG,EAAE,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v3.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.URL = exports.DNS = void 0;\nconst md5_js_1 = require(\"./md5.js\");\nconst v35_js_1 = require(\"./v35.js\");\nvar v35_js_2 = require(\"./v35.js\");\nObject.defineProperty(exports, \"DNS\", { enumerable: true, get: function () { return v35_js_2.DNS; } });\nObject.defineProperty(exports, \"URL\", { enumerable: true, get: function () { return v35_js_2.URL; } });\nfunction v3(value, namespace, buf, offset) {\n return (0, v35_js_1.default)(0x30, md5_js_1.default, value, namespace, buf, offset);\n}\nv3.DNS = v35_js_1.DNS;\nv3.URL = v35_js_1.URL;\nexports.default = v3;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/49/md5_492d12f97f16fb5ab77effc461ec7562 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/49/md5_492d12f97f16fb5ab77effc461ec7562 new file mode 100644 index 0000000..8f9fe44 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/49/md5_492d12f97f16fb5ab77effc461ec7562 @@ -0,0 +1,15 @@ +c32f9030fe21a500c9139d8bd66a7907 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const crypto_1 = require("crypto"); +function md5(bytes) { + if (Array.isArray(bytes)) { + bytes = Buffer.from(bytes); + } + else if (typeof bytes === 'string') { + bytes = Buffer.from(bytes, 'utf8'); + } + return (0, crypto_1.createHash)('md5').update(bytes).digest(); +} +exports.default = md5; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcbWQ1LmpzIiwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUNiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNuQyxTQUFTLEdBQUcsQ0FBQyxLQUFLO0lBQ2QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkIsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQztTQUNJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDakMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDbEUsQ0FBQztBQUNELE9BQU8sQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxub2RlX21vZHVsZXNcXC5wbnBtXFx1dWlkQDExLjEuMFxcbm9kZV9tb2R1bGVzXFx1dWlkXFxkaXN0XFxjanNcXG1kNS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGNyeXB0b18xID0gcmVxdWlyZShcImNyeXB0b1wiKTtcbmZ1bmN0aW9uIG1kNShieXRlcykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGJ5dGVzKSkge1xuICAgICAgICBieXRlcyA9IEJ1ZmZlci5mcm9tKGJ5dGVzKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICBieXRlcyA9IEJ1ZmZlci5mcm9tKGJ5dGVzLCAndXRmOCcpO1xuICAgIH1cbiAgICByZXR1cm4gKDAsIGNyeXB0b18xLmNyZWF0ZUhhc2gpKCdtZDUnKS51cGRhdGUoYnl0ZXMpLmRpZ2VzdCgpO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gbWQ1O1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/49/md5_492d12f97f16fb5ab77effc461ec7562.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/49/md5_492d12f97f16fb5ab77effc461ec7562.map new file mode 100644 index 0000000..4638b88 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/49/md5_492d12f97f16fb5ab77effc461ec7562.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\md5.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AACnC,SAAS,GAAG,CAAC,KAAK;IACd,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;SACI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACjC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;AAClE,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,GAAG,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\md5.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst crypto_1 = require(\"crypto\");\nfunction md5(bytes) {\n if (Array.isArray(bytes)) {\n bytes = Buffer.from(bytes);\n }\n else if (typeof bytes === 'string') {\n bytes = Buffer.from(bytes, 'utf8');\n }\n return (0, crypto_1.createHash)('md5').update(bytes).digest();\n}\nexports.default = md5;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4c/jsonschemaservice_4c698e35d782ba409cfca244345003e5 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4c/jsonschemaservice_4c698e35d782ba409cfca244345003e5 new file mode 100644 index 0000000..a56aabd --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4c/jsonschemaservice_4c698e35d782ba409cfca244345003e5 @@ -0,0 +1,317 @@ +338c6ef4bdd053340bfcc183e7e81fde +"use strict"; +// File: src/modules/json-schema/json-schema.service.ts +// บันทึกการแก้ไข: Fix TS2345 (undefined check) +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +var JsonSchemaService_1; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.JsonSchemaService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const ajv_1 = __importDefault(require("ajv")); +const ajv_formats_1 = __importDefault(require("ajv-formats")); +const typeorm_2 = require("typeorm"); +const json_schema_entity_1 = require("./entities/json-schema.entity"); +// Services ย่อยที่แยกตามหน้าที่ (Single Responsibility) +const json_security_service_1 = require("./services/json-security.service"); +const ui_schema_service_1 = require("./services/ui-schema.service"); +const virtual_column_service_1 = require("./services/virtual-column.service"); +let JsonSchemaService = JsonSchemaService_1 = class JsonSchemaService { + constructor(jsonSchemaRepository, virtualColumnService, uiSchemaService, jsonSecurityService) { + this.jsonSchemaRepository = jsonSchemaRepository; + this.virtualColumnService = virtualColumnService; + this.uiSchemaService = uiSchemaService; + this.jsonSecurityService = jsonSecurityService; + this.validators = new Map(); // Cache สำหรับเก็บ Validator ที่ Compile แล้ว + this.logger = new common_1.Logger(JsonSchemaService_1.name); + // ค่า Default สำหรับการตรวจสอบข้อมูล + this.defaultOptions = { + removeAdditional: true, // ลบฟิลด์เกิน + coerceTypes: true, // แปลงชนิดข้อมูลอัตโนมัติ (เช่น "123" -> 123) + useDefaults: true, // ใส่ค่า Default ถ้าไม่มีข้อมูล + }; + // กำหนดค่าเริ่มต้นให้กับ AJV Validation Engine + this.ajv = new ajv_1.default({ + allErrors: true, // แสดง Error ทั้งหมด ไม่หยุดแค่จุดแรก + strict: false, // ไม่เคร่งครัดเกินไป (ยอมรับ Keyword แปลกๆ เช่น ui:widget) + coerceTypes: true, + useDefaults: true, + removeAdditional: true, + }); + (0, ajv_formats_1.default)(this.ajv); // เพิ่ม Format มาตรฐาน (email, date, uri ฯลฯ) + this.registerCustomValidators(); // ลงทะเบียน Validator เฉพาะของโปรเจกต์ + } + async onModuleInit() { + // สามารถโหลด Schema ที่ Active ทั้งหมดมา Cache ไว้ล่วงหน้าได้ที่นี่ เพื่อความเร็วในการตอบสนองครั้งแรก + } + /** + * ลงทะเบียน Custom Validators เฉพาะสำหรับ LCBP3 + */ + registerCustomValidators() { + // 1. ตรวจสอบรูปแบบเลขที่เอกสาร (เช่น TEAM-RFA-STR-0001) + this.ajv.addFormat('document-number', { + type: 'string', + validate: (value) => { + // Regex อย่างง่าย: กลุ่มตัวอักษรขีดคั่นด้วย - + return /^[A-Z0-9]{2,10}-[A-Z]{2,5}(-[A-Z0-9]{2,5})?-\d{4}-\d{3,5}$/.test(value); + }, + }); + // 2. Keyword สำหรับระบุ Role ที่จำเป็น (ใช้ร่วมกับ Security Service) + this.ajv.addKeyword({ + keyword: 'requiredRole', + type: 'string', + metaSchema: { type: 'string' }, + validate: (_schema, _data) => true, // ผ่านเสมอในขั้น AJV (Security Service จะจัดการเอง) + }); + } + /** + * สร้าง Schema ใหม่ พร้อมจัดการ Version, UI Schema และ Virtual Columns + */ + async create(createDto) { + // 1. ตรวจสอบความถูกต้องของ JSON Schema Definition (AJV Syntax) + try { + this.ajv.compile(createDto.schemaDefinition); + } + catch (error) { + throw new common_1.BadRequestException(`Invalid JSON Schema format: ${error instanceof Error ? error.message : String(error)}`); + } + // 2. จัดการ UI Schema + if (createDto.uiSchema) { + // ถ้าส่งมา ให้ตรวจสอบความถูกต้องเทียบกับ Data Schema + this.uiSchemaService.validateUiSchema(createDto.uiSchema, createDto.schemaDefinition); + } + else { + // ถ้าไม่ส่งมา ให้สร้าง UI Schema พื้นฐานให้อัตโนมัติ + createDto.uiSchema = this.uiSchemaService.generateDefaultUiSchema(createDto.schemaDefinition); + } + // 3. จัดการ Versioning อัตโนมัติ (Auto-increment) + const latestSchema = await this.jsonSchemaRepository.findOne({ + where: { schemaCode: createDto.schemaCode }, + order: { version: 'DESC' }, + }); + let newVersion = 1; + if (latestSchema) { + // ถ้าผู้ใช้ไม่ระบุ Version หรือระบุมาน้อยกว่าล่าสุด ให้ +1 + if (!createDto.version || createDto.version <= latestSchema.version) { + newVersion = latestSchema.version + 1; + } + else { + newVersion = createDto.version; + } + } + else if (createDto.version) { + newVersion = createDto.version; + } + // 4. บันทึกลงฐานข้อมูล + const newSchema = this.jsonSchemaRepository.create({ + ...createDto, + version: newVersion, + }); + const savedSchema = await this.jsonSchemaRepository.save(newSchema); + // ล้าง Cache เพื่อให้โหลดตัวใหม่ในครั้งถัดไป + this.validators.delete(savedSchema.schemaCode); + this.logger.log(`Schema '${savedSchema.schemaCode}' created (v${savedSchema.version})`); + // 5. สร้าง/อัปเดต Virtual Columns บน Database จริง (Performance Optimization) + // Fix TS2345: Add empty array fallback + if (savedSchema.virtualColumns && savedSchema.virtualColumns.length > 0) { + await this.virtualColumnService.setupVirtualColumns(savedSchema.tableName, savedSchema.virtualColumns || []); + } + return savedSchema; + } + /** + * ค้นหา Schema ทั้งหมด (Pagination & Filter) + */ + async findAll(searchDto) { + const { search, isActive, page = 1, limit = 20 } = searchDto; + const skip = (page - 1) * limit; + const query = this.jsonSchemaRepository.createQueryBuilder('schema'); + if (search) { + query.andWhere('schema.schemaCode LIKE :search', { + search: `%${search}%`, + }); + } + if (isActive !== undefined) { + query.andWhere('schema.isActive = :isActive', { isActive }); + } + // เรียงตาม Code ก่อน แล้วตามด้วย Version ล่าสุด + query.orderBy('schema.schemaCode', 'ASC'); + query.addOrderBy('schema.version', 'DESC'); + const [items, total] = await query.skip(skip).take(limit).getManyAndCount(); + return { + data: items, + meta: { + total, + page, + limit, + totalPages: Math.ceil(total / limit), + }, + }; + } + /** + * ดึงข้อมูล Schema ตาม ID + */ + async findOne(id) { + const schema = await this.jsonSchemaRepository.findOne({ where: { id } }); + if (!schema) { + throw new common_1.NotFoundException(`JsonSchema with ID ${id} not found`); + } + return schema; + } + /** + * ดึงข้อมูล Schema ตาม Code และ Version (สำหรับ Migration) + */ + async findOneByCodeAndVersion(code, version) { + const schema = await this.jsonSchemaRepository.findOne({ + where: { schemaCode: code, version }, + }); + if (!schema) { + throw new common_1.NotFoundException(`JsonSchema '${code}' version ${version} not found`); + } + return schema; + } + /** + * ดึง Schema เวอร์ชันล่าสุดที่ Active (สำหรับใช้งานทั่วไป) + */ + async findLatestByCode(code) { + const schema = await this.jsonSchemaRepository.findOne({ + where: { schemaCode: code, isActive: true }, + order: { version: 'DESC' }, + }); + if (!schema) { + throw new common_1.NotFoundException(`Active JsonSchema with code '${code}' not found`); + } + return schema; + } + /** + * [CORE FUNCTION] ตรวจสอบข้อมูล (Validate), ทำความสะอาด (Sanitize) และเข้ารหัส (Encrypt) + * ใช้สำหรับ "ขาเข้า" (Write) ก่อนบันทึกลง Database + */ + async validateData(schemaCode, data, _options = {}) { + // 1. ดึงและ Compile Validator + const validate = await this.getValidator(schemaCode); + const schema = await this.findLatestByCode(schemaCode); // ดึง Full Schema เพื่อใช้ Config อื่นๆ + // 2. สำเนาข้อมูลเพื่อป้องกัน Side Effect และเตรียมสำหรับ AJV Mutation (Sanitization) + const dataToValidate = JSON.parse(JSON.stringify(data)); + // 3. เริ่มการตรวจสอบ (AJV จะทำการ Coerce Type และ Remove Additional Properties ให้ด้วย) + const valid = validate(dataToValidate); + // 4. จัดการกรณีข้อมูลไม่ถูกต้อง + if (!valid) { + const errors = (validate.errors || []).map((err) => ({ + field: err.instancePath || 'root', + message: err.message || 'Validation error', + value: err.params, + })); + return { + isValid: false, + errors, + sanitizedData: null, + }; + } + // 5. เข้ารหัสข้อมูล (Encryption) สำหรับ Field ที่มีความลับ (x-encrypt: true) + const secureData = this.jsonSecurityService.encryptFields(dataToValidate, schema.schemaDefinition); + return { + isValid: true, + errors: [], + sanitizedData: secureData, // ข้อมูลนี้สะอาดและปลอดภัย พร้อมบันทึก + }; + } + /** + * [CORE FUNCTION] อ่านข้อมูล, ถอดรหัส (Decrypt) และกรองตามสิทธิ์ (Filter) + * ใช้สำหรับ "ขาออก" (Read) ก่อนส่งให้ Frontend + */ + async processReadData(schemaCode, data, userContext) { + if (!data) + return data; + // ดึง Schema เพื่อดู Config การถอดรหัสและการมองเห็น + const schema = await this.findLatestByCode(schemaCode); + return this.jsonSecurityService.decryptAndFilterFields(data, schema.schemaDefinition, userContext); + } + /** + * Helper: ดึงและ Cache AJV Validator Function เพื่อประสิทธิภาพ + */ + async getValidator(schemaCode) { + let validate = this.validators.get(schemaCode); + if (!validate) { + const schema = await this.findLatestByCode(schemaCode); + try { + validate = this.ajv.compile(schema.schemaDefinition); + this.validators.set(schemaCode, validate); + } + catch (error) { + throw new common_1.BadRequestException(`Invalid Schema Definition for '${schemaCode}': ${error instanceof Error ? error.message : String(error)}`); + } + } + return validate; + } + /** + * Wrapper เก่าสำหรับ Backward Compatibility (ถ้ามีโค้ดเก่าเรียกใช้) + */ + async validate(schemaCode, data) { + const result = await this.validateData(schemaCode, data); + if (!result.isValid) { + const errorMsg = result.errors + .map((e) => `${e.field}: ${e.message}`) + .join(', '); + throw new common_1.BadRequestException(`JSON Validation Failed: ${errorMsg}`); + } + return true; + } + /** + * อัปเดตข้อมูล Schema และจัดการผลกระทบ (Virtual Columns / UI Schema) + */ + async update(id, updateDto) { + const schema = await this.findOne(id); + // ตรวจสอบ JSON Schema + if (updateDto.schemaDefinition) { + try { + this.ajv.compile(updateDto.schemaDefinition); + } + catch (error) { + throw new common_1.BadRequestException(`Invalid JSON Schema format: ${error instanceof Error ? error.message : String(error)}`); + } + this.validators.delete(schema.schemaCode); // เคลียร์ Cache เก่า + } + // ตรวจสอบ UI Schema + if (updateDto.uiSchema) { + this.uiSchemaService.validateUiSchema(updateDto.uiSchema, updateDto.schemaDefinition || schema.schemaDefinition); + } + const updatedSchema = this.jsonSchemaRepository.merge(schema, updateDto); + const savedSchema = await this.jsonSchemaRepository.save(updatedSchema); + // อัปเดต Virtual Columns ใน Database ถ้ามีการเปลี่ยนแปลง Config + // Fix TS2345: Add empty array fallback + if (updateDto.virtualColumns && updatedSchema.virtualColumns) { + await this.virtualColumnService.setupVirtualColumns(savedSchema.tableName, savedSchema.virtualColumns || []); + } + return savedSchema; + } + /** + * ลบ Schema (Hard Delete) + */ + async remove(id) { + const schema = await this.findOne(id); + this.validators.delete(schema.schemaCode); + await this.jsonSchemaRepository.remove(schema); + } +}; +exports.JsonSchemaService = JsonSchemaService; +exports.JsonSchemaService = JsonSchemaService = JsonSchemaService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(json_schema_entity_1.JsonSchema)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object, typeof (_b = typeof virtual_column_service_1.VirtualColumnService !== "undefined" && virtual_column_service_1.VirtualColumnService) === "function" ? _b : Object, typeof (_c = typeof ui_schema_service_1.UiSchemaService !== "undefined" && ui_schema_service_1.UiSchemaService) === "function" ? _c : Object, typeof (_d = typeof json_security_service_1.JsonSecurityService !== "undefined" && json_security_service_1.JsonSecurityService) === "function" ? _d : Object]) +], JsonSchemaService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcanNvbi1zY2hlbWFcXGpzb24tc2NoZW1hLnNlcnZpY2UudHMiLCJtYXBwaW5ncyI6IjtBQUFBLHVEQUF1RDtBQUN2RCwrQ0FBK0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRS9DLDJDQU13QjtBQUN4Qiw2Q0FBbUQ7QUFDbkQsOENBQTRDO0FBQzVDLDhEQUFxQztBQUNyQyxxQ0FBcUM7QUFLckMsc0VBQTJEO0FBRTNELHdEQUF3RDtBQUN4RCw0RUFHMEM7QUFDMUMsb0VBQStEO0FBRS9ELDhFQUF5RTtBQVNsRSxJQUFNLGlCQUFpQix5QkFBdkIsTUFBTSxpQkFBaUI7SUFZNUIsWUFFRSxvQkFBNkQsRUFDNUMsb0JBQTBDLEVBQzFDLGVBQWdDLEVBQ2hDLG1CQUF3QztRQUh4Qyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXdCO1FBQzVDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFmbkQsZUFBVSxHQUFHLElBQUksR0FBRyxFQUE0QixDQUFDLENBQUMsOENBQThDO1FBQ3ZGLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxtQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU3RCxxQ0FBcUM7UUFDcEIsbUJBQWMsR0FBc0I7WUFDbkQsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLGNBQWM7WUFDdEMsV0FBVyxFQUFFLElBQUksRUFBRSw4Q0FBOEM7WUFDakUsV0FBVyxFQUFFLElBQUksRUFBRSxnQ0FBZ0M7U0FDcEQsQ0FBQztRQVNBLCtDQUErQztRQUMvQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksYUFBRyxDQUFDO1lBQ2pCLFNBQVMsRUFBRSxJQUFJLEVBQUUsc0NBQXNDO1lBQ3ZELE1BQU0sRUFBRSxLQUFLLEVBQUUsMkRBQTJEO1lBQzFFLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFdBQVcsRUFBRSxJQUFJ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TUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXhFLGdFQUFnRTtRQUNoRSx1Q0FBdUM7UUFDdkMsSUFBSSxTQUFTLENBQUMsY0FBYyxJQUFJLGFBQWEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM3RCxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FDakQsV0FBVyxDQUFDLFNBQVMsRUFDckIsV0FBVyxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQ2pDLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFVO1FBQ3JCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUMsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELENBQUM7Q0FDRixDQUFBO0FBeFhZLDhDQUFpQjs0QkFBakIsaUJBQWlCO0lBRDdCLElBQUEsbUJBQVUsR0FBRTtJQWNSLFdBQUEsSUFBQSwwQkFBZ0IsRUFBQywrQkFBVSxDQUFDLENBQUE7eURBQ1Usb0JBQVUsb0JBQVYsb0JBQVUsb0RBQ1YsNkNBQW9CLG9CQUFwQiw2Q0FBb0Isb0RBQ3pCLG1DQUFlLG9CQUFmLG1DQUFlLG9EQUNYLDJDQUFtQixvQkFBbkIsMkNBQW1CO0dBakJoRCxpQkFBaUIsQ0F3WDdCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGpzb24tc2NoZW1hXFxqc29uLXNjaGVtYS5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9tb2R1bGVzL2pzb24tc2NoZW1hL2pzb24tc2NoZW1hLnNlcnZpY2UudHNcbi8vIOC4muC4seC4meC4l+C4tuC4geC4geC4suC4o+C5geC4geC5ieC5hOC4gjogRml4IFRTMjM0NSAodW5kZWZpbmVkIGNoZWNrKVxuXG5pbXBvcnQge1xuICBCYWRSZXF1ZXN0RXhjZXB0aW9uLFxuICBJbmplY3RhYmxlLFxuICBMb2dnZXIsXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxuICBPbk1vZHVsZUluaXQsXG59IGZyb20gJ0BuZXN0anMvY29tbW9uJztcbmltcG9ydCB7IEluamVjdFJlcG9zaXRvcnkgfSBmcm9tICdAbmVzdGpzL3R5cGVvcm0nO1xuaW1wb3J0IEFqdiwgeyBWYWxpZGF0ZUZ1bmN0aW9uIH0gZnJvbSAnYWp2JztcbmltcG9ydCBhZGRGb3JtYXRzIGZyb20gJ2Fqdi1mb3JtYXRzJztcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tICd0eXBlb3JtJztcblxuaW1wb3J0IHsgQ3JlYXRlSnNvblNjaGVtYUR0byB9IGZyb20gJy4vZHRvL2NyZWF0ZS1qc29uLXNjaGVtYS5kdG8nO1xuaW1wb3J0IHsgU2VhcmNoSnNvblNjaGVtYUR0byB9IGZyb20gJy4vZHRvL3NlYXJjaC1qc29uLXNjaGVtYS5kdG8nO1xuaW1wb3J0IHsgVXBkYXRlSnNvblNjaGVtYUR0byB9IGZyb20gJy4vZHRvL3VwZGF0ZS1qc29uLXNjaGVtYS5kdG8nO1xuaW1wb3J0IHsgSnNvblNjaGVtYSB9IGZyb20gJy4vZW50aXRpZXMvanNvbi1zY2hlbWEuZW50aXR5JztcblxuLy8gU2VydmljZXMg4Lii4LmI4Lit4Lii4LiX4Li14LmI4LmB4Lii4LiB4LiV4Liy4Lih4Lir4LiZ4LmJ4Liy4LiX4Li14LmIIChTaW5nbGUgUmVzcG9uc2liaWxpdHkpXG5pbXBvcnQge1xuICBKc29uU2VjdXJpdHlTZXJ2aWNlLFxuICBTZWN1cml0eUNvbnRleHQsXG59IGZyb20gJy4vc2VydmljZXMvanNvbi1zZWN1cml0eS5zZXJ2aWNlJztcbmltcG9ydCB7IFVpU2NoZW1hU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdWktc2NoZW1hLnNlcnZpY2UnO1xuaW1wb3J0IHsgVWlTY2hlbWEgfSBmcm9tICcuL2ludGVyZmFjZXMvdWktc2NoZW1hLmludGVyZmFjZSc7XG5pbXBvcnQgeyBWaXJ0dWFsQ29sdW1uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdmlydHVhbC1jb2x1bW4uc2VydmljZSc7XG5cbmltcG9ydCB7XG4gIFZhbGlkYXRpb25FcnJvckRldGFpbCxcbiAgVmFsaWRhdGlvbk9wdGlvbnMsXG4gIFZhbGlkYXRpb25SZXN1bHQsXG59IGZyb20gJy4vaW50ZXJmYWNlcy92YWxpZGF0aW9uLXJlc3VsdC5pbnRlcmZhY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSnNvblNjaGVtYVNlcnZpY2UgaW1wbGVtZW50cyBPbk1vZHVsZUluaXQge1xuICBwcml2YXRlIGFqdjogQWp2O1xuICBwcml2YXRlIHZhbGlkYXRvcnMgPSBuZXcgTWFwPHN0cmluZywgVmFsaWRhdGVGdW5jdGlvbj4oKTsgLy8gQ2FjaGUg4Liq4Liz4Lir4Lij4Lix4Lia4LmA4LiB4LmH4LiaIFZhbGlkYXRvciDguJfguLXguYggQ29tcGlsZSDguYHguKXguYnguKdcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKEpzb25TY2hlbWFTZXJ2aWNlLm5hbWUpO1xuXG4gIC8vIOC4hOC5iOC4siBEZWZhdWx0IOC4quC4s+C4q+C4o+C4seC4muC4geC4suC4o+C4leC4o+C4p+C4iOC4quC4reC4muC4guC5ieC4reC4oeC4ueC4pVxuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRPcHRpb25zOiBWYWxpZGF0aW9uT3B0aW9ucyA9IHtcbiAgICByZW1vdmVBZGRpdGlvbmFsOiB0cnVlLCAvLyDguKXguJrguJ/guLTguKXguJTguYzguYDguIHguLTguJlcbiAgICBjb2VyY2VUeXBlczogdHJ1ZSwgLy8g4LmB4Lib4Lil4LiH4LiK4LiZ4Li04LiU4LiC4LmJ4Lit4Lih4Li54Lil4Lit4Lix4LiV4LmC4LiZ4Lih4Lix4LiV4Li0ICjguYDguIrguYjguJkgXCIxMjNcIiAtPiAxMjMpXG4gICAgdXNlRGVmYXVsdHM6IHRydWUsIC8vIOC5g+C4quC5iOC4hOC5iOC4siBEZWZhdWx0IOC4luC5ieC4suC5hOC4oeC5iOC4oeC4teC4guC5ieC4reC4oeC4ueC4pVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3RSZXBvc2l0b3J5KEpzb25TY2hlbWEpXG4gICAgcHJpdmF0ZSByZWFkb25seSBqc29uU2NoZW1hUmVwb3NpdG9yeTogUmVwb3NpdG9yeTxKc29uU2NoZW1hPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpcnR1YWxDb2x1bW5TZXJ2aWNlOiBWaXJ0dWFsQ29sdW1uU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHVpU2NoZW1hU2VydmljZTogVWlTY2hlbWFTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkganNvblNlY3VyaXR5U2VydmljZTogSnNvblNlY3VyaXR5U2VydmljZVxuICApIHtcbiAgICAvLyDguIHguLPguKvguJnguJTguITguYjguLLguYDguKPguLTguYjguKHguJXguYnguJnguYPguKvguYnguIHguLHguJogQUpWIFZhbGlkYXRpb24gRW5naW5lXG4gICAgdGhpcy5hanYgPSBuZXcgQWp2KHtcbiAgICAgIGFsbEVycm9yczogdHJ1ZSwgLy8g4LmB4Liq4LiU4LiHIEVycm9yIOC4l+C4seC5ieC4h+C4q+C4oeC4lCDguYTguKHguYjguKvguKLguLjguJTguYHguITguYjguIjguLjguJTguYHguKPguIFcbiAgICAgIHN0cmljdDogZmFsc2UsIC8vIOC5hOC4oeC5iOC5gOC4hOC4o+C5iOC4h+C4hOC4o+C4seC4lOC5gOC4geC4tOC4meC5hOC4myAo4Lii4Lit4Lih4Lij4Lix4LiaIEtleXdvcmQg4LmB4Lib4Lil4LiB4LmGIOC5gOC4iuC5iOC4mSB1aTp3aWRnZXQpXG4gICAgICBjb2VyY2VUeXBlczogdHJ1ZSxcbiAgICAgIHVzZURlZmF1bHRzOiB0cnVlLFxuICAgICAgcmVtb3ZlQWRkaXRpb25hbDogdHJ1ZSxcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRzKHRoaXMuYWp2KTsgLy8g4LmA4Lie4Li04LmI4LihIEZvcm1hdCDguKHguLLguJXguKPguJDguLLguJkgKGVtYWlsLCBkYXRlLCB1cmkg4Liv4Lil4LivKVxuICAgIHRoaXMucmVnaXN0ZXJDdXN0b21WYWxpZGF0b3JzKCk7IC8vIOC4peC4h+C4l+C4sOC5gOC4muC4teC4ouC4mSBWYWxpZGF0b3Ig4LmA4LiJ4Lie4Liy4Liw4LiC4Lit4LiH4LmC4Lib4Lij4LmA4LiI4LiB4LiV4LmMXG4gIH1cblxuICBhc3luYyBvbk1vZHVsZUluaXQoKSB7XG4gICAgLy8g4Liq4Liy4Lih4Liy4Lij4LiW4LmC4Lir4Lil4LiUIFNjaGVtYSDguJfguLXguYggQWN0aXZlIOC4l+C4seC5ieC4h+C4q+C4oeC4lOC4oeC4siBDYWNoZSDguYTguKfguYnguKXguYjguKfguIfguKvguJnguYnguLLguYTguJTguYnguJfguLXguYjguJnguLXguYgg4LmA4Lie4Li34LmI4Lit4LiE4Lin4Liy4Lih4LmA4Lij4LmH4Lin4LmD4LiZ4LiB4Liy4Lij4LiV4Lit4Lia4Liq4LiZ4Lit4LiH4LiE4Lij4Lix4LmJ4LiH4LmB4Lij4LiBXG4gIH1cblxuICAvKipcbiAgICog4Lil4LiH4LiX4Liw4LmA4Lia4Li14Lii4LiZIEN1c3RvbSBWYWxpZGF0b3JzIOC5gOC4ieC4nuC4suC4sOC4quC4s+C4q+C4o+C4seC4miBMQ0JQM1xuICAgKi9cbiAgcHJpdmF0ZSByZWdpc3RlckN1c3RvbVZhbGlkYXRvcnMoKSB7XG4gICAgLy8gMS4g4LiV4Lij4Lin4LiI4Liq4Lit4Lia4Lij4Li54Lib4LmB4Lia4Lia4LmA4Lil4LiC4LiX4Li14LmI4LmA4Lit4LiB4Liq4Liy4LijICjguYDguIrguYjguJkgVEVBTS1SRkEtU1RSLTAwMDEpXG4gICAgdGhpcy5hanYuYWRkRm9ybWF0KCdkb2N1bWVudC1udW1iZXInLCB7XG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIHZhbGlkYXRlOiAodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAvLyBSZWdleCDguK3guKLguYjguLLguIfguIfguYjguLLguKI6IOC4geC4peC4uOC5iOC4oeC4leC4seC4p+C4reC4seC4geC4qeC4o+C4guC4teC4lOC4hOC4seC5iOC4meC4lOC5ieC4p+C4oiAtXG4gICAgICAgIHJldHVybiAvXltBLVowLTldezIsMTB9LVtBLVpdezIsNX0oLVtBLVowLTldezIsNX0pPy1cXGR7NH0tXFxkezMsNX0kLy50ZXN0KFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gMi4gS2V5d29yZCDguKrguLPguKvguKPguLHguJrguKPguLDguJrguLggUm9sZSDguJfguLXguYjguIjguLPguYDguJvguYfguJkgKOC5g+C4iuC5ieC4o+C5iOC4p+C4oeC4geC4seC4miBTZWN1cml0eSBTZXJ2aWNlKVxuICAgIHRoaXMuYWp2LmFkZEtleXdvcmQoe1xuICAgICAga2V5d29yZDogJ3JlcXVpcmVkUm9sZScsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIG1ldGFTY2hlbWE6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgIHZhbGlkYXRlOiAoX3NjaGVtYTogc3RyaW5nLCBfZGF0YTogdW5rbm93bikgPT4gdHJ1ZSwgLy8g4Lic4LmI4Liy4LiZ4LmA4Liq4Lih4Lit4LmD4LiZ4LiC4Lix4LmJ4LiZIEFKViAoU2VjdXJpdHkgU2VydmljZSDguIjguLDguIjguLHguJTguIHguLLguKPguYDguK3guIcpXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog4Liq4Lij4LmJ4Liy4LiHIFNjaGVtYSDguYPguKvguKHguYgg4Lie4Lij4LmJ4Lit4Lih4LiI4Lix4LiU4LiB4Liy4LijIFZlcnNpb24sIFVJIFNjaGVtYSDguYHguKXguLAgVmlydHVhbCBDb2x1bW5zXG4gICAqL1xuICBhc3luYyBjcmVhdGUoY3JlYXRlRHRvOiBDcmVhdGVKc29uU2NoZW1hRHRvKTogUHJvbWlzZTxKc29uU2NoZW1hPiB7XG4gICAgLy8gMS4g4LiV4Lij4Lin4LiI4Liq4Lit4Lia4LiE4Lin4Liy4Lih4LiW4Li54LiB4LiV4LmJ4Lit4LiH4LiC4Lit4LiHIEpTT04gU2NoZW1hIERlZmluaXRpb24gKEFKViBTeW50YXgpXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuYWp2LmNvbXBpbGUoY3JlYXRlRHRvLnNjaGVtYURlZmluaXRpb24pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgYEludmFsaWQgSlNPTiBTY2hlbWEgZm9ybWF0OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDIuIOC4iOC4seC4lOC4geC4suC4oyBVSSBTY2hlbWFcbiAgICBpZiAoY3JlYXRlRHRvLnVpU2NoZW1hKSB7XG4gICAgICAvLyDguJbguYnguLLguKrguYjguIfguKHguLIg4LmD4Lir4LmJ4LiV4Lij4Lin4LiI4Liq4Lit4Lia4LiE4Lin4Liy4Lih4LiW4Li54LiB4LiV4LmJ4Lit4LiH4LmA4LiX4Li14Lii4Lia4LiB4Lix4LiaIERhdGEgU2NoZW1hXG4gICAgICB0aGlzLnVpU2NoZW1hU2VydmljZS52YWxpZGF0ZVVpU2NoZW1hKFxuICAgICAgICBjcmVhdGVEdG8udWlTY2hlbWEgYXMgdW5rbm93biBhcyBVaVNjaGVtYSxcbiAgICAgICAgY3JlYXRlRHRvLnNjaGVtYURlZmluaXRpb25cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOC4luC5ieC4suC5hOC4oeC5iOC4quC5iOC4h+C4oeC4siDguYPguKvguYnguKrguKPguYnguLLguIcgVUkgU2NoZW1hIOC4nuC4t+C5ieC4meC4kOC4suC4meC5g+C4q+C5ieC4reC4seC4leC5guC4meC4oeC4seC4leC4tFxuICAgICAgY3JlYXRlRHRvLnVpU2NoZW1hID0gdGhpcy51aVNjaGVtYVNlcnZpY2UuZ2VuZXJhdGVEZWZhdWx0VWlTY2hlbWEoXG4gICAgICAgIGNyZWF0ZUR0by5zY2hlbWFEZWZpbml0aW9uXG4gICAgICApIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgfVxuXG4gICAgLy8gMy4g4LiI4Lix4LiU4LiB4Liy4LijIFZlcnNpb25pbmcg4Lit4Lix4LiV4LmC4LiZ4Lih4Lix4LiV4Li0IChBdXRvLWluY3JlbWVudClcbiAgICBjb25zdCBsYXRlc3RTY2hlbWEgPSBhd2FpdCB0aGlzLmpzb25TY2hlbWFSZXBvc2l0b3J5LmZpbmRPbmUoe1xuICAgICAgd2hlcmU6IHsgc2NoZW1hQ29kZTogY3JlYXRlRHRvLnNjaGVtYUNvZGUgfSxcbiAgICAgIG9yZGVyOiB7IHZlcnNpb246ICdERVNDJyB9LFxuICAgIH0pO1xuXG4gICAgbGV0IG5ld1ZlcnNpb24gPSAxO1xuICAgIGlmIChsYXRlc3RTY2hlbWEpIHtcbiAgICAgIC8vIOC4luC5ieC4suC4nOC4ueC5ieC5g+C4iuC5ieC5hOC4oeC5iOC4o+C4sOC4muC4uCBWZXJzaW9uIOC4q+C4o+C4t+C4reC4o+C4sOC4muC4uOC4oeC4suC4meC5ieC4reC4ouC4geC4p+C5iOC4suC4peC5iOC4suC4quC4uOC4lCDguYPguKvguYkgKzFcbiAgICAgIGlmICghY3JlYXRlRHRvLnZlcnNpb24gfHwgY3JlYXRlRHRvLnZlcnNpb24gPD0gbGF0ZXN0U2NoZW1hLnZlcnNpb24pIHtcbiAgICAgICAgbmV3VmVyc2lvbiA9IGxhdGVzdFNjaGVtYS52ZXJzaW9uICsgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1ZlcnNpb24gPSBjcmVhdGVEdG8udmVyc2lvbjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNyZWF0ZUR0by52ZXJzaW9uKSB7XG4gICAgICBuZXdWZXJzaW9uID0gY3JlYXRlRHRvLnZlcnNpb247XG4gICAgfVxuXG4gICAgLy8gNC4g4Lia4Lix4LiZ4LiX4Li24LiB4Lil4LiH4LiQ4Liy4LiZ4LiC4LmJ4Lit4Lih4Li54LilXG4gICAgY29uc3QgbmV3U2NoZW1hID0gdGhpcy5qc29uU2NoZW1hUmVwb3NpdG9yeS5jcmVhdGUoe1xuICAgICAgLi4uY3JlYXRlRHRvLFxuICAgICAgdmVyc2lvbjogbmV3VmVyc2lvbixcbiAgICB9KTtcblxuICAgIGNvbnN0IHNhdmVkU2NoZW1hID0gYXdhaXQgdGhpcy5qc29uU2NoZW1hUmVwb3NpdG9yeS5zYXZlKG5ld1NjaGVtYSk7XG5cbiAgICAvLyDguKXguYnguLLguIcgQ2FjaGUg4LmA4Lie4Li34LmI4Lit4LmD4Lir4LmJ4LmC4Lir4Lil4LiU4LiV4Lix4Lin4LmD4Lir4Lih4LmI4LmD4LiZ4LiE4Lij4Lix4LmJ4LiH4LiW4Lix4LiU4LmE4LibXG4gICAgdGhpcy52YWxpZGF0b3JzLmRlbGV0ZShzYXZlZFNjaGVtYS5zY2hlbWFDb2RlKTtcblxuICAgIHRoaXMubG9nZ2VyLmxvZyhcbiAgICAgIGBTY2hlbWEgJyR7c2F2ZWRTY2hlbWEuc2NoZW1hQ29kZX0nIGNyZWF0ZWQgKHYke3NhdmVkU2NoZW1hLnZlcnNpb259KWBcbiAgICApO1xuXG4gICAgLy8gNS4g4Liq4Lij4LmJ4Liy4LiHL+C4reC4seC4m+C5gOC4lOC4lSBWaXJ0dWFsIENvbHVtbnMg4Lia4LiZIERhdGFiYXNlIOC4iOC4o+C4tOC4hyAoUGVyZm9ybWFuY2UgT3B0aW1pemF0aW9uKVxuICAgIC8vIEZpeCBUUzIzNDU6IEFkZCBlbXB0eSBhcnJheSBmYWxsYmFja1xuICAgIGlmIChzYXZlZFNjaGVtYS52aXJ0dWFsQ29sdW1ucyAmJiBzYXZlZFNjaGVtYS52aXJ0dWFsQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCB0aGlzLnZpcnR1YWxDb2x1bW5TZXJ2aWNlLnNldHVwVmlydHVhbENvbHVtbnMoXG4gICAgICAgIHNhdmVkU2NoZW1hLnRhYmxlTmFtZSxcbiAgICAgICAgc2F2ZWRTY2hlbWEudmlydHVhbENvbHVtbnMgfHwgW11cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNhdmVkU2NoZW1hO1xuICB9XG5cbiAgLyoqXG4gICAqIOC4hOC5ieC4meC4q+C4siBTY2hlbWEg4LiX4Lix4LmJ4LiH4Lir4Lih4LiUIChQYWdpbmF0aW9uICYgRmlsdGVyKVxuICAgKi9cbiAgYXN5bmMgZmluZEFsbChzZWFyY2hEdG86IFNlYXJjaEpzb25TY2hlbWFEdG8pIHtcbiAgICBjb25zdCB7IHNlYXJjaCwgaXNBY3RpdmUsIHBhZ2UgPSAxLCBsaW1pdCA9IDIwIH0gPSBzZWFyY2hEdG87XG4gICAgY29uc3Qgc2tpcCA9IChwYWdlIC0gMSkgKiBsaW1pdDtcblxuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5qc29uU2NoZW1hUmVwb3NpdG9yeS5jcmVhdGVRdWVyeUJ1aWxkZXIoJ3NjaGVtYScpO1xuXG4gICAgaWYgKHNlYXJjaCkge1xuICAgICAgcXVlcnkuYW5kV2hlcmUoJ3NjaGVtYS5zY2hlbWFDb2RlIExJS0UgOnNlYXJjaCcsIHtcbiAgICAgICAgc2VhcmNoOiBgJSR7c2VhcmNofSVgLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGlzQWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHF1ZXJ5LmFuZFdoZXJlKCdzY2hlbWEuaXNBY3RpdmUgPSA6aXNBY3RpdmUnLCB7IGlzQWN0aXZlIH0pO1xuICAgIH1cblxuICAgIC8vIOC5gOC4o+C4teC4ouC4h+C4leC4suC4oSBDb2RlIOC4geC5iOC4reC4mSDguYHguKXguYnguKfguJXguLLguKHguJTguYnguKfguKIgVmVyc2lvbiDguKXguYjguLLguKrguLjguJRcbiAgICBxdWVyeS5vcmRlckJ5KCdzY2hlbWEuc2NoZW1hQ29kZScsICdBU0MnKTtcbiAgICBxdWVyeS5hZGRPcmRlckJ5KCdzY2hlbWEudmVyc2lvbicsICdERVNDJyk7XG5cbiAgICBjb25zdCBbaXRlbXMsIHRvdGFsXSA9IGF3YWl0IHF1ZXJ5LnNraXAoc2tpcCkudGFrZShsaW1pdCkuZ2V0TWFueUFuZENvdW50KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogaXRlbXMsXG4gICAgICBtZXRhOiB7XG4gICAgICAgIHRvdGFsLFxuICAgICAgICBwYWdlLFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgdG90YWxQYWdlczogTWF0aC5jZWlsKHRvdGFsIC8gbGltaXQpLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOC4lOC4tuC4h+C4guC5ieC4reC4oeC4ueC4pSBTY2hlbWEg4LiV4Liy4LihIElEXG4gICAqL1xuICBhc3luYyBmaW5kT25lKGlkOiBudW1iZXIpOiBQcm9taXNlPEpzb25TY2hlbWE+IHtcbiAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCB0aGlzLmpzb25TY2hlbWFSZXBvc2l0b3J5LmZpbmRPbmUoeyB3aGVyZTogeyBpZCB9IH0pO1xuICAgIGlmICghc2NoZW1hKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oYEpzb25TY2hlbWEgd2l0aCBJRCAke2lkfSBub3QgZm91bmRgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuXG4gIC8qKlxuICAgKiDguJTguLbguIfguILguYnguK3guKHguLnguKUgU2NoZW1hIOC4leC4suC4oSBDb2RlIOC5geC4peC4sCBWZXJzaW9uICjguKrguLPguKvguKPguLHguJogTWlncmF0aW9uKVxuICAgKi9cbiAgYXN5bmMgZmluZE9uZUJ5Q29kZUFuZFZlcnNpb24oXG4gICAgY29kZTogc3RyaW5nLFxuICAgIHZlcnNpb246IG51bWJlclxuICApOiBQcm9taXNlPEpzb25TY2hlbWE+IHtcbiAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCB0aGlzLmpzb25TY2hlbWFSZXBvc2l0b3J5LmZpbmRPbmUoe1xuICAgICAgd2hlcmU6IHsgc2NoZW1hQ29kZTogY29kZSwgdmVyc2lvbiB9LFxuICAgIH0pO1xuXG4gICAgaWYgKCFzY2hlbWEpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihcbiAgICAgICAgYEpzb25TY2hlbWEgJyR7Y29kZX0nIHZlcnNpb24gJHt2ZXJzaW9ufSBub3QgZm91bmRgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG5cbiAgLyoqXG4gICAqIOC4lOC4tuC4hyBTY2hlbWEg4LmA4Lin4Lit4Lij4LmM4LiK4Lix4LiZ4Lil4LmI4Liy4Liq4Li44LiU4LiX4Li14LmIIEFjdGl2ZSAo4Liq4Liz4Lir4Lij4Lix4Lia4LmD4LiK4LmJ4LiH4Liy4LiZ4LiX4Lix4LmI4Lin4LmE4LibKVxuICAgKi9cbiAgYXN5bmMgZmluZExhdGVzdEJ5Q29kZShjb2RlOiBzdHJpbmcpOiBQcm9taXNlPEpzb25TY2hlbWE+IHtcbiAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCB0aGlzLmpzb25TY2hlbWFSZXBvc2l0b3J5LmZpbmRPbmUoe1xuICAgICAgd2hlcmU6IHsgc2NoZW1hQ29kZTogY29kZSwgaXNBY3RpdmU6IHRydWUgfSxcbiAgICAgIG9yZGVyOiB7IHZlcnNpb246ICdERVNDJyB9LFxuICAgIH0pO1xuXG4gICAgaWYgKCFzY2hlbWEpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihcbiAgICAgICAgYEFjdGl2ZSBKc29uU2NoZW1hIHdpdGggY29kZSAnJHtjb2RlfScgbm90IGZvdW5kYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuXG4gIC8qKlxuICAgKiBbQ09SRSBGVU5DVElPTl0g4LiV4Lij4Lin4LiI4Liq4Lit4Lia4LiC4LmJ4Lit4Lih4Li54LilIChWYWxpZGF0ZSksIOC4l+C4s+C4hOC4p+C4suC4oeC4quC4sOC4reC4suC4lCAoU2FuaXRpemUpIOC5geC4peC4sOC5gOC4guC5ieC4suC4o+C4q+C4seC4qiAoRW5jcnlwdClcbiAgICog4LmD4LiK4LmJ4Liq4Liz4Lir4Lij4Lix4LiaIFwi4LiC4Liy4LmA4LiC4LmJ4LiyXCIgKFdyaXRlKSDguIHguYjguK3guJnguJrguLHguJnguJfguLbguIHguKXguIcgRGF0YWJhc2VcbiAgICovXG4gIGFzeW5jIHZhbGlkYXRlRGF0YShcbiAgICBzY2hlbWFDb2RlOiBzdHJpbmcsXG4gICAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgX29wdGlvbnM6IFZhbGlkYXRpb25PcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxWYWxpZGF0aW9uUmVzdWx0PiB7XG4gICAgLy8gMS4g4LiU4Li24LiH4LmB4Lil4LiwIENvbXBpbGUgVmFsaWRhdG9yXG4gICAgY29uc3QgdmFsaWRhdGUgPSBhd2FpdCB0aGlzLmdldFZhbGlkYXRvcihzY2hlbWFDb2RlKTtcbiAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCB0aGlzLmZpbmRMYXRlc3RCeUNvZGUoc2NoZW1hQ29kZSk7IC8vIOC4lOC4tuC4hyBGdWxsIFNjaGVtYSDguYDguJ7guLfguYjguK3guYPguIrguYkgQ29uZmlnIOC4reC4t+C5iOC4meC5hlxuXG4gICAgLy8gMi4g4Liq4Liz4LmA4LiZ4Liy4LiC4LmJ4Lit4Lih4Li54Lil4LmA4Lie4Li34LmI4Lit4Lib4LmJ4Lit4LiH4LiB4Lix4LiZIFNpZGUgRWZmZWN0IOC5geC4peC4sOC5gOC4leC4o+C4teC4ouC4oeC4quC4s+C4q+C4o+C4seC4miBBSlYgTXV0YXRpb24gKFNhbml0aXphdGlvbilcbiAgICBjb25zdCBkYXRhVG9WYWxpZGF0ZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGF0YSkpIGFzIFJlY29yZDxcbiAgICAgIHN0cmluZyxcbiAgICAgIHVua25vd25cbiAgICA+O1xuXG4gICAgLy8gMy4g4LmA4Lij4Li04LmI4Lih4LiB4Liy4Lij4LiV4Lij4Lin4LiI4Liq4Lit4LiaIChBSlYg4LiI4Liw4LiX4Liz4LiB4Liy4LijIENvZXJjZSBUeXBlIOC5geC4peC4sCBSZW1vdmUgQWRkaXRpb25hbCBQcm9wZXJ0aWVzIOC5g+C4q+C5ieC4lOC5ieC4p+C4oilcbiAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlKGRhdGFUb1ZhbGlkYXRlKTtcblxuICAgIC8vIDQuIOC4iOC4seC4lOC4geC4suC4o+C4geC4o+C4k+C4teC4guC5ieC4reC4oeC4ueC4peC5hOC4oeC5iOC4luC4ueC4geC4leC5ieC4reC4h1xuICAgIGlmICghdmFsaWQpIHtcbiAgICAgIGNvbnN0IGVycm9yczogVmFsaWRhdGlvbkVycm9yRGV0YWlsW10gPSAodmFsaWRhdGUuZXJyb3JzIHx8IFtdKS5tYXAoXG4gICAgICAgIChlcnIpID0+ICh7XG4gICAgICAgICAgZmllbGQ6IGVyci5pbnN0YW5jZVBhdGggfHwgJ3Jvb3QnLFxuICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlIHx8ICdWYWxpZGF0aW9uIGVycm9yJyxcbiAgICAgICAgICB2YWx1ZTogZXJyLnBhcmFtcyxcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcnMsXG4gICAgICAgIHNhbml0aXplZERhdGE6IG51bGwsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIDUuIOC5gOC4guC5ieC4suC4o+C4q+C4seC4quC4guC5ieC4reC4oeC4ueC4pSAoRW5jcnlwdGlvbikg4Liq4Liz4Lir4Lij4Lix4LiaIEZpZWxkIOC4l+C4teC5iOC4oeC4teC4hOC4p+C4suC4oeC4peC4seC4miAoeC1lbmNyeXB0OiB0cnVlKVxuICAgIGNvbnN0IHNlY3VyZURhdGEgPSB0aGlzLmpzb25TZWN1cml0eVNlcnZpY2UuZW5jcnlwdEZpZWxkcyhcbiAgICAgIGRhdGFUb1ZhbGlkYXRlLFxuICAgICAgc2NoZW1hLnNjaGVtYURlZmluaXRpb25cbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlzVmFsaWQ6IHRydWUsXG4gICAgICBlcnJvcnM6IFtdLFxuICAgICAgc2FuaXRpemVkRGF0YTogc2VjdXJlRGF0YSwgLy8g4LiC4LmJ4Lit4Lih4Li54Lil4LiZ4Li14LmJ4Liq4Liw4Lit4Liy4LiU4LmB4Lil4Liw4Lib4Lil4Lit4LiU4Lig4Lix4LiiIOC4nuC4o+C5ieC4reC4oeC4muC4seC4meC4l+C4tuC4gVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogW0NPUkUgRlVOQ1RJT05dIOC4reC5iOC4suC4meC4guC5ieC4reC4oeC4ueC4pSwg4LiW4Lit4LiU4Lij4Lir4Lix4LiqIChEZWNyeXB0KSDguYHguKXguLDguIHguKPguK3guIfguJXguLLguKHguKrguLTguJfguJjguLTguYwgKEZpbHRlcilcbiAgICog4LmD4LiK4LmJ4Liq4Liz4Lir4Lij4Lix4LiaIFwi4LiC4Liy4Lit4Lit4LiBXCIgKFJlYWQpIOC4geC5iOC4reC4meC4quC5iOC4h+C5g+C4q+C5iSBGcm9udGVuZFxuICAgKi9cbiAgYXN5bmMgcHJvY2Vzc1JlYWREYXRhKFxuICAgIHNjaGVtYUNvZGU6IHN0cmluZyxcbiAgICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICB1c2VyQ29udGV4dDogU2VjdXJpdHlDb250ZXh0XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgICBpZiAoIWRhdGEpIHJldHVybiBkYXRhO1xuXG4gICAgLy8g4LiU4Li24LiHIFNjaGVtYSDguYDguJ7guLfguYjguK3guJTguLkgQ29uZmlnIOC4geC4suC4o+C4luC4reC4lOC4o+C4q+C4seC4quC5geC4peC4sOC4geC4suC4o+C4oeC4reC4h+C5gOC4q+C5h+C4mVxuICAgIGNvbnN0IHNjaGVtYSA9IGF3YWl0IHRoaXMuZmluZExhdGVzdEJ5Q29kZShzY2hlbWFDb2RlKTtcblxuICAgIHJldHVybiB0aGlzLmpzb25TZWN1cml0eVNlcnZpY2UuZGVjcnlwdEFuZEZpbHRlckZpZWxkcyhcbiAgICAgIGRhdGEsXG4gICAgICBzY2hlbWEuc2NoZW1hRGVmaW5pdGlvbixcbiAgICAgIHVzZXJDb250ZXh0XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXI6IOC4lOC4tuC4h+C5geC4peC4sCBDYWNoZSBBSlYgVmFsaWRhdG9yIEZ1bmN0aW9uIOC5gOC4nuC4t+C5iOC4reC4m+C4o+C4sOC4quC4tOC4l+C4mOC4tOC4oOC4suC4nlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRWYWxpZGF0b3Ioc2NoZW1hQ29kZTogc3RyaW5nKTogUHJvbWlzZTxWYWxpZGF0ZUZ1bmN0aW9uPiB7XG4gICAgbGV0IHZhbGlkYXRlID0gdGhpcy52YWxpZGF0b3JzLmdldChzY2hlbWFDb2RlKTtcblxuICAgIGlmICghdmFsaWRhdGUpIHtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IGF3YWl0IHRoaXMuZmluZExhdGVzdEJ5Q29kZShzY2hlbWFDb2RlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbGlkYXRlID0gdGhpcy5hanYuY29tcGlsZShzY2hlbWEuc2NoZW1hRGVmaW5pdGlvbik7XG4gICAgICAgIHRoaXMudmFsaWRhdG9ycy5zZXQoc2NoZW1hQ29kZSwgdmFsaWRhdGUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgICAgYEludmFsaWQgU2NoZW1hIERlZmluaXRpb24gZm9yICcke3NjaGVtYUNvZGV9JzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsaWRhdGU7XG4gIH1cblxuICAvKipcbiAgICogV3JhcHBlciDguYDguIHguYjguLLguKrguLPguKvguKPguLHguJogQmFja3dhcmQgQ29tcGF0aWJpbGl0eSAo4LiW4LmJ4Liy4Lih4Li14LmC4LiE4LmJ4LiU4LmA4LiB4LmI4Liy4LmA4Lij4Li14Lii4LiB4LmD4LiK4LmJKVxuICAgKi9cbiAgYXN5bmMgdmFsaWRhdGUoXG4gICAgc2NoZW1hQ29kZTogc3RyaW5nLFxuICAgIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdGVEYXRhKHNjaGVtYUNvZGUsIGRhdGEpO1xuICAgIGlmICghcmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIGNvbnN0IGVycm9yTXNnID0gcmVzdWx0LmVycm9yc1xuICAgICAgICAubWFwKChlKSA9PiBgJHtlLmZpZWxkfTogJHtlLm1lc3NhZ2V9YClcbiAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihgSlNPTiBWYWxpZGF0aW9uIEZhaWxlZDogJHtlcnJvck1zZ31gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICog4Lit4Lix4Lib4LmA4LiU4LiV4LiC4LmJ4Lit4Lih4Li54LilIFNjaGVtYSDguYHguKXguLDguIjguLHguJTguIHguLLguKPguJzguKXguIHguKPguLDguJfguJogKFZpcnR1YWwgQ29sdW1ucyAvIFVJIFNjaGVtYSlcbiAgICovXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBpZDogbnVtYmVyLFxuICAgIHVwZGF0ZUR0bzogVXBkYXRlSnNvblNjaGVtYUR0b1xuICApOiBQcm9taXNlPEpzb25TY2hlbWE+IHtcbiAgICBjb25zdCBzY2hlbWEgPSBhd2FpdCB0aGlzLmZpbmRPbmUoaWQpO1xuXG4gICAgLy8g4LiV4Lij4Lin4LiI4Liq4Lit4LiaIEpTT04gU2NoZW1hXG4gICAgaWYgKHVwZGF0ZUR0by5zY2hlbWFEZWZpbml0aW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmFqdi5jb21waWxlKHVwZGF0ZUR0by5zY2hlbWFEZWZpbml0aW9uKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICAgIGBJbnZhbGlkIEpTT04gU2NoZW1hIGZvcm1hdDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy52YWxpZGF0b3JzLmRlbGV0ZShzY2hlbWEuc2NoZW1hQ29kZSk7IC8vIOC5gOC4hOC4peC4teC4ouC4o+C5jCBDYWNoZSDguYDguIHguYjguLJcbiAgICB9XG5cbiAgICAvLyDguJXguKPguKfguIjguKrguK3guJogVUkgU2NoZW1hXG4gICAgaWYgKHVwZGF0ZUR0by51aVNjaGVtYSkge1xuICAgICAgdGhpcy51aVNjaGVtYVNlcnZpY2UudmFsaWRhdGVVaVNjaGVtYShcbiAgICAgICAgdXBkYXRlRHRvLnVpU2NoZW1hIGFzIHVua25vd24gYXMgVWlTY2hlbWEsXG4gICAgICAgIHVwZGF0ZUR0by5zY2hlbWFEZWZpbml0aW9uIHx8IHNjaGVtYS5zY2hlbWFEZWZpbml0aW9uXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZWRTY2hlbWEgPSB0aGlzLmpzb25TY2hlbWFSZXBvc2l0b3J5Lm1lcmdlKHNjaGVtYSwgdXBkYXRlRHRvKTtcbiAgICBjb25zdCBzYXZlZFNjaGVtYSA9IGF3YWl0IHRoaXMuanNvblNjaGVtYVJlcG9zaXRvcnkuc2F2ZSh1cGRhdGVkU2NoZW1hKTtcblxuICAgIC8vIOC4reC4seC4m+C5gOC4lOC4lSBWaXJ0dWFsIENvbHVtbnMg4LmD4LiZIERhdGFiYXNlIOC4luC5ieC4suC4oeC4teC4geC4suC4o+C5gOC4m+C4peC4teC5iOC4ouC4meC5geC4m+C4peC4hyBDb25maWdcbiAgICAvLyBGaXggVFMyMzQ1OiBBZGQgZW1wdHkgYXJyYXkgZmFsbGJhY2tcbiAgICBpZiAodXBkYXRlRHRvLnZpcnR1YWxDb2x1bW5zICYmIHVwZGF0ZWRTY2hlbWEudmlydHVhbENvbHVtbnMpIHtcbiAgICAgIGF3YWl0IHRoaXMudmlydHVhbENvbHVtblNlcnZpY2Uuc2V0dXBWaXJ0dWFsQ29sdW1ucyhcbiAgICAgICAgc2F2ZWRTY2hlbWEudGFibGVOYW1lLFxuICAgICAgICBzYXZlZFNjaGVtYS52aXJ0dWFsQ29sdW1ucyB8fCBbXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2F2ZWRTY2hlbWE7XG4gIH1cblxuICAvKipcbiAgICog4Lil4LiaIFNjaGVtYSAoSGFyZCBEZWxldGUpXG4gICAqL1xuICBhc3luYyByZW1vdmUoaWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNjaGVtYSA9IGF3YWl0IHRoaXMuZmluZE9uZShpZCk7XG4gICAgdGhpcy52YWxpZGF0b3JzLmRlbGV0ZShzY2hlbWEuc2NoZW1hQ29kZSk7XG4gICAgYXdhaXQgdGhpcy5qc29uU2NoZW1hUmVwb3NpdG9yeS5yZW1vdmUoc2NoZW1hKTtcbiAgfVxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4c/jsonschemaservice_4c698e35d782ba409cfca244345003e5.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4c/jsonschemaservice_4c698e35d782ba409cfca244345003e5.map new file mode 100644 index 0000000..b68ed15 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/4c/jsonschemaservice_4c698e35d782ba409cfca244345003e5.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\json-schema.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\json-schema.service.ts"],"sourcesContent":["// File: src/modules/json-schema/json-schema.service.ts\n// บันทึกการแก้ไข: Fix TS2345 (undefined check)\n\nimport {\n BadRequestException,\n Injectable,\n Logger,\n NotFoundException,\n OnModuleInit,\n} from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport Ajv, { ValidateFunction } from 'ajv';\nimport addFormats from 'ajv-formats';\nimport { Repository } from 'typeorm';\n\nimport { CreateJsonSchemaDto } from './dto/create-json-schema.dto';\nimport { SearchJsonSchemaDto } from './dto/search-json-schema.dto';\nimport { UpdateJsonSchemaDto } from './dto/update-json-schema.dto';\nimport { JsonSchema } from './entities/json-schema.entity';\n\n// Services ย่อยที่แยกตามหน้าที่ (Single Responsibility)\nimport {\n JsonSecurityService,\n SecurityContext,\n} from './services/json-security.service';\nimport { UiSchemaService } from './services/ui-schema.service';\nimport { UiSchema } from './interfaces/ui-schema.interface';\nimport { VirtualColumnService } from './services/virtual-column.service';\n\nimport {\n ValidationErrorDetail,\n ValidationOptions,\n ValidationResult,\n} from './interfaces/validation-result.interface';\n\n@Injectable()\nexport class JsonSchemaService implements OnModuleInit {\n private ajv: Ajv;\n private validators = new Map(); // Cache สำหรับเก็บ Validator ที่ Compile แล้ว\n private readonly logger = new Logger(JsonSchemaService.name);\n\n // ค่า Default สำหรับการตรวจสอบข้อมูล\n private readonly defaultOptions: ValidationOptions = {\n removeAdditional: true, // ลบฟิลด์เกิน\n coerceTypes: true, // แปลงชนิดข้อมูลอัตโนมัติ (เช่น \"123\" -> 123)\n useDefaults: true, // ใส่ค่า Default ถ้าไม่มีข้อมูล\n };\n\n constructor(\n @InjectRepository(JsonSchema)\n private readonly jsonSchemaRepository: Repository,\n private readonly virtualColumnService: VirtualColumnService,\n private readonly uiSchemaService: UiSchemaService,\n private readonly jsonSecurityService: JsonSecurityService\n ) {\n // กำหนดค่าเริ่มต้นให้กับ AJV Validation Engine\n this.ajv = new Ajv({\n allErrors: true, // แสดง Error ทั้งหมด ไม่หยุดแค่จุดแรก\n strict: false, // ไม่เคร่งครัดเกินไป (ยอมรับ Keyword แปลกๆ เช่น ui:widget)\n coerceTypes: true,\n useDefaults: true,\n removeAdditional: true,\n });\n addFormats(this.ajv); // เพิ่ม Format มาตรฐาน (email, date, uri ฯลฯ)\n this.registerCustomValidators(); // ลงทะเบียน Validator เฉพาะของโปรเจกต์\n }\n\n async onModuleInit() {\n // สามารถโหลด Schema ที่ Active ทั้งหมดมา Cache ไว้ล่วงหน้าได้ที่นี่ เพื่อความเร็วในการตอบสนองครั้งแรก\n }\n\n /**\n * ลงทะเบียน Custom Validators เฉพาะสำหรับ LCBP3\n */\n private registerCustomValidators() {\n // 1. ตรวจสอบรูปแบบเลขที่เอกสาร (เช่น TEAM-RFA-STR-0001)\n this.ajv.addFormat('document-number', {\n type: 'string',\n validate: (value: string) => {\n // Regex อย่างง่าย: กลุ่มตัวอักษรขีดคั่นด้วย -\n return /^[A-Z0-9]{2,10}-[A-Z]{2,5}(-[A-Z0-9]{2,5})?-\\d{4}-\\d{3,5}$/.test(\n value\n );\n },\n });\n\n // 2. Keyword สำหรับระบุ Role ที่จำเป็น (ใช้ร่วมกับ Security Service)\n this.ajv.addKeyword({\n keyword: 'requiredRole',\n type: 'string',\n metaSchema: { type: 'string' },\n validate: (_schema: string, _data: unknown) => true, // ผ่านเสมอในขั้น AJV (Security Service จะจัดการเอง)\n });\n }\n\n /**\n * สร้าง Schema ใหม่ พร้อมจัดการ Version, UI Schema และ Virtual Columns\n */\n async create(createDto: CreateJsonSchemaDto): Promise {\n // 1. ตรวจสอบความถูกต้องของ JSON Schema Definition (AJV Syntax)\n try {\n this.ajv.compile(createDto.schemaDefinition);\n } catch (error: unknown) {\n throw new BadRequestException(\n `Invalid JSON Schema format: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n // 2. จัดการ UI Schema\n if (createDto.uiSchema) {\n // ถ้าส่งมา ให้ตรวจสอบความถูกต้องเทียบกับ Data Schema\n this.uiSchemaService.validateUiSchema(\n createDto.uiSchema as unknown as UiSchema,\n createDto.schemaDefinition\n );\n } else {\n // ถ้าไม่ส่งมา ให้สร้าง UI Schema พื้นฐานให้อัตโนมัติ\n createDto.uiSchema = this.uiSchemaService.generateDefaultUiSchema(\n createDto.schemaDefinition\n ) as unknown as Record;\n }\n\n // 3. จัดการ Versioning อัตโนมัติ (Auto-increment)\n const latestSchema = await this.jsonSchemaRepository.findOne({\n where: { schemaCode: createDto.schemaCode },\n order: { version: 'DESC' },\n });\n\n let newVersion = 1;\n if (latestSchema) {\n // ถ้าผู้ใช้ไม่ระบุ Version หรือระบุมาน้อยกว่าล่าสุด ให้ +1\n if (!createDto.version || createDto.version <= latestSchema.version) {\n newVersion = latestSchema.version + 1;\n } else {\n newVersion = createDto.version;\n }\n } else if (createDto.version) {\n newVersion = createDto.version;\n }\n\n // 4. บันทึกลงฐานข้อมูล\n const newSchema = this.jsonSchemaRepository.create({\n ...createDto,\n version: newVersion,\n });\n\n const savedSchema = await this.jsonSchemaRepository.save(newSchema);\n\n // ล้าง Cache เพื่อให้โหลดตัวใหม่ในครั้งถัดไป\n this.validators.delete(savedSchema.schemaCode);\n\n this.logger.log(\n `Schema '${savedSchema.schemaCode}' created (v${savedSchema.version})`\n );\n\n // 5. สร้าง/อัปเดต Virtual Columns บน Database จริง (Performance Optimization)\n // Fix TS2345: Add empty array fallback\n if (savedSchema.virtualColumns && savedSchema.virtualColumns.length > 0) {\n await this.virtualColumnService.setupVirtualColumns(\n savedSchema.tableName,\n savedSchema.virtualColumns || []\n );\n }\n\n return savedSchema;\n }\n\n /**\n * ค้นหา Schema ทั้งหมด (Pagination & Filter)\n */\n async findAll(searchDto: SearchJsonSchemaDto) {\n const { search, isActive, page = 1, limit = 20 } = searchDto;\n const skip = (page - 1) * limit;\n\n const query = this.jsonSchemaRepository.createQueryBuilder('schema');\n\n if (search) {\n query.andWhere('schema.schemaCode LIKE :search', {\n search: `%${search}%`,\n });\n }\n\n if (isActive !== undefined) {\n query.andWhere('schema.isActive = :isActive', { isActive });\n }\n\n // เรียงตาม Code ก่อน แล้วตามด้วย Version ล่าสุด\n query.orderBy('schema.schemaCode', 'ASC');\n query.addOrderBy('schema.version', 'DESC');\n\n const [items, total] = await query.skip(skip).take(limit).getManyAndCount();\n\n return {\n data: items,\n meta: {\n total,\n page,\n limit,\n totalPages: Math.ceil(total / limit),\n },\n };\n }\n\n /**\n * ดึงข้อมูล Schema ตาม ID\n */\n async findOne(id: number): Promise {\n const schema = await this.jsonSchemaRepository.findOne({ where: { id } });\n if (!schema) {\n throw new NotFoundException(`JsonSchema with ID ${id} not found`);\n }\n return schema;\n }\n\n /**\n * ดึงข้อมูล Schema ตาม Code และ Version (สำหรับ Migration)\n */\n async findOneByCodeAndVersion(\n code: string,\n version: number\n ): Promise {\n const schema = await this.jsonSchemaRepository.findOne({\n where: { schemaCode: code, version },\n });\n\n if (!schema) {\n throw new NotFoundException(\n `JsonSchema '${code}' version ${version} not found`\n );\n }\n return schema;\n }\n\n /**\n * ดึง Schema เวอร์ชันล่าสุดที่ Active (สำหรับใช้งานทั่วไป)\n */\n async findLatestByCode(code: string): Promise {\n const schema = await this.jsonSchemaRepository.findOne({\n where: { schemaCode: code, isActive: true },\n order: { version: 'DESC' },\n });\n\n if (!schema) {\n throw new NotFoundException(\n `Active JsonSchema with code '${code}' not found`\n );\n }\n return schema;\n }\n\n /**\n * [CORE FUNCTION] ตรวจสอบข้อมูล (Validate), ทำความสะอาด (Sanitize) และเข้ารหัส (Encrypt)\n * ใช้สำหรับ \"ขาเข้า\" (Write) ก่อนบันทึกลง Database\n */\n async validateData(\n schemaCode: string,\n data: Record,\n _options: ValidationOptions = {}\n ): Promise {\n // 1. ดึงและ Compile Validator\n const validate = await this.getValidator(schemaCode);\n const schema = await this.findLatestByCode(schemaCode); // ดึง Full Schema เพื่อใช้ Config อื่นๆ\n\n // 2. สำเนาข้อมูลเพื่อป้องกัน Side Effect และเตรียมสำหรับ AJV Mutation (Sanitization)\n const dataToValidate = JSON.parse(JSON.stringify(data)) as Record<\n string,\n unknown\n >;\n\n // 3. เริ่มการตรวจสอบ (AJV จะทำการ Coerce Type และ Remove Additional Properties ให้ด้วย)\n const valid = validate(dataToValidate);\n\n // 4. จัดการกรณีข้อมูลไม่ถูกต้อง\n if (!valid) {\n const errors: ValidationErrorDetail[] = (validate.errors || []).map(\n (err) => ({\n field: err.instancePath || 'root',\n message: err.message || 'Validation error',\n value: err.params,\n })\n );\n\n return {\n isValid: false,\n errors,\n sanitizedData: null,\n };\n }\n\n // 5. เข้ารหัสข้อมูล (Encryption) สำหรับ Field ที่มีความลับ (x-encrypt: true)\n const secureData = this.jsonSecurityService.encryptFields(\n dataToValidate,\n schema.schemaDefinition\n );\n\n return {\n isValid: true,\n errors: [],\n sanitizedData: secureData, // ข้อมูลนี้สะอาดและปลอดภัย พร้อมบันทึก\n };\n }\n\n /**\n * [CORE FUNCTION] อ่านข้อมูล, ถอดรหัส (Decrypt) และกรองตามสิทธิ์ (Filter)\n * ใช้สำหรับ \"ขาออก\" (Read) ก่อนส่งให้ Frontend\n */\n async processReadData(\n schemaCode: string,\n data: Record,\n userContext: SecurityContext\n ): Promise> {\n if (!data) return data;\n\n // ดึง Schema เพื่อดู Config การถอดรหัสและการมองเห็น\n const schema = await this.findLatestByCode(schemaCode);\n\n return this.jsonSecurityService.decryptAndFilterFields(\n data,\n schema.schemaDefinition,\n userContext\n );\n }\n\n /**\n * Helper: ดึงและ Cache AJV Validator Function เพื่อประสิทธิภาพ\n */\n private async getValidator(schemaCode: string): Promise {\n let validate = this.validators.get(schemaCode);\n\n if (!validate) {\n const schema = await this.findLatestByCode(schemaCode);\n try {\n validate = this.ajv.compile(schema.schemaDefinition);\n this.validators.set(schemaCode, validate);\n } catch (error: unknown) {\n throw new BadRequestException(\n `Invalid Schema Definition for '${schemaCode}': ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n return validate;\n }\n\n /**\n * Wrapper เก่าสำหรับ Backward Compatibility (ถ้ามีโค้ดเก่าเรียกใช้)\n */\n async validate(\n schemaCode: string,\n data: Record\n ): Promise {\n const result = await this.validateData(schemaCode, data);\n if (!result.isValid) {\n const errorMsg = result.errors\n .map((e) => `${e.field}: ${e.message}`)\n .join(', ');\n throw new BadRequestException(`JSON Validation Failed: ${errorMsg}`);\n }\n return true;\n }\n\n /**\n * อัปเดตข้อมูล Schema และจัดการผลกระทบ (Virtual Columns / UI Schema)\n */\n async update(\n id: number,\n updateDto: UpdateJsonSchemaDto\n ): Promise {\n const schema = await this.findOne(id);\n\n // ตรวจสอบ JSON Schema\n if (updateDto.schemaDefinition) {\n try {\n this.ajv.compile(updateDto.schemaDefinition);\n } catch (error: unknown) {\n throw new BadRequestException(\n `Invalid JSON Schema format: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n this.validators.delete(schema.schemaCode); // เคลียร์ Cache เก่า\n }\n\n // ตรวจสอบ UI Schema\n if (updateDto.uiSchema) {\n this.uiSchemaService.validateUiSchema(\n updateDto.uiSchema as unknown as UiSchema,\n updateDto.schemaDefinition || schema.schemaDefinition\n );\n }\n\n const updatedSchema = this.jsonSchemaRepository.merge(schema, updateDto);\n const savedSchema = await this.jsonSchemaRepository.save(updatedSchema);\n\n // อัปเดต Virtual Columns ใน Database ถ้ามีการเปลี่ยนแปลง Config\n // Fix TS2345: Add empty array fallback\n if (updateDto.virtualColumns && updatedSchema.virtualColumns) {\n await this.virtualColumnService.setupVirtualColumns(\n savedSchema.tableName,\n savedSchema.virtualColumns || []\n );\n }\n\n return savedSchema;\n }\n\n /**\n * ลบ Schema (Hard Delete)\n */\n async remove(id: number): Promise {\n const schema = await this.findOne(id);\n this.validators.delete(schema.schemaCode);\n await this.jsonSchemaRepository.remove(schema);\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/51/correspondencerevisionentity_5141c40a0afe3cfa4ec4036fd186bfd8 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/51/correspondencerevisionentity_5141c40a0afe3cfa4ec4036fd186bfd8 new file mode 100644 index 0000000..94241a6 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/51/correspondencerevisionentity_5141c40a0afe3cfa4ec4036fd186bfd8 @@ -0,0 +1,152 @@ +89023636803885cb4a0675797e878550 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e, _f, _g, _h, _j; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceRevision = void 0; +const typeorm_1 = require("typeorm"); +const rfa_revision_entity_1 = require("../../rfa/entities/rfa-revision.entity"); +const correspondence_entity_1 = require("./correspondence.entity"); +const correspondence_status_entity_1 = require("./correspondence-status.entity"); +const user_entity_1 = require("../../user/entities/user.entity"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const class_transformer_1 = require("class-transformer"); +const correspondence_revision_attachment_entity_1 = require("./correspondence-revision-attachment.entity"); +let CorrespondenceRevision = class CorrespondenceRevision extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.CorrespondenceRevision = CorrespondenceRevision; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'correspondence_id' }), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "correspondenceId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'revision_number' }), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "revisionNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'revision_label', nullable: true, length: 10 }), + __metadata("design:type", String) +], CorrespondenceRevision.prototype, "revisionLabel", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_current', default: false }), + __metadata("design:type", Boolean) +], CorrespondenceRevision.prototype, "isCurrent", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'correspondence_status_id' }), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "statusId", void 0); +__decorate([ + (0, typeorm_1.Column)({ length: 500 }), + __metadata("design:type", String) +], CorrespondenceRevision.prototype, "subject", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'description', type: 'text', nullable: true }), + __metadata("design:type", String) +], CorrespondenceRevision.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], CorrespondenceRevision.prototype, "body", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], CorrespondenceRevision.prototype, "remarks", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'json', nullable: true }), + __metadata("design:type", Object) +], CorrespondenceRevision.prototype, "details", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'schema_version', default: 1 }), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "schemaVersion", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'v_ref_project_id', + type: 'int', + generatedType: 'VIRTUAL', + asExpression: "JSON_UNQUOTE(JSON_EXTRACT(details, '$.projectId'))", + nullable: true, + }), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "vRefProjectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'v_doc_subtype', + type: 'varchar', + length: 50, + generatedType: 'VIRTUAL', + asExpression: "JSON_UNQUOTE(JSON_EXTRACT(details, '$.subType'))", + nullable: true, + }), + __metadata("design:type", String) +], CorrespondenceRevision.prototype, "vRefType", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'document_date', type: 'date', nullable: true }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], CorrespondenceRevision.prototype, "documentDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'issued_date', type: 'datetime', nullable: true }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], CorrespondenceRevision.prototype, "issuedDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'received_date', type: 'datetime', nullable: true }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], CorrespondenceRevision.prototype, "receivedDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'due_date', type: 'datetime', nullable: true }), + __metadata("design:type", typeof (_d = typeof Date !== "undefined" && Date) === "function" ? _d : Object) +], CorrespondenceRevision.prototype, "dueDate", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_e = typeof Date !== "undefined" && Date) === "function" ? _e : Object) +], CorrespondenceRevision.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'created_by', nullable: true }), + __metadata("design:type", Number) +], CorrespondenceRevision.prototype, "createdBy", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => correspondence_entity_1.Correspondence, (corr) => corr.revisions, { + onDelete: 'CASCADE', + }), + (0, typeorm_1.JoinColumn)({ name: 'correspondence_id' }), + __metadata("design:type", typeof (_f = typeof correspondence_entity_1.Correspondence !== "undefined" && correspondence_entity_1.Correspondence) === "function" ? _f : Object) +], CorrespondenceRevision.prototype, "correspondence", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => correspondence_status_entity_1.CorrespondenceStatus), + (0, typeorm_1.JoinColumn)({ name: 'correspondence_status_id' }), + __metadata("design:type", typeof (_g = typeof correspondence_status_entity_1.CorrespondenceStatus !== "undefined" && correspondence_status_entity_1.CorrespondenceStatus) === "function" ? _g : Object) +], CorrespondenceRevision.prototype, "status", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'created_by' }), + __metadata("design:type", typeof (_h = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _h : Object) +], CorrespondenceRevision.prototype, "creator", void 0); +__decorate([ + (0, typeorm_1.OneToOne)(() => rfa_revision_entity_1.RfaRevision, (rfaRev) => rfaRev.correspondenceRevision), + __metadata("design:type", typeof (_j = typeof rfa_revision_entity_1.RfaRevision !== "undefined" && rfa_revision_entity_1.RfaRevision) === "function" ? _j : Object) +], CorrespondenceRevision.prototype, "rfaRevision", void 0); +__decorate([ + (0, typeorm_1.OneToMany)(() => correspondence_revision_attachment_entity_1.CorrespondenceRevisionAttachment, (link) => link.revision), + __metadata("design:type", Array) +], CorrespondenceRevision.prototype, "attachmentLinks", void 0); +exports.CorrespondenceRevision = CorrespondenceRevision = __decorate([ + (0, typeorm_1.Entity)('correspondence_revisions') + // ✅ เพิ่ม Index สำหรับ Virtual Columns เพื่อให้ Search เร็วขึ้น + , + (0, typeorm_1.Index)('idx_corr_rev_v_project', ['vRefProjectId']), + (0, typeorm_1.Index)('idx_corr_rev_v_type', ['vRefType']) +], CorrespondenceRevision); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGVudGl0aWVzXFxjb3JyZXNwb25kZW5jZS1yZXZpc2lvbi5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFDQVVpQjtBQUNqQixnRkFBcUU7QUFDckUsbUVBQXlEO0FBQ3pELGlGQUFzRTtBQUN0RSxpRUFBdUQ7QUFDdkQsZ0ZBQTJFO0FBQzNFLHlEQUE0QztBQUM1QywyR0FBK0Y7QUFNeEYsSUFBTSxzQkFBc0IsR0FBNUIsTUFBTSxzQkFBdUIsU0FBUSxpQ0FBYztDQW9HekQsQ0FBQTtBQXBHWSx3REFBc0I7QUFHakM7SUFGQyxJQUFBLGdDQUFzQixHQUFFO0lBQ3hCLElBQUEsMkJBQU8sR0FBRTs7a0RBQ0U7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxDQUFDOztnRUFDWjtBQUcxQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDOzs4REFDWjtBQUd4QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQzs7NkRBQ3hDO0FBR3ZCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7O3lEQUMzQjtBQUdwQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxDQUFDOzt3REFDM0I7QUFHbEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7O3VEQUNQO0FBR2pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEs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RSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLGtCQUFJLG9CQUFKLGtCQUFJO3VEQUFDO0FBSWY7SUFEQyxJQUFBLGtCQUFRLEVBQUMsR0FBRyxFQUFFLENBQUMsaUNBQVcsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDO2tEQUN6RCxpQ0FBVyxvQkFBWCxpQ0FBVzsyREFBQztBQUkxQjtJQURDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyw0RUFBZ0MsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7K0RBQ3RCO2lDQW5HMUMsc0JBQXNCO0lBSmxDLElBQUEsZ0JBQU0sRUFBQywwQkFBMEIsQ0FBQztJQUNuQyxnRUFBZ0U7O0lBQy9ELElBQUEsZUFBSyxFQUFDLHdCQUF3QixFQUFFLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbEQsSUFBQSxlQUFLLEVBQUMscUJBQXFCLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztHQUM5QixzQkFBc0IsQ0FvR2xDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGNvcnJlc3BvbmRlbmNlXFxlbnRpdGllc1xcY29ycmVzcG9uZGVuY2UtcmV2aXNpb24uZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVudGl0eSxcbiAgQ29sdW1uLFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBNYW55VG9PbmUsXG4gIEpvaW5Db2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIEluZGV4LFxuICBPbmVUb09uZSxcbiAgT25lVG9NYW55LFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFJmYVJldmlzaW9uIH0gZnJvbSAnLi4vLi4vcmZhL2VudGl0aWVzL3JmYS1yZXZpc2lvbi5lbnRpdHknO1xuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2UgfSBmcm9tICcuL2NvcnJlc3BvbmRlbmNlLmVudGl0eSc7XG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVN0YXR1cyB9IGZyb20gJy4vY29ycmVzcG9uZGVuY2Utc3RhdHVzLmVudGl0eSc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vLi4vdXNlci9lbnRpdGllcy91c2VyLmVudGl0eSc7XG5pbXBvcnQgeyBVdWlkQmFzZUVudGl0eSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9lbnRpdGllcy91dWlkLWJhc2UuZW50aXR5JztcbmltcG9ydCB7IEV4Y2x1ZGUgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJldmlzaW9uQXR0YWNobWVudCB9IGZyb20gJy4vY29ycmVzcG9uZGVuY2UtcmV2aXNpb24tYXR0YWNobWVudC5lbnRpdHknO1xuXG5ARW50aXR5KCdjb3JyZXNwb25kZW5jZV9yZXZpc2lvbnMnKVxuLy8g4pyFIOC5gOC4nuC4tOC5iOC4oSBJbmRleCDguKrguLPguKvguKPguLHguJogVmlydHVhbCBDb2x1bW5zIOC5gOC4nuC4t+C5iOC4reC5g+C4q+C5iSBTZWFyY2gg4LmA4Lij4LmH4Lin4LiC4Li24LmJ4LiZXG5ASW5kZXgoJ2lkeF9jb3JyX3Jldl92X3Byb2plY3QnLCBbJ3ZSZWZQcm9qZWN0SWQnXSlcbkBJbmRleCgnaWR4X2NvcnJfcmV2X3ZfdHlwZScsIFsndlJlZlR5cGUnXSlcbmV4cG9ydCBjbGFzcyBDb3JyZXNwb25kZW5jZVJldmlzaW9uIGV4dGVuZHMgVXVpZEJhc2VFbnRpdHkge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIEBFeGNsdWRlKClcbiAgaWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdjb3JyZXNwb25kZW5jZV9pZCcgfSlcbiAgY29ycmVzcG9uZGVuY2VJZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3JldmlzaW9uX251bWJlcicgfSlcbiAgcmV2aXNpb25OdW1iZXIhOiBudW1iZXI7IC8vIDAsIDEsIDIuLi5cblxuICBAQ29sdW1uKHsgbmFtZTogJ3JldmlzaW9uX2xhYmVsJywgbnVsbGFibGU6IHRydWUsIGxlbmd0aDogMTAgfSlcbiAgcmV2aXNpb25MYWJlbD86IHN0cmluZzsgLy8gQSwgQiwgMDAxLi4uXG5cbiAgQENvbHVtbih7IG5hbWU6ICdpc19jdXJyZW50JywgZGVmYXVsdDogZmFsc2UgfSlcbiAgaXNDdXJyZW50ITogYm9vbGVhbjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2NvcnJlc3BvbmRlbmNlX3N0YXR1c19pZCcgfSlcbiAgc3RhdHVzSWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IGxlbmd0aDogNTAwIH0pXG4gIHN1YmplY3QhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdkZXNjcmlwdGlvbicsIHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgYm9keT86IHN0cmluZztcblxuICBAQ29sdW1uKHsgdHlwZTogJ3RleHQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICByZW1hcmtzPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAnanNvbicsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGRldGFpbHM/OiBvYmplY3Q7IC8vIER5bmFtaWMgSlNPTiDigJQgdHlwZWQgYXMgYG9iamVjdGAgcGVyIFR5cGVPUk0gSlNPTiBjb2x1bW4gY29udmVudGlvbiAobm8tYW55LCBBRFItMDE5KVxuXG4gIEBDb2x1bW4oeyBuYW1lOiAnc2NoZW1hX3ZlcnNpb24nLCBkZWZhdWx0OiAxIH0pXG4gIHNjaGVtYVZlcnNpb24hOiBudW1iZXI7XG5cbiAgLy8g4pyFIFtOZXddIFZpcnR1YWwgQ29sdW1uOiDguJTguLbguIcgUHJvamVjdCBJRCDguIjguLLguIEgSlNPTiBkZXRhaWxzXG4gIEBDb2x1bW4oe1xuICAgIG5hbWU6ICd2X3JlZl9wcm9qZWN0X2lkJyxcbiAgICB0eXBlOiAnaW50JyxcbiAgICBnZW5lcmF0ZWRUeXBlOiAnVklSVFVBTCcsXG4gICAgYXNFeHByZXNzaW9uOiBcIkpTT05fVU5RVU9URShKU09OX0VYVFJBQ1QoZGV0YWlscywgJyQucHJvamVjdElkJykpXCIsXG4gICAgbnVsbGFibGU6IHRydWUsXG4gIH0pXG4gIHZSZWZQcm9qZWN0SWQ/OiBudW1iZXI7XG5cbiAgLy8g4pyFIFtOZXddIFZpcnR1YWwgQ29sdW1uOiDguJTguLbguIcgRG9jdW1lbnQgU3ViVHlwZSDguIjguLLguIEgSlNPTiBkZXRhaWxzXG4gIEBDb2x1bW4oe1xuICAgIG5hbWU6ICd2X2RvY19zdWJ0eXBlJyxcbiAgICB0eXBlOiAndmFyY2hhcicsXG4gICAgbGVuZ3RoOiA1MCxcbiAgICBnZW5lcmF0ZWRUeXBlOiAnVklSVFVBTCcsXG4gICAgYXNFeHByZXNzaW9uOiBcIkpTT05fVU5RVU9URShKU09OX0VYVFJBQ1QoZGV0YWlscywgJyQuc3ViVHlwZScpKVwiLFxuICAgIG51bGxhYmxlOiB0cnVlLFxuICB9KVxuICB2UmVmVHlwZT86IHN0cmluZztcblxuICAvLyBEYXRlc1xuICBAQ29sdW1uKHsgbmFtZTogJ2RvY3VtZW50X2RhdGUnLCB0eXBlOiAnZGF0ZScsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGRvY3VtZW50RGF0ZT86IERhdGU7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdpc3N1ZWRfZGF0ZScsIHR5cGU6ICdkYXRldGltZScsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGlzc3VlZERhdGU/OiBEYXRlO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmVjZWl2ZWRfZGF0ZScsIHR5cGU6ICdkYXRldGltZScsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHJlY2VpdmVkRGF0ZT86IERhdGU7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdkdWVfZGF0ZScsIHR5cGU6ICdkYXRldGltZScsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGR1ZURhdGU/OiBEYXRlO1xuXG4gIEBDcmVhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdjcmVhdGVkX2J5JywgbnVsbGFibGU6IHRydWUgfSlcbiAgY3JlYXRlZEJ5PzogbnVtYmVyO1xuXG4gIC8vIFJlbGF0aW9uc1xuICBATWFueVRvT25lKCgpID0+IENvcnJlc3BvbmRlbmNlLCAoY29ycikgPT4gY29yci5yZXZpc2lvbnMsIHtcbiAgICBvbkRlbGV0ZTogJ0NBU0NBREUnLFxuICB9KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdjb3JyZXNwb25kZW5jZV9pZCcgfSlcbiAgY29ycmVzcG9uZGVuY2U/OiBDb3JyZXNwb25kZW5jZTtcblxuICBATWFueVRvT25lKCgpID0+IENvcnJlc3BvbmRlbmNlU3RhdHVzKVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdjb3JyZXNwb25kZW5jZV9zdGF0dXNfaWQnIH0pXG4gIHN0YXR1cz86IENvcnJlc3BvbmRlbmNlU3RhdHVzO1xuXG4gIEBNYW55VG9PbmUoKCkgPT4gVXNlcilcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9ieScgfSlcbiAgY3JlYXRvcj86IFVzZXI7XG5cbiAgLy8gQWRkZWQgaW52ZXJzZSByZWxhdGlvbiBmb3IgQ1RJIG1hcHBpbmcgdG8gc3ViY2xhc3NlcyAoUkZBKVxuICBAT25lVG9PbmUoKCkgPT4gUmZhUmV2aXNpb24sIChyZmFSZXYpID0+IHJmYVJldi5jb3JyZXNwb25kZW5jZVJldmlzaW9uKVxuICByZmFSZXZpc2lvbj86IFJmYVJldmlzaW9uO1xuXG4gIC8vIFtGSVggdjEuOC4xXSBSZWxhdGlvbjog4LmE4Lif4Lil4LmM4LmB4LiZ4Lia4LiC4Lit4LiHIHJldmlzaW9uIOC4meC4teC5ieC4nOC5iOC4suC4mSBqdW5jdGlvbiB0YWJsZVxuICBAT25lVG9NYW55KCgpID0+IENvcnJlc3BvbmRlbmNlUmV2aXNpb25BdHRhY2htZW50LCAobGluaykgPT4gbGluay5yZXZpc2lvbilcbiAgYXR0YWNobWVudExpbmtzPzogQ29ycmVzcG9uZGVuY2VSZXZpc2lvbkF0dGFjaG1lbnRbXTtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/51/correspondencerevisionentity_5141c40a0afe3cfa4ec4036fd186bfd8.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/51/correspondencerevisionentity_5141c40a0afe3cfa4ec4036fd186bfd8.map new file mode 100644 index 0000000..84bbae2 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/51/correspondencerevisionentity_5141c40a0afe3cfa4ec4036fd186bfd8.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-revision.entity.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-revision.entity.ts"],"sourcesContent":["import {\n Entity,\n Column,\n PrimaryGeneratedColumn,\n ManyToOne,\n JoinColumn,\n CreateDateColumn,\n Index,\n OneToOne,\n OneToMany,\n} from 'typeorm';\nimport { RfaRevision } from '../../rfa/entities/rfa-revision.entity';\nimport { Correspondence } from './correspondence.entity';\nimport { CorrespondenceStatus } from './correspondence-status.entity';\nimport { User } from '../../user/entities/user.entity';\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\nimport { Exclude } from 'class-transformer';\nimport { CorrespondenceRevisionAttachment } from './correspondence-revision-attachment.entity';\n\n@Entity('correspondence_revisions')\n// ✅ เพิ่ม Index สำหรับ Virtual Columns เพื่อให้ Search เร็วขึ้น\n@Index('idx_corr_rev_v_project', ['vRefProjectId'])\n@Index('idx_corr_rev_v_type', ['vRefType'])\nexport class CorrespondenceRevision extends UuidBaseEntity {\n @PrimaryGeneratedColumn()\n @Exclude()\n id!: number;\n\n @Column({ name: 'correspondence_id' })\n correspondenceId!: number;\n\n @Column({ name: 'revision_number' })\n revisionNumber!: number; // 0, 1, 2...\n\n @Column({ name: 'revision_label', nullable: true, length: 10 })\n revisionLabel?: string; // A, B, 001...\n\n @Column({ name: 'is_current', default: false })\n isCurrent!: boolean;\n\n @Column({ name: 'correspondence_status_id' })\n statusId!: number;\n\n @Column({ length: 500 })\n subject!: string;\n\n @Column({ name: 'description', type: 'text', nullable: true })\n description?: string;\n\n @Column({ type: 'text', nullable: true })\n body?: string;\n\n @Column({ type: 'text', nullable: true })\n remarks?: string;\n\n @Column({ type: 'json', nullable: true })\n details?: object; // Dynamic JSON — typed as `object` per TypeORM JSON column convention (no-any, ADR-019)\n\n @Column({ name: 'schema_version', default: 1 })\n schemaVersion!: number;\n\n // ✅ [New] Virtual Column: ดึง Project ID จาก JSON details\n @Column({\n name: 'v_ref_project_id',\n type: 'int',\n generatedType: 'VIRTUAL',\n asExpression: \"JSON_UNQUOTE(JSON_EXTRACT(details, '$.projectId'))\",\n nullable: true,\n })\n vRefProjectId?: number;\n\n // ✅ [New] Virtual Column: ดึง Document SubType จาก JSON details\n @Column({\n name: 'v_doc_subtype',\n type: 'varchar',\n length: 50,\n generatedType: 'VIRTUAL',\n asExpression: \"JSON_UNQUOTE(JSON_EXTRACT(details, '$.subType'))\",\n nullable: true,\n })\n vRefType?: string;\n\n // Dates\n @Column({ name: 'document_date', type: 'date', nullable: true })\n documentDate?: Date;\n\n @Column({ name: 'issued_date', type: 'datetime', nullable: true })\n issuedDate?: Date;\n\n @Column({ name: 'received_date', type: 'datetime', nullable: true })\n receivedDate?: Date;\n\n @Column({ name: 'due_date', type: 'datetime', nullable: true })\n dueDate?: Date;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @Column({ name: 'created_by', nullable: true })\n createdBy?: number;\n\n // Relations\n @ManyToOne(() => Correspondence, (corr) => corr.revisions, {\n onDelete: 'CASCADE',\n })\n @JoinColumn({ name: 'correspondence_id' })\n correspondence?: Correspondence;\n\n @ManyToOne(() => CorrespondenceStatus)\n @JoinColumn({ name: 'correspondence_status_id' })\n status?: CorrespondenceStatus;\n\n @ManyToOne(() => User)\n @JoinColumn({ name: 'created_by' })\n creator?: User;\n\n // Added inverse relation for CTI mapping to subclasses (RFA)\n @OneToOne(() => RfaRevision, (rfaRev) => rfaRev.correspondenceRevision)\n rfaRevision?: RfaRevision;\n\n // [FIX v1.8.1] Relation: ไฟล์แนบของ revision นี้ผ่าน junction table\n @OneToMany(() => CorrespondenceRevisionAttachment, (link) => link.revision)\n attachmentLinks?: CorrespondenceRevisionAttachment[];\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/51/rfaworkflowentity_51880ef91639f200aaee6b2a662c73b1 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/51/rfaworkflowentity_51880ef91639f200aaee6b2a662c73b1 new file mode 100644 index 0000000..03b36d6 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/51/rfaworkflowentity_51880ef91639f200aaee6b2a662c73b1 @@ -0,0 +1,99 @@ +eb049d6b2b75268756008ed3d78c8b12 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e, _f, _g, _h; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RfaWorkflow = void 0; +// File: src/modules/rfa/entities/rfa-workflow.entity.ts +const typeorm_1 = require("typeorm"); +const organization_entity_1 = require("../../organization/entities/organization.entity"); +const user_entity_1 = require("../../user/entities/user.entity"); +const rfa_revision_entity_1 = require("./rfa-revision.entity"); +const rfa_workflow_template_step_entity_1 = require("./rfa-workflow-template-step.entity"); // ✅ Import Enum +let RfaWorkflow = class RfaWorkflow { +}; +exports.RfaWorkflow = RfaWorkflow; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], RfaWorkflow.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'rfa_revision_id' }), + __metadata("design:type", Number) +], RfaWorkflow.prototype, "rfaRevisionId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'step_number' }), + __metadata("design:type", Number) +], RfaWorkflow.prototype, "stepNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'organization_id' }), + __metadata("design:type", Number) +], RfaWorkflow.prototype, "organizationId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'assigned_to', nullable: true }), + __metadata("design:type", Number) +], RfaWorkflow.prototype, "assignedTo", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'action_type', + type: 'enum', + enum: rfa_workflow_template_step_entity_1.RfaActionType, // ✅ Use Shared Enum + nullable: true, + }), + __metadata("design:type", typeof (_a = typeof rfa_workflow_template_step_entity_1.RfaActionType !== "undefined" && rfa_workflow_template_step_entity_1.RfaActionType) === "function" ? _a : Object) +], RfaWorkflow.prototype, "actionType", void 0); +__decorate([ + (0, typeorm_1.Column)({ + type: 'enum', + enum: ['PENDING', 'IN_PROGRESS', 'COMPLETED', 'REJECTED'], + nullable: true, + }), + __metadata("design:type", String) +], RfaWorkflow.prototype, "status", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], RfaWorkflow.prototype, "comments", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'completed_at', type: 'datetime', nullable: true }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], RfaWorkflow.prototype, "completedAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'json', nullable: true }), + __metadata("design:type", typeof (_c = typeof Record !== "undefined" && Record) === "function" ? _c : Object) +], RfaWorkflow.prototype, "stateContext", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_d = typeof Date !== "undefined" && Date) === "function" ? _d : Object) +], RfaWorkflow.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_e = typeof Date !== "undefined" && Date) === "function" ? _e : Object) +], RfaWorkflow.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => rfa_revision_entity_1.RfaRevision, (rev) => rev.workflows, { onDelete: 'CASCADE' }), + (0, typeorm_1.JoinColumn)({ name: 'rfa_revision_id' }), + __metadata("design:type", typeof (_f = typeof rfa_revision_entity_1.RfaRevision !== "undefined" && rfa_revision_entity_1.RfaRevision) === "function" ? _f : Object) +], RfaWorkflow.prototype, "rfaRevision", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => organization_entity_1.Organization), + (0, typeorm_1.JoinColumn)({ name: 'organization_id' }), + __metadata("design:type", typeof (_g = typeof organization_entity_1.Organization !== "undefined" && organization_entity_1.Organization) === "function" ? _g : Object) +], RfaWorkflow.prototype, "organization", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'assigned_to' }), + __metadata("design:type", typeof (_h = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _h : Object) +], RfaWorkflow.prototype, "assignee", void 0); +exports.RfaWorkflow = RfaWorkflow = __decorate([ + (0, typeorm_1.Entity)('rfa_workflows') +], RfaWorkflow); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccmZhXFxlbnRpdGllc1xccmZhLXdvcmtmbG93LmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEsd0RBQXdEO0FBQ3hELHFDQVFpQjtBQUNqQix5RkFBK0U7QUFDL0UsaUVBQXVEO0FBQ3ZELCtEQUFvRDtBQUNwRCwyRkFBb0UsQ0FBQyxnQkFBZ0I7QUFHOUUsSUFBTSxXQUFXLEdBQWpCLE1BQU0sV0FBVztDQTBEdkIsQ0FBQTtBQTFEWSxrQ0FBVztBQUV0QjtJQURDLElBQUEsZ0NBQXNCLEdBQUU7O3VDQUNiO0FBR1o7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQzs7a0RBQ2I7QUFHdkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLENBQUM7OytDQUNaO0FBR3BCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUM7O21EQUNaO0FBR3hCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7OytDQUM1QjtBQVFwQjtJQU5DLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSxhQUFhO1FBQ25CLElBQUksRUFBRSxNQUFNO1FBQ1osSUFBSSxFQUFFLGlEQUFhLEVBQUUsb0JBQW9CO1FBQ3pDLFFBQVEsRUFBRSxJQUFJO0tBQ2YsQ0FBQztrREFDVyxpREFBYSxvQkFBYixpREFBYTsrQ0FBQztBQU8zQjtJQUxDLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSxNQUFNO1FBQ1osSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDO1FBQ3pELFFBQVEsRUFBRSxJQUFJO0tBQ2YsQ0FBQzs7MkNBQ2M7QUFHaEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7NkNBQ3ZCO0FBR2xCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztrREFDckQsSUFBSSxvQkFBSixJQUFJO2dEQUFDO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7a0RBQzFCLE1BQU0sb0JBQU4sTUFBTTtpREFBa0I7QUFHdkM7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7OENBQUM7QUFHakI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7OENBQUM7QUFLakI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsaUNBQVcsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUM3RSxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztrREFDMUIsaUNBQVcsb0JBQVgsaUNBQVc7Z0RBQUM7QUFJMUI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsa0NBQVksQ0FBQztJQUM3QixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztrREFDekIsa0NBQVksb0JBQVosa0NBQVk7aURBQUM7QUFJNUI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsa0JBQUksQ0FBQztJQUNyQixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLENBQUM7a0RBQ3pCLGtCQUFJLG9CQUFKLGtCQUFJOzZDQUFDO3NCQXpETCxXQUFXO0lBRHZCLElBQUEsZ0JBQU0sRUFBQyxlQUFlLENBQUM7R0FDWCxXQUFXLENBMER2QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxyZmFcXGVudGl0aWVzXFxyZmEtd29ya2Zsb3cuZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9tb2R1bGVzL3JmYS9lbnRpdGllcy9yZmEtd29ya2Zsb3cuZW50aXR5LnRzXG5pbXBvcnQge1xuICBDb2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIEVudGl0eSxcbiAgSm9pbkNvbHVtbixcbiAgTWFueVRvT25lLFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBVcGRhdGVEYXRlQ29sdW1uLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IE9yZ2FuaXphdGlvbiB9IGZyb20gJy4uLy4uL29yZ2FuaXphdGlvbi9lbnRpdGllcy9vcmdhbml6YXRpb24uZW50aXR5JztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi8uLi91c2VyL2VudGl0aWVzL3VzZXIuZW50aXR5JztcbmltcG9ydCB7IFJmYVJldmlzaW9uIH0gZnJvbSAnLi9yZmEtcmV2aXNpb24uZW50aXR5JztcbmltcG9ydCB7IFJmYUFjdGlvblR5cGUgfSBmcm9tICcuL3JmYS13b3JrZmxvdy10ZW1wbGF0ZS1zdGVwLmVudGl0eSc7IC8vIOKchSBJbXBvcnQgRW51bVxuXG5ARW50aXR5KCdyZmFfd29ya2Zsb3dzJylcbmV4cG9ydCBjbGFzcyBSZmFXb3JrZmxvdyB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKClcbiAgaWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdyZmFfcmV2aXNpb25faWQnIH0pXG4gIHJmYVJldmlzaW9uSWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdzdGVwX251bWJlcicgfSlcbiAgc3RlcE51bWJlciE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ29yZ2FuaXphdGlvbl9pZCcgfSlcbiAgb3JnYW5pemF0aW9uSWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdhc3NpZ25lZF90bycsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGFzc2lnbmVkVG8/OiBudW1iZXI7XG5cbiAgQENvbHVtbih7XG4gICAgbmFtZTogJ2FjdGlvbl90eXBlJyxcbiAgICB0eXBlOiAnZW51bScsXG4gICAgZW51bTogUmZhQWN0aW9uVHlwZSwgLy8g4pyFIFVzZSBTaGFyZWQgRW51bVxuICAgIG51bGxhYmxlOiB0cnVlLFxuICB9KVxuICBhY3Rpb25UeXBlPzogUmZhQWN0aW9uVHlwZTtcblxuICBAQ29sdW1uKHtcbiAgICB0eXBlOiAnZW51bScsXG4gICAgZW51bTogWydQRU5ESU5HJywgJ0lOX1BST0dSRVNTJywgJ0NPTVBMRVRFRCcsICdSRUpFQ1RFRCddLFxuICAgIG51bGxhYmxlOiB0cnVlLFxuICB9KVxuICBzdGF0dXM/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgY29tbWVudHM/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdjb21wbGV0ZWRfYXQnLCB0eXBlOiAnZGF0ZXRpbWUnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBjb21wbGV0ZWRBdD86IERhdGU7XG5cbiAgQENvbHVtbih7IHR5cGU6ICdqc29uJywgbnVsbGFibGU6IHRydWUgfSlcbiAgc3RhdGVDb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxuICB1cGRhdGVkQXQhOiBEYXRlO1xuXG4gIC8vIFJlbGF0aW9uc1xuICBATWFueVRvT25lKCgpID0+IFJmYVJldmlzaW9uLCAocmV2KSA9PiByZXYud29ya2Zsb3dzLCB7IG9uRGVsZXRlOiAnQ0FTQ0FERScgfSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAncmZhX3JldmlzaW9uX2lkJyB9KVxuICByZmFSZXZpc2lvbiE6IFJmYVJldmlzaW9uO1xuXG4gIEBNYW55VG9PbmUoKCkgPT4gT3JnYW5pemF0aW9uKVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdvcmdhbml6YXRpb25faWQnIH0pXG4gIG9yZ2FuaXphdGlvbiE6IE9yZ2FuaXphdGlvbjtcblxuICBATWFueVRvT25lKCgpID0+IFVzZXIpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2Fzc2lnbmVkX3RvJyB9KVxuICBhc3NpZ25lZT86IFVzZXI7XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/51/rfaworkflowentity_51880ef91639f200aaee6b2a662c73b1.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/51/rfaworkflowentity_51880ef91639f200aaee6b2a662c73b1.map new file mode 100644 index 0000000..1e5f867 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/51/rfaworkflowentity_51880ef91639f200aaee6b2a662c73b1.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-workflow.entity.ts","mappings":";;;;;;;;;;;;;AAAA,wDAAwD;AACxD,qCAQiB;AACjB,yFAA+E;AAC/E,iEAAuD;AACvD,+DAAoD;AACpD,2FAAoE,CAAC,gBAAgB;AAG9E,IAAM,WAAW,GAAjB,MAAM,WAAW;CA0DvB,CAAA;AA1DY,kCAAW;AAEtB;IADC,IAAA,gCAAsB,GAAE;;uCACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;;kDACb;AAGvB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;+CACZ;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;;mDACZ;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;+CAC5B;AAQpB;IANC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,iDAAa,EAAE,oBAAoB;QACzC,QAAQ,EAAE,IAAI;KACf,CAAC;kDACW,iDAAa,oBAAb,iDAAa;+CAAC;AAO3B;IALC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,CAAC;QACzD,QAAQ,EAAE,IAAI;KACf,CAAC;;2CACc;AAGhB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;6CACvB;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACrD,IAAI,oBAAJ,IAAI;gDAAC;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDAC1B,MAAM,oBAAN,MAAM;iDAAkB;AAGvC;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;8CAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;8CAAC;AAKjB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,iCAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC7E,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;kDAC1B,iCAAW,oBAAX,iCAAW;gDAAC;AAI1B;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kCAAY,CAAC;IAC7B,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;kDACzB,kCAAY,oBAAZ,kCAAY;iDAAC;AAI5B;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,CAAC;IACrB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;kDACzB,kBAAI,oBAAJ,kBAAI;6CAAC;sBAzDL,WAAW;IADvB,IAAA,gBAAM,EAAC,eAAe,CAAC;GACX,WAAW,CA0DvB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-workflow.entity.ts"],"sourcesContent":["// File: src/modules/rfa/entities/rfa-workflow.entity.ts\nimport {\n Column,\n CreateDateColumn,\n Entity,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from 'typeorm';\nimport { Organization } from '../../organization/entities/organization.entity';\nimport { User } from '../../user/entities/user.entity';\nimport { RfaRevision } from './rfa-revision.entity';\nimport { RfaActionType } from './rfa-workflow-template-step.entity'; // ✅ Import Enum\n\n@Entity('rfa_workflows')\nexport class RfaWorkflow {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'rfa_revision_id' })\n rfaRevisionId!: number;\n\n @Column({ name: 'step_number' })\n stepNumber!: number;\n\n @Column({ name: 'organization_id' })\n organizationId!: number;\n\n @Column({ name: 'assigned_to', nullable: true })\n assignedTo?: number;\n\n @Column({\n name: 'action_type',\n type: 'enum',\n enum: RfaActionType, // ✅ Use Shared Enum\n nullable: true,\n })\n actionType?: RfaActionType;\n\n @Column({\n type: 'enum',\n enum: ['PENDING', 'IN_PROGRESS', 'COMPLETED', 'REJECTED'],\n nullable: true,\n })\n status?: string;\n\n @Column({ type: 'text', nullable: true })\n comments?: string;\n\n @Column({ name: 'completed_at', type: 'datetime', nullable: true })\n completedAt?: Date;\n\n @Column({ type: 'json', nullable: true })\n stateContext?: Record;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n // Relations\n @ManyToOne(() => RfaRevision, (rev) => rev.workflows, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'rfa_revision_id' })\n rfaRevision!: RfaRevision;\n\n @ManyToOne(() => Organization)\n @JoinColumn({ name: 'organization_id' })\n organization!: Organization;\n\n @ManyToOne(() => User)\n @JoinColumn({ name: 'assigned_to' })\n assignee?: User;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/53/migrationerrorentity_53b050c5d1af74a17caf24765a8193b9 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/53/migrationerrorentity_53b050c5d1af74a17caf24765a8193b9 new file mode 100644 index 0000000..e1a98ec --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/53/migrationerrorentity_53b050c5d1af74a17caf24765a8193b9 @@ -0,0 +1,66 @@ +32ac68079d2b38007d04eccf43854c98 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MigrationError = exports.MigrationErrorType = void 0; +const typeorm_1 = require("typeorm"); +var MigrationErrorType; +(function (MigrationErrorType) { + MigrationErrorType["FILE_NOT_FOUND"] = "FILE_NOT_FOUND"; + MigrationErrorType["MISSING_FILENAME"] = "MISSING_FILENAME"; + MigrationErrorType["FILE_ERROR"] = "FILE_ERROR"; + MigrationErrorType["AI_PARSE_ERROR"] = "AI_PARSE_ERROR"; + MigrationErrorType["API_ERROR"] = "API_ERROR"; + MigrationErrorType["DB_ERROR"] = "DB_ERROR"; + MigrationErrorType["SECURITY"] = "SECURITY"; + MigrationErrorType["UNKNOWN"] = "UNKNOWN"; +})(MigrationErrorType || (exports.MigrationErrorType = MigrationErrorType = {})); +let MigrationError = class MigrationError { +}; +exports.MigrationError = MigrationError; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], MigrationError.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'batch_id', length: 50, nullable: true }), + __metadata("design:type", String) +], MigrationError.prototype, "batchId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'document_number', length: 100, nullable: true }), + __metadata("design:type", String) +], MigrationError.prototype, "documentNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'error_type', + type: 'enum', + enum: MigrationErrorType, + nullable: true, + }), + __metadata("design:type", String) +], MigrationError.prototype, "errorType", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'error_message', type: 'text', nullable: true }), + __metadata("design:type", String) +], MigrationError.prototype, "errorMessage", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'raw_ai_response', type: 'text', nullable: true }), + __metadata("design:type", String) +], MigrationError.prototype, "rawAiResponse", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], MigrationError.prototype, "createdAt", void 0); +exports.MigrationError = MigrationError = __decorate([ + (0, typeorm_1.Entity)('migration_errors') +], MigrationError); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxlbnRpdGllc1xcbWlncmF0aW9uLWVycm9yLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBS2lCO0FBRWpCLElBQVksa0JBU1g7QUFURCxXQUFZLGtCQUFrQjtJQUM1Qix1REFBaUMsQ0FBQTtJQUNqQywyREFBcUMsQ0FBQTtJQUNyQywrQ0FBeUIsQ0FBQTtJQUN6Qix1REFBaUMsQ0FBQTtJQUNqQyw2Q0FBdUIsQ0FBQTtJQUN2QiwyQ0FBcUIsQ0FBQTtJQUNyQiwyQ0FBcUIsQ0FBQTtJQUNyQix5Q0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBVFcsa0JBQWtCLGtDQUFsQixrQkFBa0IsUUFTN0I7QUFHTSxJQUFNLGNBQWMsR0FBcEIsTUFBTSxjQUFjO0NBMEIxQixDQUFBO0FBMUJZLHdDQUFjO0FBRXpCO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7MENBQ2I7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7OytDQUN4QztBQUdqQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7c0RBQ3pDO0FBUXhCO0lBTkMsSUFBQSxnQkFBTSxFQUFDO1FBQ04sSUFBSSxFQUFFLFlBQVk7UUFDbEIsSUFBSSxFQUFFLE1BQU07UUFDWixJQUFJLEVBQUUsa0JBQWtCO1FBQ3hCLFFBQVEsRUFBRSxJQUFJO0tBQ2YsQ0FBQzs7aURBQzZCO0FBRy9CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7b0RBQzFDO0FBR3RCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOztxREFDM0M7QUFHdkI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7aURBQUM7eUJBekJOLGNBQWM7SUFEMUIsSUFBQSxnQkFBTSxFQUFDLGtCQUFrQixDQUFDO0dBQ2QsY0FBYyxDQTBCMUIiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxlbnRpdGllc1xcbWlncmF0aW9uLWVycm9yLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHksXG4gIENvbHVtbixcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbiAgQ3JlYXRlRGF0ZUNvbHVtbixcbn0gZnJvbSAndHlwZW9ybSc7XG5cbmV4cG9ydCBlbnVtIE1pZ3JhdGlvbkVycm9yVHlwZSB7XG4gIEZJTEVfTk9UX0ZPVU5EID0gJ0ZJTEVfTk9UX0ZPVU5EJyxcbiAgTUlTU0lOR19GSUxFTkFNRSA9ICdNSVNTSU5HX0ZJTEVOQU1FJyxcbiAgRklMRV9FUlJPUiA9ICdGSUxFX0VSUk9SJyxcbiAgQUlfUEFSU0VfRVJST1IgPSAnQUlfUEFSU0VfRVJST1InLFxuICBBUElfRVJST1IgPSAnQVBJX0VSUk9SJyxcbiAgREJfRVJST1IgPSAnREJfRVJST1InLFxuICBTRUNVUklUWSA9ICdTRUNVUklUWScsXG4gIFVOS05PV04gPSAnVU5LTk9XTicsXG59XG5cbkBFbnRpdHkoJ21pZ3JhdGlvbl9lcnJvcnMnKVxuZXhwb3J0IGNsYXNzIE1pZ3JhdGlvbkVycm9yIHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuICBpZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2JhdGNoX2lkJywgbGVuZ3RoOiA1MCwgbnVsbGFibGU6IHRydWUgfSlcbiAgYmF0Y2hJZD86IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ2RvY3VtZW50X251bWJlcicsIGxlbmd0aDogMTAwLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBkb2N1bWVudE51bWJlcj86IHN0cmluZztcblxuICBAQ29sdW1uKHtcbiAgICBuYW1lOiAnZXJyb3JfdHlwZScsXG4gICAgdHlwZTogJ2VudW0nLFxuICAgIGVudW06IE1pZ3JhdGlvbkVycm9yVHlwZSxcbiAgICBudWxsYWJsZTogdHJ1ZSxcbiAgfSlcbiAgZXJyb3JUeXBlPzogTWlncmF0aW9uRXJyb3JUeXBlO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnZXJyb3JfbWVzc2FnZScsIHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmF3X2FpX3Jlc3BvbnNlJywgdHlwZTogJ3RleHQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICByYXdBaVJlc3BvbnNlPzogc3RyaW5nO1xuXG4gIEBDcmVhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/53/migrationerrorentity_53b050c5d1af74a17caf24765a8193b9.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/53/migrationerrorentity_53b050c5d1af74a17caf24765a8193b9.map new file mode 100644 index 0000000..9ff0004 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/53/migrationerrorentity_53b050c5d1af74a17caf24765a8193b9.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\entities\\migration-error.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAKiB;AAEjB,IAAY,kBASX;AATD,WAAY,kBAAkB;IAC5B,uDAAiC,CAAA;IACjC,2DAAqC,CAAA;IACrC,+CAAyB,CAAA;IACzB,uDAAiC,CAAA;IACjC,6CAAuB,CAAA;IACvB,2CAAqB,CAAA;IACrB,2CAAqB,CAAA;IACrB,yCAAmB,CAAA;AACrB,CAAC,EATW,kBAAkB,kCAAlB,kBAAkB,QAS7B;AAGM,IAAM,cAAc,GAApB,MAAM,cAAc;CA0B1B,CAAA;AA1BY,wCAAc;AAEzB;IADC,IAAA,gCAAsB,GAAE;;0CACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;+CACxC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sDACzC;AAQxB;IANC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,kBAAkB;QACxB,QAAQ,EAAE,IAAI;KACf,CAAC;;iDAC6B;AAG/B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;oDAC1C;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;qDAC3C;AAGvB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;iDAAC;yBAzBN,cAAc;IAD1B,IAAA,gBAAM,EAAC,kBAAkB,CAAC;GACd,cAAc,CA0B1B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\entities\\migration-error.entity.ts"],"sourcesContent":["import {\n Entity,\n Column,\n PrimaryGeneratedColumn,\n CreateDateColumn,\n} from 'typeorm';\n\nexport enum MigrationErrorType {\n FILE_NOT_FOUND = 'FILE_NOT_FOUND',\n MISSING_FILENAME = 'MISSING_FILENAME',\n FILE_ERROR = 'FILE_ERROR',\n AI_PARSE_ERROR = 'AI_PARSE_ERROR',\n API_ERROR = 'API_ERROR',\n DB_ERROR = 'DB_ERROR',\n SECURITY = 'SECURITY',\n UNKNOWN = 'UNKNOWN',\n}\n\n@Entity('migration_errors')\nexport class MigrationError {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'batch_id', length: 50, nullable: true })\n batchId?: string;\n\n @Column({ name: 'document_number', length: 100, nullable: true })\n documentNumber?: string;\n\n @Column({\n name: 'error_type',\n type: 'enum',\n enum: MigrationErrorType,\n nullable: true,\n })\n errorType?: MigrationErrorType;\n\n @Column({ name: 'error_message', type: 'text', nullable: true })\n errorMessage?: string;\n\n @Column({ name: 'raw_ai_response', type: 'text', nullable: true })\n rawAiResponse?: string;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/54/native_548917a23d6fe6cc3c48c9539627bdc9 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/54/native_548917a23d6fe6cc3c48c9539627bdc9 new file mode 100644 index 0000000..fd0c706 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/54/native_548917a23d6fe6cc3c48c9539627bdc9 @@ -0,0 +1,6 @@ +9d5c5bc352a8575d29bebd327603ef17 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const crypto_1 = require("crypto"); +exports.default = { randomUUID: crypto_1.randomUUID }; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcbmF0aXZlLmpzIiwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUNiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNuQyxPQUFPLENBQUMsT0FBTyxHQUFHLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcbm9kZV9tb2R1bGVzXFwucG5wbVxcdXVpZEAxMS4xLjBcXG5vZGVfbW9kdWxlc1xcdXVpZFxcZGlzdFxcY2pzXFxuYXRpdmUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjcnlwdG9fMSA9IHJlcXVpcmUoXCJjcnlwdG9cIik7XG5leHBvcnRzLmRlZmF1bHQgPSB7IHJhbmRvbVVVSUQ6IGNyeXB0b18xLnJhbmRvbVVVSUQgfTtcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/54/native_548917a23d6fe6cc3c48c9539627bdc9.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/54/native_548917a23d6fe6cc3c48c9539627bdc9.map new file mode 100644 index 0000000..feffffb --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/54/native_548917a23d6fe6cc3c48c9539627bdc9.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\native.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AACnC,OAAO,CAAC,OAAO,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\native.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst crypto_1 = require(\"crypto\");\nexports.default = { randomUUID: crypto_1.randomUUID };\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/54/organizationroleentity_540b9039e779734579ca9c31fb31cdb1 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/54/organizationroleentity_540b9039e779734579ca9c31fb31cdb1 new file mode 100644 index 0000000..51328da --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/54/organizationroleentity_540b9039e779734579ca9c31fb31cdb1 @@ -0,0 +1,42 @@ +95691959b999bf3e510fb4b6ef1c7c34 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.OrganizationRole = void 0; +const typeorm_1 = require("typeorm"); +const base_entity_1 = require("../../../common/entities/base.entity"); +/** + * OrganizationRole Entity + * Represents the role/type of an organization in the system + * (OWNER, DESIGNER, CONSULTANT, CONTRACTOR, THIRD_PARTY) + * + * Schema reference: organization_roles table (lines 205-211 in schema SQL) + */ +let OrganizationRole = class OrganizationRole extends base_entity_1.BaseEntity { +}; +exports.OrganizationRole = OrganizationRole; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], OrganizationRole.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'role_name', + length: 20, + unique: true, + comment: 'Role name (OWNER, DESIGNER, CONSULTANT, CONTRACTOR, THIRD_PARTY)', + }), + __metadata("design:type", String) +], OrganizationRole.prototype, "roleName", void 0); +exports.OrganizationRole = OrganizationRole = __decorate([ + (0, typeorm_1.Entity)('organization_roles') +], OrganizationRole); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcb3JnYW5pemF0aW9uXFxlbnRpdGllc1xcb3JnYW5pemF0aW9uLXJvbGUuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLHFDQUFpRTtBQUNqRSxzRUFBa0U7QUFFbEU7Ozs7OztHQU1HO0FBRUksSUFBTSxnQkFBZ0IsR0FBdEIsTUFBTSxnQkFBaUIsU0FBUSx3QkFBVTtDQVcvQyxDQUFBO0FBWFksNENBQWdCO0FBRTNCO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7NENBQ2I7QUFRWjtJQU5DLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSxXQUFXO1FBQ2pCLE1BQU0sRUFBRSxFQUFFO1FBQ1YsTUFBTSxFQUFFLElBQUk7UUFDWixPQUFPLEVBQUUsa0VBQWtFO0tBQzVFLENBQUM7O2tEQUNnQjsyQkFWUCxnQkFBZ0I7SUFENUIsSUFBQSxnQkFBTSxFQUFDLG9CQUFvQixDQUFDO0dBQ2hCLGdCQUFnQixDQVc1QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxvcmdhbml6YXRpb25cXGVudGl0aWVzXFxvcmdhbml6YXRpb24tcm9sZS5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5LCBDb2x1bW4sIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4gfSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IEJhc2VFbnRpdHkgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZW50aXRpZXMvYmFzZS5lbnRpdHknO1xuXG4vKipcbiAqIE9yZ2FuaXphdGlvblJvbGUgRW50aXR5XG4gKiBSZXByZXNlbnRzIHRoZSByb2xlL3R5cGUgb2YgYW4gb3JnYW5pemF0aW9uIGluIHRoZSBzeXN0ZW1cbiAqIChPV05FUiwgREVTSUdORVIsIENPTlNVTFRBTlQsIENPTlRSQUNUT1IsIFRISVJEX1BBUlRZKVxuICpcbiAqIFNjaGVtYSByZWZlcmVuY2U6IG9yZ2FuaXphdGlvbl9yb2xlcyB0YWJsZSAobGluZXMgMjA1LTIxMSBpbiBzY2hlbWEgU1FMKVxuICovXG5ARW50aXR5KCdvcmdhbml6YXRpb25fcm9sZXMnKVxuZXhwb3J0IGNsYXNzIE9yZ2FuaXphdGlvblJvbGUgZXh0ZW5kcyBCYXNlRW50aXR5IHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuICBpZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHtcbiAgICBuYW1lOiAncm9sZV9uYW1lJyxcbiAgICBsZW5ndGg6IDIwLFxuICAgIHVuaXF1ZTogdHJ1ZSxcbiAgICBjb21tZW50OiAnUm9sZSBuYW1lIChPV05FUiwgREVTSUdORVIsIENPTlNVTFRBTlQsIENPTlRSQUNUT1IsIFRISVJEX1BBUlRZKScsXG4gIH0pXG4gIHJvbGVOYW1lITogc3RyaW5nO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/54/organizationroleentity_540b9039e779734579ca9c31fb31cdb1.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/54/organizationroleentity_540b9039e779734579ca9c31fb31cdb1.map new file mode 100644 index 0000000..f975bf1 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/54/organizationroleentity_540b9039e779734579ca9c31fb31cdb1.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\organization\\entities\\organization-role.entity.ts","mappings":";;;;;;;;;;;;AAAA,qCAAiE;AACjE,sEAAkE;AAElE;;;;;;GAMG;AAEI,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,wBAAU;CAW/C,CAAA;AAXY,4CAAgB;AAE3B;IADC,IAAA,gCAAsB,GAAE;;4CACb;AAQZ;IANC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,kEAAkE;KAC5E,CAAC;;kDACgB;2BAVP,gBAAgB;IAD5B,IAAA,gBAAM,EAAC,oBAAoB,CAAC;GAChB,gBAAgB,CAW5B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\organization\\entities\\organization-role.entity.ts"],"sourcesContent":["import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';\nimport { BaseEntity } from '../../../common/entities/base.entity';\n\n/**\n * OrganizationRole Entity\n * Represents the role/type of an organization in the system\n * (OWNER, DESIGNER, CONSULTANT, CONTRACTOR, THIRD_PARTY)\n *\n * Schema reference: organization_roles table (lines 205-211 in schema SQL)\n */\n@Entity('organization_roles')\nexport class OrganizationRole extends BaseEntity {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({\n name: 'role_name',\n length: 20,\n unique: true,\n comment: 'Role name (OWNER, DESIGNER, CONSULTANT, CONTRACTOR, THIRD_PARTY)',\n })\n roleName!: string;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/55/authcontroller_55fb8ae11b11b11e700eb6b1a3499bc9 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/55/authcontroller_55fb8ae11b11b11e700eb6b1a3499bc9 new file mode 100644 index 0000000..f313bf5 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/55/authcontroller_55fb8ae11b11b11e700eb6b1a3499bc9 @@ -0,0 +1,180 @@ +6d602731fa43d0b4e6adc26ef574ad71 +"use strict"; +// File: src/common/auth/auth.controller.ts +// บันทึกการแก้ไข: เพิ่ม Type ให้ req และแก้ไข Import (Fix TS7006) +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AuthController = void 0; +const common_1 = require("@nestjs/common"); +const throttler_1 = require("@nestjs/throttler"); +const auth_service_1 = require("./auth.service"); +const login_dto_1 = require("./dto/login.dto"); +const register_dto_1 = require("./dto/register.dto"); +const jwt_auth_guard_1 = require("../guards/jwt-auth.guard"); +const jwt_refresh_guard_1 = require("../guards/jwt-refresh.guard"); +const swagger_1 = require("@nestjs/swagger"); +let AuthController = class AuthController { + constructor(authService) { + this.authService = authService; + } + async login(loginDto) { + const user = await this.authService.validateUser(loginDto.username, loginDto.password); + if (!user) { + throw new common_1.UnauthorizedException('Invalid credentials'); + } + return this.authService.login(user); + } + async register(registerDto) { + return this.authService.register(registerDto); + } + async refresh(req) { + return this.authService.refreshToken(req.user.sub, req.user.refreshToken); + } + async logout(req) { + const token = req.headers.authorization?.split(' ')[1]; + if (!token) { + return { message: 'No token provided' }; + } + // ส่ง refresh token ไปด้วยถ้ามี (ใน header หรือ body) + // สำหรับตอนนี้ส่งแค่ access token ไป blacklist + return this.authService.logout(req.user.user_id, token); + } + getProfile(req) { + return req.user; + } + async getSessions() { + return this.authService.getActiveSessions(); + } + async revokeSession(id) { + return this.authService.revokeSession(Number(id)); + } +}; +exports.AuthController = AuthController; +__decorate([ + (0, common_1.Post)('login'), + (0, throttler_1.Throttle)({ default: { limit: 5, ttl: 60000 } }), + (0, common_1.HttpCode)(common_1.HttpStatus.OK), + (0, swagger_1.ApiOperation)({ summary: 'Login to get Access & Refresh Token' }), + (0, swagger_1.ApiBody)({ type: login_dto_1.LoginDto }), + (0, swagger_1.ApiResponse)({ + status: 200, + description: 'Login successful', + schema: { + type: 'object', + properties: { + access_token: { type: 'string' }, + refresh_token: { type: 'string' }, + user: { type: 'object' }, + }, + }, + }), + __param(0, (0, common_1.Body)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_b = typeof login_dto_1.LoginDto !== "undefined" && login_dto_1.LoginDto) === "function" ? _b : Object]), + __metadata("design:returntype", Promise) +], AuthController.prototype, "login", null); +__decorate([ + (0, common_1.Post)('register-admin'), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, swagger_1.ApiBearerAuth)(), + (0, swagger_1.ApiOperation)({ summary: 'Create new user (Admin Only)' }), + (0, swagger_1.ApiBody)({ type: register_dto_1.RegisterDto }), + (0, swagger_1.ApiResponse)({ status: 201, description: 'User registered' }), + __param(0, (0, common_1.Body)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_c = typeof register_dto_1.RegisterDto !== "undefined" && register_dto_1.RegisterDto) === "function" ? _c : Object]), + __metadata("design:returntype", Promise) +], AuthController.prototype, "register", null); +__decorate([ + (0, common_1.UseGuards)(jwt_refresh_guard_1.JwtRefreshGuard), + (0, common_1.Post)('refresh'), + (0, common_1.HttpCode)(common_1.HttpStatus.OK), + (0, swagger_1.ApiBearerAuth)(), + (0, swagger_1.ApiOperation)({ summary: 'Refresh Access Token using Refresh Token' }), + (0, swagger_1.ApiResponse)({ + status: 200, + description: 'Token refreshed', + schema: { + type: 'object', + properties: { + access_token: { type: 'string' }, + refresh_token: { type: 'string' }, + }, + }, + }), + __param(0, (0, common_1.Req)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Object]), + __metadata("design:returntype", Promise) +], AuthController.prototype, "refresh", null); +__decorate([ + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, common_1.Post)('logout'), + (0, common_1.HttpCode)(common_1.HttpStatus.OK), + (0, swagger_1.ApiBearerAuth)(), + (0, swagger_1.ApiOperation)({ summary: 'Logout (Revoke Tokens)' }), + (0, swagger_1.ApiResponse)({ + status: 200, + description: 'Logged out successfully', + schema: { + type: 'object', + properties: { + message: { type: 'string', example: 'Logged out successfully' }, + }, + }, + }), + __param(0, (0, common_1.Req)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Object]), + __metadata("design:returntype", Promise) +], AuthController.prototype, "logout", null); +__decorate([ + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, common_1.Get)('profile'), + (0, swagger_1.ApiBearerAuth)(), + (0, swagger_1.ApiOperation)({ summary: 'Get current user profile' }), + (0, swagger_1.ApiResponse)({ status: 200, description: 'User profile' }), + __param(0, (0, common_1.Req)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Object]), + __metadata("design:returntype", void 0) +], AuthController.prototype, "getProfile", null); +__decorate([ + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, common_1.Get)('sessions'), + (0, swagger_1.ApiBearerAuth)(), + (0, swagger_1.ApiOperation)({ summary: 'Get active sessions' }), + (0, swagger_1.ApiResponse)({ status: 200, description: 'List of active sessions' }), + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", Promise) +], AuthController.prototype, "getSessions", null); +__decorate([ + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, common_1.Delete)('sessions/:id'), + (0, swagger_1.ApiBearerAuth)(), + (0, swagger_1.ApiOperation)({ summary: 'Revoke session' }), + (0, swagger_1.ApiResponse)({ status: 200, description: 'Session revoked' }), + __param(0, (0, common_1.Param)('id')), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String]), + __metadata("design:returntype", Promise) +], AuthController.prototype, "revokeSession", null); +exports.AuthController = AuthController = __decorate([ + (0, swagger_1.ApiTags)('Authentication'), + (0, common_1.Controller)('auth'), + __metadata("design:paramtypes", [typeof (_a = typeof auth_service_1.AuthService !== "undefined" && auth_service_1.AuthService) === "function" ? _a : Object]) +], AuthController); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxhdXRoXFxhdXRoLmNvbnRyb2xsZXIudHMiLCJtYXBwaW5ncyI6IjtBQUFBLDJDQUEyQztBQUMzQyxrRUFBa0U7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFbEUsMkNBWXdCO0FBQ3hCLGlEQUE2QztBQUM3QyxpREFBNkM7QUFDN0MsK0NBQTJDO0FBQzNDLHFEQUFpRDtBQUNqRCw2REFBd0Q7QUFDeEQsbUVBQThEO0FBQzlELDZDQU15QjtBQVFsQixJQUFNLGNBQWMsR0FBcEIsTUFBTSxjQUFjO0lBQ3pCLFlBQW9CLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO0lBQUcsQ0FBQztJQW1CMUMsQUFBTixLQUFLLENBQUMsS0FBSyxDQUFTLFFBQWtCO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQzlDLFFBQVEsQ0FBQyxRQUFRLEVBQ2pCLFFBQVEsQ0FBQyxRQUFRLENBQ2xCLENBQUM7UUFFRixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksOEJBQXFCLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBUUssQUFBTixLQUFLLENBQUMsUUFBUSxDQUFTLFdBQXdCO1FBQzdDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQWtCSyxBQUFOLEtBQUssQ0FBQyxPQUFPLENBQVEsR0FBMkI7UUFDOUMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFpQkssQUFBTixLQUFLLENBQUMsTUFBTSxDQUFRLEdBQW9CO1FBQ3RDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLENBQUM7UUFDMUMsQ0FBQztRQUNELHNEQUFzRDtRQUN0RCwrQ0FBK0M7UUFDL0MsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBT0QsVUFBVSxDQUFRLEdBQW9CO1FBQ3BDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQztJQUNsQixDQUFDO0lBT0ssQUFBTixLQUFLLENBQUMsV0FBVztRQUNmLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFPSyxBQUFOLEtBQUssQ0FBQyxhQUFhLENBQWMsRUFBVTtRQUN6QyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7Q0FDRixDQUFBO0FBbEhZLHdDQUFjO0FBb0JuQjtJQWpCTCxJQUFBLGFBQUksRUFBQyxPQUFPLENBQUM7SUFDYixJQUFBLG9CQUFRLEVBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO0lBQy9DLElBQUEsaUJBQVEsRUFBQyxtQkFBVSxDQUFDLEVBQUUsQ0FBQztJQUN2QixJQUFBLHNCQUFZLEVBQUMsRUFBRSxPQUFPLEVBQUUscUNBQXFDLEVBQUUsQ0FBQztJQUNoRSxJQUFBLGlCQUFPLEVBQUMsRUFBRSxJQUFJLEVBQUUsb0JBQVEsRUFBRSxDQUFDO0lBQzNCLElBQUEscUJBQVcsRUFBQztRQUNYLE1BQU0sRUFBRSxHQUFHO1FBQ1gsV0FBVyxFQUFFLGtCQUFrQjtRQUMvQixNQUFNLEVBQUU7WUFDTixJQUFJLEVBQUUsUUFBUTtZQUNkLFVBQVUsRUFBRTtnQkFDVixZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO2dCQUNoQyxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO2dCQUNqQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO2FBQ3pCO1NBQ0Y7S0FDRixDQUFDO0lBQ1csV0FBQSxJQUFBLGFBQUksR0FBRSxDQUFBOzt5REFBVyxvQkFBUSxvQkFBUixvQkFBUTs7MkNBV3JDO0FBUUs7SUFOTCxJQUFBLGFBQUksRUFBQyxnQkFBZ0IsQ0FBQztJQUN0QixJQUFBLGtCQUFTLEVBQUMsNkJBQVksQ0FBQztJQUN2QixJQUFBLHVCQUFhLEdBQUU7SUFDZixJQUFBLHNCQUFZLEVBQUMsRUFBRSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsQ0FBQztJQUN6RCxJQUFBLGlCQUFPLEVBQUMsRUFBRSxJQUFJLEVBQUUsMEJBQVcsRUFBRSxDQUFDO0lBQzlCLElBQUEscUJBQVcsRUFBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLENBQUM7SUFDN0MsV0FBQSxJQUFBLGFBQUksR0FBRSxDQUFBOzt5REFBYywwQkFBVyxvQkFBWCwwQkFBVzs7OENBRTlDO0FBa0JLO0lBaEJMLElBQUEsa0JBQVMsRUFBQyxtQ0FBZSxDQUFDO0lBQzFCLElBQUEsYUFBSSxFQUFDLFNBQVMsQ0FBQztJQUNmLElBQUEsaUJBQVEsRUFBQyxtQkFBVSxDQUFDLEVBQUUsQ0FBQztJQUN2QixJQUFBLHVCQUFhLEdBQUU7SUFDZixJQUFBLHNCQUFZLEVBQUMsRUFBRSxPQUFPLEVBQUUsMENBQTBDLEVBQUUsQ0FBQztJQUNyRSxJQUFBLHFCQUFXLEVBQUM7UUFDWCxNQUFNLEVBQUUsR0FBRztRQUNYLFdBQVcsRUFBRSxpQkFBaUI7UUFDOUIsTUFBTSxFQUFFO1lBQ04sSUFBSSxFQUFFLFFBQVE7WUFDZCxVQUFVLEVBQUU7Z0JBQ1YsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtnQkFDaEMsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTthQUNsQztTQUNGO0tBQ0YsQ0FBQztJQUNhLFdBQUEsSUFBQSxZQUFHLEdBQUUsQ0FBQTs7Ozs2Q0FFbkI7QUFpQks7SUFmTCxJQUFBLGtCQUFTLEVBQUMsNkJBQVksQ0FBQztJQUN2QixJQUFBLGFBQUksRUFBQyxRQUFRLENBQUM7SUFDZCxJQUFBLGlCQUFRLEVBQUMsbUJBQVUsQ0FBQyxFQUFFLENBQUM7SUFDdkIsSUFBQSx1QkFBYSxHQUFFO0lBQ2YsSUFBQSxzQkFBWSxFQUFDLEVBQUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLENBQUM7SUFDbkQsSUFBQSxxQkFBVyxFQUFDO1FBQ1gsTUFBTSxFQUFFLEdBQUc7UUFDWCxXQUFXLEVBQUUseUJBQXlCO1FBQ3RDLE1BQU0sRUFBRTtZQUNOLElBQUksRUFBRSxRQUFRO1lBQ2QsVUFBVSxFQUFFO2dCQUNWLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLHlCQUF5QixFQUFFO2FBQ2hFO1NBQ0Y7S0FDRixDQUFDO0lBQ1ksV0FBQSxJQUFBLFlBQUcsR0FBRSxDQUFBOzs7OzRDQVFsQjtBQU9EO0lBTEMsSUFBQSxrQkFBUyxFQUFDLDZCQUFZLENBQUM7SUFDdkIsSUFBQSxZQUFHLEVBQUMsU0FBUyxDQUFDO0lBQ2QsSUFBQSx1QkFBYSxHQUFFO0lBQ2YsSUFBQSxzQkFBWSxFQUFDLEVBQUUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLENBQUM7SUFDckQsSUFBQSxxQkFBVyxFQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLENBQUM7SUFDOUMsV0FBQSxJQUFBLFlBQUcsR0FBRSxDQUFBOzs7O2dEQUVoQjtBQU9LO0lBTEwsSUFBQSxrQkFBUyxFQUFDLDZCQUFZLENBQUM7SUFDdkIsSUFBQSxZQUFHLEVBQUMsVUFBVSxDQUFDO0lBQ2YsSUFBQSx1QkFBYSxHQUFFO0lBQ2YsSUFBQSxzQkFBWSxFQUFDLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLENBQUM7SUFDaEQsSUFBQSxxQkFBVyxFQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUseUJBQXlCLEVBQUUsQ0FBQzs7OztpREFHcEU7QUFPSztJQUxMLElBQUEsa0JBQVMsRUFBQyw2QkFBWSxDQUFDO0lBQ3ZCLElBQUEsZUFBTSxFQUFDLGNBQWMsQ0FBQztJQUN0QixJQUFBLHVCQUFhLEdBQUU7SUFDZixJQUFBLHNCQUFZLEVBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztJQUMzQyxJQUFBLHFCQUFXLEVBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxDQUFDO0lBQ3hDLFdBQUEsSUFBQSxjQUFLLEVBQUMsSUFBSSxDQUFDLENBQUE7Ozs7bURBRS9CO3lCQWpIVSxjQUFjO0lBRjFCLElBQUEsaUJBQU8sRUFBQyxnQkFBZ0IsQ0FBQztJQUN6QixJQUFBLG1CQUFVLEVBQUMsTUFBTSxDQUFDO3lEQUVnQiwwQkFBVyxvQkFBWCwwQkFBVztHQURqQyxjQUFjLENBa0gxQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxjb21tb25cXGF1dGhcXGF1dGguY29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGaWxlOiBzcmMvY29tbW9uL2F1dGgvYXV0aC5jb250cm9sbGVyLnRzXG4vLyDguJrguLHguJnguJfguLbguIHguIHguLLguKPguYHguIHguYnguYTguII6IOC5gOC4nuC4tOC5iOC4oSBUeXBlIOC5g+C4q+C5iSByZXEg4LmB4Lil4Liw4LmB4LiB4LmJ4LmE4LiCIEltcG9ydCAoRml4IFRTNzAwNilcblxuaW1wb3J0IHtcbiAgQ29udHJvbGxlcixcbiAgUG9zdCxcbiAgQm9keSxcbiAgR2V0LFxuICBVc2VHdWFyZHMsXG4gIFVuYXV0aG9yaXplZEV4Y2VwdGlvbixcbiAgUmVxLFxuICBIdHRwQ29kZSxcbiAgSHR0cFN0YXR1cyxcbiAgRGVsZXRlLFxuICBQYXJhbSxcbn0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xuaW1wb3J0IHsgVGhyb3R0bGUgfSBmcm9tICdAbmVzdGpzL3Rocm90dGxlcic7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4vYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IExvZ2luRHRvIH0gZnJvbSAnLi9kdG8vbG9naW4uZHRvJztcbmltcG9ydCB7IFJlZ2lzdGVyRHRvIH0gZnJvbSAnLi9kdG8vcmVnaXN0ZXIuZHRvJztcbmltcG9ydCB7IEp3dEF1dGhHdWFyZCB9IGZyb20gJy4uL2d1YXJkcy9qd3QtYXV0aC5ndWFyZCc7XG5pbXBvcnQgeyBKd3RSZWZyZXNoR3VhcmQgfSBmcm9tICcuLi9ndWFyZHMvand0LXJlZnJlc2guZ3VhcmQnO1xuaW1wb3J0IHtcbiAgQXBpVGFncyxcbiAgQXBpT3BlcmF0aW9uLFxuICBBcGlCZWFyZXJBdXRoLFxuICBBcGlSZXNwb25zZSxcbiAgQXBpQm9keSxcbn0gZnJvbSAnQG5lc3Rqcy9zd2FnZ2VyJztcbmltcG9ydCB0eXBlIHtcbiAgUmVxdWVzdFdpdGhVc2VyLFxuICBSZXF1ZXN0V2l0aFJlZnJlc2hVc2VyLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcXVlc3Qtd2l0aC11c2VyLmludGVyZmFjZSc7XG5cbkBBcGlUYWdzKCdBdXRoZW50aWNhdGlvbicpXG5AQ29udHJvbGxlcignYXV0aCcpXG5leHBvcnQgY2xhc3MgQXV0aENvbnRyb2xsZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSkge31cblxuICBAUG9zdCgnbG9naW4nKVxuICBAVGhyb3R0bGUoeyBkZWZhdWx0OiB7IGxpbWl0OiA1LCB0dGw6IDYwMDAwIH0gfSlcbiAgQEh0dHBDb2RlKEh0dHBTdGF0dXMuT0spXG4gIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiAnTG9naW4gdG8gZ2V0IEFjY2VzcyAmIFJlZnJlc2ggVG9rZW4nIH0pXG4gIEBBcGlCb2R5KHsgdHlwZTogTG9naW5EdG8gfSlcbiAgQEFwaVJlc3BvbnNlKHtcbiAgICBzdGF0dXM6IDIwMCxcbiAgICBkZXNjcmlwdGlvbjogJ0xvZ2luIHN1Y2Nlc3NmdWwnLFxuICAgIHNjaGVtYToge1xuICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGFjY2Vzc190b2tlbjogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICByZWZyZXNoX3Rva2VuOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHVzZXI6IHsgdHlwZTogJ29iamVjdCcgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSlcbiAgYXN5bmMgbG9naW4oQEJvZHkoKSBsb2dpbkR0bzogTG9naW5EdG8pIHtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hdXRoU2VydmljZS52YWxpZGF0ZVVzZXIoXG4gICAgICBsb2dpbkR0by51c2VybmFtZSxcbiAgICAgIGxvZ2luRHRvLnBhc3N3b3JkXG4gICAgKTtcblxuICAgIGlmICghdXNlcikge1xuICAgICAgdGhyb3cgbmV3IFVuYXV0aG9yaXplZEV4Y2VwdGlvbignSW52YWxpZCBjcmVkZW50aWFscycpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLmxvZ2luKHVzZXIpO1xuICB9XG5cbiAgQFBvc3QoJ3JlZ2lzdGVyLWFkbWluJylcbiAgQFVzZUd1YXJkcyhKd3RBdXRoR3VhcmQpXG4gIEBBcGlCZWFyZXJBdXRoKClcbiAgQEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6ICdDcmVhdGUgbmV3IHVzZXIgKEFkbWluIE9ubHkpJyB9KVxuICBAQXBpQm9keSh7IHR5cGU6IFJlZ2lzdGVyRHRvIH0pXG4gIEBBcGlSZXNwb25zZSh7IHN0YXR1czogMjAxLCBkZXNjcmlwdGlvbjogJ1VzZXIgcmVnaXN0ZXJlZCcgfSlcbiAgYXN5bmMgcmVnaXN0ZXIoQEJvZHkoKSByZWdpc3RlckR0bzogUmVnaXN0ZXJEdG8pIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoU2VydmljZS5yZWdpc3RlcihyZWdpc3RlckR0byk7XG4gIH1cblxuICBAVXNlR3VhcmRzKEp3dFJlZnJlc2hHdWFyZClcbiAgQFBvc3QoJ3JlZnJlc2gnKVxuICBASHR0cENvZGUoSHR0cFN0YXR1cy5PSylcbiAgQEFwaUJlYXJlckF1dGgoKVxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ1JlZnJlc2ggQWNjZXNzIFRva2VuIHVzaW5nIFJlZnJlc2ggVG9rZW4nIH0pXG4gIEBBcGlSZXNwb25zZSh7XG4gICAgc3RhdHVzOiAyMDAsXG4gICAgZGVzY3JpcHRpb246ICdUb2tlbiByZWZyZXNoZWQnLFxuICAgIHNjaGVtYToge1xuICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGFjY2Vzc190b2tlbjogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICByZWZyZXNoX3Rva2VuOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0pXG4gIGFzeW5jIHJlZnJlc2goQFJlcSgpIHJlcTogUmVxdWVzdFdpdGhSZWZyZXNoVXNlcikge1xuICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLnJlZnJlc2hUb2tlbihyZXEudXNlci5zdWIsIHJlcS51c2VyLnJlZnJlc2hUb2tlbik7XG4gIH1cblxuICBAVXNlR3VhcmRzKEp3dEF1dGhHdWFyZClcbiAgQFBvc3QoJ2xvZ291dCcpXG4gIEBIdHRwQ29kZShIdHRwU3RhdHVzLk9LKVxuICBAQXBpQmVhcmVyQXV0aCgpXG4gIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiAnTG9nb3V0IChSZXZva2UgVG9rZW5zKScgfSlcbiAgQEFwaVJlc3BvbnNlKHtcbiAgICBzdGF0dXM6IDIwMCxcbiAgICBkZXNjcmlwdGlvbjogJ0xvZ2dlZCBvdXQgc3VjY2Vzc2Z1bGx5JyxcbiAgICBzY2hlbWE6IHtcbiAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBtZXNzYWdlOiB7IHR5cGU6ICdzdHJpbmcnLCBleGFtcGxlOiAnTG9nZ2VkIG91dCBzdWNjZXNzZnVsbHknIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0pXG4gIGFzeW5jIGxvZ291dChAUmVxKCkgcmVxOiBSZXF1ZXN0V2l0aFVzZXIpIHtcbiAgICBjb25zdCB0b2tlbiA9IHJlcS5oZWFkZXJzLmF1dGhvcml6YXRpb24/LnNwbGl0KCcgJylbMV07XG4gICAgaWYgKCF0b2tlbikge1xuICAgICAgcmV0dXJuIHsgbWVzc2FnZTogJ05vIHRva2VuIHByb3ZpZGVkJyB9O1xuICAgIH1cbiAgICAvLyDguKrguYjguIcgcmVmcmVzaCB0b2tlbiDguYTguJvguJTguYnguKfguKLguJbguYnguLLguKHguLUgKOC5g+C4mSBoZWFkZXIg4Lir4Lij4Li34LitIGJvZHkpXG4gICAgLy8g4Liq4Liz4Lir4Lij4Lix4Lia4LiV4Lit4LiZ4LiZ4Li14LmJ4Liq4LmI4LiH4LmB4LiE4LmIIGFjY2VzcyB0b2tlbiDguYTguJsgYmxhY2tsaXN0XG4gICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UubG9nb3V0KHJlcS51c2VyLnVzZXJfaWQsIHRva2VuKTtcbiAgfVxuXG4gIEBVc2VHdWFyZHMoSnd0QXV0aEd1YXJkKVxuICBAR2V0KCdwcm9maWxlJylcbiAgQEFwaUJlYXJlckF1dGgoKVxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ0dldCBjdXJyZW50IHVzZXIgcHJvZmlsZScgfSlcbiAgQEFwaVJlc3BvbnNlKHsgc3RhdHVzOiAyMDAsIGRlc2NyaXB0aW9uOiAnVXNlciBwcm9maWxlJyB9KVxuICBnZXRQcm9maWxlKEBSZXEoKSByZXE6IFJlcXVlc3RXaXRoVXNlcikge1xuICAgIHJldHVybiByZXEudXNlcjtcbiAgfVxuXG4gIEBVc2VHdWFyZHMoSnd0QXV0aEd1YXJkKVxuICBAR2V0KCdzZXNzaW9ucycpXG4gIEBBcGlCZWFyZXJBdXRoKClcbiAgQEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6ICdHZXQgYWN0aXZlIHNlc3Npb25zJyB9KVxuICBAQXBpUmVzcG9uc2UoeyBzdGF0dXM6IDIwMCwgZGVzY3JpcHRpb246ICdMaXN0IG9mIGFjdGl2ZSBzZXNzaW9ucycgfSlcbiAgYXN5bmMgZ2V0U2Vzc2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UuZ2V0QWN0aXZlU2Vzc2lvbnMoKTtcbiAgfVxuXG4gIEBVc2VHdWFyZHMoSnd0QXV0aEd1YXJkKVxuICBARGVsZXRlKCdzZXNzaW9ucy86aWQnKVxuICBAQXBpQmVhcmVyQXV0aCgpXG4gIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiAnUmV2b2tlIHNlc3Npb24nIH0pXG4gIEBBcGlSZXNwb25zZSh7IHN0YXR1czogMjAwLCBkZXNjcmlwdGlvbjogJ1Nlc3Npb24gcmV2b2tlZCcgfSlcbiAgYXN5bmMgcmV2b2tlU2Vzc2lvbihAUGFyYW0oJ2lkJykgaWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLnJldm9rZVNlc3Npb24oTnVtYmVyKGlkKSk7XG4gIH1cbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/55/authcontroller_55fb8ae11b11b11e700eb6b1a3499bc9.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/55/authcontroller_55fb8ae11b11b11e700eb6b1a3499bc9.map new file mode 100644 index 0000000..ee7c9c5 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/55/authcontroller_55fb8ae11b11b11e700eb6b1a3499bc9.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\auth\\auth.controller.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\auth\\auth.controller.ts"],"sourcesContent":["// File: src/common/auth/auth.controller.ts\n// บันทึกการแก้ไข: เพิ่ม Type ให้ req และแก้ไข Import (Fix TS7006)\n\nimport {\n Controller,\n Post,\n Body,\n Get,\n UseGuards,\n UnauthorizedException,\n Req,\n HttpCode,\n HttpStatus,\n Delete,\n Param,\n} from '@nestjs/common';\nimport { Throttle } from '@nestjs/throttler';\nimport { AuthService } from './auth.service';\nimport { LoginDto } from './dto/login.dto';\nimport { RegisterDto } from './dto/register.dto';\nimport { JwtAuthGuard } from '../guards/jwt-auth.guard';\nimport { JwtRefreshGuard } from '../guards/jwt-refresh.guard';\nimport {\n ApiTags,\n ApiOperation,\n ApiBearerAuth,\n ApiResponse,\n ApiBody,\n} from '@nestjs/swagger';\nimport type {\n RequestWithUser,\n RequestWithRefreshUser,\n} from '../interfaces/request-with-user.interface';\n\n@ApiTags('Authentication')\n@Controller('auth')\nexport class AuthController {\n constructor(private authService: AuthService) {}\n\n @Post('login')\n @Throttle({ default: { limit: 5, ttl: 60000 } })\n @HttpCode(HttpStatus.OK)\n @ApiOperation({ summary: 'Login to get Access & Refresh Token' })\n @ApiBody({ type: LoginDto })\n @ApiResponse({\n status: 200,\n description: 'Login successful',\n schema: {\n type: 'object',\n properties: {\n access_token: { type: 'string' },\n refresh_token: { type: 'string' },\n user: { type: 'object' },\n },\n },\n })\n async login(@Body() loginDto: LoginDto) {\n const user = await this.authService.validateUser(\n loginDto.username,\n loginDto.password\n );\n\n if (!user) {\n throw new UnauthorizedException('Invalid credentials');\n }\n\n return this.authService.login(user);\n }\n\n @Post('register-admin')\n @UseGuards(JwtAuthGuard)\n @ApiBearerAuth()\n @ApiOperation({ summary: 'Create new user (Admin Only)' })\n @ApiBody({ type: RegisterDto })\n @ApiResponse({ status: 201, description: 'User registered' })\n async register(@Body() registerDto: RegisterDto) {\n return this.authService.register(registerDto);\n }\n\n @UseGuards(JwtRefreshGuard)\n @Post('refresh')\n @HttpCode(HttpStatus.OK)\n @ApiBearerAuth()\n @ApiOperation({ summary: 'Refresh Access Token using Refresh Token' })\n @ApiResponse({\n status: 200,\n description: 'Token refreshed',\n schema: {\n type: 'object',\n properties: {\n access_token: { type: 'string' },\n refresh_token: { type: 'string' },\n },\n },\n })\n async refresh(@Req() req: RequestWithRefreshUser) {\n return this.authService.refreshToken(req.user.sub, req.user.refreshToken);\n }\n\n @UseGuards(JwtAuthGuard)\n @Post('logout')\n @HttpCode(HttpStatus.OK)\n @ApiBearerAuth()\n @ApiOperation({ summary: 'Logout (Revoke Tokens)' })\n @ApiResponse({\n status: 200,\n description: 'Logged out successfully',\n schema: {\n type: 'object',\n properties: {\n message: { type: 'string', example: 'Logged out successfully' },\n },\n },\n })\n async logout(@Req() req: RequestWithUser) {\n const token = req.headers.authorization?.split(' ')[1];\n if (!token) {\n return { message: 'No token provided' };\n }\n // ส่ง refresh token ไปด้วยถ้ามี (ใน header หรือ body)\n // สำหรับตอนนี้ส่งแค่ access token ไป blacklist\n return this.authService.logout(req.user.user_id, token);\n }\n\n @UseGuards(JwtAuthGuard)\n @Get('profile')\n @ApiBearerAuth()\n @ApiOperation({ summary: 'Get current user profile' })\n @ApiResponse({ status: 200, description: 'User profile' })\n getProfile(@Req() req: RequestWithUser) {\n return req.user;\n }\n\n @UseGuards(JwtAuthGuard)\n @Get('sessions')\n @ApiBearerAuth()\n @ApiOperation({ summary: 'Get active sessions' })\n @ApiResponse({ status: 200, description: 'List of active sessions' })\n async getSessions() {\n return this.authService.getActiveSessions();\n }\n\n @UseGuards(JwtAuthGuard)\n @Delete('sessions/:id')\n @ApiBearerAuth()\n @ApiOperation({ summary: 'Revoke session' })\n @ApiResponse({ status: 200, description: 'Session revoked' })\n async revokeSession(@Param('id') id: string) {\n return this.authService.revokeSession(Number(id));\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/56/workflowengineservice_56e5849b90e20ae3b6280216e4d638ce b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/56/workflowengineservice_56e5849b90e20ae3b6280216e4d638ce new file mode 100644 index 0000000..f87dfe0 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/56/workflowengineservice_56e5849b90e20ae3b6280216e4d638ce @@ -0,0 +1,345 @@ +a41beca36d6541e647704c23de5a95db +"use strict"; +// File: src/modules/workflow-engine/workflow-engine.service.ts +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var WorkflowEngineService_1; +var _a, _b, _c, _d, _e, _f; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WorkflowEngineService = exports.WorkflowAction = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +// Entities +const workflow_definition_entity_1 = require("./entities/workflow-definition.entity"); +const workflow_history_entity_1 = require("./entities/workflow-history.entity"); +const workflow_instance_entity_1 = require("./entities/workflow-instance.entity"); +const workflow_dsl_service_1 = require("./workflow-dsl.service"); +const workflow_event_service_1 = require("./workflow-event.service"); // [NEW] Import Event Service +// Legacy Interface (Backward Compatibility) +var WorkflowAction; +(function (WorkflowAction) { + WorkflowAction["APPROVE"] = "APPROVE"; + WorkflowAction["REJECT"] = "REJECT"; + WorkflowAction["RETURN"] = "RETURN"; + WorkflowAction["ACKNOWLEDGE"] = "ACKNOWLEDGE"; +})(WorkflowAction || (exports.WorkflowAction = WorkflowAction = {})); +let WorkflowEngineService = WorkflowEngineService_1 = class WorkflowEngineService { + constructor(workflowDefRepo, instanceRepo, historyRepo, dslService, eventService, // [NEW] Inject Service + dataSource // ใช้สำหรับ Transaction + ) { + this.workflowDefRepo = workflowDefRepo; + this.instanceRepo = instanceRepo; + this.historyRepo = historyRepo; + this.dslService = dslService; + this.eventService = eventService; + this.dataSource = dataSource; + this.logger = new common_1.Logger(WorkflowEngineService_1.name); + } + // ================================================================= + // [PART 1] Definition Management (Phase 6A) + // ================================================================= + /** + * สร้างหรืออัปเดต Workflow Definition ใหม่ (Auto Versioning) + */ + async createDefinition(dto) { + // 1. Compile & Validate DSL + const compiled = this.dslService.compile(dto.dsl); + // 2. Check latest version + const latest = await this.workflowDefRepo.findOne({ + where: { workflow_code: dto.workflow_code }, + order: { version: 'DESC' }, + }); + const nextVersion = latest ? latest.version + 1 : 1; + // 3. Save new version + const entity = this.workflowDefRepo.create({ + workflow_code: dto.workflow_code, + version: nextVersion, + dsl: dto.dsl, + compiled: compiled, + is_active: dto.is_active ?? true, + }); + const saved = await this.workflowDefRepo.save(entity); + this.logger.log(`Created Workflow Definition: ${saved.workflow_code} v${saved.version}`); + return saved; + } + /** + * อัปเดต Definition (Re-compile DSL) + */ + async update(id, dto) { + const definition = await this.workflowDefRepo.findOne({ where: { id } }); + if (!definition) { + throw new common_1.NotFoundException(`Workflow Definition with ID "${id}" not found`); + } + if (dto.dsl) { + try { + const compiled = this.dslService.compile(dto.dsl); + definition.dsl = dto.dsl; + definition.compiled = compiled; + } + catch (error) { + throw new common_1.BadRequestException(`Invalid DSL: ${error instanceof Error ? error.message : String(error)}`); + } + } + if (dto.is_active !== undefined) + definition.is_active = dto.is_active; + if (dto.workflow_code) + definition.workflow_code = dto.workflow_code; + return this.workflowDefRepo.save(definition); + } + /** + * ดึง Workflow Definition ทั้งหมด (เฉพาะ Version ล่าสุดของแต่ละ Workflow Code) + */ + async getDefinitions() { + // หา version ล่าสุดของแต่ละ workflow_code + // ใช้ query builder เพื่อ group by และหา max version + const latestDefinitions = await this.workflowDefRepo + .createQueryBuilder('def') + .where('def.version = (SELECT MAX(sub.version) FROM workflow_definitions sub WHERE sub.workflow_code = def.workflow_code)') + .getMany(); + return latestDefinitions; + } + /** + * ดึง Workflow Definition ตาม ID หรือ Code + */ + async getDefinitionById(id) { + const definition = await this.workflowDefRepo.findOne({ where: { id } }); + if (!definition) { + throw new common_1.NotFoundException(`Workflow Definition with ID "${id}" not found`); + } + return definition; + } + /** + * ดึง Action ที่ทำได้ ณ State ปัจจุบัน + */ + async getAvailableActions(workflowCode, currentState) { + const definition = await this.workflowDefRepo.findOne({ + where: { workflow_code: workflowCode, is_active: true }, + order: { version: 'DESC' }, + }); + if (!definition) + return []; + const compiled = definition.compiled; + const stateConfig = compiled.states[currentState]; + if (!stateConfig || !stateConfig.transitions) + return []; + return Object.keys(stateConfig.transitions); + } + // ================================================================= + // [PART 2] Runtime Engine (Phase 3.1) + // ================================================================= + /** + * เริ่มต้น Workflow Instance ใหม่สำหรับเอกสาร + */ + async createInstance(workflowCode, entityType, entityId, initialContext = {}) { + // 1. หา Definition ล่าสุด + const definition = await this.workflowDefRepo.findOne({ + where: { workflow_code: workflowCode, is_active: true }, + order: { version: 'DESC' }, + }); + if (!definition) { + throw new common_1.NotFoundException(`Workflow "${workflowCode}" not found or inactive.`); + } + // 2. หา Initial State จาก Compiled Structure + const compiled = definition.compiled; + // [FIX] ใช้ initialState จาก Root Property โดยตรง (ตามที่ Optimize ใน DSL Service) + // เพราะ CompiledState ใน states map ไม่มี property 'initial' แล้ว + const initialState = compiled.initialState; + if (!initialState) { + throw new common_1.BadRequestException(`Workflow "${workflowCode}" has no initial state defined.`); + } + // 3. สร้าง Instance + const instance = this.instanceRepo.create({ + definition, + entityType, + entityId, + currentState: initialState, + status: workflow_instance_entity_1.WorkflowStatus.ACTIVE, + context: initialContext, + }); + const savedInstance = await this.instanceRepo.save(instance); + this.logger.log(`Started Workflow Instance: ${workflowCode} for ${entityType}:${entityId}`); + return savedInstance; + } + /** + * ดึงข้อมูล Workflow Instance ตาม ID + * ใช้สำหรับการตรวจสอบสถานะหรือซิงค์ข้อมูลกลับไปยัง Module หลัก + */ + async getInstanceById(instanceId) { + const instance = await this.instanceRepo.findOne({ + where: { id: instanceId }, + relations: ['definition'], + }); + if (!instance) { + throw new common_1.NotFoundException(`Workflow Instance "${instanceId}" not found`); + } + return instance; + } + /** + * ดำเนินการเปลี่ยนสถานะ (Transition) ของ Instance จริงแบบ Transactional + */ + async processTransition(instanceId, action, userId, comment, payload = {}) { + const queryRunner = this.dataSource.createQueryRunner(); + await queryRunner.connect(); + await queryRunner.startTransaction(); + let eventsToDispatch = []; + let updatedContext = {}; + try { + // 1. Lock Instance เพื่อป้องกัน Race Condition (Pessimistic Write Lock) + const instance = await queryRunner.manager.findOne(workflow_instance_entity_1.WorkflowInstance, { + where: { id: instanceId }, + relations: ['definition'], + lock: { mode: 'pessimistic_write' }, + }); + if (!instance) { + throw new common_1.NotFoundException(`Workflow Instance "${instanceId}" not found.`); + } + if (instance.status !== workflow_instance_entity_1.WorkflowStatus.ACTIVE) { + throw new common_1.BadRequestException(`Workflow is not active (Status: ${instance.status}).`); + } + // 2. Evaluate Logic ผ่าน DSL Service + const compiled = instance.definition + .compiled; + const context = { ...instance.context, userId, ...payload }; // Merge Context + // * DSL Service จะ throw error ถ้า action ไม่ถูกต้อง หรือสิทธิ์ไม่พอ + const evaluation = this.dslService.evaluate(compiled, instance.currentState, action, context); + const fromState = instance.currentState; + const toState = evaluation.nextState; + // 3. อัปเดต Instance + instance.currentState = toState; + instance.context = context; // อัปเดต Context ด้วย + // เช็คว่าเป็น Terminal State หรือไม่? + if (compiled.states[toState].terminal) { + instance.status = workflow_instance_entity_1.WorkflowStatus.COMPLETED; + } + await queryRunner.manager.save(instance); + // 4. บันทึก History (Audit Trail) + const history = this.historyRepo.create({ + instanceId: instance.id, + fromState, + toState, + action, + actionByUserId: userId, + comment, + metadata: { + events: evaluation.events, + payload, + }, + }); + await queryRunner.manager.save(history); + await queryRunner.commitTransaction(); + // [NEW] เก็บค่าไว้ Dispatch หลัง Commit + eventsToDispatch = evaluation.events; + updatedContext = context; + this.logger.log(`Transition: ${instanceId} [${fromState}] --${action}--> [${toState}] by User:${userId}`); + // [NEW] Dispatch Events (Async) ผ่าน WorkflowEventService + if (eventsToDispatch && eventsToDispatch.length > 0) { + void this.eventService.dispatchEvents(instance.id, eventsToDispatch, updatedContext); + } + return { + success: true, + nextState: toState, + events: eventsToDispatch, + isCompleted: instance.status === workflow_instance_entity_1.WorkflowStatus.COMPLETED, + }; + } + catch (err) { + await queryRunner.rollbackTransaction(); + this.logger.error(`Transition Failed for ${instanceId}: ${err.message}`); + throw err; + } + finally { + await queryRunner.release(); + } + } + /** + * (Utility) Evaluate แบบไม่บันทึกผล (Dry Run) สำหรับ Test หรือ Preview + */ + async evaluate(dto) { + const definition = await this.workflowDefRepo.findOne({ + where: { workflow_code: dto.workflow_code, is_active: true }, + order: { version: 'DESC' }, + }); + if (!definition) { + throw new common_1.NotFoundException(`Workflow "${dto.workflow_code}" not found`); + } + return this.dslService.evaluate(definition.compiled, dto.current_state, dto.action, dto.context || {}); + } + // ================================================================= + // [PART 3] Legacy Support (Backward Compatibility) + // รักษา Logic เดิมไว้เพื่อให้ Module อื่น (Correspondence/RFA) ทำงานต่อได้ + // ================================================================= + /** + * คำนวณสถานะถัดไปแบบ Linear Sequence (Logic เดิม) + * @deprecated แนะนำให้เปลี่ยนไปใช้ processTransition แทนเมื่อ Refactor เสร็จ + */ + processAction(currentSequence, totalSteps, action, returnToSequence) { + const act = action.toUpperCase(); + switch (act) { + case 'APPROVE': + case 'ACKNOWLEDGE': + if (currentSequence >= totalSteps) { + return { + nextStepSequence: null, + shouldUpdateStatus: true, + documentStatus: 'COMPLETED', + }; + } + return { + nextStepSequence: currentSequence + 1, + shouldUpdateStatus: false, + }; + case 'REJECT': + return { + nextStepSequence: null, + shouldUpdateStatus: true, + documentStatus: 'REJECTED', + }; + case 'RETURN': { + const targetStep = returnToSequence || currentSequence - 1; + if (targetStep < 1) { + throw new common_1.BadRequestException('Cannot return beyond the first step'); + } + return { + nextStepSequence: targetStep, + shouldUpdateStatus: true, + documentStatus: 'REVISE_REQUIRED', + }; + } + default: + this.logger.warn(`Unknown legacy action: ${action}, treating as next step.`); + if (currentSequence >= totalSteps) { + return { + nextStepSequence: null, + shouldUpdateStatus: true, + documentStatus: 'COMPLETED', + }; + } + return { + nextStepSequence: currentSequence + 1, + shouldUpdateStatus: false, + }; + } + } +}; +exports.WorkflowEngineService = WorkflowEngineService; +exports.WorkflowEngineService = WorkflowEngineService = WorkflowEngineService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(workflow_definition_entity_1.WorkflowDefinition)), + __param(1, (0, typeorm_1.InjectRepository)(workflow_instance_entity_1.WorkflowInstance)), + __param(2, (0, typeorm_1.InjectRepository)(workflow_history_entity_1.WorkflowHistory)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object, typeof (_b = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _b : Object, typeof (_c = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _c : Object, typeof (_d = typeof workflow_dsl_service_1.WorkflowDslService !== "undefined" && workflow_dsl_service_1.WorkflowDslService) === "function" ? _d : Object, typeof (_e = typeof workflow_event_service_1.WorkflowEventService !== "undefined" && workflow_event_service_1.WorkflowEventService) === "function" ? _e : Object, typeof (_f = typeof typeorm_2.DataSource // ใช้สำหรับ Transaction + !== "undefined" && typeorm_2.DataSource // ใช้สำหรับ Transaction + ) === "function" ? _f : Object]) +], WorkflowEngineService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcd29ya2Zsb3ctZW5naW5lXFx3b3JrZmxvdy1lbmdpbmUuc2VydmljZS50cyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQStEOzs7Ozs7Ozs7Ozs7Ozs7OztBQUUvRCwyQ0FLd0I7QUFDeEIsNkNBQW1EO0FBQ25ELHFDQUFpRDtBQUVqRCxXQUFXO0FBQ1gsc0ZBQTJFO0FBQzNFLGdGQUFxRTtBQUNyRSxrRkFHNkM7QUFNN0MsaUVBSWdDO0FBQ2hDLHFFQUFnRSxDQUFDLDZCQUE2QjtBQUU5Riw0Q0FBNEM7QUFDNUMsSUFBWSxjQUtYO0FBTEQsV0FBWSxjQUFjO0lBQ3hCLHFDQUFtQixDQUFBO0lBQ25CLG1DQUFpQixDQUFBO0lBQ2pCLG1DQUFpQixDQUFBO0lBQ2pCLDZDQUEyQixDQUFBO0FBQzdCLENBQUMsRUFMVyxjQUFjLDhCQUFkLGNBQWMsUUFLekI7QUFTTSxJQUFNLHFCQUFxQiw2QkFBM0IsTUFBTSxxQkFBcUI7SUFHaEMsWUFFRSxlQUFnRSxFQUVoRSxZQUEyRCxFQUUzRCxXQUF5RCxFQUN4QyxVQUE4QixFQUM5QixZQUFrQyxFQUFFLHVCQUF1QjtJQUMzRCxVQUFzQixDQUFDLHdCQUF3Qjs7UUFQL0Msb0JBQWUsR0FBZixlQUFlLENBQWdDO1FBRS9DLGlCQUFZLEdBQVosWUFBWSxDQUE4QjtRQUUxQyxnQkFBVyxHQUFYLFdBQVcsQ0FBNkI7UUFDeEMsZUFBVSxHQUFWLFVBQVUsQ0FBb0I7UUFDOUIsaUJBQVksR0FBWixZQUFZLENBQXNCO1FBQ2xDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFYeEIsV0FBTSxHQUFHLElBQUksZUFBTSxDQUFDLHVCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBWTlELENBQUM7SUFFSixvRUFBb0U7SUFDcEUsNENBQTRDO0lBQzVDLG9FQUFvRTtJQUVwRTs7T0FFRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FDcEIsR0FBZ0M7UUFFaEMsNEJBQTRCO1FBQzVCLE1BQU0sUUFB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QixFQUFDLCtDQUFrQixDQUFDLENBQUE7SUFFcEMsV0FBQSxJQUFBLDBCQUFnQixFQUFDLDJDQUFnQixDQUFDLENBQUE7SUFFbEMsV0FBQSxJQUFBLDBCQUFnQixFQUFDLHlDQUFlLENBQUMsQ0FBQTt5REFIQSxvQkFBVSxvQkFBVixvQkFBVSxvREFFYixvQkFBVSxvQkFBVixvQkFBVSxvREFFWCxvQkFBVSxvQkFBVixvQkFBVSxvREFDWCx5Q0FBa0Isb0JBQWxCLHlDQUFrQixvREFDaEIsNkNBQW9CLG9CQUFwQiw2Q0FBb0Isb0RBQ3RCLG9CQUFVLENBQUMsd0JBQXdCOzRCQUFuQyxvQkFBVSxDQUFDLHdCQUF3Qjs7R0FadkQscUJBQXFCLENBMFpqQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFx3b3JrZmxvdy1lbmdpbmVcXHdvcmtmbG93LWVuZ2luZS5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9tb2R1bGVzL3dvcmtmbG93LWVuZ2luZS93b3JrZmxvdy1lbmdpbmUuc2VydmljZS50c1xuXG5pbXBvcnQge1xuICBCYWRSZXF1ZXN0RXhjZXB0aW9uLFxuICBJbmplY3RhYmxlLFxuICBMb2dnZXIsXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxufSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3RSZXBvc2l0b3J5IH0gZnJvbSAnQG5lc3Rqcy90eXBlb3JtJztcbmltcG9ydCB7IERhdGFTb3VyY2UsIFJlcG9zaXRvcnkgfSBmcm9tICd0eXBlb3JtJztcblxuLy8gRW50aXRpZXNcbmltcG9ydCB7IFdvcmtmbG93RGVmaW5pdGlvbiB9IGZyb20gJy4vZW50aXRpZXMvd29ya2Zsb3ctZGVmaW5pdGlvbi5lbnRpdHknO1xuaW1wb3J0IHsgV29ya2Zsb3dIaXN0b3J5IH0gZnJvbSAnLi9lbnRpdGllcy93b3JrZmxvdy1oaXN0b3J5LmVudGl0eSc7XG5pbXBvcnQge1xuICBXb3JrZmxvd0luc3RhbmNlLFxuICBXb3JrZmxvd1N0YXR1cyxcbn0gZnJvbSAnLi9lbnRpdGllcy93b3JrZmxvdy1pbnN0YW5jZS5lbnRpdHknO1xuXG4vLyBTZXJ2aWNlcyAmIEludGVyZmFjZXNcbmltcG9ydCB7IENyZWF0ZVdvcmtmbG93RGVmaW5pdGlvbkR0byB9IGZyb20gJy4vZHRvL2NyZWF0ZS13b3JrZmxvdy1kZWZpbml0aW9uLmR0byc7XG5pbXBvcnQgeyBFdmFsdWF0ZVdvcmtmbG93RHRvIH0gZnJvbSAnLi9kdG8vZXZhbHVhdGUtd29ya2Zsb3cuZHRvJztcbmltcG9ydCB7IFVwZGF0ZVdvcmtmbG93RGVmaW5pdGlvbkR0byB9IGZyb20gJy4vZHRvL3VwZGF0ZS13b3JrZmxvdy1kZWZpbml0aW9uLmR0byc7XG5pbXBvcnQge1xuICBDb21waWxlZFdvcmtmbG93LFxuICBSYXdFdmVudCxcbiAgV29ya2Zsb3dEc2xTZXJ2aWNlLFxufSBmcm9tICcuL3dvcmtmbG93LWRzbC5zZXJ2aWNlJztcbmltcG9ydCB7IFdvcmtmbG93RXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi93b3JrZmxvdy1ldmVudC5zZXJ2aWNlJzsgLy8gW05FV10gSW1wb3J0IEV2ZW50IFNlcnZpY2VcblxuLy8gTGVnYWN5IEludGVyZmFjZSAoQmFja3dhcmQgQ29tcGF0aWJpbGl0eSlcbmV4cG9ydCBlbnVtIFdvcmtmbG93QWN0aW9uIHtcbiAgQVBQUk9WRSA9ICdBUFBST1ZFJyxcbiAgUkVKRUNUID0gJ1JFSkVDVCcsXG4gIFJFVFVSTiA9ICdSRVRVUk4nLFxuICBBQ0tOT1dMRURHRSA9ICdBQ0tOT1dMRURHRScsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNpdGlvblJlc3VsdCB7XG4gIG5leHRTdGVwU2VxdWVuY2U6IG51bWJlciB8IG51bGw7XG4gIHNob3VsZFVwZGF0ZVN0YXR1czogYm9vbGVhbjtcbiAgZG9jdW1lbnRTdGF0dXM/OiBzdHJpbmc7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBXb3JrZmxvd0VuZ2luZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoV29ya2Zsb3dFbmdpbmVTZXJ2aWNlLm5hbWUpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3RSZXBvc2l0b3J5KFdvcmtmbG93RGVmaW5pdGlvbilcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdvcmtmbG93RGVmUmVwbzogUmVwb3NpdG9yeTxXb3JrZmxvd0RlZmluaXRpb24+LFxuICAgIEBJbmplY3RSZXBvc2l0b3J5KFdvcmtmbG93SW5zdGFuY2UpXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbnN0YW5jZVJlcG86IFJlcG9zaXRvcnk8V29ya2Zsb3dJbnN0YW5jZT4sXG4gICAgQEluamVjdFJlcG9zaXRvcnkoV29ya2Zsb3dIaXN0b3J5KVxuICAgIHByaXZhdGUgcmVhZG9ubHkgaGlzdG9yeVJlcG86IFJlcG9zaXRvcnk8V29ya2Zsb3dIaXN0b3J5PixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRzbFNlcnZpY2U6IFdvcmtmbG93RHNsU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50U2VydmljZTogV29ya2Zsb3dFdmVudFNlcnZpY2UsIC8vIFtORVddIEluamVjdCBTZXJ2aWNlXG4gICAgcHJpdmF0ZSByZWFkb25seSBkYXRhU291cmNlOiBEYXRhU291cmNlIC8vIOC5g+C4iuC5ieC4quC4s+C4q+C4o+C4seC4miBUcmFuc2FjdGlvblxuICApIHt9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gW1BBUlQgMV0gRGVmaW5pdGlvbiBNYW5hZ2VtZW50IChQaGFzZSA2QSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICog4Liq4Lij4LmJ4Liy4LiH4Lir4Lij4Li34Lit4Lit4Lix4Lib4LmA4LiU4LiVIFdvcmtmbG93IERlZmluaXRpb24g4LmD4Lir4Lih4LmIIChBdXRvIFZlcnNpb25pbmcpXG4gICAqL1xuICBhc3luYyBjcmVhdGVEZWZpbml0aW9uKFxuICAgIGR0bzogQ3JlYXRlV29ya2Zsb3dEZWZpbml0aW9uRHRvXG4gICk6IFByb21pc2U8V29ya2Zsb3dEZWZpbml0aW9uPiB7XG4gICAgLy8gMS4gQ29tcGlsZSAmIFZhbGlkYXRlIERTTFxuICAgIGNvbnN0IGNvbXBpbGVkID0gdGhpcy5kc2xTZXJ2aWNlLmNvbXBpbGUoZHRvLmRzbCk7XG5cbiAgICAvLyAyLiBDaGVjayBsYXRlc3QgdmVyc2lvblxuICAgIGNvbnN0IGxhdGVzdCA9IGF3YWl0IHRoaXMud29ya2Zsb3dEZWZSZXBvLmZpbmRPbmUoe1xuICAgICAgd2hlcmU6IHsgd29ya2Zsb3dfY29kZTogZHRvLndvcmtmbG93X2NvZGUgfSxcbiAgICAgIG9yZGVyOiB7IHZlcnNpb246ICdERVNDJyB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgbmV4dFZlcnNpb24gPSBsYXRlc3QgPyBsYXRlc3QudmVyc2lvbiArIDEgOiAxO1xuXG4gICAgLy8gMy4gU2F2ZSBuZXcgdmVyc2lvblxuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMud29ya2Zsb3dEZWZSZXBvLmNyZWF0ZSh7XG4gICAgICB3b3JrZmxvd19jb2RlOiBkdG8ud29ya2Zsb3dfY29kZSxcbiAgICAgIHZlcnNpb246IG5leHRWZXJzaW9uLFxuICAgICAgZHNsOiBkdG8uZHNsIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICBjb21waWxlZDogY29tcGlsZWQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgIGlzX2FjdGl2ZTogZHRvLmlzX2FjdGl2ZSA/PyB0cnVlLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2F2ZWQgPSBhd2FpdCB0aGlzLndvcmtmbG93RGVmUmVwby5zYXZlKGVudGl0eSk7XG4gICAgdGhpcy5sb2dnZXIubG9nKFxuICAgICAgYENyZWF0ZWQgV29ya2Zsb3cgRGVmaW5pdGlvbjogJHtzYXZlZC53b3JrZmxvd19jb2RlfSB2JHtzYXZlZC52ZXJzaW9ufWBcbiAgICApO1xuICAgIHJldHVybiBzYXZlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDguK3guLHguJvguYDguJTguJUgRGVmaW5pdGlvbiAoUmUtY29tcGlsZSBEU0wpXG4gICAqL1xuICBhc3luYyB1cGRhdGUoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBkdG86IFVwZGF0ZVdvcmtmbG93RGVmaW5pdGlvbkR0b1xuICApOiBQcm9taXNlPFdvcmtmbG93RGVmaW5pdGlvbj4ge1xuICAgIGNvbnN0IGRlZmluaXRpb24gPSBhd2FpdCB0aGlzLndvcmtmbG93RGVmUmVwby5maW5kT25lKHsgd2hlcmU6IHsgaWQgfSB9KTtcbiAgICBpZiAoIWRlZmluaXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihcbiAgICAgICAgYFdvcmtmbG93IERlZmluaXRpb24gd2l0aCBJRCBcIiR7aWR9XCIgbm90IGZvdW5kYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZHRvLmRzbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29tcGlsZWQgPSB0aGlzLmRzbFNlcnZpY2UuY29tcGlsZShkdG8uZHNsKTtcbiAgICAgICAgZGVmaW5pdGlvbi5kc2wgPSBkdG8uZHNsIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIGRlZmluaXRpb24uY29tcGlsZWQgPSBjb21waWxlZCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgICAgYEludmFsaWQgRFNMOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGR0by5pc19hY3RpdmUgIT09IHVuZGVmaW5lZCkgZGVmaW5pdGlvbi5pc19hY3RpdmUgPSBkdG8uaXNfYWN0aXZlO1xuICAgIGlmIChkdG8ud29ya2Zsb3dfY29kZSkgZGVmaW5pdGlvbi53b3JrZmxvd19jb2RlID0gZHRvLndvcmtmbG93X2NvZGU7XG5cbiAgICByZXR1cm4gdGhpcy53b3JrZmxvd0RlZlJlcG8uc2F2ZShkZWZpbml0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDguJTguLbguIcgV29ya2Zsb3cgRGVmaW5pdGlvbiDguJfguLHguYnguIfguKvguKHguJQgKOC5gOC4ieC4nuC4suC4sCBWZXJzaW9uIOC4peC5iOC4suC4quC4uOC4lOC4guC4reC4h+C5geC4leC5iOC4peC4sCBXb3JrZmxvdyBDb2RlKVxuICAgKi9cbiAgYXN5bmMgZ2V0RGVmaW5pdGlvbnMoKTogUHJvbWlzZTxXb3JrZmxvd0RlZmluaXRpb25bXT4ge1xuICAgIC8vIOC4q+C4siB2ZXJzaW9uIOC4peC5iOC4suC4quC4uOC4lOC4guC4reC4h+C5geC4leC5iOC4peC4sCB3b3JrZmxvd19jb2RlXG4gICAgLy8g4LmD4LiK4LmJIHF1ZXJ5IGJ1aWxkZXIg4LmA4Lie4Li34LmI4LitIGdyb3VwIGJ5IOC5geC4peC4sOC4q+C4siBtYXggdmVyc2lvblxuICAgIGNvbnN0IGxhdGVzdERlZmluaXRpb25zID0gYXdhaXQgdGhpcy53b3JrZmxvd0RlZlJlcG9cbiAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoJ2RlZicpXG4gICAgICAud2hlcmUoXG4gICAgICAgICdkZWYudmVyc2lvbiA9IChTRUxFQ1QgTUFYKHN1Yi52ZXJzaW9uKSBGUk9NIHdvcmtmbG93X2RlZmluaXRpb25zIHN1YiBXSEVSRSBzdWIud29ya2Zsb3dfY29kZSA9IGRlZi53b3JrZmxvd19jb2RlKSdcbiAgICAgIClcbiAgICAgIC5nZXRNYW55KCk7XG5cbiAgICByZXR1cm4gbGF0ZXN0RGVmaW5pdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICog4LiU4Li24LiHIFdvcmtmbG93IERlZmluaXRpb24g4LiV4Liy4LihIElEIOC4q+C4o+C4t+C4rSBDb2RlXG4gICAqL1xuICBhc3luYyBnZXREZWZpbml0aW9uQnlJZChpZDogc3RyaW5nKTogUHJvbWlzZTxXb3JrZmxvd0RlZmluaXRpb24+IHtcbiAgICBjb25zdCBkZWZpbml0aW9uID0gYXdhaXQgdGhpcy53b3JrZmxvd0RlZlJlcG8uZmluZE9uZSh7IHdoZXJlOiB7IGlkIH0gfSk7XG4gICAgaWYgKCFkZWZpbml0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oXG4gICAgICAgIGBXb3JrZmxvdyBEZWZpbml0aW9uIHdpdGggSUQgXCIke2lkfVwiIG5vdCBmb3VuZGBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBkZWZpbml0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIOC4lOC4tuC4hyBBY3Rpb24g4LiX4Li14LmI4LiX4Liz4LmE4LiU4LmJIOC4kyBTdGF0ZSDguJvguLHguIjguIjguLjguJrguLHguJlcbiAgICovXG4gIGFzeW5jIGdldEF2YWlsYWJsZUFjdGlvbnMoXG4gICAgd29ya2Zsb3dDb2RlOiBzdHJpbmcsXG4gICAgY3VycmVudFN0YXRlOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGRlZmluaXRpb24gPSBhd2FpdCB0aGlzLndvcmtmbG93RGVmUmVwby5maW5kT25lKHtcbiAgICAgIHdoZXJlOiB7IHdvcmtmbG93X2NvZGU6IHdvcmtmbG93Q29kZSwgaXNfYWN0aXZlOiB0cnVlIH0sXG4gICAgICBvcmRlcjogeyB2ZXJzaW9uOiAnREVTQycgfSxcbiAgICB9KTtcblxuICAgIGlmICghZGVmaW5pdGlvbikgcmV0dXJuIFtdO1xuXG4gICAgY29uc3QgY29tcGlsZWQgPSBkZWZpbml0aW9uLmNvbXBpbGVkIGFzIHVua25vd24gYXMgQ29tcGlsZWRXb3JrZmxvdztcbiAgICBjb25zdCBzdGF0ZUNvbmZpZyA9IGNvbXBpbGVkLnN0YXRlc1tjdXJyZW50U3RhdGVdO1xuICAgIGlmICghc3RhdGVDb25maWcgfHwgIXN0YXRlQ29uZmlnLnRyYW5zaXRpb25zKSByZXR1cm4gW107XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc3RhdGVDb25maWcudHJhbnNpdGlvbnMpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gW1BBUlQgMl0gUnVudGltZSBFbmdpbmUgKFBoYXNlIDMuMSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICog4LmA4Lij4Li04LmI4Lih4LiV4LmJ4LiZIFdvcmtmbG93IEluc3RhbmNlIOC5g+C4q+C4oeC5iOC4quC4s+C4q+C4o+C4seC4muC5gOC4reC4geC4quC4suC4o1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlSW5zdGFuY2UoXG4gICAgd29ya2Zsb3dDb2RlOiBzdHJpbmcsXG4gICAgZW50aXR5VHlwZTogc3RyaW5nLFxuICAgIGVudGl0eUlkOiBzdHJpbmcsXG4gICAgaW5pdGlhbENvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgKTogUHJvbWlzZTxXb3JrZmxvd0luc3RhbmNlPiB7XG4gICAgLy8gMS4g4Lir4LiyIERlZmluaXRpb24g4Lil4LmI4Liy4Liq4Li44LiUXG4gICAgY29uc3QgZGVmaW5pdGlvbiA9IGF3YWl0IHRoaXMud29ya2Zsb3dEZWZSZXBvLmZpbmRPbmUoe1xuICAgICAgd2hlcmU6IHsgd29ya2Zsb3dfY29kZTogd29ya2Zsb3dDb2RlLCBpc19hY3RpdmU6IHRydWUgfSxcbiAgICAgIG9yZGVyOiB7IHZlcnNpb246ICdERVNDJyB9LFxuICAgIH0pO1xuXG4gICAgaWYgKCFkZWZpbml0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oXG4gICAgICAgIGBXb3JrZmxvdyBcIiR7d29ya2Zsb3dDb2RlfVwiIG5vdCBmb3VuZCBvciBpbmFjdGl2ZS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDIuIOC4q+C4siBJbml0aWFsIFN0YXRlIOC4iOC4suC4gSBDb21waWxlZCBTdHJ1Y3R1cmVcbiAgICBjb25zdCBjb21waWxlZCA9IGRlZmluaXRpb24uY29tcGlsZWQgYXMgdW5rbm93biBhcyBDb21waWxlZFdvcmtmbG93O1xuICAgIC8vIFtGSVhdIOC5g+C4iuC5iSBpbml0aWFsU3RhdGUg4LiI4Liy4LiBIFJvb3QgUHJvcGVydHkg4LmC4LiU4Lii4LiV4Lij4LiHICjguJXguLLguKHguJfguLXguYggT3B0aW1pemUg4LmD4LiZIERTTCBTZXJ2aWNlKVxuICAgIC8vIOC5gOC4nuC4o+C4suC4sCBDb21waWxlZFN0YXRlIOC5g+C4mSBzdGF0ZXMgbWFwIOC5hOC4oeC5iOC4oeC4tSBwcm9wZXJ0eSAnaW5pdGlhbCcg4LmB4Lil4LmJ4LinXG4gICAgY29uc3QgaW5pdGlhbFN0YXRlID0gY29tcGlsZWQuaW5pdGlhbFN0YXRlO1xuXG4gICAgaWYgKCFpbml0aWFsU3RhdGUpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICBgV29ya2Zsb3cgXCIke3dvcmtmbG93Q29kZX1cIiBoYXMgbm8gaW5pdGlhbCBzdGF0ZSBkZWZpbmVkLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gMy4g4Liq4Lij4LmJ4Liy4LiHIEluc3RhbmNlXG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlUmVwby5jcmVhdGUoe1xuICAgICAgZGVmaW5pdGlvbixcbiAgICAgIGVudGl0eVR5cGUsXG4gICAgICBlbnRpdHlJZCxcbiAgICAgIGN1cnJlbnRTdGF0ZTogaW5pdGlhbFN0YXRlLFxuICAgICAgc3RhdHVzOiBXb3JrZmxvd1N0YXR1cy5BQ1RJVkUsXG4gICAgICBjb250ZXh0OiBpbml0aWFsQ29udGV4dCxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNhdmVkSW5zdGFuY2UgPSBhd2FpdCB0aGlzLmluc3RhbmNlUmVwby5zYXZlKGluc3RhbmNlKTtcbiAgICB0aGlzLmxvZ2dlci5sb2coXG4gICAgICBgU3RhcnRlZCBXb3JrZmxvdyBJbnN0YW5jZTogJHt3b3JrZmxvd0NvZGV9IGZvciAke2VudGl0eVR5cGV9OiR7ZW50aXR5SWR9YFxuICAgICk7XG4gICAgcmV0dXJuIHNhdmVkSW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICog4LiU4Li24LiH4LiC4LmJ4Lit4Lih4Li54LilIFdvcmtmbG93IEluc3RhbmNlIOC4leC4suC4oSBJRFxuICAgKiDguYPguIrguYnguKrguLPguKvguKPguLHguJrguIHguLLguKPguJXguKPguKfguIjguKrguK3guJrguKrguJbguLLguJnguLDguKvguKPguLfguK3guIvguLTguIfguITguYzguILguYnguK3guKHguLnguKXguIHguKXguLHguJrguYTguJvguKLguLHguIcgTW9kdWxlIOC4q+C4peC4seC4gVxuICAgKi9cbiAgYXN5bmMgZ2V0SW5zdGFuY2VCeUlkKGluc3RhbmNlSWQ6IHN0cmluZyk6IFByb21pc2U8V29ya2Zsb3dJbnN0YW5jZT4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgdGhpcy5pbnN0YW5jZVJlcG8uZmluZE9uZSh7XG4gICAgICB3aGVyZTogeyBpZDogaW5zdGFuY2VJZCB9LFxuICAgICAgcmVsYXRpb25zOiBbJ2RlZmluaXRpb24nXSxcbiAgICB9KTtcblxuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihcbiAgICAgICAgYFdvcmtmbG93IEluc3RhbmNlIFwiJHtpbnN0YW5jZUlkfVwiIG5vdCBmb3VuZGBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIOC4lOC4s+C5gOC4meC4tOC4meC4geC4suC4o+C5gOC4m+C4peC4teC5iOC4ouC4meC4quC4luC4suC4meC4sCAoVHJhbnNpdGlvbikg4LiC4Lit4LiHIEluc3RhbmNlIOC4iOC4o+C4tOC4h+C5geC4muC4miBUcmFuc2FjdGlvbmFsXG4gICAqL1xuICBhc3luYyBwcm9jZXNzVHJhbnNpdGlvbihcbiAgICBpbnN0YW5jZUlkOiBzdHJpbmcsXG4gICAgYWN0aW9uOiBzdHJpbmcsXG4gICAgdXNlcklkOiBudW1iZXIsXG4gICAgY29tbWVudD86IHN0cmluZyxcbiAgICBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gICkge1xuICAgIGNvbnN0IHF1ZXJ5UnVubmVyID0gdGhpcy5kYXRhU291cmNlLmNyZWF0ZVF1ZXJ5UnVubmVyKCk7XG4gICAgYXdhaXQgcXVlcnlSdW5uZXIuY29ubmVjdCgpO1xuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKTtcblxuICAgIGxldCBldmVudHNUb0Rpc3BhdGNoOiBSYXdFdmVudFtdID0gW107XG4gICAgbGV0IHVwZGF0ZWRDb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIDEuIExvY2sgSW5zdGFuY2Ug4LmA4Lie4Li34LmI4Lit4Lib4LmJ4Lit4LiH4LiB4Lix4LiZIFJhY2UgQ29uZGl0aW9uIChQZXNzaW1pc3RpYyBXcml0ZSBMb2NrKVxuICAgICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBxdWVyeVJ1bm5lci5tYW5hZ2VyLmZpbmRPbmUoV29ya2Zsb3dJbnN0YW5jZSwge1xuICAgICAgICB3aGVyZTogeyBpZDogaW5zdGFuY2VJZCB9LFxuICAgICAgICByZWxhdGlvbnM6IFsnZGVmaW5pdGlvbiddLFxuICAgICAgICBsb2NrOiB7IG1vZGU6ICdwZXNzaW1pc3RpY193cml0ZScgfSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihcbiAgICAgICAgICBgV29ya2Zsb3cgSW5zdGFuY2UgXCIke2luc3RhbmNlSWR9XCIgbm90IGZvdW5kLmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluc3RhbmNlLnN0YXR1cyAhPT0gV29ya2Zsb3dTdGF0dXMuQUNUSVZFKSB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICAgIGBXb3JrZmxvdyBpcyBub3QgYWN0aXZlIChTdGF0dXM6ICR7aW5zdGFuY2Uuc3RhdHVzfSkuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBFdmFsdWF0ZSBMb2dpYyDguJzguYjguLLguJkgRFNMIFNlcnZpY2VcbiAgICAgIGNvbnN0IGNvbXBpbGVkID0gaW5zdGFuY2UuZGVmaW5pdGlvblxuICAgICAgICAuY29tcGlsZWQgYXMgdW5rbm93biBhcyBDb21waWxlZFdvcmtmbG93O1xuICAgICAgY29uc3QgY29udGV4dCA9IHsgLi4uaW5zdGFuY2UuY29udGV4dCwgdXNlcklkLCAuLi5wYXlsb2FkIH07IC8vIE1lcmdlIENvbnRleHRcblxuICAgICAgLy8gKiBEU0wgU2VydmljZSDguIjguLAgdGhyb3cgZXJyb3Ig4LiW4LmJ4LiyIGFjdGlvbiDguYTguKHguYjguJbguLnguIHguJXguYnguK3guIcg4Lir4Lij4Li34Lit4Liq4Li04LiX4LiY4Li04LmM4LmE4Lih4LmI4Lie4LitXG4gICAgICBjb25zdCBldmFsdWF0aW9uID0gdGhpcy5kc2xTZXJ2aWNlLmV2YWx1YXRlKFxuICAgICAgICBjb21waWxlZCxcbiAgICAgICAgaW5zdGFuY2UuY3VycmVudFN0YXRlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNvbnRleHRcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGZyb21TdGF0ZSA9IGluc3RhbmNlLmN1cnJlbnRTdGF0ZTtcbiAgICAgIGNvbnN0IHRvU3RhdGUgPSBldmFsdWF0aW9uLm5leHRTdGF0ZTtcblxuICAgICAgLy8gMy4g4Lit4Lix4Lib4LmA4LiU4LiVIEluc3RhbmNlXG4gICAgICBpbnN0YW5jZS5jdXJyZW50U3RhdGUgPSB0b1N0YXRlO1xuICAgICAgaW5zdGFuY2UuY29udGV4dCA9IGNvbnRleHQ7IC8vIOC4reC4seC4m+C5gOC4lOC4lSBDb250ZXh0IOC4lOC5ieC4p+C4olxuXG4gICAgICAvLyDguYDguIrguYfguITguKfguYjguLLguYDguJvguYfguJkgVGVybWluYWwgU3RhdGUg4Lir4Lij4Li34Lit4LmE4Lih4LmIP1xuICAgICAgaWYgKGNvbXBpbGVkLnN0YXRlc1t0b1N0YXRlXS50ZXJtaW5hbCkge1xuICAgICAgICBpbnN0YW5jZS5zdGF0dXMgPSBXb3JrZmxvd1N0YXR1cy5DT01QTEVURUQ7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIuc2F2ZShpbnN0YW5jZSk7XG5cbiAgICAgIC8vIDQuIOC4muC4seC4meC4l+C4tuC4gSBIaXN0b3J5IChBdWRpdCBUcmFpbClcbiAgICAgIGNvbnN0IGhpc3RvcnkgPSB0aGlzLmhpc3RvcnlSZXBvLmNyZWF0ZSh7XG4gICAgICAgIGluc3RhbmNlSWQ6IGluc3RhbmNlLmlkLFxuICAgICAgICBmcm9tU3RhdGUsXG4gICAgICAgIHRvU3RhdGUsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgYWN0aW9uQnlVc2VySWQ6IHVzZXJJZCxcbiAgICAgICAgY29tbWVudCxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICBldmVudHM6IGV2YWx1YXRpb24uZXZlbnRzLFxuICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIuc2F2ZShoaXN0b3J5KTtcblxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKTtcblxuICAgICAgLy8gW05FV10g4LmA4LiB4LmH4Lia4LiE4LmI4Liy4LmE4Lin4LmJIERpc3BhdGNoIOC4q+C4peC4seC4hyBDb21taXRcbiAgICAgIGV2ZW50c1RvRGlzcGF0Y2ggPSBldmFsdWF0aW9uLmV2ZW50cztcbiAgICAgIHVwZGF0ZWRDb250ZXh0ID0gY29udGV4dDtcblxuICAgICAgdGhpcy5sb2dnZXIubG9nKFxuICAgICAgICBgVHJhbnNpdGlvbjogJHtpbnN0YW5jZUlkfSBbJHtmcm9tU3RhdGV9XSAtLSR7YWN0aW9ufS0tPiBbJHt0b1N0YXRlfV0gYnkgVXNlcjoke3VzZXJJZH1gXG4gICAgICApO1xuXG4gICAgICAvLyBbTkVXXSBEaXNwYXRjaCBFdmVudHMgKEFzeW5jKSDguJzguYjguLLguJkgV29ya2Zsb3dFdmVudFNlcnZpY2VcbiAgICAgIGlmIChldmVudHNUb0Rpc3BhdGNoICYmIGV2ZW50c1RvRGlzcGF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICB2b2lkIHRoaXMuZXZlbnRTZXJ2aWNlLmRpc3BhdGNoRXZlbnRzKFxuICAgICAgICAgIGluc3RhbmNlLmlkLFxuICAgICAgICAgIGV2ZW50c1RvRGlzcGF0Y2gsXG4gICAgICAgICAgdXBkYXRlZENvbnRleHRcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgbmV4dFN0YXRlOiB0b1N0YXRlLFxuICAgICAgICBldmVudHM6IGV2ZW50c1RvRGlzcGF0Y2gsXG4gICAgICAgIGlzQ29tcGxldGVkOiBpbnN0YW5jZS5zdGF0dXMgPT09IFdvcmtmbG93U3RhdHVzLkNPTVBMRVRFRCxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKCk7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYFRyYW5zaXRpb24gRmFpbGVkIGZvciAke2luc3RhbmNlSWR9OiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YFxuICAgICAgKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucmVsZWFzZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiAoVXRpbGl0eSkgRXZhbHVhdGUg4LmB4Lia4Lia4LmE4Lih4LmI4Lia4Lix4LiZ4LiX4Li24LiB4Lic4LilIChEcnkgUnVuKSDguKrguLPguKvguKPguLHguJogVGVzdCDguKvguKPguLfguK0gUHJldmlld1xuICAgKi9cbiAgYXN5bmMgZXZhbHVhdGUoZHRvOiBFdmFsdWF0ZVdvcmtmbG93RHRvKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgZGVmaW5pdGlvbiA9IGF3YWl0IHRoaXMud29ya2Zsb3dEZWZSZXBvLmZpbmRPbmUoe1xuICAgICAgd2hlcmU6IHsgd29ya2Zsb3dfY29kZTogZHRvLndvcmtmbG93X2NvZGUsIGlzX2FjdGl2ZTogdHJ1ZSB9LFxuICAgICAgb3JkZXI6IHsgdmVyc2lvbjogJ0RFU0MnIH0sXG4gICAgfSk7XG5cbiAgICBpZiAoIWRlZmluaXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgV29ya2Zsb3cgXCIke2R0by53b3JrZmxvd19jb2RlfVwiIG5vdCBmb3VuZGApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRzbFNlcnZpY2UuZXZhbHVhdGUoXG4gICAgICBkZWZpbml0aW9uLmNvbXBpbGVkIGFzIHVua25vd24gYXMgQ29tcGlsZWRXb3JrZmxvdyxcbiAgICAgIGR0by5jdXJyZW50X3N0YXRlLFxuICAgICAgZHRvLmFjdGlvbixcbiAgICAgIGR0by5jb250ZXh0IHx8IHt9XG4gICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFtQQVJUIDNdIExlZ2FjeSBTdXBwb3J0IChCYWNrd2FyZCBDb21wYXRpYmlsaXR5KVxuICAvLyDguKPguLHguIHguKnguLIgTG9naWMg4LmA4LiU4Li04Lih4LmE4Lin4LmJ4LmA4Lie4Li34LmI4Lit4LmD4Lir4LmJIE1vZHVsZSDguK3guLfguYjguJkgKENvcnJlc3BvbmRlbmNlL1JGQSkg4LiX4Liz4LiH4Liy4LiZ4LiV4LmI4Lit4LmE4LiU4LmJXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIOC4hOC4s+C4meC4p+C4k+C4quC4luC4suC4meC4sOC4luC4seC4lOC5hOC4m+C5geC4muC4miBMaW5lYXIgU2VxdWVuY2UgKExvZ2ljIOC5gOC4lOC4tOC4oSlcbiAgICogQGRlcHJlY2F0ZWQg4LmB4LiZ4Liw4LiZ4Liz4LmD4Lir4LmJ4LmA4Lib4Lil4Li14LmI4Lii4LiZ4LmE4Lib4LmD4LiK4LmJIHByb2Nlc3NUcmFuc2l0aW9uIOC5geC4l+C4meC5gOC4oeC4t+C5iOC4rSBSZWZhY3RvciDguYDguKrguKPguYfguIhcbiAgICovXG4gIHByb2Nlc3NBY3Rpb24oXG4gICAgY3VycmVudFNlcXVlbmNlOiBudW1iZXIsXG4gICAgdG90YWxTdGVwczogbnVtYmVyLFxuICAgIGFjdGlvbjogc3RyaW5nLFxuICAgIHJldHVyblRvU2VxdWVuY2U/OiBudW1iZXJcbiAgKTogVHJhbnNpdGlvblJlc3VsdCB7XG4gICAgY29uc3QgYWN0ID0gYWN0aW9uLnRvVXBwZXJDYXNlKCk7XG4gICAgc3dpdGNoIChhY3QpIHtcbiAgICAgIGNhc2UgJ0FQUFJPVkUnOlxuICAgICAgY2FzZSAnQUNLTk9XTEVER0UnOlxuICAgICAgICBpZiAoY3VycmVudFNlcXVlbmNlID49IHRvdGFsU3RlcHMpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmV4dFN0ZXBTZXF1ZW5jZTogbnVsbCxcbiAgICAgICAgICAgIHNob3VsZFVwZGF0ZVN0YXR1czogdHJ1ZSxcbiAgICAgICAgICAgIGRvY3VtZW50U3RhdHVzOiAnQ09NUExFVEVEJyxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmV4dFN0ZXBTZXF1ZW5jZTogY3VycmVudFNlcXVlbmNlICsgMSxcbiAgICAgICAgICBzaG91bGRVcGRhdGVTdGF0dXM6IGZhbHNlLFxuICAgICAgICB9O1xuXG4gICAgICBjYXNlICdSRUpFQ1QnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5leHRTdGVwU2VxdWVuY2U6IG51bGwsXG4gICAgICAgICAgc2hvdWxkVXBkYXRlU3RhdHVzOiB0cnVlLFxuICAgICAgICAgIGRvY3VtZW50U3RhdHVzOiAnUkVKRUNURUQnLFxuICAgICAgICB9O1xuXG4gICAgICBjYXNlICdSRVRVUk4nOiB7XG4gICAgICAgIGNvbnN0IHRhcmdldFN0ZXAgPSByZXR1cm5Ub1NlcXVlbmNlIHx8IGN1cnJlbnRTZXF1ZW5jZSAtIDE7XG4gICAgICAgIGlmICh0YXJnZXRTdGVwIDwgMSkge1xuICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCdDYW5ub3QgcmV0dXJuIGJleW9uZCB0aGUgZmlyc3Qgc3RlcCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmV4dFN0ZXBTZXF1ZW5jZTogdGFyZ2V0U3RlcCxcbiAgICAgICAgICBzaG91bGRVcGRhdGVTdGF0dXM6IHRydWUsXG4gICAgICAgICAgZG9jdW1lbnRTdGF0dXM6ICdSRVZJU0VfUkVRVUlSRUQnLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgIGBVbmtub3duIGxlZ2FjeSBhY3Rpb246ICR7YWN0aW9ufSwgdHJlYXRpbmcgYXMgbmV4dCBzdGVwLmBcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGN1cnJlbnRTZXF1ZW5jZSA+PSB0b3RhbFN0ZXBzKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5leHRTdGVwU2VxdWVuY2U6IG51bGwsXG4gICAgICAgICAgICBzaG91bGRVcGRhdGVTdGF0dXM6IHRydWUsXG4gICAgICAgICAgICBkb2N1bWVudFN0YXR1czogJ0NPTVBMRVRFRCcsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5leHRTdGVwU2VxdWVuY2U6IGN1cnJlbnRTZXF1ZW5jZSArIDEsXG4gICAgICAgICAgc2hvdWxkVXBkYXRlU3RhdHVzOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICB9XG4gIH1cbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/56/workflowengineservice_56e5849b90e20ae3b6280216e4d638ce.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/56/workflowengineservice_56e5849b90e20ae3b6280216e4d638ce.map new file mode 100644 index 0000000..2eec2b1 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/56/workflowengineservice_56e5849b90e20ae3b6280216e4d638ce.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\workflow-engine.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\workflow-engine.service.ts"],"sourcesContent":["// File: src/modules/workflow-engine/workflow-engine.service.ts\n\nimport {\n BadRequestException,\n Injectable,\n Logger,\n NotFoundException,\n} from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { DataSource, Repository } from 'typeorm';\n\n// Entities\nimport { WorkflowDefinition } from './entities/workflow-definition.entity';\nimport { WorkflowHistory } from './entities/workflow-history.entity';\nimport {\n WorkflowInstance,\n WorkflowStatus,\n} from './entities/workflow-instance.entity';\n\n// Services & Interfaces\nimport { CreateWorkflowDefinitionDto } from './dto/create-workflow-definition.dto';\nimport { EvaluateWorkflowDto } from './dto/evaluate-workflow.dto';\nimport { UpdateWorkflowDefinitionDto } from './dto/update-workflow-definition.dto';\nimport {\n CompiledWorkflow,\n RawEvent,\n WorkflowDslService,\n} from './workflow-dsl.service';\nimport { WorkflowEventService } from './workflow-event.service'; // [NEW] Import Event Service\n\n// Legacy Interface (Backward Compatibility)\nexport enum WorkflowAction {\n APPROVE = 'APPROVE',\n REJECT = 'REJECT',\n RETURN = 'RETURN',\n ACKNOWLEDGE = 'ACKNOWLEDGE',\n}\n\nexport interface TransitionResult {\n nextStepSequence: number | null;\n shouldUpdateStatus: boolean;\n documentStatus?: string;\n}\n\n@Injectable()\nexport class WorkflowEngineService {\n private readonly logger = new Logger(WorkflowEngineService.name);\n\n constructor(\n @InjectRepository(WorkflowDefinition)\n private readonly workflowDefRepo: Repository,\n @InjectRepository(WorkflowInstance)\n private readonly instanceRepo: Repository,\n @InjectRepository(WorkflowHistory)\n private readonly historyRepo: Repository,\n private readonly dslService: WorkflowDslService,\n private readonly eventService: WorkflowEventService, // [NEW] Inject Service\n private readonly dataSource: DataSource // ใช้สำหรับ Transaction\n ) {}\n\n // =================================================================\n // [PART 1] Definition Management (Phase 6A)\n // =================================================================\n\n /**\n * สร้างหรืออัปเดต Workflow Definition ใหม่ (Auto Versioning)\n */\n async createDefinition(\n dto: CreateWorkflowDefinitionDto\n ): Promise {\n // 1. Compile & Validate DSL\n const compiled = this.dslService.compile(dto.dsl);\n\n // 2. Check latest version\n const latest = await this.workflowDefRepo.findOne({\n where: { workflow_code: dto.workflow_code },\n order: { version: 'DESC' },\n });\n\n const nextVersion = latest ? latest.version + 1 : 1;\n\n // 3. Save new version\n const entity = this.workflowDefRepo.create({\n workflow_code: dto.workflow_code,\n version: nextVersion,\n dsl: dto.dsl as unknown as Record,\n compiled: compiled as unknown as Record,\n is_active: dto.is_active ?? true,\n });\n\n const saved = await this.workflowDefRepo.save(entity);\n this.logger.log(\n `Created Workflow Definition: ${saved.workflow_code} v${saved.version}`\n );\n return saved;\n }\n\n /**\n * อัปเดต Definition (Re-compile DSL)\n */\n async update(\n id: string,\n dto: UpdateWorkflowDefinitionDto\n ): Promise {\n const definition = await this.workflowDefRepo.findOne({ where: { id } });\n if (!definition) {\n throw new NotFoundException(\n `Workflow Definition with ID \"${id}\" not found`\n );\n }\n\n if (dto.dsl) {\n try {\n const compiled = this.dslService.compile(dto.dsl);\n definition.dsl = dto.dsl as unknown as Record;\n definition.compiled = compiled as unknown as Record;\n } catch (error: unknown) {\n throw new BadRequestException(\n `Invalid DSL: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n if (dto.is_active !== undefined) definition.is_active = dto.is_active;\n if (dto.workflow_code) definition.workflow_code = dto.workflow_code;\n\n return this.workflowDefRepo.save(definition);\n }\n\n /**\n * ดึง Workflow Definition ทั้งหมด (เฉพาะ Version ล่าสุดของแต่ละ Workflow Code)\n */\n async getDefinitions(): Promise {\n // หา version ล่าสุดของแต่ละ workflow_code\n // ใช้ query builder เพื่อ group by และหา max version\n const latestDefinitions = await this.workflowDefRepo\n .createQueryBuilder('def')\n .where(\n 'def.version = (SELECT MAX(sub.version) FROM workflow_definitions sub WHERE sub.workflow_code = def.workflow_code)'\n )\n .getMany();\n\n return latestDefinitions;\n }\n\n /**\n * ดึง Workflow Definition ตาม ID หรือ Code\n */\n async getDefinitionById(id: string): Promise {\n const definition = await this.workflowDefRepo.findOne({ where: { id } });\n if (!definition) {\n throw new NotFoundException(\n `Workflow Definition with ID \"${id}\" not found`\n );\n }\n return definition;\n }\n\n /**\n * ดึง Action ที่ทำได้ ณ State ปัจจุบัน\n */\n async getAvailableActions(\n workflowCode: string,\n currentState: string\n ): Promise {\n const definition = await this.workflowDefRepo.findOne({\n where: { workflow_code: workflowCode, is_active: true },\n order: { version: 'DESC' },\n });\n\n if (!definition) return [];\n\n const compiled = definition.compiled as unknown as CompiledWorkflow;\n const stateConfig = compiled.states[currentState];\n if (!stateConfig || !stateConfig.transitions) return [];\n\n return Object.keys(stateConfig.transitions);\n }\n\n // =================================================================\n // [PART 2] Runtime Engine (Phase 3.1)\n // =================================================================\n\n /**\n * เริ่มต้น Workflow Instance ใหม่สำหรับเอกสาร\n */\n async createInstance(\n workflowCode: string,\n entityType: string,\n entityId: string,\n initialContext: Record = {}\n ): Promise {\n // 1. หา Definition ล่าสุด\n const definition = await this.workflowDefRepo.findOne({\n where: { workflow_code: workflowCode, is_active: true },\n order: { version: 'DESC' },\n });\n\n if (!definition) {\n throw new NotFoundException(\n `Workflow \"${workflowCode}\" not found or inactive.`\n );\n }\n\n // 2. หา Initial State จาก Compiled Structure\n const compiled = definition.compiled as unknown as CompiledWorkflow;\n // [FIX] ใช้ initialState จาก Root Property โดยตรง (ตามที่ Optimize ใน DSL Service)\n // เพราะ CompiledState ใน states map ไม่มี property 'initial' แล้ว\n const initialState = compiled.initialState;\n\n if (!initialState) {\n throw new BadRequestException(\n `Workflow \"${workflowCode}\" has no initial state defined.`\n );\n }\n\n // 3. สร้าง Instance\n const instance = this.instanceRepo.create({\n definition,\n entityType,\n entityId,\n currentState: initialState,\n status: WorkflowStatus.ACTIVE,\n context: initialContext,\n });\n\n const savedInstance = await this.instanceRepo.save(instance);\n this.logger.log(\n `Started Workflow Instance: ${workflowCode} for ${entityType}:${entityId}`\n );\n return savedInstance;\n }\n\n /**\n * ดึงข้อมูล Workflow Instance ตาม ID\n * ใช้สำหรับการตรวจสอบสถานะหรือซิงค์ข้อมูลกลับไปยัง Module หลัก\n */\n async getInstanceById(instanceId: string): Promise {\n const instance = await this.instanceRepo.findOne({\n where: { id: instanceId },\n relations: ['definition'],\n });\n\n if (!instance) {\n throw new NotFoundException(\n `Workflow Instance \"${instanceId}\" not found`\n );\n }\n\n return instance;\n }\n\n /**\n * ดำเนินการเปลี่ยนสถานะ (Transition) ของ Instance จริงแบบ Transactional\n */\n async processTransition(\n instanceId: string,\n action: string,\n userId: number,\n comment?: string,\n payload: Record = {}\n ) {\n const queryRunner = this.dataSource.createQueryRunner();\n await queryRunner.connect();\n await queryRunner.startTransaction();\n\n let eventsToDispatch: RawEvent[] = [];\n let updatedContext: Record = {};\n\n try {\n // 1. Lock Instance เพื่อป้องกัน Race Condition (Pessimistic Write Lock)\n const instance = await queryRunner.manager.findOne(WorkflowInstance, {\n where: { id: instanceId },\n relations: ['definition'],\n lock: { mode: 'pessimistic_write' },\n });\n\n if (!instance) {\n throw new NotFoundException(\n `Workflow Instance \"${instanceId}\" not found.`\n );\n }\n\n if (instance.status !== WorkflowStatus.ACTIVE) {\n throw new BadRequestException(\n `Workflow is not active (Status: ${instance.status}).`\n );\n }\n\n // 2. Evaluate Logic ผ่าน DSL Service\n const compiled = instance.definition\n .compiled as unknown as CompiledWorkflow;\n const context = { ...instance.context, userId, ...payload }; // Merge Context\n\n // * DSL Service จะ throw error ถ้า action ไม่ถูกต้อง หรือสิทธิ์ไม่พอ\n const evaluation = this.dslService.evaluate(\n compiled,\n instance.currentState,\n action,\n context\n );\n\n const fromState = instance.currentState;\n const toState = evaluation.nextState;\n\n // 3. อัปเดต Instance\n instance.currentState = toState;\n instance.context = context; // อัปเดต Context ด้วย\n\n // เช็คว่าเป็น Terminal State หรือไม่?\n if (compiled.states[toState].terminal) {\n instance.status = WorkflowStatus.COMPLETED;\n }\n\n await queryRunner.manager.save(instance);\n\n // 4. บันทึก History (Audit Trail)\n const history = this.historyRepo.create({\n instanceId: instance.id,\n fromState,\n toState,\n action,\n actionByUserId: userId,\n comment,\n metadata: {\n events: evaluation.events,\n payload,\n },\n });\n await queryRunner.manager.save(history);\n\n await queryRunner.commitTransaction();\n\n // [NEW] เก็บค่าไว้ Dispatch หลัง Commit\n eventsToDispatch = evaluation.events;\n updatedContext = context;\n\n this.logger.log(\n `Transition: ${instanceId} [${fromState}] --${action}--> [${toState}] by User:${userId}`\n );\n\n // [NEW] Dispatch Events (Async) ผ่าน WorkflowEventService\n if (eventsToDispatch && eventsToDispatch.length > 0) {\n void this.eventService.dispatchEvents(\n instance.id,\n eventsToDispatch,\n updatedContext\n );\n }\n\n return {\n success: true,\n nextState: toState,\n events: eventsToDispatch,\n isCompleted: instance.status === WorkflowStatus.COMPLETED,\n };\n } catch (err) {\n await queryRunner.rollbackTransaction();\n this.logger.error(\n `Transition Failed for ${instanceId}: ${(err as Error).message}`\n );\n throw err;\n } finally {\n await queryRunner.release();\n }\n }\n\n /**\n * (Utility) Evaluate แบบไม่บันทึกผล (Dry Run) สำหรับ Test หรือ Preview\n */\n async evaluate(dto: EvaluateWorkflowDto): Promise {\n const definition = await this.workflowDefRepo.findOne({\n where: { workflow_code: dto.workflow_code, is_active: true },\n order: { version: 'DESC' },\n });\n\n if (!definition) {\n throw new NotFoundException(`Workflow \"${dto.workflow_code}\" not found`);\n }\n\n return this.dslService.evaluate(\n definition.compiled as unknown as CompiledWorkflow,\n dto.current_state,\n dto.action,\n dto.context || {}\n );\n }\n\n // =================================================================\n // [PART 3] Legacy Support (Backward Compatibility)\n // รักษา Logic เดิมไว้เพื่อให้ Module อื่น (Correspondence/RFA) ทำงานต่อได้\n // =================================================================\n\n /**\n * คำนวณสถานะถัดไปแบบ Linear Sequence (Logic เดิม)\n * @deprecated แนะนำให้เปลี่ยนไปใช้ processTransition แทนเมื่อ Refactor เสร็จ\n */\n processAction(\n currentSequence: number,\n totalSteps: number,\n action: string,\n returnToSequence?: number\n ): TransitionResult {\n const act = action.toUpperCase();\n switch (act) {\n case 'APPROVE':\n case 'ACKNOWLEDGE':\n if (currentSequence >= totalSteps) {\n return {\n nextStepSequence: null,\n shouldUpdateStatus: true,\n documentStatus: 'COMPLETED',\n };\n }\n return {\n nextStepSequence: currentSequence + 1,\n shouldUpdateStatus: false,\n };\n\n case 'REJECT':\n return {\n nextStepSequence: null,\n shouldUpdateStatus: true,\n documentStatus: 'REJECTED',\n };\n\n case 'RETURN': {\n const targetStep = returnToSequence || currentSequence - 1;\n if (targetStep < 1) {\n throw new BadRequestException('Cannot return beyond the first step');\n }\n return {\n nextStepSequence: targetStep,\n shouldUpdateStatus: true,\n documentStatus: 'REVISE_REQUIRED',\n };\n }\n\n default:\n this.logger.warn(\n `Unknown legacy action: ${action}, treating as next step.`\n );\n if (currentSequence >= totalSteps) {\n return {\n nextStepSequence: null,\n shouldUpdateStatus: true,\n documentStatus: 'COMPLETED',\n };\n }\n return {\n nextStepSequence: currentSequence + 1,\n shouldUpdateStatus: false,\n };\n }\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/57/workflowdefinitionentity_57ffa5b8a12b394b6fe52756e53c2027 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/57/workflowdefinitionentity_57ffa5b8a12b394b6fe52756e53c2027 new file mode 100644 index 0000000..32243ec --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/57/workflowdefinitionentity_57ffa5b8a12b394b6fe52756e53c2027 @@ -0,0 +1,76 @@ +a29d09149ab910d378ee6fe2675e46fc +"use strict"; +// File: src/modules/workflow-engine/entities/workflow-definition.entity.ts +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WorkflowDefinition = void 0; +const typeorm_1 = require("typeorm"); +/** + * เก็บแม่แบบ (Blueprint) ของ Workflow + * 1 Workflow Code (เช่น RFA) สามารถมีได้หลาย Version + */ +let WorkflowDefinition = class WorkflowDefinition { +}; +exports.WorkflowDefinition = WorkflowDefinition; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)('uuid'), + __metadata("design:type", String) +], WorkflowDefinition.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ length: 50, comment: 'รหัส Workflow เช่น RFA, CORR, LEAVE_REQ' }), + __metadata("design:type", String) +], WorkflowDefinition.prototype, "workflow_code", void 0); +__decorate([ + (0, typeorm_1.Column)({ + type: 'int', + default: 1, + comment: 'หมายเลข Version (Running sequence)', + }), + __metadata("design:type", Number) +], WorkflowDefinition.prototype, "version", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true, comment: 'คำอธิบายเพิ่มเติม' }), + __metadata("design:type", String) +], WorkflowDefinition.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ + type: 'json', + comment: 'Raw DSL ที่ User/Admin เขียน (เก็บไว้เพื่อดูหรือแก้ไข)', + }), + __metadata("design:type", typeof (_a = typeof Record !== "undefined" && Record) === "function" ? _a : Object) +], WorkflowDefinition.prototype, "dsl", void 0); +__decorate([ + (0, typeorm_1.Column)({ + type: 'json', + comment: 'Compiled JSON Structure ที่ผ่านการ Validate และ Optimize สำหรับ Runtime Engine แล้ว', + }), + __metadata("design:type", typeof (_b = typeof Record !== "undefined" && Record) === "function" ? _b : Object) +], WorkflowDefinition.prototype, "compiled", void 0); +__decorate([ + (0, typeorm_1.Column)({ default: true, comment: 'สถานะการใช้งาน (Soft Disable)' }), + __metadata("design:type", Boolean) +], WorkflowDefinition.prototype, "is_active", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], WorkflowDefinition.prototype, "created_at", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_d = typeof Date !== "undefined" && Date) === "function" ? _d : Object) +], WorkflowDefinition.prototype, "updated_at", void 0); +exports.WorkflowDefinition = WorkflowDefinition = __decorate([ + (0, typeorm_1.Entity)('workflow_definitions'), + (0, typeorm_1.Unique)(['workflow_code', 'version']) // ป้องกัน Version ซ้ำใน Workflow เดียวกัน + , + (0, typeorm_1.Index)(['workflow_code', 'is_active', 'version']) // เพื่อการ Query หา Active Version ล่าสุดได้เร็ว +], WorkflowDefinition); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcd29ya2Zsb3ctZW5naW5lXFxlbnRpdGllc1xcd29ya2Zsb3ctZGVmaW5pdGlvbi5lbnRpdHkudHMiLCJtYXBwaW5ncyI6IjtBQUFBLDJFQUEyRTs7Ozs7Ozs7Ozs7OztBQUUzRSxxQ0FRaUI7QUFFakI7OztHQUdHO0FBSUksSUFBTSxrQkFBa0IsR0FBeEIsTUFBTSxrQkFBa0I7Q0FzQzlCLENBQUE7QUF0Q1ksZ0RBQWtCO0FBRTdCO0lBREMsSUFBQSxnQ0FBc0IsRUFBQyxNQUFNLENBQUM7OzhDQUNuQjtBQUdaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUseUNBQXlDLEVBQUUsQ0FBQzs7eURBQ3BEO0FBT3ZCO0lBTEMsSUFBQSxnQkFBTSxFQUFDO1FBQ04sSUFBSSxFQUFFLEtBQUs7UUFDWCxPQUFPLEVBQUUsQ0FBQztRQUNWLE9BQU8sRUFBRSxvQ0FBb0M7S0FDOUMsQ0FBQzs7bURBQ2U7QUFHakI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLENBQUM7O3VEQUNsRDtBQU1yQjtJQUpDLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSxNQUFNO1FBQ1osT0FBTyxFQUFFLHdEQUF3RDtLQUNsRSxDQUFDO2tEQUNJLE1BQU0sb0JBQU4sTUFBTTsrQ0FBa0I7QUFPOUI7SUFMQyxJQUFBLGdCQUFNLEVBQUM7UUFDTixJQUFJLEVBQUUsTUFBTTtRQUNaLE9BQU8sRUFDTCxxRkFBcUY7S0FDeEYsQ0FBQztrREFDUyxNQUFNLG9CQUFOLE1BQU07b0RBQWtCO0FBR25DO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsQ0FBQzs7cURBQ2hEO0FBR3BCO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDNUIsSUFBSSxvQkFBSixJQUFJO3NEQUFDO0FBR2xCO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDNUIsSUFBSSxvQkFBSixJQUFJO3NEQUFDOzZCQXJDUCxrQkFBa0I7SUFIOUIsSUFBQSxnQkFBTSxFQUFDLHNCQUFzQixDQUFDO0lBQzlCLElBQUEsZ0JBQU0sRUFBQyxDQUFDLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLDBDQUEwQzs7SUFDL0UsSUFBQSxlQUFLLEVBQUMsQ0FBQyxlQUFlLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsaURBQWlEO0dBQ3RGLGtCQUFrQixDQXNDOUIiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcd29ya2Zsb3ctZW5naW5lXFxlbnRpdGllc1xcd29ya2Zsb3ctZGVmaW5pdGlvbi5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRmlsZTogc3JjL21vZHVsZXMvd29ya2Zsb3ctZW5naW5lL2VudGl0aWVzL3dvcmtmbG93LWRlZmluaXRpb24uZW50aXR5LnRzXG5cbmltcG9ydCB7XG4gIENvbHVtbixcbiAgQ3JlYXRlRGF0ZUNvbHVtbixcbiAgRW50aXR5LFxuICBJbmRleCxcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbiAgVW5pcXVlLFxuICBVcGRhdGVEYXRlQ29sdW1uLFxufSBmcm9tICd0eXBlb3JtJztcblxuLyoqXG4gKiDguYDguIHguYfguJrguYHguKHguYjguYHguJrguJogKEJsdWVwcmludCkg4LiC4Lit4LiHIFdvcmtmbG93XG4gKiAxIFdvcmtmbG93IENvZGUgKOC5gOC4iuC5iOC4mSBSRkEpIOC4quC4suC4oeC4suC4o+C4luC4oeC4teC5hOC4lOC5ieC4q+C4peC4suC4oiBWZXJzaW9uXG4gKi9cbkBFbnRpdHkoJ3dvcmtmbG93X2RlZmluaXRpb25zJylcbkBVbmlxdWUoWyd3b3JrZmxvd19jb2RlJywgJ3ZlcnNpb24nXSkgLy8g4Lib4LmJ4Lit4LiH4LiB4Lix4LiZIFZlcnNpb24g4LiL4LmJ4Liz4LmD4LiZIFdvcmtmbG93IOC5gOC4lOC4teC4ouC4p+C4geC4seC4mVxuQEluZGV4KFsnd29ya2Zsb3dfY29kZScsICdpc19hY3RpdmUnLCAndmVyc2lvbiddKSAvLyDguYDguJ7guLfguYjguK3guIHguLLguKMgUXVlcnkg4Lir4LiyIEFjdGl2ZSBWZXJzaW9uIOC4peC5iOC4suC4quC4uOC4lOC5hOC4lOC5ieC5gOC4o+C5h+C4p1xuZXhwb3J0IGNsYXNzIFdvcmtmbG93RGVmaW5pdGlvbiB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKCd1dWlkJylcbiAgaWQhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IGxlbmd0aDogNTAsIGNvbW1lbnQ6ICfguKPguKvguLHguKogV29ya2Zsb3cg4LmA4LiK4LmI4LiZIFJGQSwgQ09SUiwgTEVBVkVfUkVRJyB9KVxuICB3b3JrZmxvd19jb2RlITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oe1xuICAgIHR5cGU6ICdpbnQnLFxuICAgIGRlZmF1bHQ6IDEsXG4gICAgY29tbWVudDogJ+C4q+C4oeC4suC4ouC5gOC4peC4giBWZXJzaW9uIChSdW5uaW5nIHNlcXVlbmNlKScsXG4gIH0pXG4gIHZlcnNpb24hOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUsIGNvbW1lbnQ6ICfguITguLPguK3guJjguLTguJrguLLguKLguYDguJ7guLTguYjguKHguYDguJXguLTguKEnIH0pXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oe1xuICAgIHR5cGU6ICdqc29uJyxcbiAgICBjb21tZW50OiAnUmF3IERTTCDguJfguLXguYggVXNlci9BZG1pbiDguYDguILguLXguKLguJkgKOC5gOC4geC5h+C4muC5hOC4p+C5ieC5gOC4nuC4t+C5iOC4reC4lOC4ueC4q+C4o+C4t+C4reC5geC4geC5ieC5hOC4giknLFxuICB9KVxuICBkc2whOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsgLy8gUmF3V29ya2Zsb3dEU0wgfCBXb3JrZmxvd0RzbFxuXG4gIEBDb2x1bW4oe1xuICAgIHR5cGU6ICdqc29uJyxcbiAgICBjb21tZW50OlxuICAgICAgJ0NvbXBpbGVkIEpTT04gU3RydWN0dXJlIOC4l+C4teC5iOC4nOC5iOC4suC4meC4geC4suC4oyBWYWxpZGF0ZSDguYHguKXguLAgT3B0aW1pemUg4Liq4Liz4Lir4Lij4Lix4LiaIFJ1bnRpbWUgRW5naW5lIOC5geC4peC5ieC4pycsXG4gIH0pXG4gIGNvbXBpbGVkITogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IC8vIENvbXBpbGVkV29ya2Zsb3cgfCBXb3JrZmxvd0RzbFxuXG4gIEBDb2x1bW4oeyBkZWZhdWx0OiB0cnVlLCBjb21tZW50OiAn4Liq4LiW4Liy4LiZ4Liw4LiB4Liy4Lij4LmD4LiK4LmJ4LiH4Liy4LiZIChTb2Z0IERpc2FibGUpJyB9KVxuICBpc19hY3RpdmUhOiBib29sZWFuO1xuXG4gIEBDcmVhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXG4gIGNyZWF0ZWRfYXQhOiBEYXRlO1xuXG4gIEBVcGRhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ3VwZGF0ZWRfYXQnIH0pXG4gIHVwZGF0ZWRfYXQhOiBEYXRlO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/57/workflowdefinitionentity_57ffa5b8a12b394b6fe52756e53c2027.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/57/workflowdefinitionentity_57ffa5b8a12b394b6fe52756e53c2027.map new file mode 100644 index 0000000..5b878a8 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/57/workflowdefinitionentity_57ffa5b8a12b394b6fe52756e53c2027.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\entities\\workflow-definition.entity.ts","mappings":";AAAA,2EAA2E;;;;;;;;;;;;;AAE3E,qCAQiB;AAEjB;;;GAGG;AAII,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;CAsC9B,CAAA;AAtCY,gDAAkB;AAE7B;IADC,IAAA,gCAAsB,EAAC,MAAM,CAAC;;8CACnB;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,yCAAyC,EAAE,CAAC;;yDACpD;AAOvB;IALC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,oCAAoC;KAC9C,CAAC;;mDACe;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;;uDAClD;AAMrB;IAJC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,wDAAwD;KAClE,CAAC;kDACI,MAAM,oBAAN,MAAM;+CAAkB;AAO9B;IALC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,MAAM;QACZ,OAAO,EACL,qFAAqF;KACxF,CAAC;kDACS,MAAM,oBAAN,MAAM;oDAAkB;AAGnC;IADC,IAAA,gBAAM,EAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC;;qDAChD;AAGpB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC5B,IAAI,oBAAJ,IAAI;sDAAC;AAGlB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC5B,IAAI,oBAAJ,IAAI;sDAAC;6BArCP,kBAAkB;IAH9B,IAAA,gBAAM,EAAC,sBAAsB,CAAC;IAC9B,IAAA,gBAAM,EAAC,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC,0CAA0C;;IAC/E,IAAA,eAAK,EAAC,CAAC,eAAe,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,iDAAiD;GACtF,kBAAkB,CAsC9B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\entities\\workflow-definition.entity.ts"],"sourcesContent":["// File: src/modules/workflow-engine/entities/workflow-definition.entity.ts\n\nimport {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n PrimaryGeneratedColumn,\n Unique,\n UpdateDateColumn,\n} from 'typeorm';\n\n/**\n * เก็บแม่แบบ (Blueprint) ของ Workflow\n * 1 Workflow Code (เช่น RFA) สามารถมีได้หลาย Version\n */\n@Entity('workflow_definitions')\n@Unique(['workflow_code', 'version']) // ป้องกัน Version ซ้ำใน Workflow เดียวกัน\n@Index(['workflow_code', 'is_active', 'version']) // เพื่อการ Query หา Active Version ล่าสุดได้เร็ว\nexport class WorkflowDefinition {\n @PrimaryGeneratedColumn('uuid')\n id!: string;\n\n @Column({ length: 50, comment: 'รหัส Workflow เช่น RFA, CORR, LEAVE_REQ' })\n workflow_code!: string;\n\n @Column({\n type: 'int',\n default: 1,\n comment: 'หมายเลข Version (Running sequence)',\n })\n version!: number;\n\n @Column({ type: 'text', nullable: true, comment: 'คำอธิบายเพิ่มเติม' })\n description?: string;\n\n @Column({\n type: 'json',\n comment: 'Raw DSL ที่ User/Admin เขียน (เก็บไว้เพื่อดูหรือแก้ไข)',\n })\n dsl!: Record; // RawWorkflowDSL | WorkflowDsl\n\n @Column({\n type: 'json',\n comment:\n 'Compiled JSON Structure ที่ผ่านการ Validate และ Optimize สำหรับ Runtime Engine แล้ว',\n })\n compiled!: Record; // CompiledWorkflow | WorkflowDsl\n\n @Column({ default: true, comment: 'สถานะการใช้งาน (Soft Disable)' })\n is_active!: boolean;\n\n @CreateDateColumn({ name: 'created_at' })\n created_at!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updated_at!: Date;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5a/documentnumberformatentity_5a3d0de37e7b9f3152a1d411dd0f9d25 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5a/documentnumberformatentity_5a3d0de37e7b9f3152a1d411dd0f9d25 new file mode 100644 index 0000000..54bc251 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5a/documentnumberformatentity_5a3d0de37e7b9f3152a1d411dd0f9d25 @@ -0,0 +1,76 @@ +efefbb2cfce547506292a65a0ff6c4ae +"use strict"; +// backend/src/modules/document-numbering/entities/document-number-format.entity.ts +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DocumentNumberFormat = void 0; +const typeorm_1 = require("typeorm"); +const project_entity_1 = require("../../project/entities/project.entity"); +const correspondence_type_entity_1 = require("../../correspondence/entities/correspondence-type.entity"); +let DocumentNumberFormat = class DocumentNumberFormat { +}; +exports.DocumentNumberFormat = DocumentNumberFormat; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], DocumentNumberFormat.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id' }), + __metadata("design:type", Number) +], DocumentNumberFormat.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'correspondence_type_id', nullable: true }), + __metadata("design:type", Number) +], DocumentNumberFormat.prototype, "correspondenceTypeId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'discipline_id', default: 0 }), + __metadata("design:type", Number) +], DocumentNumberFormat.prototype, "disciplineId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'format_string', length: 100 }), + __metadata("design:type", String) +], DocumentNumberFormat.prototype, "formatTemplate", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'description', nullable: true }), + __metadata("design:type", String) +], DocumentNumberFormat.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'reset_annually', default: true }), + __metadata("design:type", Boolean) +], DocumentNumberFormat.prototype, "resetSequenceYearly", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: 1 }), + __metadata("design:type", Number) +], DocumentNumberFormat.prototype, "isActive", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], DocumentNumberFormat.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], DocumentNumberFormat.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => project_entity_1.Project), + (0, typeorm_1.JoinColumn)({ name: 'project_id' }), + __metadata("design:type", typeof (_c = typeof project_entity_1.Project !== "undefined" && project_entity_1.Project) === "function" ? _c : Object) +], DocumentNumberFormat.prototype, "project", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => correspondence_type_entity_1.CorrespondenceType), + (0, typeorm_1.JoinColumn)({ name: 'correspondence_type_id' }), + __metadata("design:type", typeof (_d = typeof correspondence_type_entity_1.CorrespondenceType !== "undefined" && correspondence_type_entity_1.CorrespondenceType) === "function" ? _d : Object) +], DocumentNumberFormat.prototype, "correspondenceType", void 0); +exports.DocumentNumberFormat = DocumentNumberFormat = __decorate([ + (0, typeorm_1.Entity)('document_number_formats'), + (0, typeorm_1.Unique)(['projectId', 'correspondenceTypeId', 'disciplineId']) +], DocumentNumberFormat); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxlbnRpdGllc1xcZG9jdW1lbnQtbnVtYmVyLWZvcm1hdC5lbnRpdHkudHMiLCJtYXBwaW5ncyI6IjtBQUFBLG1GQUFtRjs7Ozs7Ozs7Ozs7OztBQUVuRixxQ0FTaUI7QUFDakIsMEVBQWdFO0FBQ2hFLHlHQUE4RjtBQUl2RixJQUFNLG9CQUFvQixHQUExQixNQUFNLG9CQUFvQjtDQXdDaEMsQ0FBQTtBQXhDWSxvREFBb0I7QUFFL0I7SUFEQyxJQUFBLGdDQUFzQixHQUFFOztnREFDYjtBQUdaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDOzt1REFDWjtBQUduQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSx3QkFBd0IsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O2tFQUM3QjtBQUc5QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDOzswREFDeEI7QUFHdEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7NERBQ3ZCO0FBR3hCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O3lEQUMzQjtBQUlyQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7O2lFQUNwQjtBQUc5QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDOztzREFDeEI7QUFHbEI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7dURBQUM7QUFHakI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7dURBQUM7QUFLakI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsd0JBQU8sQ0FBQztJQUN4QixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLHdCQUFPLG9CQUFQLHdCQUFPO3FEQUFDO0FBSWxCO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLCtDQUFrQixDQUFDO0lBQ25DLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSx3QkFBd0IsRUFBRSxDQUFDO2tEQUMxQiwrQ0FBa0Isb0JBQWxCLCtDQUFrQjtnRUFBQzsrQkF2QzdCLG9CQUFvQjtJQUZoQyxJQUFBLGdCQUFNLEVBQUMseUJBQXlCLENBQUM7SUFDakMsSUFBQSxnQkFBTSxFQUFDLENBQUMsV0FBVyxFQUFFLHNCQUFzQixFQUFFLGNBQWMsQ0FBQyxDQUFDO0dBQ2pELG9CQUFvQixDQXdDaEMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxlbnRpdGllc1xcZG9jdW1lbnQtbnVtYmVyLWZvcm1hdC5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gYmFja2VuZC9zcmMvbW9kdWxlcy9kb2N1bWVudC1udW1iZXJpbmcvZW50aXRpZXMvZG9jdW1lbnQtbnVtYmVyLWZvcm1hdC5lbnRpdHkudHNcblxuaW1wb3J0IHtcbiAgRW50aXR5LFxuICBDb2x1bW4sXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXG4gIE1hbnlUb09uZSxcbiAgSm9pbkNvbHVtbixcbiAgVW5pcXVlLFxuICBDcmVhdGVEYXRlQ29sdW1uLFxuICBVcGRhdGVEYXRlQ29sdW1uLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0L2VudGl0aWVzL3Byb2plY3QuZW50aXR5JztcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlVHlwZSB9IGZyb20gJy4uLy4uL2NvcnJlc3BvbmRlbmNlL2VudGl0aWVzL2NvcnJlc3BvbmRlbmNlLXR5cGUuZW50aXR5JztcblxuQEVudGl0eSgnZG9jdW1lbnRfbnVtYmVyX2Zvcm1hdHMnKVxuQFVuaXF1ZShbJ3Byb2plY3RJZCcsICdjb3JyZXNwb25kZW5jZVR5cGVJZCcsICdkaXNjaXBsaW5lSWQnXSlcbmV4cG9ydCBjbGFzcyBEb2N1bWVudE51bWJlckZvcm1hdCB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKClcbiAgaWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdwcm9qZWN0X2lkJyB9KVxuICBwcm9qZWN0SWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdjb3JyZXNwb25kZW5jZV90eXBlX2lkJywgbnVsbGFibGU6IHRydWUgfSlcbiAgY29ycmVzcG9uZGVuY2VUeXBlSWQ/OiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdkaXNjaXBsaW5lX2lkJywgZGVmYXVsdDogMCB9KVxuICBkaXNjaXBsaW5lSWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdmb3JtYXRfc3RyaW5nJywgbGVuZ3RoOiAxMDAgfSlcbiAgZm9ybWF0VGVtcGxhdGUhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdkZXNjcmlwdGlvbicsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8vIFtORVddIENvbnRyb2wgeWVhcmx5IHJlc2V0IGJlaGF2aW9yXG4gIEBDb2x1bW4oeyBuYW1lOiAncmVzZXRfYW5udWFsbHknLCBkZWZhdWx0OiB0cnVlIH0pXG4gIHJlc2V0U2VxdWVuY2VZZWFybHkhOiBib29sZWFuO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXNfYWN0aXZlJywgZGVmYXVsdDogMSB9KVxuICBpc0FjdGl2ZSE6IG51bWJlcjtcblxuICBAQ3JlYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICdjcmVhdGVkX2F0JyB9KVxuICBjcmVhdGVkQXQhOiBEYXRlO1xuXG4gIEBVcGRhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ3VwZGF0ZWRfYXQnIH0pXG4gIHVwZGF0ZWRBdCE6IERhdGU7XG5cbiAgLy8gUmVsYXRpb25zXG4gIEBNYW55VG9PbmUoKCkgPT4gUHJvamVjdClcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAncHJvamVjdF9pZCcgfSlcbiAgcHJvamVjdCE6IFByb2plY3Q7XG5cbiAgQE1hbnlUb09uZSgoKSA9PiBDb3JyZXNwb25kZW5jZVR5cGUpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2NvcnJlc3BvbmRlbmNlX3R5cGVfaWQnIH0pXG4gIGNvcnJlc3BvbmRlbmNlVHlwZT86IENvcnJlc3BvbmRlbmNlVHlwZTtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5a/documentnumberformatentity_5a3d0de37e7b9f3152a1d411dd0f9d25.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5a/documentnumberformatentity_5a3d0de37e7b9f3152a1d411dd0f9d25.map new file mode 100644 index 0000000..8f46ad8 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5a/documentnumberformatentity_5a3d0de37e7b9f3152a1d411dd0f9d25.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\entities\\document-number-format.entity.ts","mappings":";AAAA,mFAAmF;;;;;;;;;;;;;AAEnF,qCASiB;AACjB,0EAAgE;AAChE,yGAA8F;AAIvF,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;CAwChC,CAAA;AAxCY,oDAAoB;AAE/B;IADC,IAAA,gCAAsB,GAAE;;gDACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;uDACZ;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kEAC7B;AAG9B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;0DACxB;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;4DACvB;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yDAC3B;AAIrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;iEACpB;AAG9B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;sDACxB;AAGlB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;uDAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;uDAAC;AAKjB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wBAAO,CAAC;IACxB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,wBAAO,oBAAP,wBAAO;qDAAC;AAIlB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,+CAAkB,CAAC;IACnC,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC;kDAC1B,+CAAkB,oBAAlB,+CAAkB;gEAAC;+BAvC7B,oBAAoB;IAFhC,IAAA,gBAAM,EAAC,yBAAyB,CAAC;IACjC,IAAA,gBAAM,EAAC,CAAC,WAAW,EAAE,sBAAsB,EAAE,cAAc,CAAC,CAAC;GACjD,oBAAoB,CAwChC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\entities\\document-number-format.entity.ts"],"sourcesContent":["// backend/src/modules/document-numbering/entities/document-number-format.entity.ts\n\nimport {\n Entity,\n Column,\n PrimaryGeneratedColumn,\n ManyToOne,\n JoinColumn,\n Unique,\n CreateDateColumn,\n UpdateDateColumn,\n} from 'typeorm';\nimport { Project } from '../../project/entities/project.entity';\nimport { CorrespondenceType } from '../../correspondence/entities/correspondence-type.entity';\n\n@Entity('document_number_formats')\n@Unique(['projectId', 'correspondenceTypeId', 'disciplineId'])\nexport class DocumentNumberFormat {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'project_id' })\n projectId!: number;\n\n @Column({ name: 'correspondence_type_id', nullable: true })\n correspondenceTypeId?: number;\n\n @Column({ name: 'discipline_id', default: 0 })\n disciplineId!: number;\n\n @Column({ name: 'format_string', length: 100 })\n formatTemplate!: string;\n\n @Column({ name: 'description', nullable: true })\n description?: string;\n\n // [NEW] Control yearly reset behavior\n @Column({ name: 'reset_annually', default: true })\n resetSequenceYearly!: boolean;\n\n @Column({ name: 'is_active', default: 1 })\n isActive!: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n // Relations\n @ManyToOne(() => Project)\n @JoinColumn({ name: 'project_id' })\n project!: Project;\n\n @ManyToOne(() => CorrespondenceType)\n @JoinColumn({ name: 'correspondence_type_id' })\n correspondenceType?: CorrespondenceType;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5a/migrationcontroller_5a5c2f21e7047c054c5007b586de9f9d b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5a/migrationcontroller_5a5c2f21e7047c054c5007b586de9f9d new file mode 100644 index 0000000..b3af476 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5a/migrationcontroller_5a5c2f21e7047c054c5007b586de9f9d @@ -0,0 +1,207 @@ +2f43d7b4178ccfbe2e738f0bc828ca41 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MigrationController = void 0; +const common_1 = require("@nestjs/common"); +const migration_service_1 = require("./migration.service"); +const import_correspondence_dto_1 = require("./dto/import-correspondence.dto"); +const enqueue_migration_dto_1 = require("./dto/enqueue-migration.dto"); +const commit_batch_dto_1 = require("./dto/commit-batch.dto"); +const create_migration_error_dto_1 = require("./dto/create-migration-error.dto"); +const jwt_auth_guard_1 = require("../../common/guards/jwt-auth.guard"); +const current_user_decorator_1 = require("../../common/decorators/current-user.decorator"); +const user_entity_1 = require("../user/entities/user.entity"); +const swagger_1 = require("@nestjs/swagger"); +const migration_queue_query_dto_1 = require("./dto/migration-queue-query.dto"); +let MigrationController = class MigrationController { + constructor(migrationService) { + this.migrationService = migrationService; + } + async importCorrespondence(dto, idempotencyKey, user) { + const userId = user?.user_id || 5; + return this.migrationService.importCorrespondence(dto, idempotencyKey, userId); + } + async commitBatch(dto, idempotencyKey, user) { + const userId = user?.user_id || 5; + return this.migrationService.commitBatch(dto, idempotencyKey, userId); + } + async enqueueRecord(dto) { + return this.migrationService.enqueueRecord(dto); + } + async getReviewQueue(query) { + return this.migrationService.getReviewQueue(query); + } + async getQueueItemById(id) { + return this.migrationService.getQueueItemById(id); + } + async createError(dto) { + return this.migrationService.createError(dto); + } + async getErrors(page, limit) { + return this.migrationService.getErrors(page, limit); + } + async approveQueueItem(id, dto, idempotencyKey, user) { + const userId = user?.user_id || 5; + return this.migrationService.approveQueueItem(id, dto, idempotencyKey, userId); + } + async rejectQueueItem(id, user) { + const userId = user?.user_id || 5; + return this.migrationService.rejectQueueItem(id, userId); + } + getStagingFile(filePath, res) { + const stream = this.migrationService.getStagingFileStream(filePath); + res.set({ + 'Content-Type': 'application/pdf', + 'Content-Disposition': 'inline; filename="document.pdf"', + }); + stream.pipe(res); + } +}; +exports.MigrationController = MigrationController; +__decorate([ + (0, common_1.Post)('import'), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, swagger_1.ApiOperation)({ + summary: 'Import generic legacy correspondence record via n8n integration', + }), + (0, swagger_1.ApiHeader)({ + name: 'Idempotency-Key', + description: 'Unique key per document and batch to prevent duplicate inserts', + required: true, + }), + __param(0, (0, common_1.Body)()), + __param(1, (0, common_1.Headers)('idempotency-key')), + __param(2, (0, current_user_decorator_1.CurrentUser)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_b = typeof import_correspondence_dto_1.ImportCorrespondenceDto !== "undefined" && import_correspondence_dto_1.ImportCorrespondenceDto) === "function" ? _b : Object, String, typeof (_c = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _c : Object]), + __metadata("design:returntype", Promise) +], MigrationController.prototype, "importCorrespondence", null); +__decorate([ + (0, common_1.Post)('commit_batch'), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, swagger_1.ApiOperation)({ + summary: 'Batch approve and import migration review queue items', + }), + (0, swagger_1.ApiHeader)({ + name: 'Idempotency-Key', + description: 'Unique key for the entire batch to prevent duplicate execution', + required: true, + }), + __param(0, (0, common_1.Body)()), + __param(1, (0, common_1.Headers)('idempotency-key')), + __param(2, (0, current_user_decorator_1.CurrentUser)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_d = typeof commit_batch_dto_1.CommitBatchDto !== "undefined" && commit_batch_dto_1.CommitBatchDto) === "function" ? _d : Object, String, typeof (_e = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _e : Object]), + __metadata("design:returntype", Promise) +], MigrationController.prototype, "commitBatch", null); +__decorate([ + (0, common_1.Post)('queue'), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, swagger_1.ApiOperation)({ + summary: 'Enqueue a record into the staging migration review queue', + }), + __param(0, (0, common_1.Body)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_f = typeof enqueue_migration_dto_1.EnqueueMigrationDto !== "undefined" && enqueue_migration_dto_1.EnqueueMigrationDto) === "function" ? _f : Object]), + __metadata("design:returntype", Promise) +], MigrationController.prototype, "enqueueRecord", null); +__decorate([ + (0, common_1.Get)('queue'), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, swagger_1.ApiOperation)({ summary: 'Get migration review queue' }), + __param(0, (0, common_1.Query)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_g = typeof migration_queue_query_dto_1.MigrationQueueQueryDto !== "undefined" && migration_queue_query_dto_1.MigrationQueueQueryDto) === "function" ? _g : Object]), + __metadata("design:returntype", Promise) +], MigrationController.prototype, "getReviewQueue", null); +__decorate([ + (0, common_1.Get)('queue/:id'), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, swagger_1.ApiOperation)({ summary: 'Get a specific queue item by ID' }), + (0, swagger_1.ApiParam)({ name: 'id', type: Number }), + __param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Number]), + __metadata("design:returntype", Promise) +], MigrationController.prototype, "getQueueItemById", null); +__decorate([ + (0, common_1.Post)('errors'), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, swagger_1.ApiOperation)({ summary: 'Log a migration error from n8n workflow' }), + __param(0, (0, common_1.Body)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_h = typeof create_migration_error_dto_1.CreateMigrationErrorDto !== "undefined" && create_migration_error_dto_1.CreateMigrationErrorDto) === "function" ? _h : Object]), + __metadata("design:returntype", Promise) +], MigrationController.prototype, "createError", null); +__decorate([ + (0, common_1.Get)('errors'), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, swagger_1.ApiOperation)({ summary: 'Get migration errors' }), + (0, swagger_1.ApiQuery)({ name: 'page', required: false, type: Number }), + (0, swagger_1.ApiQuery)({ name: 'limit', required: false, type: Number }), + __param(0, (0, common_1.Query)('page')), + __param(1, (0, common_1.Query)('limit')), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Number, Number]), + __metadata("design:returntype", Promise) +], MigrationController.prototype, "getErrors", null); +__decorate([ + (0, common_1.Post)('queue/:id/approve'), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, swagger_1.ApiOperation)({ summary: 'Approve and import a queued migration item' }), + (0, swagger_1.ApiParam)({ name: 'id', type: Number }), + (0, swagger_1.ApiHeader)({ + name: 'Idempotency-Key', + description: 'Unique key per document and batch to prevent duplicate inserts', + required: true, + }), + __param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)), + __param(1, (0, common_1.Body)()), + __param(2, (0, common_1.Headers)('idempotency-key')), + __param(3, (0, current_user_decorator_1.CurrentUser)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Number, typeof (_j = typeof import_correspondence_dto_1.ImportCorrespondenceDto !== "undefined" && import_correspondence_dto_1.ImportCorrespondenceDto) === "function" ? _j : Object, String, typeof (_k = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _k : Object]), + __metadata("design:returntype", Promise) +], MigrationController.prototype, "approveQueueItem", null); +__decorate([ + (0, common_1.Post)('queue/:id/reject'), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, swagger_1.ApiOperation)({ summary: 'Reject a queued migration item' }), + (0, swagger_1.ApiParam)({ name: 'id', type: Number }), + __param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)), + __param(1, (0, current_user_decorator_1.CurrentUser)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Number, typeof (_l = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _l : Object]), + __metadata("design:returntype", Promise) +], MigrationController.prototype, "rejectQueueItem", null); +__decorate([ + (0, common_1.Get)('staging-file'), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + (0, swagger_1.ApiOperation)({ summary: 'Stream a file from staging' }), + (0, swagger_1.ApiQuery)({ name: 'path', required: true, type: String }), + __param(0, (0, common_1.Query)('path')), + __param(1, (0, common_1.Res)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, Object]), + __metadata("design:returntype", void 0) +], MigrationController.prototype, "getStagingFile", null); +exports.MigrationController = MigrationController = __decorate([ + (0, swagger_1.ApiTags)('Migration'), + (0, swagger_1.ApiBearerAuth)(), + (0, common_1.Controller)('migration'), + __metadata("design:paramtypes", [typeof (_a = typeof migration_service_1.MigrationService !== "undefined" && migration_service_1.MigrationService) === "function" ? _a : Object]) +], MigrationController); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxtaWdyYXRpb24uY29udHJvbGxlci50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBV3dCO0FBQ3hCLDJEQUF1RDtBQUN2RCwrRUFBMEU7QUFDMUUsdUVBQWtFO0FBQ2xFLDZEQUF3RDtBQUN4RCxpRkFBMkU7QUFDM0UsdUVBQWtFO0FBQ2xFLDJGQUE2RTtBQUM3RSw4REFBb0Q7QUFDcEQsNkNBT3lCO0FBQ3pCLCtFQUF5RTtBQU1sRSxJQUFNLG1CQUFtQixHQUF6QixNQUFNLG1CQUFtQjtJQUM5QixZQUE2QixnQkFBa0M7UUFBbEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtJQUFHLENBQUM7SUFhN0QsQUFBTixLQUFLLENBQUMsb0JBQW9CLENBQ2hCLEdBQTRCLEVBQ1IsY0FBc0IsRUFDbkMsSUFBVTtRQUV6QixNQUFNLE1BQU0sR0FBRyxJQUFJLEVBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FDL0MsR0FBRyxFQUNILGNBQWMsRUFDZCxNQUFNLENBQ1AsQ0FBQztJQUNKLENBQUM7SUFhSyxBQUFOLEtBQUssQ0FBQyxXQUFXLENBQ1AsR0FBbUIsRUFDQyxjQUFzQixFQUNuQyxJQUFVO1FBRXpCLE1BQU0sTUFBTSxHQUFHLElBQUksRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFPSyxBQUFOLEtBQUssQ0FBQyxhQUFhLENBQVMsR0FBd0I7UUFDbEQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFLSyxBQUFOLEtBQUssQ0FBQyxjQUFjLENBQVUsS0FBNkI7UUFD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QUN4QixJQUFBLGtCQUFTLEVBQUMsNkJBQVksQ0FBQztJQUN2QixJQUFBLHNCQUFZLEVBQUMsRUFBRSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsQ0FBQztJQUMzRCxJQUFBLGtCQUFRLEVBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUVwQyxXQUFBLElBQUEsY0FBSyxFQUFDLElBQUksRUFBRSxxQkFBWSxDQUFDLENBQUE7SUFDekIsV0FBQSxJQUFBLG9DQUFXLEdBQUUsQ0FBQTs7aUVBQU8sa0JBQUksb0JBQUosa0JBQUk7OzBEQUkxQjtBQU1EO0lBSkMsSUFBQSxZQUFHLEVBQUMsY0FBYyxDQUFDO0lBQ25CLElBQUEsa0JBQVMsRUFBQyw2QkFBWSxDQUFDO0lBQ3ZCLElBQUEsc0JBQVksRUFBQyxFQUFFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxDQUFDO0lBQ3ZELElBQUEsa0JBQVEsRUFBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDekMsV0FBQSxJQUFBLGNBQUssRUFBQyxNQUFNLENBQUMsQ0FBQTtJQUFvQixXQUFBLElBQUEsWUFBRyxHQUFFLENBQUE7Ozs7eURBT3JEOzhCQTFJVSxtQkFBbUI7SUFIL0IsSUFBQSxpQkFBTyxFQUFDLFdBQVcsQ0FBQztJQUNwQixJQUFBLHVCQUFhLEdBQUU7SUFDZixJQUFBLG1CQUFVLEVBQUMsV0FBVyxDQUFDO3lEQUV5QixvQ0FBZ0Isb0JBQWhCLG9DQUFnQjtHQURwRCxtQkFBbUIsQ0EySS9CIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXG1pZ3JhdGlvblxcbWlncmF0aW9uLmNvbnRyb2xsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29udHJvbGxlcixcbiAgUG9zdCxcbiAgQm9keSxcbiAgSGVhZGVycyxcbiAgVXNlR3VhcmRzLFxuICBHZXQsXG4gIFBhcmFtLFxuICBRdWVyeSxcbiAgUmVzLFxuICBQYXJzZUludFBpcGUsXG59IGZyb20gJ0BuZXN0anMvY29tbW9uJztcbmltcG9ydCB7IE1pZ3JhdGlvblNlcnZpY2UgfSBmcm9tICcuL21pZ3JhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEltcG9ydENvcnJlc3BvbmRlbmNlRHRvIH0gZnJvbSAnLi9kdG8vaW1wb3J0LWNvcnJlc3BvbmRlbmNlLmR0byc7XG5pbXBvcnQgeyBFbnF1ZXVlTWlncmF0aW9uRHRvIH0gZnJvbSAnLi9kdG8vZW5xdWV1ZS1taWdyYXRpb24uZHRvJztcbmltcG9ydCB7IENvbW1pdEJhdGNoRHRvIH0gZnJvbSAnLi9kdG8vY29tbWl0LWJhdGNoLmR0byc7XG5pbXBvcnQgeyBDcmVhdGVNaWdyYXRpb25FcnJvckR0byB9IGZyb20gJy4vZHRvL2NyZWF0ZS1taWdyYXRpb24tZXJyb3IuZHRvJztcbmltcG9ydCB7IEp3dEF1dGhHdWFyZCB9IGZyb20gJy4uLy4uL2NvbW1vbi9ndWFyZHMvand0LWF1dGguZ3VhcmQnO1xuaW1wb3J0IHsgQ3VycmVudFVzZXIgfSBmcm9tICcuLi8uLi9jb21tb24vZGVjb3JhdG9ycy9jdXJyZW50LXVzZXIuZGVjb3JhdG9yJztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi91c2VyL2VudGl0aWVzL3VzZXIuZW50aXR5JztcbmltcG9ydCB7XG4gIEFwaVRhZ3MsXG4gIEFwaU9wZXJhdGlvbixcbiAgQXBpQmVhcmVyQXV0aCxcbiAgQXBpSGVhZGVyLFxuICBBcGlRdWVyeSxcbiAgQXBpUGFyYW0sXG59IGZyb20gJ0BuZXN0anMvc3dhZ2dlcic7XG5pbXBvcnQgeyBNaWdyYXRpb25RdWV1ZVF1ZXJ5RHRvIH0gZnJvbSAnLi9kdG8vbWlncmF0aW9uLXF1ZXVlLXF1ZXJ5LmR0byc7XG5pbXBvcnQgdHlwZSB7IFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcyc7XG5cbkBBcGlUYWdzKCdNaWdyYXRpb24nKVxuQEFwaUJlYXJlckF1dGgoKVxuQENvbnRyb2xsZXIoJ21pZ3JhdGlvbicpXG5leHBvcnQgY2xhc3MgTWlncmF0aW9uQ29udHJvbGxlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbWlncmF0aW9uU2VydmljZTogTWlncmF0aW9uU2VydmljZSkge31cblxuICBAUG9zdCgnaW1wb3J0JylcbiAgQFVzZUd1YXJkcyhKd3RBdXRoR3VhcmQpXG4gIEBBcGlPcGVyYXRpb24oe1xuICAgIHN1bW1hcnk6ICdJbXBvcnQgZ2VuZXJpYyBsZWdhY3kgY29ycmVzcG9uZGVuY2UgcmVjb3JkIHZpYSBuOG4gaW50ZWdyYXRpb24nLFxuICB9KVxuICBAQXBpSGVhZGVyKHtcbiAgICBuYW1lOiAnSWRlbXBvdGVuY3ktS2V5JyxcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdVbmlxdWUga2V5IHBlciBkb2N1bWVudCBhbmQgYmF0Y2ggdG8gcHJldmVudCBkdXBsaWNhdGUgaW5zZXJ0cycsXG4gICAgcmVxdWlyZWQ6IHRydWUsXG4gIH0pXG4gIGFzeW5jIGltcG9ydENvcnJlc3BvbmRlbmNlKFxuICAgIEBCb2R5KCkgZHRvOiBJbXBvcnRDb3JyZXNwb25kZW5jZUR0byxcbiAgICBASGVhZGVycygnaWRlbXBvdGVuY3kta2V5JykgaWRlbXBvdGVuY3lLZXk6IHN0cmluZyxcbiAgICBAQ3VycmVudFVzZXIoKSB1c2VyOiBVc2VyXG4gICkge1xuICAgIGNvbnN0IHVzZXJJZCA9IHVzZXI/LnVzZXJfaWQgfHwgNTtcbiAgICByZXR1cm4gdGhpcy5taWdyYXRpb25TZXJ2aWNlLmltcG9ydENvcnJlc3BvbmRlbmNlKFxuICAgICAgZHRvLFxuICAgICAgaWRlbXBvdGVuY3lLZXksXG4gICAgICB1c2VySWRcbiAgICApO1xuICB9XG5cbiAgQFBvc3QoJ2NvbW1pdF9iYXRjaCcpXG4gIEBVc2VHdWFyZHMoSnd0QXV0aEd1YXJkKVxuICBAQXBpT3BlcmF0aW9uKHtcbiAgICBzdW1tYXJ5OiAnQmF0Y2ggYXBwcm92ZSBhbmQgaW1wb3J0IG1pZ3JhdGlvbiByZXZpZXcgcXVldWUgaXRlbXMnLFxuICB9KVxuICBAQXBpSGVhZGVyKHtcbiAgICBuYW1lOiAnSWRlbXBvdGVuY3ktS2V5JyxcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdVbmlxdWUga2V5IGZvciB0aGUgZW50aXJlIGJhdGNoIHRvIHByZXZlbnQgZHVwbGljYXRlIGV4ZWN1dGlvbicsXG4gICAgcmVxdWlyZWQ6IHRydWUsXG4gIH0pXG4gIGFzeW5jIGNvbW1pdEJhdGNoKFxuICAgIEBCb2R5KCkgZHRvOiBDb21taXRCYXRjaER0byxcbiAgICBASGVhZGVycygnaWRlbXBvdGVuY3kta2V5JykgaWRlbXBvdGVuY3lLZXk6IHN0cmluZyxcbiAgICBAQ3VycmVudFVzZXIoKSB1c2VyOiBVc2VyXG4gICkge1xuICAgIGNvbnN0IHVzZXJJZCA9IHVzZXI/LnVzZXJfaWQgfHwgNTtcbiAgICByZXR1cm4gdGhpcy5taWdyYXRpb25TZXJ2aWNlLmNvbW1pdEJhdGNoKGR0bywgaWRlbXBvdGVuY3lLZXksIHVzZXJJZCk7XG4gIH1cblxuICBAUG9zdCgncXVldWUnKVxuICBAVXNlR3VhcmRzKEp3dEF1dGhHdWFyZClcbiAgQEFwaU9wZXJhdGlvbih7XG4gICAgc3VtbWFyeTogJ0VucXVldWUgYSByZWNvcmQgaW50byB0aGUgc3RhZ2luZyBtaWdyYXRpb24gcmV2aWV3IHF1ZXVlJyxcbiAgfSlcbiAgYXN5bmMgZW5xdWV1ZVJlY29yZChAQm9keSgpIGR0bzogRW5xdWV1ZU1pZ3JhdGlvbkR0bykge1xuICAgIHJldHVybiB0aGlzLm1pZ3JhdGlvblNlcnZpY2UuZW5xdWV1ZVJlY29yZChkdG8pO1xuICB9XG5cbiAgQEdldCgncXVldWUnKVxuICBAVXNlR3VhcmRzKEp3dEF1dGhHdWFyZClcbiAgQEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6ICdHZXQgbWlncmF0aW9uIHJldmlldyBxdWV1ZScgfSlcbiAgYXN5bmMgZ2V0UmV2aWV3UXVldWUoQFF1ZXJ5KCkgcXVlcnk6IE1pZ3JhdGlvblF1ZXVlUXVlcnlEdG8pIHtcbiAgICByZXR1cm4gdGhpcy5taWdyYXRpb25TZXJ2aWNlLmdldFJldmlld1F1ZXVlKHF1ZXJ5KTtcbiAgfVxuXG4gIEBHZXQoJ3F1ZXVlLzppZCcpXG4gIEBVc2VHdWFyZHMoSnd0QXV0aEd1YXJkKVxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ0dldCBhIHNwZWNpZmljIHF1ZXVlIGl0ZW0gYnkgSUQnIH0pXG4gIEBBcGlQYXJhbSh7IG5hbWU6ICdpZCcsIHR5cGU6IE51bWJlciB9KVxuICBhc3luYyBnZXRRdWV1ZUl0ZW1CeUlkKEBQYXJhbSgnaWQnLCBQYXJzZUludFBpcGUpIGlkOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5taWdyYXRpb25TZXJ2aWNlLmdldFF1ZXVlSXRlbUJ5SWQoaWQpO1xuICB9XG5cbiAgQFBvc3QoJ2Vycm9ycycpXG4gIEBVc2VHdWFyZHMoSnd0QXV0aEd1YXJkKVxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ0xvZyBhIG1pZ3JhdGlvbiBlcnJvciBmcm9tIG44biB3b3JrZmxvdycgfSlcbiAgYXN5bmMgY3JlYXRlRXJyb3IoQEJvZHkoKSBkdG86IENyZWF0ZU1pZ3JhdGlvbkVycm9yRHRvKSB7XG4gICAgcmV0dXJuIHRoaXMubWlncmF0aW9uU2VydmljZS5jcmVhdGVFcnJvcihkdG8pO1xuICB9XG5cbiAgQEdldCgnZXJyb3JzJylcbiAgQFVzZUd1YXJkcyhKd3RBdXRoR3VhcmQpXG4gIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiAnR2V0IG1pZ3JhdGlvbiBlcnJvcnMnIH0pXG4gIEBBcGlRdWVyeSh7IG5hbWU6ICdwYWdlJywgcmVxdWlyZWQ6IGZhbHNlLCB0eXBlOiBOdW1iZXIgfSlcbiAgQEFwaVF1ZXJ5KHsgbmFtZTogJ2xpbWl0JywgcmVxdWlyZWQ6IGZhbHNlLCB0eXBlOiBOdW1iZXIgfSlcbiAgYXN5bmMgZ2V0RXJyb3JzKFxuICAgIEBRdWVyeSgncGFnZScpIHBhZ2U/OiBudW1iZXIsXG4gICAgQFF1ZXJ5KCdsaW1pdCcpIGxpbWl0PzogbnVtYmVyXG4gICkge1xuICAgIHJldHVybiB0aGlzLm1pZ3JhdGlvblNlcnZpY2UuZ2V0RXJyb3JzKHBhZ2UsIGxpbWl0KTtcbiAgfVxuXG4gIEBQb3N0KCdxdWV1ZS86aWQvYXBwcm92ZScpXG4gIEBVc2VHdWFyZHMoSnd0QXV0aEd1YXJkKVxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ0FwcHJvdmUgYW5kIGltcG9ydCBhIHF1ZXVlZCBtaWdyYXRpb24gaXRlbScgfSlcbiAgQEFwaVBhcmFtKHsgbmFtZTogJ2lkJywgdHlwZTogTnVtYmVyIH0pXG4gIEBBcGlIZWFkZXIoe1xuICAgIG5hbWU6ICdJZGVtcG90ZW5jeS1LZXknLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1VuaXF1ZSBrZXkgcGVyIGRvY3VtZW50IGFuZCBiYXRjaCB0byBwcmV2ZW50IGR1cGxpY2F0ZSBpbnNlcnRzJyxcbiAgICByZXF1aXJlZDogdHJ1ZSxcbiAgfSlcbiAgYXN5bmMgYXBwcm92ZVF1ZXVlSXRlbShcbiAgICBAUGFyYW0oJ2lkJywgUGFyc2VJbnRQaXBlKSBpZDogbnVtYmVyLFxuICAgIEBCb2R5KCkgZHRvOiBJbXBvcnRDb3JyZXNwb25kZW5jZUR0byxcbiAgICBASGVhZGVycygnaWRlbXBvdGVuY3kta2V5JykgaWRlbXBvdGVuY3lLZXk6IHN0cmluZyxcbiAgICBAQ3VycmVudFVzZXIoKSB1c2VyOiBVc2VyXG4gICkge1xuICAgIGNvbnN0IHVzZXJJZCA9IHVzZXI/LnVzZXJfaWQgfHwgNTtcbiAgICByZXR1cm4gdGhpcy5taWdyYXRpb25TZXJ2aWNlLmFwcHJvdmVRdWV1ZUl0ZW0oXG4gICAgICBpZCxcbiAgICAgIGR0byxcbiAgICAgIGlkZW1wb3RlbmN5S2V5LFxuICAgICAgdXNlcklkXG4gICAgKTtcbiAgfVxuXG4gIEBQb3N0KCdxdWV1ZS86aWQvcmVqZWN0JylcbiAgQFVzZUd1YXJkcyhKd3RBdXRoR3VhcmQpXG4gIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiAnUmVqZWN0IGEgcXVldWVkIG1pZ3JhdGlvbiBpdGVtJyB9KVxuICBAQXBpUGFyYW0oeyBuYW1lOiAnaWQnLCB0eXBlOiBOdW1iZXIgfSlcbiAgYXN5bmMgcmVqZWN0UXVldWVJdGVtKFxuICAgIEBQYXJhbSgnaWQnLCBQYXJzZUludFBpcGUpIGlkOiBudW1iZXIsXG4gICAgQEN1cnJlbnRVc2VyKCkgdXNlcjogVXNlclxuICApIHtcbiAgICBjb25zdCB1c2VySWQgPSB1c2VyPy51c2VyX2lkIHx8IDU7XG4gICAgcmV0dXJuIHRoaXMubWlncmF0aW9uU2VydmljZS5yZWplY3RRdWV1ZUl0ZW0oaWQsIHVzZXJJZCk7XG4gIH1cblxuICBAR2V0KCdzdGFnaW5nLWZpbGUnKVxuICBAVXNlR3VhcmRzKEp3dEF1dGhHdWFyZClcbiAgQEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6ICdTdHJlYW0gYSBmaWxlIGZyb20gc3RhZ2luZycgfSlcbiAgQEFwaVF1ZXJ5KHsgbmFtZTogJ3BhdGgnLCByZXF1aXJlZDogdHJ1ZSwgdHlwZTogU3RyaW5nIH0pXG4gIGdldFN0YWdpbmdGaWxlKEBRdWVyeSgncGF0aCcpIGZpbGVQYXRoOiBzdHJpbmcsIEBSZXMoKSByZXM6IFJlc3BvbnNlKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5taWdyYXRpb25TZXJ2aWNlLmdldFN0YWdpbmdGaWxlU3RyZWFtKGZpbGVQYXRoKTtcbiAgICByZXMuc2V0KHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vcGRmJyxcbiAgICAgICdDb250ZW50LURpc3Bvc2l0aW9uJzogJ2lubGluZTsgZmlsZW5hbWU9XCJkb2N1bWVudC5wZGZcIicsXG4gICAgfSk7XG4gICAgc3RyZWFtLnBpcGUocmVzKTtcbiAgfVxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5a/migrationcontroller_5a5c2f21e7047c054c5007b586de9f9d.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5a/migrationcontroller_5a5c2f21e7047c054c5007b586de9f9d.map new file mode 100644 index 0000000..06a2eb9 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5a/migrationcontroller_5a5c2f21e7047c054c5007b586de9f9d.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\migration.controller.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\migration.controller.ts"],"sourcesContent":["import {\n Controller,\n Post,\n Body,\n Headers,\n UseGuards,\n Get,\n Param,\n Query,\n Res,\n ParseIntPipe,\n} from '@nestjs/common';\nimport { MigrationService } from './migration.service';\nimport { ImportCorrespondenceDto } from './dto/import-correspondence.dto';\nimport { EnqueueMigrationDto } from './dto/enqueue-migration.dto';\nimport { CommitBatchDto } from './dto/commit-batch.dto';\nimport { CreateMigrationErrorDto } from './dto/create-migration-error.dto';\nimport { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';\nimport { CurrentUser } from '../../common/decorators/current-user.decorator';\nimport { User } from '../user/entities/user.entity';\nimport {\n ApiTags,\n ApiOperation,\n ApiBearerAuth,\n ApiHeader,\n ApiQuery,\n ApiParam,\n} from '@nestjs/swagger';\nimport { MigrationQueueQueryDto } from './dto/migration-queue-query.dto';\nimport type { Response } from 'express';\n\n@ApiTags('Migration')\n@ApiBearerAuth()\n@Controller('migration')\nexport class MigrationController {\n constructor(private readonly migrationService: MigrationService) {}\n\n @Post('import')\n @UseGuards(JwtAuthGuard)\n @ApiOperation({\n summary: 'Import generic legacy correspondence record via n8n integration',\n })\n @ApiHeader({\n name: 'Idempotency-Key',\n description:\n 'Unique key per document and batch to prevent duplicate inserts',\n required: true,\n })\n async importCorrespondence(\n @Body() dto: ImportCorrespondenceDto,\n @Headers('idempotency-key') idempotencyKey: string,\n @CurrentUser() user: User\n ) {\n const userId = user?.user_id || 5;\n return this.migrationService.importCorrespondence(\n dto,\n idempotencyKey,\n userId\n );\n }\n\n @Post('commit_batch')\n @UseGuards(JwtAuthGuard)\n @ApiOperation({\n summary: 'Batch approve and import migration review queue items',\n })\n @ApiHeader({\n name: 'Idempotency-Key',\n description:\n 'Unique key for the entire batch to prevent duplicate execution',\n required: true,\n })\n async commitBatch(\n @Body() dto: CommitBatchDto,\n @Headers('idempotency-key') idempotencyKey: string,\n @CurrentUser() user: User\n ) {\n const userId = user?.user_id || 5;\n return this.migrationService.commitBatch(dto, idempotencyKey, userId);\n }\n\n @Post('queue')\n @UseGuards(JwtAuthGuard)\n @ApiOperation({\n summary: 'Enqueue a record into the staging migration review queue',\n })\n async enqueueRecord(@Body() dto: EnqueueMigrationDto) {\n return this.migrationService.enqueueRecord(dto);\n }\n\n @Get('queue')\n @UseGuards(JwtAuthGuard)\n @ApiOperation({ summary: 'Get migration review queue' })\n async getReviewQueue(@Query() query: MigrationQueueQueryDto) {\n return this.migrationService.getReviewQueue(query);\n }\n\n @Get('queue/:id')\n @UseGuards(JwtAuthGuard)\n @ApiOperation({ summary: 'Get a specific queue item by ID' })\n @ApiParam({ name: 'id', type: Number })\n async getQueueItemById(@Param('id', ParseIntPipe) id: number) {\n return this.migrationService.getQueueItemById(id);\n }\n\n @Post('errors')\n @UseGuards(JwtAuthGuard)\n @ApiOperation({ summary: 'Log a migration error from n8n workflow' })\n async createError(@Body() dto: CreateMigrationErrorDto) {\n return this.migrationService.createError(dto);\n }\n\n @Get('errors')\n @UseGuards(JwtAuthGuard)\n @ApiOperation({ summary: 'Get migration errors' })\n @ApiQuery({ name: 'page', required: false, type: Number })\n @ApiQuery({ name: 'limit', required: false, type: Number })\n async getErrors(\n @Query('page') page?: number,\n @Query('limit') limit?: number\n ) {\n return this.migrationService.getErrors(page, limit);\n }\n\n @Post('queue/:id/approve')\n @UseGuards(JwtAuthGuard)\n @ApiOperation({ summary: 'Approve and import a queued migration item' })\n @ApiParam({ name: 'id', type: Number })\n @ApiHeader({\n name: 'Idempotency-Key',\n description:\n 'Unique key per document and batch to prevent duplicate inserts',\n required: true,\n })\n async approveQueueItem(\n @Param('id', ParseIntPipe) id: number,\n @Body() dto: ImportCorrespondenceDto,\n @Headers('idempotency-key') idempotencyKey: string,\n @CurrentUser() user: User\n ) {\n const userId = user?.user_id || 5;\n return this.migrationService.approveQueueItem(\n id,\n dto,\n idempotencyKey,\n userId\n );\n }\n\n @Post('queue/:id/reject')\n @UseGuards(JwtAuthGuard)\n @ApiOperation({ summary: 'Reject a queued migration item' })\n @ApiParam({ name: 'id', type: Number })\n async rejectQueueItem(\n @Param('id', ParseIntPipe) id: number,\n @CurrentUser() user: User\n ) {\n const userId = user?.user_id || 5;\n return this.migrationService.rejectQueueItem(id, userId);\n }\n\n @Get('staging-file')\n @UseGuards(JwtAuthGuard)\n @ApiOperation({ summary: 'Stream a file from staging' })\n @ApiQuery({ name: 'path', required: true, type: String })\n getStagingFile(@Query('path') filePath: string, @Res() res: Response) {\n const stream = this.migrationService.getStagingFileStream(filePath);\n res.set({\n 'Content-Type': 'application/pdf',\n 'Content-Disposition': 'inline; filename=\"document.pdf\"',\n });\n stream.pipe(res);\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5a/migrationservicespec_5a537f9973f4abc7efd76426c2858a1b b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5a/migrationservicespec_5a537f9973f4abc7efd76426c2858a1b new file mode 100644 index 0000000..ecd48ea --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5a/migrationservicespec_5a537f9973f4abc7efd76426c2858a1b @@ -0,0 +1,92 @@ +81d3937f1ee1628acef873c64c726bd8 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const testing_1 = require("@nestjs/testing"); +const migration_service_1 = require("./migration.service"); +const typeorm_1 = require("@nestjs/typeorm"); +const import_transaction_entity_1 = require("./entities/import-transaction.entity"); +const correspondence_type_entity_1 = require("../correspondence/entities/correspondence-type.entity"); +const correspondence_status_entity_1 = require("../correspondence/entities/correspondence-status.entity"); +const project_entity_1 = require("../project/entities/project.entity"); +const typeorm_2 = require("typeorm"); +const migration_review_queue_entity_1 = require("./entities/migration-review-queue.entity"); +const migration_error_entity_1 = require("./entities/migration-error.entity"); +const file_storage_service_1 = require("../../common/file-storage/file-storage.service"); +describe('MigrationService', () => { + let service; + const mockTransactionRepo = { + findOne: jest.fn(), + create: jest.fn(), + save: jest.fn(), + }; + const mockTypeRepo = { + findOne: jest.fn(), + }; + const mockStatusRepo = { + findOne: jest.fn(), + }; + const mockProjectRepo = { + findOne: jest.fn(), + }; + const mockQueryRunner = { + connect: jest.fn(), + startTransaction: jest.fn(), + commitTransaction: jest.fn(), + rollbackTransaction: jest.fn(), + release: jest.fn(), + manager: { + findOne: jest.fn(), + create: jest.fn(), + save: jest.fn(), + count: jest.fn(), + update: jest.fn(), + }, + }; + const mockDataSource = { + createQueryRunner: jest.fn().mockReturnValue(mockQueryRunner), + }; + beforeEach(async () => { + const module = await testing_1.Test.createTestingModule({ + providers: [ + migration_service_1.MigrationService, + { + provide: (0, typeorm_1.getRepositoryToken)(import_transaction_entity_1.ImportTransaction), + useValue: mockTransactionRepo, + }, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_type_entity_1.CorrespondenceType), + useValue: mockTypeRepo, + }, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus), + useValue: mockStatusRepo, + }, + { + provide: (0, typeorm_1.getRepositoryToken)(project_entity_1.Project), + useValue: mockProjectRepo, + }, + { + provide: typeorm_2.DataSource, + useValue: mockDataSource, + }, + { + provide: (0, typeorm_1.getRepositoryToken)(migration_review_queue_entity_1.MigrationReviewQueue), + useValue: { findOne: jest.fn(), create: jest.fn(), save: jest.fn() }, + }, + { + provide: (0, typeorm_1.getRepositoryToken)(migration_error_entity_1.MigrationError), + useValue: { create: jest.fn(), save: jest.fn() }, + }, + { + provide: file_storage_service_1.FileStorageService, + useValue: { importStagingFile: jest.fn() }, + }, + ], + }).compile(); + service = module.get(migration_service_1.MigrationService); + }); + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxtaWdyYXRpb24uc2VydmljZS5zcGVjLnRzIiwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQXNEO0FBQ3RELDJEQUF1RDtBQUN2RCw2Q0FBcUQ7QUFDckQsb0ZBQXlFO0FBQ3pFLHNHQUEyRjtBQUMzRiwwR0FBK0Y7QUFDL0YsdUVBQTZEO0FBQzdELHFDQUFxQztBQUNyQyw0RkFBZ0Y7QUFDaEYsOEVBQW1FO0FBQ25FLHlGQUFvRjtBQUVwRixRQUFRLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO0lBQ2hDLElBQUksT0FBeUIsQ0FBQztJQUU5QixNQUFNLG1CQUFtQixHQUFHO1FBQzFCLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2xCLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2pCLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO0tBQ2hCLENBQUM7SUFFRixNQUFNLFlBQVksR0FBRztRQUNuQixPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtLQUNuQixDQUFDO0lBRUYsTUFBTSxjQUFjLEdBQUc7UUFDckIsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7S0FDbkIsQ0FBQztJQUVGLE1BQU0sZUFBZSxHQUFHO1FBQ3RCLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO0tBQ25CLENBQUM7SUFFRixNQUFNLGVBQWUsR0FBRztRQUN0QixPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNsQixnQkFBZ0IsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQzNCLGlCQUFpQixFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDNUIsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUM5QixPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNsQixPQUFPLEVBQUU7WUFDUCxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNsQixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNqQixJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNmLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ2hCLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1NBQ2xCO0tBQ0YsQ0FBQztJQUVGLE1BQU0sY0FBYyxHQUFHO1FBQ3JCLGlCQUFpQixFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDO0tBQzlELENBQUM7SUFFRixVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDcEIsTUFBTSxNQUFNLEdBQWtCLE1BQU0sY0FBSSxDQUFDLG1CQUFtQixDQUFDO1lBQzNELFNBQVMsRUFBRTtnQkFDVCxvQ0FBZ0I7Z0JBQ2hCO29CQUNFLE9BQU8sRUFBRSxJQUFBLDRCQUFrQixFQUFDLDZDQUFpQixDQUFDO29CQUM5QyxRQUFRLEVBQUUsbUJBQW1CO2lCQUM5QjtnQkFDRDtvQkFDRSxPQUFPLEVBQUUsSUFBQSw0QkFBa0IsRUFBQywrQ0FBa0IsQ0FBQztvQkFDL0MsUUFBUSxFQUFFLFlBQVk7aUJBQ3ZCO2dCQUNEO29CQUNFLE9BQU8sRUFBRSxJQUFBLDRCQUFrQixFQUFDLG1EQUFvQixDQUFDO29CQUNqRCxRQUFRLEVBQUUsY0FBYztpQkFDekI7Z0JBQ0Q7b0JBQ0UsT0FBTyxFQUFFLElBQUEsNEJBQWtCLEVBQUMsd0JBQU8sQ0FBQztvQkFDcEMsUUFBUSxFQUFFLGVBQWU7aUJBQzFCO2dCQUNEO29CQUNFLE9BQU8sRUFBRSxvQkFBVTtvQkFDbkIsUUFBUSxFQUFFLGNBQWM7aUJBQ3pCO2dCQUNEO29CQUNFLE9BQU8sRUFBRSxJQUFBLDRCQUFrQixFQUFDLG9EQUFvQixDQUFDO29CQUNqRCxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRTtpQkFDckU7Z0JBQ0Q7b0JBQ0UsT0FBTyxFQUFFLElBQUEsNEJBQWtCLEVBQUMsdUNBQWMsQ0FBQztvQkFDM0MsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFO2lCQUNqRDtnQkFDRDtvQkFDRSxPQUFPLEVBQUUseUNBQWtCO29CQUMzQixRQUFRLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUU7aUJBQzNDO2FBQ0Y7U0FDRixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFYixPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBbUIsb0NBQWdCLENBQUMsQ0FBQztJQUMzRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUU7UUFDM0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxtaWdyYXRpb24uc2VydmljZS5zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlc3QsIFRlc3RpbmdNb2R1bGUgfSBmcm9tICdAbmVzdGpzL3Rlc3RpbmcnO1xuaW1wb3J0IHsgTWlncmF0aW9uU2VydmljZSB9IGZyb20gJy4vbWlncmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0UmVwb3NpdG9yeVRva2VuIH0gZnJvbSAnQG5lc3Rqcy90eXBlb3JtJztcbmltcG9ydCB7IEltcG9ydFRyYW5zYWN0aW9uIH0gZnJvbSAnLi9lbnRpdGllcy9pbXBvcnQtdHJhbnNhY3Rpb24uZW50aXR5JztcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlVHlwZSB9IGZyb20gJy4uL2NvcnJlc3BvbmRlbmNlL2VudGl0aWVzL2NvcnJlc3BvbmRlbmNlLXR5cGUuZW50aXR5JztcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlU3RhdHVzIH0gZnJvbSAnLi4vY29ycmVzcG9uZGVuY2UvZW50aXRpZXMvY29ycmVzcG9uZGVuY2Utc3RhdHVzLmVudGl0eSc7XG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC9lbnRpdGllcy9wcm9qZWN0LmVudGl0eSc7XG5pbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBNaWdyYXRpb25SZXZpZXdRdWV1ZSB9IGZyb20gJy4vZW50aXRpZXMvbWlncmF0aW9uLXJldmlldy1xdWV1ZS5lbnRpdHknO1xuaW1wb3J0IHsgTWlncmF0aW9uRXJyb3IgfSBmcm9tICcuL2VudGl0aWVzL21pZ3JhdGlvbi1lcnJvci5lbnRpdHknO1xuaW1wb3J0IHsgRmlsZVN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uL2ZpbGUtc3RvcmFnZS9maWxlLXN0b3JhZ2Uuc2VydmljZSc7XG5cbmRlc2NyaWJlKCdNaWdyYXRpb25TZXJ2aWNlJywgKCkgPT4ge1xuICBsZXQgc2VydmljZTogTWlncmF0aW9uU2VydmljZTtcblxuICBjb25zdCBtb2NrVHJhbnNhY3Rpb25SZXBvID0ge1xuICAgIGZpbmRPbmU6IGplc3QuZm4oKSxcbiAgICBjcmVhdGU6IGplc3QuZm4oKSxcbiAgICBzYXZlOiBqZXN0LmZuKCksXG4gIH07XG5cbiAgY29uc3QgbW9ja1R5cGVSZXBvID0ge1xuICAgIGZpbmRPbmU6IGplc3QuZm4oKSxcbiAgfTtcblxuICBjb25zdCBtb2NrU3RhdHVzUmVwbyA9IHtcbiAgICBmaW5kT25lOiBqZXN0LmZuKCksXG4gIH07XG5cbiAgY29uc3QgbW9ja1Byb2plY3RSZXBvID0ge1xuICAgIGZpbmRPbmU6IGplc3QuZm4oKSxcbiAgfTtcblxuICBjb25zdCBtb2NrUXVlcnlSdW5uZXIgPSB7XG4gICAgY29ubmVjdDogamVzdC5mbigpLFxuICAgIHN0YXJ0VHJhbnNhY3Rpb246IGplc3QuZm4oKSxcbiAgICBjb21taXRUcmFuc2FjdGlvbjogamVzdC5mbigpLFxuICAgIHJvbGxiYWNrVHJhbnNhY3Rpb246IGplc3QuZm4oKSxcbiAgICByZWxlYXNlOiBqZXN0LmZuKCksXG4gICAgbWFuYWdlcjoge1xuICAgICAgZmluZE9uZTogamVzdC5mbigpLFxuICAgICAgY3JlYXRlOiBqZXN0LmZuKCksXG4gICAgICBzYXZlOiBqZXN0LmZuKCksXG4gICAgICBjb3VudDogamVzdC5mbigpLFxuICAgICAgdXBkYXRlOiBqZXN0LmZuKCksXG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBtb2NrRGF0YVNvdXJjZSA9IHtcbiAgICBjcmVhdGVRdWVyeVJ1bm5lcjogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShtb2NrUXVlcnlSdW5uZXIpLFxuICB9O1xuXG4gIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG1vZHVsZTogVGVzdGluZ01vZHVsZSA9IGF3YWl0IFRlc3QuY3JlYXRlVGVzdGluZ01vZHVsZSh7XG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgTWlncmF0aW9uU2VydmljZSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IGdldFJlcG9zaXRvcnlUb2tlbihJbXBvcnRUcmFuc2FjdGlvbiksXG4gICAgICAgICAgdXNlVmFsdWU6IG1vY2tUcmFuc2FjdGlvblJlcG8sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VUeXBlKSxcbiAgICAgICAgICB1c2VWYWx1ZTogbW9ja1R5cGVSZXBvLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlU3RhdHVzKSxcbiAgICAgICAgICB1c2VWYWx1ZTogbW9ja1N0YXR1c1JlcG8sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBnZXRSZXBvc2l0b3J5VG9rZW4oUHJvamVjdCksXG4gICAgICAgICAgdXNlVmFsdWU6IG1vY2tQcm9qZWN0UmVwbyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IERhdGFTb3VyY2UsXG4gICAgICAgICAgdXNlVmFsdWU6IG1vY2tEYXRhU291cmNlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogZ2V0UmVwb3NpdG9yeVRva2VuKE1pZ3JhdGlvblJldmlld1F1ZXVlKSxcbiAgICAgICAgICB1c2VWYWx1ZTogeyBmaW5kT25lOiBqZXN0LmZuKCksIGNyZWF0ZTogamVzdC5mbigpLCBzYXZlOiBqZXN0LmZuKCkgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IGdldFJlcG9zaXRvcnlUb2tlbihNaWdyYXRpb25FcnJvciksXG4gICAgICAgICAgdXNlVmFsdWU6IHsgY3JlYXRlOiBqZXN0LmZuKCksIHNhdmU6IGplc3QuZm4oKSB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogRmlsZVN0b3JhZ2VTZXJ2aWNlLFxuICAgICAgICAgIHVzZVZhbHVlOiB7IGltcG9ydFN0YWdpbmdGaWxlOiBqZXN0LmZuKCkgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSkuY29tcGlsZSgpO1xuXG4gICAgc2VydmljZSA9IG1vZHVsZS5nZXQ8TWlncmF0aW9uU2VydmljZT4oTWlncmF0aW9uU2VydmljZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYmUgZGVmaW5lZCcsICgpID0+IHtcbiAgICBleHBlY3Qoc2VydmljZSkudG9CZURlZmluZWQoKTtcbiAgfSk7XG59KTtcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5a/migrationservicespec_5a537f9973f4abc7efd76426c2858a1b.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5a/migrationservicespec_5a537f9973f4abc7efd76426c2858a1b.map new file mode 100644 index 0000000..6d02c43 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5a/migrationservicespec_5a537f9973f4abc7efd76426c2858a1b.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\migration.service.spec.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\migration.service.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\nimport { MigrationService } from './migration.service';\nimport { getRepositoryToken } from '@nestjs/typeorm';\nimport { ImportTransaction } from './entities/import-transaction.entity';\nimport { CorrespondenceType } from '../correspondence/entities/correspondence-type.entity';\nimport { CorrespondenceStatus } from '../correspondence/entities/correspondence-status.entity';\nimport { Project } from '../project/entities/project.entity';\nimport { DataSource } from 'typeorm';\nimport { MigrationReviewQueue } from './entities/migration-review-queue.entity';\nimport { MigrationError } from './entities/migration-error.entity';\nimport { FileStorageService } from '../../common/file-storage/file-storage.service';\n\ndescribe('MigrationService', () => {\n let service: MigrationService;\n\n const mockTransactionRepo = {\n findOne: jest.fn(),\n create: jest.fn(),\n save: jest.fn(),\n };\n\n const mockTypeRepo = {\n findOne: jest.fn(),\n };\n\n const mockStatusRepo = {\n findOne: jest.fn(),\n };\n\n const mockProjectRepo = {\n findOne: jest.fn(),\n };\n\n const mockQueryRunner = {\n connect: jest.fn(),\n startTransaction: jest.fn(),\n commitTransaction: jest.fn(),\n rollbackTransaction: jest.fn(),\n release: jest.fn(),\n manager: {\n findOne: jest.fn(),\n create: jest.fn(),\n save: jest.fn(),\n count: jest.fn(),\n update: jest.fn(),\n },\n };\n\n const mockDataSource = {\n createQueryRunner: jest.fn().mockReturnValue(mockQueryRunner),\n };\n\n beforeEach(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n MigrationService,\n {\n provide: getRepositoryToken(ImportTransaction),\n useValue: mockTransactionRepo,\n },\n {\n provide: getRepositoryToken(CorrespondenceType),\n useValue: mockTypeRepo,\n },\n {\n provide: getRepositoryToken(CorrespondenceStatus),\n useValue: mockStatusRepo,\n },\n {\n provide: getRepositoryToken(Project),\n useValue: mockProjectRepo,\n },\n {\n provide: DataSource,\n useValue: mockDataSource,\n },\n {\n provide: getRepositoryToken(MigrationReviewQueue),\n useValue: { findOne: jest.fn(), create: jest.fn(), save: jest.fn() },\n },\n {\n provide: getRepositoryToken(MigrationError),\n useValue: { create: jest.fn(), save: jest.fn() },\n },\n {\n provide: FileStorageService,\n useValue: { importStagingFile: jest.fn() },\n },\n ],\n }).compile();\n\n service = module.get(MigrationService);\n });\n\n it('should be defined', () => {\n expect(service).toBeDefined();\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5b/formatservice_5b80502de833b4704f252f5b67b90d66 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5b/formatservice_5b80502de833b4704f252f5b67b90d66 new file mode 100644 index 0000000..f137df5 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5b/formatservice_5b80502de833b4704f252f5b67b90d66 @@ -0,0 +1,148 @@ +82efdf74334317d54a482bf60927f289 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var _a, _b, _c, _d, _e; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.FormatService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const document_number_format_entity_1 = require("../entities/document-number-format.entity"); +const project_entity_1 = require("../../project/entities/project.entity"); +const correspondence_type_entity_1 = require("../../correspondence/entities/correspondence-type.entity"); +const organization_entity_1 = require("../../organization/entities/organization.entity"); +const discipline_entity_1 = require("../../master/entities/discipline.entity"); +let FormatService = class FormatService { + constructor(formatRepo, projectRepo, typeRepo, orgRepo, disciplineRepo) { + this.formatRepo = formatRepo; + this.projectRepo = projectRepo; + this.typeRepo = typeRepo; + this.orgRepo = orgRepo; + this.disciplineRepo = disciplineRepo; + } + async format(options) { + const { template, isDefault } = await this.resolveFormatAndScope(options); + const currentYear = options.year || new Date().getFullYear(); + const tokens = await this.resolveTokens(options, currentYear); + const previewNumber = this.replaceTokens(template, tokens, options.sequence); + return { previewNumber, isDefault }; + } + // --- Helpers --- + async resolveFormatAndScope(options) { + // 1. Specific Format + const specificFormat = await this.formatRepo.findOne({ + where: { + projectId: options.projectId, + correspondenceTypeId: options.correspondenceTypeId, + }, + }); + if (specificFormat) + return { + template: specificFormat.formatTemplate, + resetSequenceYearly: specificFormat.resetSequenceYearly, + isDefault: false, + }; + // 2. Default Format + const defaultFormat = await this.formatRepo.findOne({ + where: { projectId: options.projectId, correspondenceTypeId: (0, typeorm_2.IsNull)() }, + }); + if (defaultFormat) + return { + template: defaultFormat.formatTemplate, + resetSequenceYearly: defaultFormat.resetSequenceYearly, + isDefault: true, + }; + // 3. Fallback + return { + template: '{ORG}-{RECIPIENT}-{SEQ:4}/{YEAR:BE}', + resetSequenceYearly: true, + isDefault: true, + }; + } + async resolveTokens(options, year) { + const [project, type, recipientCode, disciplineCode, orgCode] = await Promise.all([ + this.projectRepo.findOne({ + where: { id: options.projectId }, + select: ['projectCode'], + }), + this.typeRepo.findOne({ + where: { id: options.correspondenceTypeId }, + select: ['typeCode'], + }), + this.resolveRecipientCode(options.recipientOrganizationId), + this.resolveDisciplineCode(options.disciplineId), + this.resolveOrgCode(options.originatorOrganizationId), + ]); + return { + '{PROJECT}': project?.projectCode || 'PROJ', + '{TYPE}': type?.typeCode || 'DOC', + '{ORG}': orgCode, + '{RECIPIENT}': recipientCode, + '{DISCIPLINE}': disciplineCode, + '{YEAR}': year.toString(), + '{YEAR:BE}': (year + 543).toString(), + '{REV}': '0', + }; + } + replaceTokens(template, tokens, sequence) { + let result = template; + for (const [key, value] of Object.entries(tokens)) { + result = result.replace(new RegExp(key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g'), value); + } + const seqMatch = result.match(/{SEQ:(\d+)}/); + if (seqMatch) { + const padding = Number(seqMatch[1]); + result = result.replace(seqMatch[0], sequence.toString().padStart(padding, '0')); + } + return result; + } + async resolveRecipientCode(recipientId) { + if (!recipientId) + return 'GEN'; + const org = await this.orgRepo.findOne({ + where: { id: recipientId }, + select: ['organizationCode'], + }); + return org ? org.organizationCode : 'GEN'; + } + async resolveOrgCode(orgId) { + if (!orgId) + return 'GEN'; + const org = await this.orgRepo.findOne({ + where: { id: orgId }, + select: ['organizationCode'], + }); + return org ? org.organizationCode : 'GEN'; + } + async resolveDisciplineCode(disciplineId) { + if (!disciplineId) + return 'GEN'; + const discipline = await this.disciplineRepo.findOne({ + where: { id: disciplineId }, + select: ['disciplineCode'], + }); + return discipline ? discipline.disciplineCode : 'GEN'; + } +}; +exports.FormatService = FormatService; +exports.FormatService = FormatService = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(document_number_format_entity_1.DocumentNumberFormat)), + __param(1, (0, typeorm_1.InjectRepository)(project_entity_1.Project)), + __param(2, (0, typeorm_1.InjectRepository)(correspondence_type_entity_1.CorrespondenceType)), + __param(3, (0, typeorm_1.InjectRepository)(organization_entity_1.Organization)), + __param(4, (0, typeorm_1.InjectRepository)(discipline_entity_1.Discipline)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object, typeof (_b = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _b : Object, typeof (_c = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _c : Object, typeof (_d = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _d : Object, typeof (_e = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _e : Object]) +], FormatService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxzZXJ2aWNlc1xcZm9ybWF0LnNlcnZpY2UudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUE0QztBQUM1Qyw2Q0FBbUQ7QUFDbkQscUNBQTZDO0FBQzdDLDZGQUFpRjtBQUNqRiwwRUFBZ0U7QUFDaEUseUdBQThGO0FBQzlGLHlGQUErRTtBQUMvRSwrRUFBcUU7QUFvQjlELElBQU0sYUFBYSxHQUFuQixNQUFNLGFBQWE7SUFDeEIsWUFFVSxVQUE0QyxFQUU1QyxXQUFnQyxFQUVoQyxRQUF3QyxFQUV4QyxPQUFpQyxFQUVqQyxjQUFzQztRQVJ0QyxlQUFVLEdBQVYsVUFBVSxDQUFrQztRQUU1QyxnQkFBVyxHQUFYLFdBQVcsQ0FBcUI7UUFFaEMsYUFBUSxHQUFSLFFBQVEsQ0FBZ0M7UUFFeEMsWUFBTyxHQUFQLE9BQU8sQ0FBMEI7UUFFakMsbUJBQWMsR0FBZCxjQUFjLENBQXdCO0lBQzdDLENBQUM7SUFFSixLQUFLLENBQUMsTUFBTSxDQUNWLE9BQXNCO1FBRXRCLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFOUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FDdEMsUUFBUSxFQUNSLE1BQU0sRUFDTixPQUFPLENBQUMsUUFBUSxDQUNqQixDQUFDO1FBQ0YsT0FBTyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsa0JBQWtCO0lBRVYsS0FBSyxD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QUFDO1FBQ0gsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzVDLENBQUM7SUFFTyxLQUFLLENBQUMscUJBQXFCLENBQUMsWUFBcUI7UUFDdkQsSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNoQyxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDO1lBQ25ELEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUU7WUFDM0IsTUFBTSxFQUFFLENBQUMsZ0JBQWdCLENBQUM7U0FDM0IsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUN4RCxDQUFDO0NBQ0YsQ0FBQTtBQXJKWSxzQ0FBYTt3QkFBYixhQUFhO0lBRHpCLElBQUEsbUJBQVUsR0FBRTtJQUdSLFdBQUEsSUFBQSwwQkFBZ0IsRUFBQyxvREFBb0IsQ0FBQyxDQUFBO0lBRXRDLFdBQUEsSUFBQSwwQkFBZ0IsRUFBQyx3QkFBTyxDQUFDLENBQUE7SUFFekIsV0FBQSxJQUFBLDBCQUFnQixFQUFDLCtDQUFrQixDQUFDLENBQUE7SUFFcEMsV0FBQSxJQUFBLDBCQUFnQixFQUFDLGtDQUFZLENBQUMsQ0FBQTtJQUU5QixXQUFBLElBQUEsMEJBQWdCLEVBQUMsOEJBQVUsQ0FBQyxDQUFBO3lEQVBULG9CQUFVLG9CQUFWLG9CQUFVLG9EQUVULG9CQUFVLG9CQUFWLG9CQUFVLG9EQUViLG9CQUFVLG9CQUFWLG9CQUFVLG9EQUVYLG9CQUFVLG9CQUFWLG9CQUFVLG9EQUVILG9CQUFVLG9CQUFWLG9CQUFVO0dBWHpCLGFBQWEsQ0FxSnpCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGRvY3VtZW50LW51bWJlcmluZ1xcc2VydmljZXNcXGZvcm1hdC5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XHJcbmltcG9ydCB7IEluamVjdFJlcG9zaXRvcnkgfSBmcm9tICdAbmVzdGpzL3R5cGVvcm0nO1xyXG5pbXBvcnQgeyBSZXBvc2l0b3J5LCBJc051bGwgfSBmcm9tICd0eXBlb3JtJztcclxuaW1wb3J0IHsgRG9jdW1lbnROdW1iZXJGb3JtYXQgfSBmcm9tICcuLi9lbnRpdGllcy9kb2N1bWVudC1udW1iZXItZm9ybWF0LmVudGl0eSc7XHJcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0L2VudGl0aWVzL3Byb2plY3QuZW50aXR5JztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VUeXBlIH0gZnJvbSAnLi4vLi4vY29ycmVzcG9uZGVuY2UvZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtdHlwZS5lbnRpdHknO1xyXG5pbXBvcnQgeyBPcmdhbml6YXRpb24gfSBmcm9tICcuLi8uLi9vcmdhbml6YXRpb24vZW50aXRpZXMvb3JnYW5pemF0aW9uLmVudGl0eSc7XHJcbmltcG9ydCB7IERpc2NpcGxpbmUgfSBmcm9tICcuLi8uLi9tYXN0ZXIvZW50aXRpZXMvZGlzY2lwbGluZS5lbnRpdHknO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGb3JtYXRPcHRpb25zIHtcclxuICBwcm9qZWN0SWQ6IG51bWJlcjtcclxuICBjb3JyZXNwb25kZW5jZVR5cGVJZDogbnVtYmVyO1xyXG4gIHN1YlR5cGVJZD86IG51bWJlcjtcclxuICByZmFUeXBlSWQ/OiBudW1iZXI7XHJcbiAgZGlzY2lwbGluZUlkPzogbnVtYmVyO1xyXG4gIHNlcXVlbmNlOiBudW1iZXI7XHJcbiAgcmVzZXRTY29wZTogc3RyaW5nO1xyXG4gIHllYXI/OiBudW1iZXI7XHJcbiAgb3JpZ2luYXRvck9yZ2FuaXphdGlvbklkOiBudW1iZXI7XHJcbiAgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQ/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGVjb2RlZFRva2VucyB7XHJcbiAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBGb3JtYXRTZXJ2aWNlIHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KERvY3VtZW50TnVtYmVyRm9ybWF0KVxyXG4gICAgcHJpdmF0ZSBmb3JtYXRSZXBvOiBSZXBvc2l0b3J5PERvY3VtZW50TnVtYmVyRm9ybWF0PixcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KFByb2plY3QpXHJcbiAgICBwcml2YXRlIHByb2plY3RSZXBvOiBSZXBvc2l0b3J5PFByb2plY3Q+LFxyXG4gICAgQEluamVjdFJlcG9zaXRvcnkoQ29ycmVzcG9uZGVuY2VUeXBlKVxyXG4gICAgcHJpdmF0ZSB0eXBlUmVwbzogUmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZVR5cGU+LFxyXG4gICAgQEluamVjdFJlcG9zaXRvcnkoT3JnYW5pemF0aW9uKVxyXG4gICAgcHJpdmF0ZSBvcmdSZXBvOiBSZXBvc2l0b3J5PE9yZ2FuaXphdGlvbj4sXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShEaXNjaXBsaW5lKVxyXG4gICAgcHJpdmF0ZSBkaXNjaXBsaW5lUmVwbzogUmVwb3NpdG9yeTxEaXNjaXBsaW5lPlxyXG4gICkge31cclxuXHJcbiAgYXN5bmMgZm9ybWF0KFxyXG4gICAgb3B0aW9uczogRm9ybWF0T3B0aW9uc1xyXG4gICk6IFByb21pc2U8eyBwcmV2aWV3TnVtYmVyOiBzdHJpbmc7IGlzRGVmYXVsdDogYm9vbGVhbiB9PiB7XHJcbiAgICBjb25zdCB7IHRlbXBsYXRlLCBpc0RlZmF1bHQgfSA9IGF3YWl0IHRoaXMucmVzb2x2ZUZvcm1hdEFuZFNjb3BlKG9wdGlvbnMpO1xyXG4gICAgY29uc3QgY3VycmVudFllYXIgPSBvcHRpb25zLnllYXIgfHwgbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xyXG4gICAgY29uc3QgdG9rZW5zID0gYXdhaXQgdGhpcy5yZXNvbHZlVG9rZW5zKG9wdGlvbnMsIGN1cnJlbnRZZWFyKTtcclxuXHJcbiAgICBjb25zdCBwcmV2aWV3TnVtYmVyID0gdGhpcy5yZXBsYWNlVG9rZW5zKFxyXG4gICAgICB0ZW1wbGF0ZSxcclxuICAgICAgdG9rZW5zLFxyXG4gICAgICBvcHRpb25zLnNlcXVlbmNlXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIHsgcHJldmlld051bWJlciwgaXNEZWZhdWx0IH07XHJcbiAgfVxyXG5cclxuICAvLyAtLS0gSGVscGVycyAtLS1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlRm9ybWF0QW5kU2NvcGUob3B0aW9uczogRm9ybWF0T3B0aW9ucyk6IFByb21pc2U8e1xyXG4gICAgdGVtcGxhdGU6IHN0cmluZztcclxuICAgIHJlc2V0U2VxdWVuY2VZZWFybHk6IGJvb2xlYW47XHJcbiAgICBpc0RlZmF1bHQ6IGJvb2xlYW47XHJcbiAgfT4ge1xyXG4gICAgLy8gMS4gU3BlY2lmaWMgRm9ybWF0XHJcbiAgICBjb25zdCBzcGVjaWZpY0Zvcm1hdCA9IGF3YWl0IHRoaXMuZm9ybWF0UmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHtcclxuICAgICAgICBwcm9qZWN0SWQ6IG9wdGlvbnMucHJvamVjdElkLFxyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlVHlwZUlkOiBvcHRpb25zLmNvcnJlc3BvbmRlbmNlVHlwZUlkLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgICBpZiAoc3BlY2lmaWNGb3JtYXQpXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgdGVtcGxhdGU6IHNwZWNpZmljRm9ybWF0LmZvcm1hdFRlbXBsYXRlLFxyXG4gICAgICAgIHJlc2V0U2VxdWVuY2VZZWFybHk6IHNwZWNpZmljRm9ybWF0LnJlc2V0U2VxdWVuY2VZZWFybHksXHJcbiAgICAgICAgaXNEZWZhdWx0OiBmYWxzZSxcclxuICAgICAgfTtcclxuXHJcbiAgICAvLyAyLiBEZWZhdWx0IEZvcm1hdFxyXG4gICAgY29uc3QgZGVmYXVsdEZvcm1hdCA9IGF3YWl0IHRoaXMuZm9ybWF0UmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgcHJvamVjdElkOiBvcHRpb25zLnByb2plY3RJZCwgY29ycmVzcG9uZGVuY2VUeXBlSWQ6IElzTnVsbCgpIH0sXHJcbiAgICB9KTtcclxuICAgIGlmIChkZWZhdWx0Rm9ybWF0KVxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHRlbXBsYXRlOiBkZWZhdWx0Rm9ybWF0LmZvcm1hdFRlbXBsYXRlLFxyXG4gICAgICAgIHJlc2V0U2VxdWVuY2VZZWFybHk6IGRlZmF1bHRGb3JtYXQucmVzZXRTZXF1ZW5jZVllYXJseSxcclxuICAgICAgICBpc0RlZmF1bHQ6IHRydWUsXHJcbiAgICAgIH07XHJcblxyXG4gICAgLy8gMy4gRmFsbGJhY2tcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRlbXBsYXRlOiAne09SR30te1JFQ0lQSUVOVH0te1NFUTo0fS97WUVBUjpCRX0nLFxyXG4gICAgICByZXNldFNlcXVlbmNlWWVhcmx5OiB0cnVlLFxyXG4gICAgICBpc0RlZmF1bHQ6IHRydWUsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlVG9rZW5zKFxyXG4gICAgb3B0aW9uczogRm9ybWF0T3B0aW9ucyxcclxuICAgIHllYXI6IG51bWJlclxyXG4gICk6IFByb21pc2U8RGVjb2RlZFRva2Vucz4ge1xyXG4gICAgY29uc3QgW3Byb2plY3QsIHR5cGUsIHJlY2lwaWVudENvZGUsIGRpc2NpcGxpbmVDb2RlLCBvcmdDb2RlXSA9XHJcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcclxuICAgICAgICB0aGlzLnByb2plY3RSZXBvLmZpbmRPbmUoe1xyXG4gICAgICAgICAgd2hlcmU6IHsgaWQ6IG9wdGlvbnMucHJvamVjdElkIH0sXHJcbiAgICAgICAgICBzZWxlY3Q6IFsncHJvamVjdENvZGUnXSxcclxuICAgICAgICB9KSxcclxuICAgICAgICB0aGlzLnR5cGVSZXBvLmZpbmRPbmUoe1xyXG4gICAgICAgICAgd2hlcmU6IHsgaWQ6IG9wdGlvbnMuY29ycmVzcG9uZGVuY2VUeXBlSWQgfSxcclxuICAgICAgICAgIHNlbGVjdDogWyd0eXBlQ29kZSddLFxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRoaXMucmVzb2x2ZVJlY2lwaWVudENvZGUob3B0aW9ucy5yZWNpcGllbnRPcmdhbml6YXRpb25JZCksXHJcbiAgICAgICAgdGhpcy5yZXNvbHZlRGlzY2lwbGluZUNvZGUob3B0aW9ucy5kaXNjaXBsaW5lSWQpLFxyXG4gICAgICAgIHRoaXMucmVzb2x2ZU9yZ0NvZGUob3B0aW9ucy5vcmlnaW5hdG9yT3JnYW5pemF0aW9uSWQpLFxyXG4gICAgICBdKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAne1BST0pFQ1R9JzogcHJvamVjdD8ucHJvamVjdENvZGUgfHwgJ1BST0onLFxyXG4gICAgICAne1RZUEV9JzogdHlwZT8udHlwZUNvZGUgfHwgJ0RPQycsXHJcbiAgICAgICd7T1JHfSc6IG9yZ0NvZGUsXHJcbiAgICAgICd7UkVDSVBJRU5UfSc6IHJlY2lwaWVudENvZGUsXHJcbiAgICAgICd7RElTQ0lQTElORX0nOiBkaXNjaXBsaW5lQ29kZSxcclxuICAgICAgJ3tZRUFSfSc6IHllYXIudG9TdHJpbmcoKSxcclxuICAgICAgJ3tZRUFSOkJFfSc6ICh5ZWFyICsgNTQzKS50b1N0cmluZygpLFxyXG4gICAgICAne1JFVn0nOiAnMCcsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXBsYWNlVG9rZW5zKFxyXG4gICAgdGVtcGxhdGU6IHN0cmluZyxcclxuICAgIHRva2VuczogRGVjb2RlZFRva2VucyxcclxuICAgIHNlcXVlbmNlOiBudW1iZXJcclxuICApOiBzdHJpbmcge1xyXG4gICAgbGV0IHJlc3VsdCA9IHRlbXBsYXRlO1xyXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModG9rZW5zKSkge1xyXG4gICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShcclxuICAgICAgICBuZXcgUmVnRXhwKGtleS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpLCAnZycpLFxyXG4gICAgICAgIHZhbHVlXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzZXFNYXRjaCA9IHJlc3VsdC5tYXRjaCgve1NFUTooXFxkKyl9Lyk7XHJcbiAgICBpZiAoc2VxTWF0Y2gpIHtcclxuICAgICAgY29uc3QgcGFkZGluZyA9IE51bWJlcihzZXFNYXRjaFsxXSk7XHJcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKFxyXG4gICAgICAgIHNlcU1hdGNoWzBdLFxyXG4gICAgICAgIHNlcXVlbmNlLnRvU3RyaW5nKCkucGFkU3RhcnQocGFkZGluZywgJzAnKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVJlY2lwaWVudENvZGUocmVjaXBpZW50SWQ/OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgaWYgKCFyZWNpcGllbnRJZCkgcmV0dXJuICdHRU4nO1xyXG4gICAgY29uc3Qgb3JnID0gYXdhaXQgdGhpcy5vcmdSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBpZDogcmVjaXBpZW50SWQgfSxcclxuICAgICAgc2VsZWN0OiBbJ29yZ2FuaXphdGlvbkNvZGUnXSxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG9yZyA/IG9yZy5vcmdhbml6YXRpb25Db2RlIDogJ0dFTic7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHJlc29sdmVPcmdDb2RlKG9yZ0lkPzogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGlmICghb3JnSWQpIHJldHVybiAnR0VOJztcclxuICAgIGNvbnN0IG9yZyA9IGF3YWl0IHRoaXMub3JnUmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgaWQ6IG9yZ0lkIH0sXHJcbiAgICAgIHNlbGVjdDogWydvcmdhbml6YXRpb25Db2RlJ10sXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBvcmcgPyBvcmcub3JnYW5pemF0aW9uQ29kZSA6ICdHRU4nO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlRGlzY2lwbGluZUNvZGUoZGlzY2lwbGluZUlkPzogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGlmICghZGlzY2lwbGluZUlkKSByZXR1cm4gJ0dFTic7XHJcbiAgICBjb25zdCBkaXNjaXBsaW5lID0gYXdhaXQgdGhpcy5kaXNjaXBsaW5lUmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgaWQ6IGRpc2NpcGxpbmVJZCB9LFxyXG4gICAgICBzZWxlY3Q6IFsnZGlzY2lwbGluZUNvZGUnXSxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGRpc2NpcGxpbmUgPyBkaXNjaXBsaW5lLmRpc2NpcGxpbmVDb2RlIDogJ0dFTic7XHJcbiAgfVxyXG59XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5b/formatservice_5b80502de833b4704f252f5b67b90d66.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5b/formatservice_5b80502de833b4704f252f5b67b90d66.map new file mode 100644 index 0000000..301dd7d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5b/formatservice_5b80502de833b4704f252f5b67b90d66.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\format.service.ts","mappings":";;;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6CAAmD;AACnD,qCAA6C;AAC7C,6FAAiF;AACjF,0EAAgE;AAChE,yGAA8F;AAC9F,yFAA+E;AAC/E,+EAAqE;AAoB9D,IAAM,aAAa,GAAnB,MAAM,aAAa;IACxB,YAEU,UAA4C,EAE5C,WAAgC,EAEhC,QAAwC,EAExC,OAAiC,EAEjC,cAAsC;QARtC,eAAU,GAAV,UAAU,CAAkC;QAE5C,gBAAW,GAAX,WAAW,CAAqB;QAEhC,aAAQ,GAAR,QAAQ,CAAgC;QAExC,YAAO,GAAP,OAAO,CAA0B;QAEjC,mBAAc,GAAd,cAAc,CAAwB;IAC7C,CAAC;IAEJ,KAAK,CAAC,MAAM,CACV,OAAsB;QAEtB,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC1E,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAE9D,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CACtC,QAAQ,EACR,MAAM,EACN,OAAO,CAAC,QAAQ,CACjB,CAAC;QACF,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;IACtC,CAAC;IAED,kBAAkB;IAEV,KAAK,CAAC,qBAAqB,CAAC,OAAsB;QAKxD,qBAAqB;QACrB,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YACnD,KAAK,EAAE;gBACL,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;aACnD;SACF,CAAC,CAAC;QACH,IAAI,cAAc;YAChB,OAAO;gBACL,QAAQ,EAAE,cAAc,CAAC,cAAc;gBACvC,mBAAmB,EAAE,cAAc,CAAC,mBAAmB;gBACvD,SAAS,EAAE,KAAK;aACjB,CAAC;QAEJ,oBAAoB;QACpB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAClD,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,oBAAoB,EAAE,IAAA,gBAAM,GAAE,EAAE;SACxE,CAAC,CAAC;QACH,IAAI,aAAa;YACf,OAAO;gBACL,QAAQ,EAAE,aAAa,CAAC,cAAc;gBACtC,mBAAmB,EAAE,aAAa,CAAC,mBAAmB;gBACtD,SAAS,EAAE,IAAI;aAChB,CAAC;QAEJ,cAAc;QACd,OAAO;YACL,QAAQ,EAAE,qCAAqC;YAC/C,mBAAmB,EAAE,IAAI;YACzB,SAAS,EAAE,IAAI;SAChB,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,aAAa,CACzB,OAAsB,EACtB,IAAY;QAEZ,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,cAAc,EAAE,OAAO,CAAC,GAC3D,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;gBACvB,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,SAAS,EAAE;gBAChC,MAAM,EAAE,CAAC,aAAa,CAAC;aACxB,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACpB,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,oBAAoB,EAAE;gBAC3C,MAAM,EAAE,CAAC,UAAU,CAAC;aACrB,CAAC;YACF,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,uBAAuB,CAAC;YAC1D,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,YAAY,CAAC;YAChD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,wBAAwB,CAAC;SACtD,CAAC,CAAC;QAEL,OAAO;YACL,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,MAAM;YAC3C,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,KAAK;YACjC,OAAO,EAAE,OAAO;YAChB,aAAa,EAAE,aAAa;YAC5B,cAAc,EAAE,cAAc;YAC9B,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;YACzB,WAAW,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE;YACpC,OAAO,EAAE,GAAG;SACb,CAAC;IACJ,CAAC;IAEO,aAAa,CACnB,QAAgB,EAChB,MAAqB,EACrB,QAAgB;QAEhB,IAAI,MAAM,GAAG,QAAQ,CAAC;QACtB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,EAC3D,KAAK,CACN,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC7C,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,QAAQ,CAAC,CAAC,CAAC,EACX,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAC3C,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,WAAoB;QACrD,IAAI,CAAC,WAAW;YAAE,OAAO,KAAK,CAAC;QAC/B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YACrC,KAAK,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE;YAC1B,MAAM,EAAE,CAAC,kBAAkB,CAAC;SAC7B,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5C,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,KAAc;QACzC,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YACrC,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE;YACpB,MAAM,EAAE,CAAC,kBAAkB,CAAC;SAC7B,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5C,CAAC;IAEO,KAAK,CAAC,qBAAqB,CAAC,YAAqB;QACvD,IAAI,CAAC,YAAY;YAAE,OAAO,KAAK,CAAC;QAChC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;YACnD,KAAK,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE;YAC3B,MAAM,EAAE,CAAC,gBAAgB,CAAC;SAC3B,CAAC,CAAC;QACH,OAAO,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC;IACxD,CAAC;CACF,CAAA;AArJY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,0BAAgB,EAAC,oDAAoB,CAAC,CAAA;IAEtC,WAAA,IAAA,0BAAgB,EAAC,wBAAO,CAAC,CAAA;IAEzB,WAAA,IAAA,0BAAgB,EAAC,+CAAkB,CAAC,CAAA;IAEpC,WAAA,IAAA,0BAAgB,EAAC,kCAAY,CAAC,CAAA;IAE9B,WAAA,IAAA,0BAAgB,EAAC,8BAAU,CAAC,CAAA;yDAPT,oBAAU,oBAAV,oBAAU,oDAET,oBAAU,oBAAV,oBAAU,oDAEb,oBAAU,oBAAV,oBAAU,oDAEX,oBAAU,oBAAV,oBAAU,oDAEH,oBAAU,oBAAV,oBAAU;GAXzB,aAAa,CAqJzB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\format.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\r\nimport { InjectRepository } from '@nestjs/typeorm';\r\nimport { Repository, IsNull } from 'typeorm';\r\nimport { DocumentNumberFormat } from '../entities/document-number-format.entity';\r\nimport { Project } from '../../project/entities/project.entity';\r\nimport { CorrespondenceType } from '../../correspondence/entities/correspondence-type.entity';\r\nimport { Organization } from '../../organization/entities/organization.entity';\r\nimport { Discipline } from '../../master/entities/discipline.entity';\r\n\r\nexport interface FormatOptions {\r\n projectId: number;\r\n correspondenceTypeId: number;\r\n subTypeId?: number;\r\n rfaTypeId?: number;\r\n disciplineId?: number;\r\n sequence: number;\r\n resetScope: string;\r\n year?: number;\r\n originatorOrganizationId: number;\r\n recipientOrganizationId?: number;\r\n}\r\n\r\nexport interface DecodedTokens {\r\n [key: string]: string;\r\n}\r\n\r\n@Injectable()\r\nexport class FormatService {\r\n constructor(\r\n @InjectRepository(DocumentNumberFormat)\r\n private formatRepo: Repository,\r\n @InjectRepository(Project)\r\n private projectRepo: Repository,\r\n @InjectRepository(CorrespondenceType)\r\n private typeRepo: Repository,\r\n @InjectRepository(Organization)\r\n private orgRepo: Repository,\r\n @InjectRepository(Discipline)\r\n private disciplineRepo: Repository\r\n ) {}\r\n\r\n async format(\r\n options: FormatOptions\r\n ): Promise<{ previewNumber: string; isDefault: boolean }> {\r\n const { template, isDefault } = await this.resolveFormatAndScope(options);\r\n const currentYear = options.year || new Date().getFullYear();\r\n const tokens = await this.resolveTokens(options, currentYear);\r\n\r\n const previewNumber = this.replaceTokens(\r\n template,\r\n tokens,\r\n options.sequence\r\n );\r\n return { previewNumber, isDefault };\r\n }\r\n\r\n // --- Helpers ---\r\n\r\n private async resolveFormatAndScope(options: FormatOptions): Promise<{\r\n template: string;\r\n resetSequenceYearly: boolean;\r\n isDefault: boolean;\r\n }> {\r\n // 1. Specific Format\r\n const specificFormat = await this.formatRepo.findOne({\r\n where: {\r\n projectId: options.projectId,\r\n correspondenceTypeId: options.correspondenceTypeId,\r\n },\r\n });\r\n if (specificFormat)\r\n return {\r\n template: specificFormat.formatTemplate,\r\n resetSequenceYearly: specificFormat.resetSequenceYearly,\r\n isDefault: false,\r\n };\r\n\r\n // 2. Default Format\r\n const defaultFormat = await this.formatRepo.findOne({\r\n where: { projectId: options.projectId, correspondenceTypeId: IsNull() },\r\n });\r\n if (defaultFormat)\r\n return {\r\n template: defaultFormat.formatTemplate,\r\n resetSequenceYearly: defaultFormat.resetSequenceYearly,\r\n isDefault: true,\r\n };\r\n\r\n // 3. Fallback\r\n return {\r\n template: '{ORG}-{RECIPIENT}-{SEQ:4}/{YEAR:BE}',\r\n resetSequenceYearly: true,\r\n isDefault: true,\r\n };\r\n }\r\n\r\n private async resolveTokens(\r\n options: FormatOptions,\r\n year: number\r\n ): Promise {\r\n const [project, type, recipientCode, disciplineCode, orgCode] =\r\n await Promise.all([\r\n this.projectRepo.findOne({\r\n where: { id: options.projectId },\r\n select: ['projectCode'],\r\n }),\r\n this.typeRepo.findOne({\r\n where: { id: options.correspondenceTypeId },\r\n select: ['typeCode'],\r\n }),\r\n this.resolveRecipientCode(options.recipientOrganizationId),\r\n this.resolveDisciplineCode(options.disciplineId),\r\n this.resolveOrgCode(options.originatorOrganizationId),\r\n ]);\r\n\r\n return {\r\n '{PROJECT}': project?.projectCode || 'PROJ',\r\n '{TYPE}': type?.typeCode || 'DOC',\r\n '{ORG}': orgCode,\r\n '{RECIPIENT}': recipientCode,\r\n '{DISCIPLINE}': disciplineCode,\r\n '{YEAR}': year.toString(),\r\n '{YEAR:BE}': (year + 543).toString(),\r\n '{REV}': '0',\r\n };\r\n }\r\n\r\n private replaceTokens(\r\n template: string,\r\n tokens: DecodedTokens,\r\n sequence: number\r\n ): string {\r\n let result = template;\r\n for (const [key, value] of Object.entries(tokens)) {\r\n result = result.replace(\r\n new RegExp(key.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'g'),\r\n value\r\n );\r\n }\r\n const seqMatch = result.match(/{SEQ:(\\d+)}/);\r\n if (seqMatch) {\r\n const padding = Number(seqMatch[1]);\r\n result = result.replace(\r\n seqMatch[0],\r\n sequence.toString().padStart(padding, '0')\r\n );\r\n }\r\n return result;\r\n }\r\n\r\n private async resolveRecipientCode(recipientId?: number): Promise {\r\n if (!recipientId) return 'GEN';\r\n const org = await this.orgRepo.findOne({\r\n where: { id: recipientId },\r\n select: ['organizationCode'],\r\n });\r\n return org ? org.organizationCode : 'GEN';\r\n }\r\n\r\n private async resolveOrgCode(orgId?: number): Promise {\r\n if (!orgId) return 'GEN';\r\n const org = await this.orgRepo.findOne({\r\n where: { id: orgId },\r\n select: ['organizationCode'],\r\n });\r\n return org ? org.organizationCode : 'GEN';\r\n }\r\n\r\n private async resolveDisciplineCode(disciplineId?: number): Promise {\r\n if (!disciplineId) return 'GEN';\r\n const discipline = await this.disciplineRepo.findOne({\r\n where: { id: disciplineId },\r\n select: ['disciplineCode'],\r\n });\r\n return discipline ? discipline.disciplineCode : 'GEN';\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5b/notificationservice_5b6998e2dbfb353e9d8968e9721537e2 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5b/notificationservice_5b6998e2dbfb353e9d8968e9721537e2 new file mode 100644 index 0000000..c07fd06 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5b/notificationservice_5b6998e2dbfb353e9d8968e9721537e2 @@ -0,0 +1,167 @@ +71618f8e5523bff20164d182c296b221 +"use strict"; +// File: src/modules/notification/notification.service.ts +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var NotificationService_1; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.NotificationService = void 0; +const common_1 = require("@nestjs/common"); +const bullmq_1 = require("@nestjs/bullmq"); +const bullmq_2 = require("bullmq"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +// Entities +const notification_entity_1 = require("./entities/notification.entity"); +const user_entity_1 = require("../user/entities/user.entity"); +// Gateway +const notification_gateway_1 = require("./notification.gateway"); +let NotificationService = NotificationService_1 = class NotificationService { + constructor(notificationQueue, notificationRepo, userRepo, + // ไม่ต้อง Inject UserPrefRepo แล้ว เพราะ Processor จะจัดการเอง + notificationGateway) { + this.notificationQueue = notificationQueue; + this.notificationRepo = notificationRepo; + this.userRepo = userRepo; + this.notificationGateway = notificationGateway; + this.logger = new common_1.Logger(NotificationService_1.name); + } + /** + * ส่งการแจ้งเตือน (Centralized Notification Sender) + */ + async send(data) { + try { + // --------------------------------------------------------- + // 1. สร้าง Entity และบันทึกลง DB (System Log) + // --------------------------------------------------------- + const notification = this.notificationRepo.create({ + userId: data.userId, + title: data.title, + message: data.message, + notificationType: notification_entity_1.NotificationType.SYSTEM, + entityType: data.entityType, + entityId: data.entityId, + isRead: false, + }); + const savedNotification = await this.notificationRepo.save(notification); + // --------------------------------------------------------- + // 2. Real-time Push (WebSocket) + // --------------------------------------------------------- + this.notificationGateway.sendToUser(data.userId, savedNotification); + // --------------------------------------------------------- + // 3. Push Job ลง Redis BullMQ (Dispatch Logic) + // เปลี่ยนชื่อ Job เป็น 'dispatch-notification' ตาม Processor + // --------------------------------------------------------- + await this.notificationQueue.add('dispatch-notification', { + ...data, + notificationId: savedNotification.id, // ส่ง ID ไปด้วยเผื่อใช้ Tracking + }, { + attempts: 3, + backoff: { + type: 'exponential', + delay: 5000, + }, + removeOnComplete: true, + }); + this.logger.debug(`Dispatched notification job for user ${data.userId}`); + } + catch (error) { + this.logger.error(`Failed to process notification for user ${data.userId}`, error.stack); + } + } + // ... (ส่วน findAll, markAsRead, cleanupOldNotifications เหมือนเดิม ไม่ต้องแก้) ... + async findAll(userId, searchDto) { + const { page = 1, limit = 20, isRead } = searchDto; + const skip = (page - 1) * limit; + const queryBuilder = this.notificationRepo + .createQueryBuilder('notification') + .where('notification.userId = :userId', { userId }) + .orderBy('notification.createdAt', 'DESC') + .take(limit) + .skip(skip); + if (isRead !== undefined) { + queryBuilder.andWhere('notification.isRead = :isRead', { isRead }); + } + const [items, total] = await queryBuilder.getManyAndCount(); + const unreadCount = await this.notificationRepo.count({ + where: { userId, isRead: false }, + }); + return { + data: items, + meta: { + total, + page, + limit, + totalPages: Math.ceil(total / limit), + unreadCount, + }, + }; + } + /** + * ดึงจำนวน Notification ที่ยังไม่ได้อ่าน + */ + async getUnreadCount(userId) { + return this.notificationRepo.count({ + where: { userId, isRead: false }, + }); + } + async markAsRead(id, userId) { + const notification = await this.notificationRepo.findOne({ + where: { id, userId }, + }); + if (!notification) { + throw new common_1.NotFoundException(`Notification #${id} not found`); + } + if (!notification.isRead) { + notification.isRead = true; + await this.notificationRepo.save(notification); + } + } + async markAsReadByUuid(uuid, userId) { + const notification = await this.notificationRepo.findOne({ + where: { publicId: uuid, userId }, + }); + if (!notification) { + throw new common_1.NotFoundException(`Notification UUID ${uuid} not found`); + } + if (!notification.isRead) { + notification.isRead = true; + await this.notificationRepo.save(notification); + } + } + async markAllAsRead(userId) { + await this.notificationRepo.update({ userId, isRead: false }, { isRead: true }); + } + async cleanupOldNotifications(days = 90) { + const dateLimit = new Date(); + dateLimit.setDate(dateLimit.getDate() - days); + const result = await this.notificationRepo + .createQueryBuilder() + .delete() + .from(notification_entity_1.Notification) + .where('createdAt < :dateLimit', { dateLimit }) + .execute(); + this.logger.log(`Cleaned up ${result.affected} old notifications`); + return result.affected ?? 0; + } +}; +exports.NotificationService = NotificationService; +exports.NotificationService = NotificationService = NotificationService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, bullmq_1.InjectQueue)('notifications')), + __param(1, (0, typeorm_1.InjectRepository)(notification_entity_1.Notification)), + __param(2, (0, typeorm_1.InjectRepository)(user_entity_1.User)), + __metadata("design:paramtypes", [typeof (_a = typeof bullmq_2.Queue !== "undefined" && bullmq_2.Queue) === "function" ? _a : Object, typeof (_b = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _b : Object, typeof (_c = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _c : Object, typeof (_d = typeof notification_gateway_1.NotificationGateway !== "undefined" && notification_gateway_1.NotificationGateway) === "function" ? _d : Object]) +], NotificationService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbm90aWZpY2F0aW9uXFxub3RpZmljYXRpb24uc2VydmljZS50cyIsIm1hcHBpbmdzIjoiO0FBQUEseURBQXlEOzs7Ozs7Ozs7Ozs7Ozs7OztBQUV6RCwyQ0FBdUU7QUFDdkUsMkNBQTZDO0FBQzdDLG1DQUErQjtBQUMvQiw2Q0FBbUQ7QUFDbkQscUNBQXFDO0FBRXJDLFdBQVc7QUFDWCx3RUFBZ0Y7QUFDaEYsOERBQW9EO0FBRXBELFVBQVU7QUFDVixpRUFBNkQ7QUFpQnRELElBQU0sbUJBQW1CLDJCQUF6QixNQUFNLG1CQUFtQjtJQUc5QixZQUNnQyxpQkFBZ0MsRUFFOUQsZ0JBQWtELEVBRWxELFFBQWtDO0lBQ2xDLCtEQUErRDtJQUN2RCxtQkFBd0M7UUFOVixzQkFBaUIsR0FBakIsaUJBQWlCLENBQU87UUFFdEQscUJBQWdCLEdBQWhCLGdCQUFnQixDQUEwQjtRQUUxQyxhQUFRLEdBQVIsUUFBUSxDQUFrQjtRQUUxQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBVGpDLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxxQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQVU1RCxDQUFDO0lBRUo7O09BRUc7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQXlCO1FBQ2xDLElBQUksQ0FBQztZQUNILDREQUE0RDtZQUM1RCw4Q0FBOEM7WUFDOUMsNERBQTREO1lBQzVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7Z0JBQ2hELE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNqQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87Z0JBQ3JCLGdCQUFnQixFQUFFLHNDQUFnQixDQUFDLE1BQU07Z0JBQ3pDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDM0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2dC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QUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFDekIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQ2pCLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLHVCQUF1QixDQUFDLE9BQWUsRUFBRTtRQUM3QyxNQUFNLFNBQVMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQzdCLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBRTlDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQjthQUN2QyxrQkFBa0IsRUFBRTthQUNwQixNQUFNLEVBQUU7YUFDUixJQUFJLENBQUMsa0NBQVksQ0FBQzthQUNsQixLQUFLLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQzthQUM5QyxPQUFPLEVBQUUsQ0FBQztRQUViLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGNBQWMsTUFBTSxDQUFDLFFBQVEsb0JBQW9CLENBQUMsQ0FBQztRQUNuRSxPQUFPLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7Q0FDRixDQUFBO0FBaktZLGtEQUFtQjs4QkFBbkIsbUJBQW1CO0lBRC9CLElBQUEsbUJBQVUsR0FBRTtJQUtSLFdBQUEsSUFBQSxvQkFBVyxFQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQzVCLFdBQUEsSUFBQSwwQkFBZ0IsRUFBQyxrQ0FBWSxDQUFDLENBQUE7SUFFOUIsV0FBQSxJQUFBLDBCQUFnQixFQUFDLGtCQUFJLENBQUMsQ0FBQTt5REFIa0MsY0FBSyxvQkFBTCxjQUFLLG9EQUVwQyxvQkFBVSxvQkFBVixvQkFBVSxvREFFbEIsb0JBQVUsb0JBQVYsb0JBQVUsb0RBRUMsMENBQW1CLG9CQUFuQiwwQ0FBbUI7R0FWdkMsbUJBQW1CLENBaUsvQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxub3RpZmljYXRpb25cXG5vdGlmaWNhdGlvbi5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9tb2R1bGVzL25vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24uc2VydmljZS50c1xyXG5cclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgTG9nZ2VyLCBOb3RGb3VuZEV4Y2VwdGlvbiB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcclxuaW1wb3J0IHsgSW5qZWN0UXVldWUgfSBmcm9tICdAbmVzdGpzL2J1bGxtcSc7XHJcbmltcG9ydCB7IFF1ZXVlIH0gZnJvbSAnYnVsbG1xJztcclxuaW1wb3J0IHsgSW5qZWN0UmVwb3NpdG9yeSB9IGZyb20gJ0BuZXN0anMvdHlwZW9ybSc7XHJcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tICd0eXBlb3JtJztcclxuXHJcbi8vIEVudGl0aWVzXHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvbiwgTm90aWZpY2F0aW9uVHlwZSB9IGZyb20gJy4vZW50aXRpZXMvbm90aWZpY2F0aW9uLmVudGl0eSc7XHJcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi91c2VyL2VudGl0aWVzL3VzZXIuZW50aXR5JztcclxuXHJcbi8vIEdhdGV3YXlcclxuaW1wb3J0IHsgTm90aWZpY2F0aW9uR2F0ZXdheSB9IGZyb20gJy4vbm90aWZpY2F0aW9uLmdhdGV3YXknO1xyXG5cclxuLy8gRFRPc1xyXG5pbXBvcnQgeyBTZWFyY2hOb3RpZmljYXRpb25EdG8gfSBmcm9tICcuL2R0by9zZWFyY2gtbm90aWZpY2F0aW9uLmR0byc7XHJcblxyXG4vLyBJbnRlcmZhY2VzXHJcbmV4cG9ydCBpbnRlcmZhY2UgTm90aWZpY2F0aW9uSm9iRGF0YSB7XHJcbiAgdXNlcklkOiBudW1iZXI7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBtZXNzYWdlOiBzdHJpbmc7XHJcbiAgdHlwZTogJ0VNQUlMJyB8ICdMSU5FJyB8ICdTWVNURU0nOyAvLyDguIrguYjguK3guIfguJfguLLguIfguKvguKXguLHguIHguJfguLXguYjguJXguYnguK3guIfguIHguLLguKPguKrguYjguIcgKFRyaWdnZXIgVHlwZSlcclxuICBlbnRpdHlUeXBlPzogc3RyaW5nO1xyXG4gIGVudGl0eUlkPzogbnVtYmVyO1xyXG4gIGxpbms/OiBzdHJpbmc7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvblNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IExvZ2dlcihOb3RpZmljYXRpb25TZXJ2aWNlLm5hbWUpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3RRdWV1ZSgnbm90aWZpY2F0aW9ucycpIHByaXZhdGUgbm90aWZpY2F0aW9uUXVldWU6IFF1ZXVlLFxyXG4gICAgQEluamVjdFJlcG9zaXRvcnkoTm90aWZpY2F0aW9uKVxyXG4gICAgcHJpdmF0ZSBub3RpZmljYXRpb25SZXBvOiBSZXBvc2l0b3J5PE5vdGlmaWNhdGlvbj4sXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShVc2VyKVxyXG4gICAgcHJpdmF0ZSB1c2VyUmVwbzogUmVwb3NpdG9yeTxVc2VyPixcclxuICAgIC8vIOC5hOC4oeC5iOC4leC5ieC4reC4hyBJbmplY3QgVXNlclByZWZSZXBvIOC5geC4peC5ieC4pyDguYDguJ7guKPguLLguLAgUHJvY2Vzc29yIOC4iOC4sOC4iOC4seC4lOC4geC4suC4o+C5gOC4reC4h1xyXG4gICAgcHJpdmF0ZSBub3RpZmljYXRpb25HYXRld2F5OiBOb3RpZmljYXRpb25HYXRld2F5XHJcbiAgKSB7fVxyXG5cclxuICAvKipcclxuICAgKiDguKrguYjguIfguIHguLLguKPguYHguIjguYnguIfguYDguJXguLfguK3guJkgKENlbnRyYWxpemVkIE5vdGlmaWNhdGlvbiBTZW5kZXIpXHJcbiAgICovXHJcbiAgYXN5bmMgc2VuZChkYXRhOiBOb3RpZmljYXRpb25Kb2JEYXRhKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgLy8gMS4g4Liq4Lij4LmJ4Liy4LiHIEVudGl0eSDguYHguKXguLDguJrguLHguJnguJfguLbguIHguKXguIcgREIgKFN5c3RlbSBMb2cpXHJcbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICBjb25zdCBub3RpZmljYXRpb24gPSB0aGlzLm5vdGlmaWNhdGlvblJlcG8uY3JlYXRlKHtcclxuICAgICAgICB1c2VySWQ6IGRhdGEudXNlcklkLFxyXG4gICAgICAgIHRpdGxlOiBkYXRhLnRpdGxlLFxyXG4gICAgICAgIG1lc3NhZ2U6IGRhdGEubWVzc2FnZSxcclxuICAgICAgICBub3RpZmljYXRpb25UeXBlOiBOb3RpZmljYXRpb25UeXBlLlNZU1RFTSxcclxuICAgICAgICBlbnRpdHlUeXBlOiBkYXRhLmVudGl0eVR5cGUsXHJcbiAgICAgICAgZW50aXR5SWQ6IGRhdGEuZW50aXR5SWQsXHJcbiAgICAgICAgaXNSZWFkOiBmYWxzZSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBzYXZlZE5vdGlmaWNhdGlvbiA9IGF3YWl0IHRoaXMubm90aWZpY2F0aW9uUmVwby5zYXZlKG5vdGlmaWNhdGlvbik7XHJcblxyXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgLy8gMi4gUmVhbC10aW1lIFB1c2ggKFdlYlNvY2tldClcclxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uR2F0ZXdheS5zZW5kVG9Vc2VyKGRhdGEudXNlcklkLCBzYXZlZE5vdGlmaWNhdGlvbik7XHJcblxyXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgLy8gMy4gUHVzaCBKb2Ig4Lil4LiHIFJlZGlzIEJ1bGxNUSAoRGlzcGF0Y2ggTG9naWMpXHJcbiAgICAgIC8vIOC5gOC4m+C4peC4teC5iOC4ouC4meC4iuC4t+C5iOC4rSBKb2Ig4LmA4Lib4LmH4LiZICdkaXNwYXRjaC1ub3RpZmljYXRpb24nIOC4leC4suC4oSBQcm9jZXNzb3JcclxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgIGF3YWl0IHRoaXMubm90aWZpY2F0aW9uUXVldWUuYWRkKFxyXG4gICAgICAgICdkaXNwYXRjaC1ub3RpZmljYXRpb24nLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIC4uLmRhdGEsXHJcbiAgICAgICAgICBub3RpZmljYXRpb25JZDogc2F2ZWROb3RpZmljYXRpb24uaWQsIC8vIOC4quC5iOC4hyBJRCDguYTguJvguJTguYnguKfguKLguYDguJzguLfguYjguK3guYPguIrguYkgVHJhY2tpbmdcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGF0dGVtcHRzOiAzLFxyXG4gICAgICAgICAgYmFja29mZjoge1xyXG4gICAgICAgICAgICB0eXBlOiAnZXhwb25lbnRpYWwnLFxyXG4gICAgICAgICAgICBkZWxheTogNTAwMCxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICByZW1vdmVPbkNvbXBsZXRlOiB0cnVlLFxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuXHJcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBEaXNwYXRjaGVkIG5vdGlmaWNhdGlvbiBqb2IgZm9yIHVzZXIgJHtkYXRhLnVzZXJJZH1gKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxyXG4gICAgICAgIGBGYWlsZWQgdG8gcHJvY2VzcyBub3RpZmljYXRpb24gZm9yIHVzZXIgJHtkYXRhLnVzZXJJZH1gLFxyXG4gICAgICAgIChlcnJvciBhcyBFcnJvcikuc3RhY2tcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIC4uLiAo4Liq4LmI4Lin4LiZIGZpbmRBbGwsIG1hcmtBc1JlYWQsIGNsZWFudXBPbGROb3RpZmljYXRpb25zIOC5gOC4q+C4oeC4t+C4reC4meC5gOC4lOC4tOC4oSDguYTguKHguYjguJXguYnguK3guIfguYHguIHguYkpIC4uLlxyXG5cclxuICBhc3luYyBmaW5kQWxsKHVzZXJJZDogbnVtYmVyLCBzZWFyY2hEdG86IFNlYXJjaE5vdGlmaWNhdGlvbkR0bykge1xyXG4gICAgY29uc3QgeyBwYWdlID0gMSwgbGltaXQgPSAyMCwgaXNSZWFkIH0gPSBzZWFyY2hEdG87XHJcbiAgICBjb25zdCBza2lwID0gKHBhZ2UgLSAxKSAqIGxpbWl0O1xyXG5cclxuICAgIGNvbnN0IHF1ZXJ5QnVpbGRlciA9IHRoaXMubm90aWZpY2F0aW9uUmVwb1xyXG4gICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKCdub3RpZmljYXRpb24nKVxyXG4gICAgICAud2hlcmUoJ25vdGlmaWNhdGlvbi51c2VySWQgPSA6dXNlcklkJywgeyB1c2VySWQgfSlcclxuICAgICAgLm9yZGVyQnkoJ25vdGlmaWNhdGlvbi5jcmVhdGVkQXQnLCAnREVTQycpXHJcbiAgICAgIC50YWtlKGxpbWl0KVxyXG4gICAgICAuc2tpcChza2lwKTtcclxuXHJcbiAgICBpZiAoaXNSZWFkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcXVlcnlCdWlsZGVyLmFuZFdoZXJlKCdub3RpZmljYXRpb24uaXNSZWFkID0gOmlzUmVhZCcsIHsgaXNSZWFkIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IFtpdGVtcywgdG90YWxdID0gYXdhaXQgcXVlcnlCdWlsZGVyLmdldE1hbnlBbmRDb3VudCgpO1xyXG4gICAgY29uc3QgdW5yZWFkQ291bnQgPSBhd2FpdCB0aGlzLm5vdGlmaWNhdGlvblJlcG8uY291bnQoe1xyXG4gICAgICB3aGVyZTogeyB1c2VySWQsIGlzUmVhZDogZmFsc2UgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGRhdGE6IGl0ZW1zLFxyXG4gICAgICBtZXRhOiB7XHJcbiAgICAgICAgdG90YWwsXHJcbiAgICAgICAgcGFnZSxcclxuICAgICAgICBsaW1pdCxcclxuICAgICAgICB0b3RhbFBhZ2VzOiBNYXRoLmNlaWwodG90YWwgLyBsaW1pdCksXHJcbiAgICAgICAgdW5yZWFkQ291bnQsXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog4LiU4Li24LiH4LiI4Liz4LiZ4Lin4LiZIE5vdGlmaWNhdGlvbiDguJfguLXguYjguKLguLHguIfguYTguKHguYjguYTguJTguYnguK3guYjguLLguJlcclxuICAgKi9cclxuICBhc3luYyBnZXRVbnJlYWRDb3VudCh1c2VySWQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiB7XHJcbiAgICByZXR1cm4gdGhpcy5ub3RpZmljYXRpb25SZXBvLmNvdW50KHtcclxuICAgICAgd2hlcmU6IHsgdXNlcklkLCBpc1JlYWQ6IGZhbHNlIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG1hcmtBc1JlYWQoaWQ6IG51bWJlciwgdXNlcklkOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IGF3YWl0IHRoaXMubm90aWZpY2F0aW9uUmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgaWQsIHVzZXJJZCB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCFub3RpZmljYXRpb24pIHtcclxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBOb3RpZmljYXRpb24gIyR7aWR9IG5vdCBmb3VuZGApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghbm90aWZpY2F0aW9uLmlzUmVhZCkge1xyXG4gICAgICBub3RpZmljYXRpb24uaXNSZWFkID0gdHJ1ZTtcclxuICAgICAgYXdhaXQgdGhpcy5ub3RpZmljYXRpb25SZXBvLnNhdmUobm90aWZpY2F0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG1hcmtBc1JlYWRCeVV1aWQodXVpZDogc3RyaW5nLCB1c2VySWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgbm90aWZpY2F0aW9uID0gYXdhaXQgdGhpcy5ub3RpZmljYXRpb25SZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBwdWJsaWNJZDogdXVpZCwgdXNlcklkIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIW5vdGlmaWNhdGlvbikge1xyXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oYE5vdGlmaWNhdGlvbiBVVUlEICR7dXVpZH0gbm90IGZvdW5kYCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFub3RpZmljYXRpb24uaXNSZWFkKSB7XHJcbiAgICAgIG5vdGlmaWNhdGlvbi5pc1JlYWQgPSB0cnVlO1xyXG4gICAgICBhd2FpdCB0aGlzLm5vdGlmaWNhdGlvblJlcG8uc2F2ZShub3RpZmljYXRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgbWFya0FsbEFzUmVhZCh1c2VySWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5ub3RpZmljYXRpb25SZXBvLnVwZGF0ZShcclxuICAgICAgeyB1c2VySWQsIGlzUmVhZDogZmFsc2UgfSxcclxuICAgICAgeyBpc1JlYWQ6IHRydWUgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNsZWFudXBPbGROb3RpZmljYXRpb25zKGRheXM6IG51bWJlciA9IDkwKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIGNvbnN0IGRhdGVMaW1pdCA9IG5ldyBEYXRlKCk7XHJcbiAgICBkYXRlTGltaXQuc2V0RGF0ZShkYXRlTGltaXQuZ2V0RGF0ZSgpIC0gZGF5cyk7XHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ub3RpZmljYXRpb25SZXBvXHJcbiAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxyXG4gICAgICAuZGVsZXRlKClcclxuICAgICAgLmZyb20oTm90aWZpY2F0aW9uKVxyXG4gICAgICAud2hlcmUoJ2NyZWF0ZWRBdCA8IDpkYXRlTGltaXQnLCB7IGRhdGVMaW1pdCB9KVxyXG4gICAgICAuZXhlY3V0ZSgpO1xyXG5cclxuICAgIHRoaXMubG9nZ2VyLmxvZyhgQ2xlYW5lZCB1cCAke3Jlc3VsdC5hZmZlY3RlZH0gb2xkIG5vdGlmaWNhdGlvbnNgKTtcclxuICAgIHJldHVybiByZXN1bHQuYWZmZWN0ZWQgPz8gMDtcclxuICB9XHJcbn1cclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5b/notificationservice_5b6998e2dbfb353e9d8968e9721537e2.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5b/notificationservice_5b6998e2dbfb353e9d8968e9721537e2.map new file mode 100644 index 0000000..82349a7 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5b/notificationservice_5b6998e2dbfb353e9d8968e9721537e2.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\notification\\notification.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\notification\\notification.service.ts"],"sourcesContent":["// File: src/modules/notification/notification.service.ts\r\n\r\nimport { Injectable, Logger, NotFoundException } from '@nestjs/common';\r\nimport { InjectQueue } from '@nestjs/bullmq';\r\nimport { Queue } from 'bullmq';\r\nimport { InjectRepository } from '@nestjs/typeorm';\r\nimport { Repository } from 'typeorm';\r\n\r\n// Entities\r\nimport { Notification, NotificationType } from './entities/notification.entity';\r\nimport { User } from '../user/entities/user.entity';\r\n\r\n// Gateway\r\nimport { NotificationGateway } from './notification.gateway';\r\n\r\n// DTOs\r\nimport { SearchNotificationDto } from './dto/search-notification.dto';\r\n\r\n// Interfaces\r\nexport interface NotificationJobData {\r\n userId: number;\r\n title: string;\r\n message: string;\r\n type: 'EMAIL' | 'LINE' | 'SYSTEM'; // ช่องทางหลักที่ต้องการส่ง (Trigger Type)\r\n entityType?: string;\r\n entityId?: number;\r\n link?: string;\r\n}\r\n\r\n@Injectable()\r\nexport class NotificationService {\r\n private readonly logger = new Logger(NotificationService.name);\r\n\r\n constructor(\r\n @InjectQueue('notifications') private notificationQueue: Queue,\r\n @InjectRepository(Notification)\r\n private notificationRepo: Repository,\r\n @InjectRepository(User)\r\n private userRepo: Repository,\r\n // ไม่ต้อง Inject UserPrefRepo แล้ว เพราะ Processor จะจัดการเอง\r\n private notificationGateway: NotificationGateway\r\n ) {}\r\n\r\n /**\r\n * ส่งการแจ้งเตือน (Centralized Notification Sender)\r\n */\r\n async send(data: NotificationJobData): Promise {\r\n try {\r\n // ---------------------------------------------------------\r\n // 1. สร้าง Entity และบันทึกลง DB (System Log)\r\n // ---------------------------------------------------------\r\n const notification = this.notificationRepo.create({\r\n userId: data.userId,\r\n title: data.title,\r\n message: data.message,\r\n notificationType: NotificationType.SYSTEM,\r\n entityType: data.entityType,\r\n entityId: data.entityId,\r\n isRead: false,\r\n });\r\n\r\n const savedNotification = await this.notificationRepo.save(notification);\r\n\r\n // ---------------------------------------------------------\r\n // 2. Real-time Push (WebSocket)\r\n // ---------------------------------------------------------\r\n this.notificationGateway.sendToUser(data.userId, savedNotification);\r\n\r\n // ---------------------------------------------------------\r\n // 3. Push Job ลง Redis BullMQ (Dispatch Logic)\r\n // เปลี่ยนชื่อ Job เป็น 'dispatch-notification' ตาม Processor\r\n // ---------------------------------------------------------\r\n await this.notificationQueue.add(\r\n 'dispatch-notification',\r\n {\r\n ...data,\r\n notificationId: savedNotification.id, // ส่ง ID ไปด้วยเผื่อใช้ Tracking\r\n },\r\n {\r\n attempts: 3,\r\n backoff: {\r\n type: 'exponential',\r\n delay: 5000,\r\n },\r\n removeOnComplete: true,\r\n }\r\n );\r\n\r\n this.logger.debug(`Dispatched notification job for user ${data.userId}`);\r\n } catch (error) {\r\n this.logger.error(\r\n `Failed to process notification for user ${data.userId}`,\r\n (error as Error).stack\r\n );\r\n }\r\n }\r\n\r\n // ... (ส่วน findAll, markAsRead, cleanupOldNotifications เหมือนเดิม ไม่ต้องแก้) ...\r\n\r\n async findAll(userId: number, searchDto: SearchNotificationDto) {\r\n const { page = 1, limit = 20, isRead } = searchDto;\r\n const skip = (page - 1) * limit;\r\n\r\n const queryBuilder = this.notificationRepo\r\n .createQueryBuilder('notification')\r\n .where('notification.userId = :userId', { userId })\r\n .orderBy('notification.createdAt', 'DESC')\r\n .take(limit)\r\n .skip(skip);\r\n\r\n if (isRead !== undefined) {\r\n queryBuilder.andWhere('notification.isRead = :isRead', { isRead });\r\n }\r\n\r\n const [items, total] = await queryBuilder.getManyAndCount();\r\n const unreadCount = await this.notificationRepo.count({\r\n where: { userId, isRead: false },\r\n });\r\n\r\n return {\r\n data: items,\r\n meta: {\r\n total,\r\n page,\r\n limit,\r\n totalPages: Math.ceil(total / limit),\r\n unreadCount,\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * ดึงจำนวน Notification ที่ยังไม่ได้อ่าน\r\n */\r\n async getUnreadCount(userId: number): Promise {\r\n return this.notificationRepo.count({\r\n where: { userId, isRead: false },\r\n });\r\n }\r\n\r\n async markAsRead(id: number, userId: number): Promise {\r\n const notification = await this.notificationRepo.findOne({\r\n where: { id, userId },\r\n });\r\n\r\n if (!notification) {\r\n throw new NotFoundException(`Notification #${id} not found`);\r\n }\r\n\r\n if (!notification.isRead) {\r\n notification.isRead = true;\r\n await this.notificationRepo.save(notification);\r\n }\r\n }\r\n\r\n async markAsReadByUuid(uuid: string, userId: number): Promise {\r\n const notification = await this.notificationRepo.findOne({\r\n where: { publicId: uuid, userId },\r\n });\r\n\r\n if (!notification) {\r\n throw new NotFoundException(`Notification UUID ${uuid} not found`);\r\n }\r\n\r\n if (!notification.isRead) {\r\n notification.isRead = true;\r\n await this.notificationRepo.save(notification);\r\n }\r\n }\r\n\r\n async markAllAsRead(userId: number): Promise {\r\n await this.notificationRepo.update(\r\n { userId, isRead: false },\r\n { isRead: true }\r\n );\r\n }\r\n\r\n async cleanupOldNotifications(days: number = 90): Promise {\r\n const dateLimit = new Date();\r\n dateLimit.setDate(dateLimit.getDate() - days);\r\n\r\n const result = await this.notificationRepo\r\n .createQueryBuilder()\r\n .delete()\r\n .from(Notification)\r\n .where('createdAt < :dateLimit', { dateLimit })\r\n .execute();\r\n\r\n this.logger.log(`Cleaned up ${result.affected} old notifications`);\r\n return result.affected ?? 0;\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5d/v7_5db91ea355080bfa2d90ae5b5f2fb5a9 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5d/v7_5db91ea355080bfa2d90ae5b5f2fb5a9 new file mode 100644 index 0000000..7c7c69d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5d/v7_5db91ea355080bfa2d90ae5b5f2fb5a9 @@ -0,0 +1,71 @@ +eb3d4006b762ef4be4530cea42e90674 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.updateV7State = void 0; +const rng_js_1 = require("./rng.js"); +const stringify_js_1 = require("./stringify.js"); +const _state = {}; +function v7(options, buf, offset) { + let bytes; + if (options) { + bytes = v7Bytes(options.random ?? options.rng?.() ?? (0, rng_js_1.default)(), options.msecs, options.seq, buf, offset); + } + else { + const now = Date.now(); + const rnds = (0, rng_js_1.default)(); + updateV7State(_state, now, rnds); + bytes = v7Bytes(rnds, _state.msecs, _state.seq, buf, offset); + } + return buf ?? (0, stringify_js_1.unsafeStringify)(bytes); +} +function updateV7State(state, now, rnds) { + state.msecs ??= -Infinity; + state.seq ??= 0; + if (now > state.msecs) { + state.seq = (rnds[6] << 23) | (rnds[7] << 16) | (rnds[8] << 8) | rnds[9]; + state.msecs = now; + } + else { + state.seq = (state.seq + 1) | 0; + if (state.seq === 0) { + state.msecs++; + } + } + return state; +} +exports.updateV7State = updateV7State; +function v7Bytes(rnds, msecs, seq, buf, offset = 0) { + if (rnds.length < 16) { + throw new Error('Random bytes length must be >= 16'); + } + if (!buf) { + buf = new Uint8Array(16); + offset = 0; + } + else { + if (offset < 0 || offset + 16 > buf.length) { + throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`); + } + } + msecs ??= Date.now(); + seq ??= ((rnds[6] * 0x7f) << 24) | (rnds[7] << 16) | (rnds[8] << 8) | rnds[9]; + buf[offset++] = (msecs / 0x10000000000) & 0xff; + buf[offset++] = (msecs / 0x100000000) & 0xff; + buf[offset++] = (msecs / 0x1000000) & 0xff; + buf[offset++] = (msecs / 0x10000) & 0xff; + buf[offset++] = (msecs / 0x100) & 0xff; + buf[offset++] = msecs & 0xff; + buf[offset++] = 0x70 | ((seq >>> 28) & 0x0f); + buf[offset++] = (seq >>> 20) & 0xff; + buf[offset++] = 0x80 | ((seq >>> 14) & 0x3f); + buf[offset++] = (seq >>> 6) & 0xff; + buf[offset++] = ((seq << 2) & 0xff) | (rnds[10] & 0x03); + buf[offset++] = rnds[11]; + buf[offset++] = rnds[12]; + buf[offset++] = rnds[13]; + buf[offset++] = rnds[14]; + buf[offset++] = rnds[15]; + return buf; +} +exports.default = v7; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdjcuanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDO0FBQ2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUQsT0FBTyxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUMvQixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDckMsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDakQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLFNBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTTtJQUM1QixJQUFJLEtBQUssQ0FBQztJQUNWLElBQUksT0FBTyxFQUFFLENBQUM7UUFDVixLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzSCxDQUFDO1NBQ0ksQ0FBQztRQUNGLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN2QixNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNyQyxhQUFhLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqQyxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxH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Q0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQztJQUN2QyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQzdCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQzdDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNwQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUM3QyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDbkMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUN4RCxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDekIsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6QixHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDekIsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pCLE9BQU8sR0FBRyxDQUFDO0FBQ2YsQ0FBQztBQUNELE9BQU8sQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxub2RlX21vZHVsZXNcXC5wbnBtXFx1dWlkQDExLjEuMFxcbm9kZV9tb2R1bGVzXFx1dWlkXFxkaXN0XFxjanNcXHY3LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy51cGRhdGVWN1N0YXRlID0gdm9pZCAwO1xuY29uc3Qgcm5nX2pzXzEgPSByZXF1aXJlKFwiLi9ybmcuanNcIik7XG5jb25zdCBzdHJpbmdpZnlfanNfMSA9IHJlcXVpcmUoXCIuL3N0cmluZ2lmeS5qc1wiKTtcbmNvbnN0IF9zdGF0ZSA9IHt9O1xuZnVuY3Rpb24gdjcob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgICBsZXQgYnl0ZXM7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgYnl0ZXMgPSB2N0J5dGVzKG9wdGlvbnMucmFuZG9tID8/IG9wdGlvbnMucm5nPy4oKSA/PyAoMCwgcm5nX2pzXzEuZGVmYXVsdCkoKSwgb3B0aW9ucy5tc2Vjcywgb3B0aW9ucy5zZXEsIGJ1Ziwgb2Zmc2V0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHJuZHMgPSAoMCwgcm5nX2pzXzEuZGVmYXVsdCkoKTtcbiAgICAgICAgdXBkYXRlVjdTdGF0ZShfc3RhdGUsIG5vdywgcm5kcyk7XG4gICAgICAgIGJ5dGVzID0gdjdCeXRlcyhybmRzLCBfc3RhdGUubXNlY3MsIF9zdGF0ZS5zZXEsIGJ1Ziwgb2Zmc2V0KTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZiA/PyAoMCwgc3RyaW5naWZ5X2pzXzEudW5zYWZlU3RyaW5naWZ5KShieXRlcyk7XG59XG5mdW5jdGlvbiB1cGRhdGVWN1N0YXRlKHN0YXRlLCBub3csIHJuZHMpIHtcbiAgICBzdGF0ZS5tc2VjcyA/Pz0gLUluZmluaXR5O1xuICAgIHN0YXRlLnNlcSA/Pz0gMDtcbiAgICBpZiAobm93ID4gc3RhdGUubXNlY3MpIHtcbiAgICAgICAgc3RhdGUuc2VxID0gKHJuZHNbNl0gPDwgMjMpIHwgKHJuZHNbN10gPDwgMTYpIHwgKHJuZHNbOF0gPDwgOCkgfCBybmRzWzldO1xuICAgICAgICBzdGF0ZS5tc2VjcyA9IG5vdztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHN0YXRlLnNlcSA9IChzdGF0ZS5zZXEgKyAxKSB8IDA7XG4gICAgICAgIGlmIChzdGF0ZS5zZXEgPT09IDApIHtcbiAgICAgICAgICAgIHN0YXRlLm1zZWNzKys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlO1xufVxuZXhwb3J0cy51cGRhdGVWN1N0YXRlID0gdXBkYXRlVjdTdGF0ZTtcbmZ1bmN0aW9uIHY3Qnl0ZXMocm5kcywgbXNlY3MsIHNlcSwgYnVmLCBvZmZzZXQgPSAwKSB7XG4gICAgaWYgKHJuZHMubGVuZ3RoIDwgMTYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSYW5kb20gYnl0ZXMgbGVuZ3RoIG11c3QgYmUgPj0gMTYnKTtcbiAgICB9XG4gICAgaWYgKCFidWYpIHtcbiAgICAgICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuICAgICAgICBvZmZzZXQgPSAwO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICsgMTYgPiBidWYubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVVVJRCBieXRlIHJhbmdlICR7b2Zmc2V0fToke29mZnNldCArIDE1fSBpcyBvdXQgb2YgYnVmZmVyIGJvdW5kc2ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1zZWNzID8/PSBEYXRlLm5vdygpO1xuICAgIHNlcSA/Pz0gKChybmRzWzZdICogMHg3ZikgPDwgMjQpIHwgKHJuZHNbN10gPDwgMTYpIHwgKHJuZHNbOF0gPDwgOCkgfCBybmRzWzldO1xuICAgIGJ1ZltvZmZzZXQrK10gPSAobXNlY3MgLyAweDEwMDAwMDAwMDAwKSAmIDB4ZmY7XG4gICAgYnVmW29mZnNldCsrXSA9IChtc2VjcyAvIDB4MTAwMDAwMDAwKSAmIDB4ZmY7XG4gICAgYnVmW29mZnNldCsrXSA9IChtc2VjcyAvIDB4MTAwMDAwMCkgJiAweGZmO1xuICAgIGJ1ZltvZmZzZXQrK10gPSAobXNlY3MgLyAweDEwMDAwKSAmIDB4ZmY7XG4gICAgYnVmW29mZnNldCsrXSA9IChtc2VjcyAvIDB4MTAwKSAmIDB4ZmY7XG4gICAgYnVmW29mZnNldCsrXSA9IG1zZWNzICYgMHhmZjtcbiAgICBidWZbb2Zmc2V0KytdID0gMHg3MCB8ICgoc2VxID4+PiAyOCkgJiAweDBmKTtcbiAgICBidWZbb2Zmc2V0KytdID0gKHNlcSA+Pj4gMjApICYgMHhmZjtcbiAgICBidWZbb2Zmc2V0KytdID0gMHg4MCB8ICgoc2VxID4+PiAxNCkgJiAweDNmKTtcbiAgICBidWZbb2Zmc2V0KytdID0gKHNlcSA+Pj4gNikgJiAweGZmO1xuICAgIGJ1ZltvZmZzZXQrK10gPSAoKHNlcSA8PCAyKSAmIDB4ZmYpIHwgKHJuZHNbMTBdICYgMHgwMyk7XG4gICAgYnVmW29mZnNldCsrXSA9IHJuZHNbMTFdO1xuICAgIGJ1ZltvZmZzZXQrK10gPSBybmRzWzEyXTtcbiAgICBidWZbb2Zmc2V0KytdID0gcm5kc1sxM107XG4gICAgYnVmW29mZnNldCsrXSA9IHJuZHNbMTRdO1xuICAgIGJ1ZltvZmZzZXQrK10gPSBybmRzWzE1XTtcbiAgICByZXR1cm4gYnVmO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gdjc7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5d/v7_5db91ea355080bfa2d90ae5b5f2fb5a9.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5d/v7_5db91ea355080bfa2d90ae5b5f2fb5a9.map new file mode 100644 index 0000000..172d06c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5d/v7_5db91ea355080bfa2d90ae5b5f2fb5a9.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v7.js","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v7.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.updateV7State = void 0;\nconst rng_js_1 = require(\"./rng.js\");\nconst stringify_js_1 = require(\"./stringify.js\");\nconst _state = {};\nfunction v7(options, buf, offset) {\n let bytes;\n if (options) {\n bytes = v7Bytes(options.random ?? options.rng?.() ?? (0, rng_js_1.default)(), options.msecs, options.seq, buf, offset);\n }\n else {\n const now = Date.now();\n const rnds = (0, rng_js_1.default)();\n updateV7State(_state, now, rnds);\n bytes = v7Bytes(rnds, _state.msecs, _state.seq, buf, offset);\n }\n return buf ?? (0, stringify_js_1.unsafeStringify)(bytes);\n}\nfunction updateV7State(state, now, rnds) {\n state.msecs ??= -Infinity;\n state.seq ??= 0;\n if (now > state.msecs) {\n state.seq = (rnds[6] << 23) | (rnds[7] << 16) | (rnds[8] << 8) | rnds[9];\n state.msecs = now;\n }\n else {\n state.seq = (state.seq + 1) | 0;\n if (state.seq === 0) {\n state.msecs++;\n }\n }\n return state;\n}\nexports.updateV7State = updateV7State;\nfunction v7Bytes(rnds, msecs, seq, buf, offset = 0) {\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n if (!buf) {\n buf = new Uint8Array(16);\n offset = 0;\n }\n else {\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n }\n msecs ??= Date.now();\n seq ??= ((rnds[6] * 0x7f) << 24) | (rnds[7] << 16) | (rnds[8] << 8) | rnds[9];\n buf[offset++] = (msecs / 0x10000000000) & 0xff;\n buf[offset++] = (msecs / 0x100000000) & 0xff;\n buf[offset++] = (msecs / 0x1000000) & 0xff;\n buf[offset++] = (msecs / 0x10000) & 0xff;\n buf[offset++] = (msecs / 0x100) & 0xff;\n buf[offset++] = msecs & 0xff;\n buf[offset++] = 0x70 | ((seq >>> 28) & 0x0f);\n buf[offset++] = (seq >>> 20) & 0xff;\n buf[offset++] = 0x80 | ((seq >>> 14) & 0x3f);\n buf[offset++] = (seq >>> 6) & 0xff;\n buf[offset++] = ((seq << 2) & 0xff) | (rnds[10] & 0x03);\n buf[offset++] = rnds[11];\n buf[offset++] = rnds[12];\n buf[offset++] = rnds[13];\n buf[offset++] = rnds[14];\n buf[offset++] = rnds[15];\n return buf;\n}\nexports.default = v7;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5f/migratedatadto_5fc4702b52b0731b76c9c1d9c0d34cee b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5f/migratedatadto_5fc4702b52b0731b76c9c1d9c0d34cee new file mode 100644 index 0000000..54c3ede --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5f/migratedatadto_5fc4702b52b0731b76c9c1d9c0d34cee @@ -0,0 +1,35 @@ +283f28c845208088054a4cdeae6543c2 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MigrateDataDto = void 0; +// File: src/modules/json-schema/dto/migrate-data.dto.ts +const class_validator_1 = require("class-validator"); +const swagger_1 = require("@nestjs/swagger"); +class MigrateDataDto { +} +exports.MigrateDataDto = MigrateDataDto; +__decorate([ + (0, swagger_1.ApiProperty)({ description: 'The schema code to migrate to (e.g., RFA_DWG)' }), + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], MigrateDataDto.prototype, "targetSchemaCode", void 0); +__decorate([ + (0, swagger_1.ApiProperty)({ + description: 'Target version. If omitted, migrates to latest.', + required: false, + }), + (0, class_validator_1.IsInt)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], MigrateDataDto.prototype, "targetVersion", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcanNvbi1zY2hlbWFcXGR0b1xcbWlncmF0ZS1kYXRhLmR0by50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSx3REFBd0Q7QUFDeEQscURBQTBFO0FBQzFFLDZDQUE4QztBQUU5QyxNQUFhLGNBQWM7Q0FhMUI7QUFiRCx3Q0FhQztBQVRDO0lBSEMsSUFBQSxxQkFBVyxFQUFDLEVBQUUsV0FBVyxFQUFFLCtDQUErQyxFQUFFLENBQUM7SUFDN0UsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzt3REFDYTtBQVExQjtJQU5DLElBQUEscUJBQVcsRUFBQztRQUNYLFdBQVcsRUFBRSxpREFBaUQ7UUFDOUQsUUFBUSxFQUFFLEtBQUs7S0FDaEIsQ0FBQztJQUNELElBQUEsdUJBQUssR0FBRTtJQUNQLElBQUEsNEJBQVUsR0FBRTs7cURBQ1UiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcanNvbi1zY2hlbWFcXGR0b1xcbWlncmF0ZS1kYXRhLmR0by50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGaWxlOiBzcmMvbW9kdWxlcy9qc29uLXNjaGVtYS9kdG8vbWlncmF0ZS1kYXRhLmR0by50c1xuaW1wb3J0IHsgSXNTdHJpbmcsIElzTm90RW1wdHksIElzSW50LCBJc09wdGlvbmFsIH0gZnJvbSAnY2xhc3MtdmFsaWRhdG9yJztcbmltcG9ydCB7IEFwaVByb3BlcnR5IH0gZnJvbSAnQG5lc3Rqcy9zd2FnZ2VyJztcblxuZXhwb3J0IGNsYXNzIE1pZ3JhdGVEYXRhRHRvIHtcbiAgQEFwaVByb3BlcnR5KHsgZGVzY3JpcHRpb246ICdUaGUgc2NoZW1hIGNvZGUgdG8gbWlncmF0ZSB0byAoZS5nLiwgUkZBX0RXRyknIH0pXG4gIEBJc1N0cmluZygpXG4gIEBJc05vdEVtcHR5KClcbiAgdGFyZ2V0U2NoZW1hQ29kZSE6IHN0cmluZztcblxuICBAQXBpUHJvcGVydHkoe1xuICAgIGRlc2NyaXB0aW9uOiAnVGFyZ2V0IHZlcnNpb24uIElmIG9taXR0ZWQsIG1pZ3JhdGVzIHRvIGxhdGVzdC4nLFxuICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgfSlcbiAgQElzSW50KClcbiAgQElzT3B0aW9uYWwoKVxuICB0YXJnZXRWZXJzaW9uPzogbnVtYmVyO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5f/migratedatadto_5fc4702b52b0731b76c9c1d9c0d34cee.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5f/migratedatadto_5fc4702b52b0731b76c9c1d9c0d34cee.map new file mode 100644 index 0000000..9b85bbd --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5f/migratedatadto_5fc4702b52b0731b76c9c1d9c0d34cee.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\dto\\migrate-data.dto.ts","mappings":";;;;;;;;;;;;AAAA,wDAAwD;AACxD,qDAA0E;AAC1E,6CAA8C;AAE9C,MAAa,cAAc;CAa1B;AAbD,wCAaC;AATC;IAHC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,+CAA+C,EAAE,CAAC;IAC7E,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;wDACa;AAQ1B;IANC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,iDAAiD;QAC9D,QAAQ,EAAE,KAAK;KAChB,CAAC;IACD,IAAA,uBAAK,GAAE;IACP,IAAA,4BAAU,GAAE;;qDACU","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\dto\\migrate-data.dto.ts"],"sourcesContent":["// File: src/modules/json-schema/dto/migrate-data.dto.ts\nimport { IsString, IsNotEmpty, IsInt, IsOptional } from 'class-validator';\nimport { ApiProperty } from '@nestjs/swagger';\n\nexport class MigrateDataDto {\n @ApiProperty({ description: 'The schema code to migrate to (e.g., RFA_DWG)' })\n @IsString()\n @IsNotEmpty()\n targetSchemaCode!: string;\n\n @ApiProperty({\n description: 'Target version. If omitted, migrates to latest.',\n required: false,\n })\n @IsInt()\n @IsOptional()\n targetVersion?: number;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5f/uuidresolverservicespec_5faf19cc6799478d39fbda80519f078b b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5f/uuidresolverservicespec_5faf19cc6799478d39fbda80519f078b new file mode 100644 index 0000000..f1095c1 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5f/uuidresolverservicespec_5faf19cc6799478d39fbda80519f078b @@ -0,0 +1,133 @@ +86b4a9559480f8717f69dba7fa773e7a +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +// Mock uuid module to avoid ESM import issue with uuid@13 +jest.mock('uuid', () => ({ + validate: (str) => /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(str), + v7: () => '01912345-6789-7abc-8def-0123456789ab', +})); +const testing_1 = require("@nestjs/testing"); +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("typeorm"); +const uuid_resolver_service_1 = require("./uuid-resolver.service"); +describe('UuidResolverService', () => { + let service; + let mockQuery; + beforeEach(async () => { + mockQuery = jest.fn(); + const module = await testing_1.Test.createTestingModule({ + providers: [ + uuid_resolver_service_1.UuidResolverService, + { + provide: typeorm_1.DataSource, + useValue: { + manager: { query: mockQuery }, + }, + }, + ], + }).compile(); + service = module.get(uuid_resolver_service_1.UuidResolverService); + }); + afterEach(() => jest.clearAllMocks()); + // ========================================================== + // resolve() — Core generic resolver + // ========================================================== + describe('resolve()', () => { + it('should return number directly when value is a number', async () => { + const result = await service.resolve('Project', 'projects', 'id', 42); + expect(result).toBe(42); + expect(mockQuery).not.toHaveBeenCalled(); + }); + it('should parse numeric string and return number', async () => { + const result = await service.resolve('Project', 'projects', 'id', '99'); + expect(result).toBe(99); + expect(mockQuery).not.toHaveBeenCalled(); + }); + it('should look up UUID string and return PK from DB', async () => { + const uuid = '01912345-6789-7abc-8def-0123456789ab'; + mockQuery.mockResolvedValue([{ id: 7 }]); + const result = await service.resolve('Project', 'projects', 'id', uuid); + expect(result).toBe(7); + expect(mockQuery).toHaveBeenCalledWith('SELECT `id` FROM `projects` WHERE `uuid` = ? LIMIT 1', [uuid]); + }); + it('should throw NotFoundException for invalid UUID string', async () => { + await expect(service.resolve('Project', 'projects', 'id', 'not-a-uuid')).rejects.toThrow(common_1.NotFoundException); + expect(mockQuery).not.toHaveBeenCalled(); + }); + it('should throw NotFoundException when UUID not found in DB', async () => { + const uuid = '01912345-6789-7abc-8def-0123456789ab'; + mockQuery.mockResolvedValue([]); + await expect(service.resolve('Project', 'projects', 'id', uuid)).rejects.toThrow(common_1.NotFoundException); + }); + }); + // ========================================================== + // Named convenience resolvers + // ========================================================== + describe('resolveProjectId()', () => { + it('should delegate to resolve with projects table', async () => { + const result = await service.resolveProjectId(5); + expect(result).toBe(5); + }); + it('should look up UUID for project', async () => { + const uuid = '01912345-6789-7abc-8def-0123456789ab'; + mockQuery.mockResolvedValue([{ id: 5 }]); + const result = await service.resolveProjectId(uuid); + expect(result).toBe(5); + expect(mockQuery).toHaveBeenCalledWith('SELECT `id` FROM `projects` WHERE `uuid` = ? LIMIT 1', [uuid]); + }); + }); + describe('resolveOrganizationId()', () => { + it('should delegate to resolve with organizations table', async () => { + const uuid = '01912345-6789-7abc-8def-0123456789ab'; + mockQuery.mockResolvedValue([{ id: 3 }]); + const result = await service.resolveOrganizationId(uuid); + expect(result).toBe(3); + expect(mockQuery).toHaveBeenCalledWith('SELECT `id` FROM `organizations` WHERE `uuid` = ? LIMIT 1', [uuid]); + }); + }); + describe('resolveCorrespondenceId()', () => { + it('should delegate to resolve with correspondences table', async () => { + const uuid = '01912345-6789-7abc-8def-0123456789ab'; + mockQuery.mockResolvedValue([{ id: 10 }]); + const result = await service.resolveCorrespondenceId(uuid); + expect(result).toBe(10); + expect(mockQuery).toHaveBeenCalledWith('SELECT `id` FROM `correspondences` WHERE `uuid` = ? LIMIT 1', [uuid]); + }); + }); + describe('resolveUserId()', () => { + it('should use user_id as PK column', async () => { + const uuid = '01912345-6789-7abc-8def-0123456789ab'; + mockQuery.mockResolvedValue([{ user_id: 8 }]); + const result = await service.resolveUserId(uuid); + expect(result).toBe(8); + expect(mockQuery).toHaveBeenCalledWith('SELECT `user_id` FROM `users` WHERE `uuid` = ? LIMIT 1', [uuid]); + }); + }); + describe('resolveContractId()', () => { + it('should delegate to resolve with contracts table', async () => { + const uuid = '01912345-6789-7abc-8def-0123456789ab'; + mockQuery.mockResolvedValue([{ id: 2 }]); + const result = await service.resolveContractId(uuid); + expect(result).toBe(2); + expect(mockQuery).toHaveBeenCalledWith('SELECT `id` FROM `contracts` WHERE `uuid` = ? LIMIT 1', [uuid]); + }); + }); + // ========================================================== + // Edge cases + // ========================================================== + describe('edge cases', () => { + it('should handle zero as a valid number', async () => { + const result = await service.resolve('Project', 'projects', 'id', 0); + expect(result).toBe(0); + }); + it('should handle string "0" as numeric', async () => { + const result = await service.resolve('Project', 'projects', 'id', '0'); + expect(result).toBe(0); + }); + it('should handle negative number', async () => { + const result = await service.resolve('Project', 'projects', 'id', -1); + expect(result).toBe(-1); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxzZXJ2aWNlc1xcdXVpZC1yZXNvbHZlci5zZXJ2aWNlLnNwZWMudHMiLCJtYXBwaW5ncyI6Ijs7QUFLQSwwREFBMEQ7QUFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUN2QixRQUFRLEVBQUUsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUN4QixpRUFBaUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQzdFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxzQ0FBc0M7Q0FDakQsQ0FBQyxDQUFDLENBQUM7QUFWSiw2Q0FBc0Q7QUFDdEQsMkNBQW1EO0FBQ25ELHFDQUFxQztBQUNyQyxtRUFBOEQ7QUFTOUQsUUFBUSxDQUFDLHFCQUFxQixFQUFFLEdBQUcsRUFBRTtJQUNuQyxJQUFJLE9BQTRCLENBQUM7SUFDakMsSUFBSSxTQUFvQixDQUFDO0lBRXpCLFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNwQixTQUFTLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBRXRCLE1BQU0sTUFBTSxHQUFrQixNQUFNLGNBQUksQ0FBQyxtQkFBbUIsQ0FBQztZQUMzRCxTQUFTLEVBQUU7Z0JBQ1QsMkNBQW1CO2dCQUNuQjtvQkFDRSxPQUFPLEVBQUUsb0JBQVU7b0JBQ25CLFFBQVEsRUFBRTt3QkFDUixPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO3FCQUM5QjtpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRWIsT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQXNCLDJDQUFtQixDQUFDLENBQUM7SUFDakUsQ0FBQyxDQUFDLENBQUM7SUFFSCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFFdEMsNkRBQTZEO0lBQzdELG9DQUFvQztJQUNwQyw2REFBNkQ7SUFF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Q0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxzZXJ2aWNlc1xcdXVpZC1yZXNvbHZlci5zZXJ2aWNlLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVzdCwgVGVzdGluZ01vZHVsZSB9IGZyb20gJ0BuZXN0anMvdGVzdGluZyc7XG5pbXBvcnQgeyBOb3RGb3VuZEV4Y2VwdGlvbiB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcbmltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFV1aWRSZXNvbHZlclNlcnZpY2UgfSBmcm9tICcuL3V1aWQtcmVzb2x2ZXIuc2VydmljZSc7XG5cbi8vIE1vY2sgdXVpZCBtb2R1bGUgdG8gYXZvaWQgRVNNIGltcG9ydCBpc3N1ZSB3aXRoIHV1aWRAMTNcbmplc3QubW9jaygndXVpZCcsICgpID0+ICh7XG4gIHZhbGlkYXRlOiAoc3RyOiBzdHJpbmcpID0+XG4gICAgL15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kL2kudGVzdChzdHIpLFxuICB2NzogKCkgPT4gJzAxOTEyMzQ1LTY3ODktN2FiYy04ZGVmLTAxMjM0NTY3ODlhYicsXG59KSk7XG5cbmRlc2NyaWJlKCdVdWlkUmVzb2x2ZXJTZXJ2aWNlJywgKCkgPT4ge1xuICBsZXQgc2VydmljZTogVXVpZFJlc29sdmVyU2VydmljZTtcbiAgbGV0IG1vY2tRdWVyeTogamVzdC5Nb2NrO1xuXG4gIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tRdWVyeSA9IGplc3QuZm4oKTtcblxuICAgIGNvbnN0IG1vZHVsZTogVGVzdGluZ01vZHVsZSA9IGF3YWl0IFRlc3QuY3JlYXRlVGVzdGluZ01vZHVsZSh7XG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgVXVpZFJlc29sdmVyU2VydmljZSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IERhdGFTb3VyY2UsXG4gICAgICAgICAgdXNlVmFsdWU6IHtcbiAgICAgICAgICAgIG1hbmFnZXI6IHsgcXVlcnk6IG1vY2tRdWVyeSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pLmNvbXBpbGUoKTtcblxuICAgIHNlcnZpY2UgPSBtb2R1bGUuZ2V0PFV1aWRSZXNvbHZlclNlcnZpY2U+KFV1aWRSZXNvbHZlclNlcnZpY2UpO1xuICB9KTtcblxuICBhZnRlckVhY2goKCkgPT4gamVzdC5jbGVhckFsbE1vY2tzKCkpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gcmVzb2x2ZSgpIOKAlCBDb3JlIGdlbmVyaWMgcmVzb2x2ZXJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGRlc2NyaWJlKCdyZXNvbHZlKCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gbnVtYmVyIGRpcmVjdGx5IHdoZW4gdmFsdWUgaXMgYSBudW1iZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXJ2aWNlLnJlc29sdmUoJ1Byb2plY3QnLCAncHJvamVjdHMnLCAnaWQnLCA0Mik7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKDQyKTtcbiAgICAgIGV4cGVjdChtb2NrUXVlcnkpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIG51bWVyaWMgc3RyaW5nIGFuZCByZXR1cm4gbnVtYmVyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VydmljZS5yZXNvbHZlKCdQcm9qZWN0JywgJ3Byb2plY3RzJywgJ2lkJywgJzk5Jyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKDk5KTtcbiAgICAgIGV4cGVjdChtb2NrUXVlcnkpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGxvb2sgdXAgVVVJRCBzdHJpbmcgYW5kIHJldHVybiBQSyBmcm9tIERCJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXVpZCA9ICcwMTkxMjM0NS02Nzg5LTdhYmMtOGRlZi0wMTIzNDU2Nzg5YWInO1xuICAgICAgbW9ja1F1ZXJ5Lm1vY2tSZXNvbHZlZFZhbHVlKFt7IGlkOiA3IH1dKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VydmljZS5yZXNvbHZlKCdQcm9qZWN0JywgJ3Byb2plY3RzJywgJ2lkJywgdXVpZCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKDcpO1xuICAgICAgZXhwZWN0KG1vY2tRdWVyeSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgICdTRUxFQ1QgYGlkYCBGUk9NIGBwcm9qZWN0c2AgV0hFUkUgYHV1aWRgID0gPyBMSU1JVCAxJyxcbiAgICAgICAgW3V1aWRdXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBOb3RGb3VuZEV4Y2VwdGlvbiBmb3IgaW52YWxpZCBVVUlEIHN0cmluZycsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGV4cGVjdChcbiAgICAgICAgc2VydmljZS5yZXNvbHZlKCdQcm9qZWN0JywgJ3Byb2plY3RzJywgJ2lkJywgJ25vdC1hLXV1aWQnKVxuICAgICAgKS5yZWplY3RzLnRvVGhyb3coTm90Rm91bmRFeGNlcHRpb24pO1xuICAgICAgZXhwZWN0KG1vY2tRdWVyeSkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgTm90Rm91bmRFeGNlcHRpb24gd2hlbiBVVUlEIG5vdCBmb3VuZCBpbiBEQicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHV1aWQgPSAnMDE5MTIzNDUtNjc4OS03YWJjLThkZWYtMDEyMzQ1Njc4OWFiJztcbiAgICAgIG1vY2tRdWVyeS5tb2NrUmVzb2x2ZWRWYWx1ZShbXSk7XG5cbiAgICAgIGF3YWl0IGV4cGVjdChcbiAgICAgICAgc2VydmljZS5yZXNvbHZlKCdQcm9qZWN0JywgJ3Byb2plY3RzJywgJ2lkJywgdXVpZClcbiAgICAgICkucmVqZWN0cy50b1Rocm93KE5vdEZvdW5kRXhjZXB0aW9uKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBOYW1lZCBjb252ZW5pZW5jZSByZXNvbHZlcnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGRlc2NyaWJlKCdyZXNvbHZlUHJvamVjdElkKCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBkZWxlZ2F0ZSB0byByZXNvbHZlIHdpdGggcHJvamVjdHMgdGFibGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXJ2aWNlLnJlc29sdmVQcm9qZWN0SWQoNSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKDUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBsb29rIHVwIFVVSUQgZm9yIHByb2plY3QnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1dWlkID0gJzAxOTEyMzQ1LTY3ODktN2FiYy04ZGVmLTAxMjM0NTY3ODlhYic7XG4gICAgICBtb2NrUXVlcnkubW9ja1Jlc29sdmVkVmFsdWUoW3sgaWQ6IDUgfV0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXJ2aWNlLnJlc29sdmVQcm9qZWN0SWQodXVpZCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKDUpO1xuICAgICAgZXhwZWN0KG1vY2tRdWVyeSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgICdTRUxFQ1QgYGlkYCBGUk9NIGBwcm9qZWN0c2AgV0hFUkUgYHV1aWRgID0gPyBMSU1JVCAxJyxcbiAgICAgICAgW3V1aWRdXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVzb2x2ZU9yZ2FuaXphdGlvbklkKCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBkZWxlZ2F0ZSB0byByZXNvbHZlIHdpdGggb3JnYW5pemF0aW9ucyB0YWJsZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHV1aWQgPSAnMDE5MTIzNDUtNjc4OS03YWJjLThkZWYtMDEyMzQ1Njc4OWFiJztcbiAgICAgIG1vY2tRdWVyeS5tb2NrUmVzb2x2ZWRWYWx1ZShbeyBpZDogMyB9XSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlcnZpY2UucmVzb2x2ZU9yZ2FuaXphdGlvbklkKHV1aWQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgzKTtcbiAgICAgIGV4cGVjdChtb2NrUXVlcnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAnU0VMRUNUIGBpZGAgRlJPTSBgb3JnYW5pemF0aW9uc2AgV0hFUkUgYHV1aWRgID0gPyBMSU1JVCAxJyxcbiAgICAgICAgW3V1aWRdXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVzb2x2ZUNvcnJlc3BvbmRlbmNlSWQoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGRlbGVnYXRlIHRvIHJlc29sdmUgd2l0aCBjb3JyZXNwb25kZW5jZXMgdGFibGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1dWlkID0gJzAxOTEyMzQ1LTY3ODktN2FiYy04ZGVmLTAxMjM0NTY3ODlhYic7XG4gICAgICBtb2NrUXVlcnkubW9ja1Jlc29sdmVkVmFsdWUoW3sgaWQ6IDEwIH1dKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VydmljZS5yZXNvbHZlQ29ycmVzcG9uZGVuY2VJZCh1dWlkKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoMTApO1xuICAgICAgZXhwZWN0KG1vY2tRdWVyeSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgICdTRUxFQ1QgYGlkYCBGUk9NIGBjb3JyZXNwb25kZW5jZXNgIFdIRVJFIGB1dWlkYCA9ID8gTElNSVQgMScsXG4gICAgICAgIFt1dWlkXVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Jlc29sdmVVc2VySWQoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHVzZSB1c2VyX2lkIGFzIFBLIGNvbHVtbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHV1aWQgPSAnMDE5MTIzNDUtNjc4OS03YWJjLThkZWYtMDEyMzQ1Njc4OWFiJztcbiAgICAgIG1vY2tRdWVyeS5tb2NrUmVzb2x2ZWRWYWx1ZShbeyB1c2VyX2lkOiA4IH1dKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VydmljZS5yZXNvbHZlVXNlcklkKHV1aWQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSg4KTtcbiAgICAgIGV4cGVjdChtb2NrUXVlcnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAnU0VMRUNUIGB1c2VyX2lkYCBGUk9NIGB1c2Vyc2AgV0hFUkUgYHV1aWRgID0gPyBMSU1JVCAxJyxcbiAgICAgICAgW3V1aWRdXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVzb2x2ZUNvbnRyYWN0SWQoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGRlbGVnYXRlIHRvIHJlc29sdmUgd2l0aCBjb250cmFjdHMgdGFibGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1dWlkID0gJzAxOTEyMzQ1LTY3ODktN2FiYy04ZGVmLTAxMjM0NTY3ODlhYic7XG4gICAgICBtb2NrUXVlcnkubW9ja1Jlc29sdmVkVmFsdWUoW3sgaWQ6IDIgfV0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXJ2aWNlLnJlc29sdmVDb250cmFjdElkKHV1aWQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgyKTtcbiAgICAgIGV4cGVjdChtb2NrUXVlcnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAnU0VMRUNUIGBpZGAgRlJPTSBgY29udHJhY3RzYCBXSEVSRSBgdXVpZGAgPSA/IExJTUlUIDEnLFxuICAgICAgICBbdXVpZF1cbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRWRnZSBjYXNlc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZGVzY3JpYmUoJ2VkZ2UgY2FzZXMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgemVybyBhcyBhIHZhbGlkIG51bWJlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlcnZpY2UucmVzb2x2ZSgnUHJvamVjdCcsICdwcm9qZWN0cycsICdpZCcsIDApO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZSgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHN0cmluZyBcIjBcIiBhcyBudW1lcmljJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VydmljZS5yZXNvbHZlKCdQcm9qZWN0JywgJ3Byb2plY3RzJywgJ2lkJywgJzAnKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBuZWdhdGl2ZSBudW1iZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXJ2aWNlLnJlc29sdmUoJ1Byb2plY3QnLCAncHJvamVjdHMnLCAnaWQnLCAtMSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKC0xKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5f/uuidresolverservicespec_5faf19cc6799478d39fbda80519f078b.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5f/uuidresolverservicespec_5faf19cc6799478d39fbda80519f078b.map new file mode 100644 index 0000000..7820cf2 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/5f/uuidresolverservicespec_5faf19cc6799478d39fbda80519f078b.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\services\\uuid-resolver.service.spec.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\services\\uuid-resolver.service.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\nimport { NotFoundException } from '@nestjs/common';\nimport { DataSource } from 'typeorm';\nimport { UuidResolverService } from './uuid-resolver.service';\n\n// Mock uuid module to avoid ESM import issue with uuid@13\njest.mock('uuid', () => ({\n validate: (str: string) =>\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(str),\n v7: () => '01912345-6789-7abc-8def-0123456789ab',\n}));\n\ndescribe('UuidResolverService', () => {\n let service: UuidResolverService;\n let mockQuery: jest.Mock;\n\n beforeEach(async () => {\n mockQuery = jest.fn();\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n UuidResolverService,\n {\n provide: DataSource,\n useValue: {\n manager: { query: mockQuery },\n },\n },\n ],\n }).compile();\n\n service = module.get(UuidResolverService);\n });\n\n afterEach(() => jest.clearAllMocks());\n\n // ==========================================================\n // resolve() — Core generic resolver\n // ==========================================================\n\n describe('resolve()', () => {\n it('should return number directly when value is a number', async () => {\n const result = await service.resolve('Project', 'projects', 'id', 42);\n expect(result).toBe(42);\n expect(mockQuery).not.toHaveBeenCalled();\n });\n\n it('should parse numeric string and return number', async () => {\n const result = await service.resolve('Project', 'projects', 'id', '99');\n expect(result).toBe(99);\n expect(mockQuery).not.toHaveBeenCalled();\n });\n\n it('should look up UUID string and return PK from DB', async () => {\n const uuid = '01912345-6789-7abc-8def-0123456789ab';\n mockQuery.mockResolvedValue([{ id: 7 }]);\n\n const result = await service.resolve('Project', 'projects', 'id', uuid);\n expect(result).toBe(7);\n expect(mockQuery).toHaveBeenCalledWith(\n 'SELECT `id` FROM `projects` WHERE `uuid` = ? LIMIT 1',\n [uuid]\n );\n });\n\n it('should throw NotFoundException for invalid UUID string', async () => {\n await expect(\n service.resolve('Project', 'projects', 'id', 'not-a-uuid')\n ).rejects.toThrow(NotFoundException);\n expect(mockQuery).not.toHaveBeenCalled();\n });\n\n it('should throw NotFoundException when UUID not found in DB', async () => {\n const uuid = '01912345-6789-7abc-8def-0123456789ab';\n mockQuery.mockResolvedValue([]);\n\n await expect(\n service.resolve('Project', 'projects', 'id', uuid)\n ).rejects.toThrow(NotFoundException);\n });\n });\n\n // ==========================================================\n // Named convenience resolvers\n // ==========================================================\n\n describe('resolveProjectId()', () => {\n it('should delegate to resolve with projects table', async () => {\n const result = await service.resolveProjectId(5);\n expect(result).toBe(5);\n });\n\n it('should look up UUID for project', async () => {\n const uuid = '01912345-6789-7abc-8def-0123456789ab';\n mockQuery.mockResolvedValue([{ id: 5 }]);\n\n const result = await service.resolveProjectId(uuid);\n expect(result).toBe(5);\n expect(mockQuery).toHaveBeenCalledWith(\n 'SELECT `id` FROM `projects` WHERE `uuid` = ? LIMIT 1',\n [uuid]\n );\n });\n });\n\n describe('resolveOrganizationId()', () => {\n it('should delegate to resolve with organizations table', async () => {\n const uuid = '01912345-6789-7abc-8def-0123456789ab';\n mockQuery.mockResolvedValue([{ id: 3 }]);\n\n const result = await service.resolveOrganizationId(uuid);\n expect(result).toBe(3);\n expect(mockQuery).toHaveBeenCalledWith(\n 'SELECT `id` FROM `organizations` WHERE `uuid` = ? LIMIT 1',\n [uuid]\n );\n });\n });\n\n describe('resolveCorrespondenceId()', () => {\n it('should delegate to resolve with correspondences table', async () => {\n const uuid = '01912345-6789-7abc-8def-0123456789ab';\n mockQuery.mockResolvedValue([{ id: 10 }]);\n\n const result = await service.resolveCorrespondenceId(uuid);\n expect(result).toBe(10);\n expect(mockQuery).toHaveBeenCalledWith(\n 'SELECT `id` FROM `correspondences` WHERE `uuid` = ? LIMIT 1',\n [uuid]\n );\n });\n });\n\n describe('resolveUserId()', () => {\n it('should use user_id as PK column', async () => {\n const uuid = '01912345-6789-7abc-8def-0123456789ab';\n mockQuery.mockResolvedValue([{ user_id: 8 }]);\n\n const result = await service.resolveUserId(uuid);\n expect(result).toBe(8);\n expect(mockQuery).toHaveBeenCalledWith(\n 'SELECT `user_id` FROM `users` WHERE `uuid` = ? LIMIT 1',\n [uuid]\n );\n });\n });\n\n describe('resolveContractId()', () => {\n it('should delegate to resolve with contracts table', async () => {\n const uuid = '01912345-6789-7abc-8def-0123456789ab';\n mockQuery.mockResolvedValue([{ id: 2 }]);\n\n const result = await service.resolveContractId(uuid);\n expect(result).toBe(2);\n expect(mockQuery).toHaveBeenCalledWith(\n 'SELECT `id` FROM `contracts` WHERE `uuid` = ? LIMIT 1',\n [uuid]\n );\n });\n });\n\n // ==========================================================\n // Edge cases\n // ==========================================================\n\n describe('edge cases', () => {\n it('should handle zero as a valid number', async () => {\n const result = await service.resolve('Project', 'projects', 'id', 0);\n expect(result).toBe(0);\n });\n\n it('should handle string \"0\" as numeric', async () => {\n const result = await service.resolve('Project', 'projects', 'id', '0');\n expect(result).toBe(0);\n });\n\n it('should handle negative number', async () => {\n const result = await service.resolve('Project', 'projects', 'id', -1);\n expect(result).toBe(-1);\n });\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/60/baseentity_608b668623d9fcbf5ab8d6d9d171784a b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/60/baseentity_608b668623d9fcbf5ab8d6d9d171784a new file mode 100644 index 0000000..711d0c1 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/60/baseentity_608b668623d9fcbf5ab8d6d9d171784a @@ -0,0 +1,31 @@ +9baf01580d92f088080b77b7a4de5a38 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BaseEntity = void 0; +const typeorm_1 = require("typeorm"); +class BaseEntity { +} +exports.BaseEntity = BaseEntity; +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], BaseEntity.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], BaseEntity.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.DeleteDateColumn)({ name: 'deleted_at', select: false }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], BaseEntity.prototype, "deletedAt", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxlbnRpdGllc1xcYmFzZS5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFDQUErRTtBQUUvRSxNQUFzQixVQUFVO0NBWS9CO0FBWkQsZ0NBWUM7QUFQQztJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTs2Q0FBQztBQUdqQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTs2Q0FBQztBQUdqQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztrREFDNUMsSUFBSSxvQkFBSixJQUFJOzZDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXGNvbW1vblxcZW50aXRpZXNcXGJhc2UuZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENyZWF0ZURhdGVDb2x1bW4sIFVwZGF0ZURhdGVDb2x1bW4sIERlbGV0ZURhdGVDb2x1bW4gfSBmcm9tICd0eXBlb3JtJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VFbnRpdHkge1xuICAvLyBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIC8vIGlkITogbnVtYmVyO1xuXG4gIEBDcmVhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG5cbiAgQFVwZGF0ZURhdGVDb2x1bW4oeyBuYW1lOiAndXBkYXRlZF9hdCcgfSlcbiAgdXBkYXRlZEF0ITogRGF0ZTtcblxuICBARGVsZXRlRGF0ZUNvbHVtbih7IG5hbWU6ICdkZWxldGVkX2F0Jywgc2VsZWN0OiBmYWxzZSB9KVxuICBkZWxldGVkQXQ/OiBEYXRlO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/60/baseentity_608b668623d9fcbf5ab8d6d9d171784a.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/60/baseentity_608b668623d9fcbf5ab8d6d9d171784a.map new file mode 100644 index 0000000..97406ed --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/60/baseentity_608b668623d9fcbf5ab8d6d9d171784a.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\entities\\base.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAA+E;AAE/E,MAAsB,UAAU;CAY/B;AAZD,gCAYC;AAPC;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;6CAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;6CAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;kDAC5C,IAAI,oBAAJ,IAAI;6CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\entities\\base.entity.ts"],"sourcesContent":["import { CreateDateColumn, UpdateDateColumn, DeleteDateColumn } from 'typeorm';\n\nexport abstract class BaseEntity {\n // @PrimaryGeneratedColumn()\n // id!: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n @DeleteDateColumn({ name: 'deleted_at', select: false })\n deletedAt?: Date;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/60/rbacguard_601bfb0d32c8333cec517da3b22343ec b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/60/rbacguard_601bfb0d32c8333cec517da3b22343ec new file mode 100644 index 0000000..e162665 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/60/rbacguard_601bfb0d32c8333cec517da3b22343ec @@ -0,0 +1,54 @@ +282e3ea6d7de7875491738d20d1a1525 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RbacGuard = void 0; +const common_1 = require("@nestjs/common"); +const core_1 = require("@nestjs/core"); +const require_permission_decorator_1 = require("../decorators/require-permission.decorator"); +const user_service_1 = require("../../modules/user/user.service"); +let RbacGuard = class RbacGuard { + constructor(reflector, userService) { + this.reflector = reflector; + this.userService = userService; + } + async canActivate(context) { + // 1. ดูว่า Controller นี้ต้องการสิทธิ์อะไร? + const requiredPermissions = this.reflector.getAllAndOverride(require_permission_decorator_1.PERMISSIONS_KEY, [context.getHandler(), context.getClass()]); + // ถ้าไม่ต้องการสิทธิ์อะไรเลย ก็ปล่อยผ่าน + if (!requiredPermissions || requiredPermissions.length === 0) { + return true; + } + // 2. ดึง User จาก Request (ที่ JwtAuthGuard แปะไว้ให้) + const request = context.switchToHttp().getRequest(); + const user = request.user; + if (!user) { + throw new common_1.ForbiddenException('User not found in request'); + } + // 3. (สำคัญ) ดึงสิทธิ์ทั้งหมดของ User คนนี้จาก Database + const userPermissions = await this.userService.getUserPermissions(user.user_id // ✅ FIX: ใช้ user_id ตาม Entity field name + ); + // 4. ตรวจสอบว่ามีสิทธิ์ที่ต้องการไหม? (User ต้องมีครบทุกสิทธิ์) + const hasPermission = requiredPermissions.every((req) => userPermissions.some((p) => p === req || p === 'system.manage_all' // Superadmin ทะลุทุกสิทธิ์ + )); + if (!hasPermission) { + throw new common_1.ForbiddenException(`You do not have permission: ${requiredPermissions.join(', ')}`); + } + return true; + } +}; +exports.RbacGuard = RbacGuard; +exports.RbacGuard = RbacGuard = __decorate([ + (0, common_1.Injectable)(), + __metadata("design:paramtypes", [typeof (_a = typeof core_1.Reflector !== "undefined" && core_1.Reflector) === "function" ? _a : Object, typeof (_b = typeof user_service_1.UserService !== "undefined" && user_service_1.UserService) === "function" ? _b : Object]) +], RbacGuard); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxndWFyZHNcXHJiYWMuZ3VhcmQudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUt3QjtBQUN4Qix1Q0FBeUM7QUFDekMsNkZBQTZFO0FBQzdFLGtFQUE4RDtBQVF2RCxJQUFNLFNBQVMsR0FBZixNQUFNLFNBQVM7SUFDcEIsWUFDVSxTQUFvQixFQUNwQixXQUF3QjtRQUR4QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO0lBQy9CLENBQUM7SUFFSixLQUFLLENBQUMsV0FBVyxDQUFDLE9BQXlCO1FBQ3pDLDRDQUE0QztRQUM1QyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQzFELDhDQUFlLEVBQ2YsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQzNDLENBQUM7UUFFRix5Q0FBeUM7UUFDekMsSUFBSSxDQUFDLG1CQUFtQixJQUFJLG1CQUFtQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3RCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCx1REFBdUQ7UUFDdkQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDLFVBQVUsRUFBbUIsQ0FBQztRQUNyRSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE1BQU0sSUFBSSwyQkFBa0IsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFFRCx3REFBd0Q7UUFDeEQsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUMvRCxJQUFJLENBQUMsT0FBTyxDQUFDLDJDQUEyQztTQUN6RCxDQUFDO1FBRUYsZ0VBQWdFO1FBQ2hFLE1BQU0sYUFBYSxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQ3RELGVBQWUsQ0FBQyxJQUFJLENBQ2xCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxtQkFBbUIsQ0FBQywyQkFBMkI7U0FDMUUsQ0FDRixDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25CLE1BQU0sSUFBSSwyQkFBa0IsQ0FDMUIsK0JBQStCLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNoRSxDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGLENBQUE7QUE3Q1ksOEJBQVM7b0JBQVQsU0FBUztJQURyQixJQUFBLG1CQUFVLEdBQUU7eURBR1UsZ0JBQVMsb0JBQVQsZ0JBQVMsb0RBQ1AsMEJBQVcsb0JBQVgsMEJBQVc7R0FIdkIsU0FBUyxDQTZDckIiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxndWFyZHNcXHJiYWMuZ3VhcmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2FuQWN0aXZhdGUsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIEluamVjdGFibGUsXG4gIEZvcmJpZGRlbkV4Y2VwdGlvbixcbn0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xuaW1wb3J0IHsgUmVmbGVjdG9yIH0gZnJvbSAnQG5lc3Rqcy9jb3JlJztcbmltcG9ydCB7IFBFUk1JU1NJT05TX0tFWSB9IGZyb20gJy4uL2RlY29yYXRvcnMvcmVxdWlyZS1wZXJtaXNzaW9uLmRlY29yYXRvcic7XG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uLy4uL21vZHVsZXMvdXNlci91c2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL21vZHVsZXMvdXNlci9lbnRpdGllcy91c2VyLmVudGl0eSc7XG5cbmludGVyZmFjZSBSZXF1ZXN0V2l0aFVzZXIge1xuICB1c2VyPzogVXNlcjtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJiYWNHdWFyZCBpbXBsZW1lbnRzIENhbkFjdGl2YXRlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWZsZWN0b3I6IFJlZmxlY3RvcixcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZVxuICApIHt9XG5cbiAgYXN5bmMgY2FuQWN0aXZhdGUoY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIDEuIOC4lOC4ueC4p+C5iOC4siBDb250cm9sbGVyIOC4meC4teC5ieC4leC5ieC4reC4h+C4geC4suC4o+C4quC4tOC4l+C4mOC4tOC5jOC4reC4sOC5hOC4oz9cbiAgICBjb25zdCByZXF1aXJlZFBlcm1pc3Npb25zID0gdGhpcy5yZWZsZWN0b3IuZ2V0QWxsQW5kT3ZlcnJpZGU8c3RyaW5nW10+KFxuICAgICAgUEVSTUlTU0lPTlNfS0VZLFxuICAgICAgW2NvbnRleHQuZ2V0SGFuZGxlcigpLCBjb250ZXh0LmdldENsYXNzKCldXG4gICAgKTtcblxuICAgIC8vIOC4luC5ieC4suC5hOC4oeC5iOC4leC5ieC4reC4h+C4geC4suC4o+C4quC4tOC4l+C4mOC4tOC5jOC4reC4sOC5hOC4o+C5gOC4peC4oiDguIHguYfguJvguKXguYjguK3guKLguJzguYjguLLguJlcbiAgICBpZiAoIXJlcXVpcmVkUGVybWlzc2lvbnMgfHwgcmVxdWlyZWRQZXJtaXNzaW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIDIuIOC4lOC4tuC4hyBVc2VyIOC4iOC4suC4gSBSZXF1ZXN0ICjguJfguLXguYggSnd0QXV0aEd1YXJkIOC5geC4m+C4sOC5hOC4p+C5ieC5g+C4q+C5iSlcbiAgICBjb25zdCByZXF1ZXN0ID0gY29udGV4dC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXF1ZXN0PFJlcXVlc3RXaXRoVXNlcj4oKTtcbiAgICBjb25zdCB1c2VyID0gcmVxdWVzdC51c2VyO1xuICAgIGlmICghdXNlcikge1xuICAgICAgdGhyb3cgbmV3IEZvcmJpZGRlbkV4Y2VwdGlvbignVXNlciBub3QgZm91bmQgaW4gcmVxdWVzdCcpO1xuICAgIH1cblxuICAgIC8vIDMuICjguKrguLPguITguLHguI0pIOC4lOC4tuC4h+C4quC4tOC4l+C4mOC4tOC5jOC4l+C4seC5ieC4h+C4q+C4oeC4lOC4guC4reC4hyBVc2VyIOC4hOC4meC4meC4teC5ieC4iOC4suC4gSBEYXRhYmFzZVxuICAgIGNvbnN0IHVzZXJQZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlclBlcm1pc3Npb25zKFxuICAgICAgdXNlci51c2VyX2lkIC8vIOKchSBGSVg6IOC5g+C4iuC5iSB1c2VyX2lkIOC4leC4suC4oSBFbnRpdHkgZmllbGQgbmFtZVxuICAgICk7XG5cbiAgICAvLyA0LiDguJXguKPguKfguIjguKrguK3guJrguKfguYjguLLguKHguLXguKrguLTguJfguJjguLTguYzguJfguLXguYjguJXguYnguK3guIfguIHguLLguKPguYTguKvguKE/IChVc2VyIOC4leC5ieC4reC4h+C4oeC4teC4hOC4o+C4muC4l+C4uOC4geC4quC4tOC4l+C4mOC4tOC5jClcbiAgICBjb25zdCBoYXNQZXJtaXNzaW9uID0gcmVxdWlyZWRQZXJtaXNzaW9ucy5ldmVyeSgocmVxKSA9PlxuICAgICAgdXNlclBlcm1pc3Npb25zLnNvbWUoXG4gICAgICAgIChwKSA9PiBwID09PSByZXEgfHwgcCA9PT0gJ3N5c3RlbS5tYW5hZ2VfYWxsJyAvLyBTdXBlcmFkbWluIOC4l+C4sOC4peC4uOC4l+C4uOC4geC4quC4tOC4l+C4mOC4tOC5jFxuICAgICAgKVxuICAgICk7XG5cbiAgICBpZiAoIWhhc1Blcm1pc3Npb24pIHtcbiAgICAgIHRocm93IG5ldyBGb3JiaWRkZW5FeGNlcHRpb24oXG4gICAgICAgIGBZb3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbjogJHtyZXF1aXJlZFBlcm1pc3Npb25zLmpvaW4oJywgJyl9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/60/rbacguard_601bfb0d32c8333cec517da3b22343ec.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/60/rbacguard_601bfb0d32c8333cec517da3b22343ec.map new file mode 100644 index 0000000..6e096eb --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/60/rbacguard_601bfb0d32c8333cec517da3b22343ec.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\guards\\rbac.guard.ts","mappings":";;;;;;;;;;;;;AAAA,2CAKwB;AACxB,uCAAyC;AACzC,6FAA6E;AAC7E,kEAA8D;AAQvD,IAAM,SAAS,GAAf,MAAM,SAAS;IACpB,YACU,SAAoB,EACpB,WAAwB;QADxB,cAAS,GAAT,SAAS,CAAW;QACpB,gBAAW,GAAX,WAAW,CAAa;IAC/B,CAAC;IAEJ,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,4CAA4C;QAC5C,MAAM,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAC1D,8CAAe,EACf,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAC3C,CAAC;QAEF,yCAAyC;QACzC,IAAI,CAAC,mBAAmB,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,uDAAuD;QACvD,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAmB,CAAC;QACrE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,2BAAkB,CAAC,2BAA2B,CAAC,CAAC;QAC5D,CAAC;QAED,wDAAwD;QACxD,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAC/D,IAAI,CAAC,OAAO,CAAC,2CAA2C;SACzD,CAAC;QAEF,gEAAgE;QAChE,MAAM,aAAa,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACtD,eAAe,CAAC,IAAI,CAClB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,mBAAmB,CAAC,2BAA2B;SAC1E,CACF,CAAC;QAEF,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,2BAAkB,CAC1B,+BAA+B,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAChE,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AA7CY,8BAAS;oBAAT,SAAS;IADrB,IAAA,mBAAU,GAAE;yDAGU,gBAAS,oBAAT,gBAAS,oDACP,0BAAW,oBAAX,0BAAW;GAHvB,SAAS,CA6CrB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\guards\\rbac.guard.ts"],"sourcesContent":["import {\n CanActivate,\n ExecutionContext,\n Injectable,\n ForbiddenException,\n} from '@nestjs/common';\nimport { Reflector } from '@nestjs/core';\nimport { PERMISSIONS_KEY } from '../decorators/require-permission.decorator';\nimport { UserService } from '../../modules/user/user.service';\nimport { User } from '../../modules/user/entities/user.entity';\n\ninterface RequestWithUser {\n user?: User;\n}\n\n@Injectable()\nexport class RbacGuard implements CanActivate {\n constructor(\n private reflector: Reflector,\n private userService: UserService\n ) {}\n\n async canActivate(context: ExecutionContext): Promise {\n // 1. ดูว่า Controller นี้ต้องการสิทธิ์อะไร?\n const requiredPermissions = this.reflector.getAllAndOverride(\n PERMISSIONS_KEY,\n [context.getHandler(), context.getClass()]\n );\n\n // ถ้าไม่ต้องการสิทธิ์อะไรเลย ก็ปล่อยผ่าน\n if (!requiredPermissions || requiredPermissions.length === 0) {\n return true;\n }\n\n // 2. ดึง User จาก Request (ที่ JwtAuthGuard แปะไว้ให้)\n const request = context.switchToHttp().getRequest();\n const user = request.user;\n if (!user) {\n throw new ForbiddenException('User not found in request');\n }\n\n // 3. (สำคัญ) ดึงสิทธิ์ทั้งหมดของ User คนนี้จาก Database\n const userPermissions = await this.userService.getUserPermissions(\n user.user_id // ✅ FIX: ใช้ user_id ตาม Entity field name\n );\n\n // 4. ตรวจสอบว่ามีสิทธิ์ที่ต้องการไหม? (User ต้องมีครบทุกสิทธิ์)\n const hasPermission = requiredPermissions.every((req) =>\n userPermissions.some(\n (p) => p === req || p === 'system.manage_all' // Superadmin ทะลุทุกสิทธิ์\n )\n );\n\n if (!hasPermission) {\n throw new ForbiddenException(\n `You do not have permission: ${requiredPermissions.join(', ')}`\n );\n }\n\n return true;\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/62/importtransactionentity_628b90e7a7504230203752d5578eafce b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/62/importtransactionentity_628b90e7a7504230203752d5578eafce new file mode 100644 index 0000000..c3fca76 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/62/importtransactionentity_628b90e7a7504230203752d5578eafce @@ -0,0 +1,47 @@ +53584d8ebb04cde6b88b778e7c726ac3 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ImportTransaction = void 0; +const typeorm_1 = require("typeorm"); +let ImportTransaction = class ImportTransaction { +}; +exports.ImportTransaction = ImportTransaction; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], ImportTransaction.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Index)('idx_idem_key', { unique: true }), + (0, typeorm_1.Column)({ name: 'idempotency_key', length: 255, unique: true }), + __metadata("design:type", String) +], ImportTransaction.prototype, "idempotencyKey", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'document_number', length: 100, nullable: true }), + __metadata("design:type", String) +], ImportTransaction.prototype, "documentNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'batch_id', length: 100, nullable: true }), + __metadata("design:type", String) +], ImportTransaction.prototype, "batchId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'status_code', default: 201 }), + __metadata("design:type", Number) +], ImportTransaction.prototype, "statusCode", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], ImportTransaction.prototype, "createdAt", void 0); +exports.ImportTransaction = ImportTransaction = __decorate([ + (0, typeorm_1.Entity)('import_transactions') +], ImportTransaction); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxlbnRpdGllc1xcaW1wb3J0LXRyYW5zYWN0aW9uLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBTWlCO0FBR1YsSUFBTSxpQkFBaUIsR0FBdkIsTUFBTSxpQkFBaUI7Q0FtQjdCLENBQUE7QUFuQlksOENBQWlCO0FBRTVCO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7NkNBQ2I7QUFJWjtJQUZDLElBQUEsZUFBSyxFQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN2QyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7O3lEQUN2QztBQUd4QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7eURBQ3pDO0FBR3hCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7a0RBQ3pDO0FBR2pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUM7O3FEQUMxQjtBQUdwQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTtvREFBQzs0QkFsQk4saUJBQWlCO0lBRDdCLElBQUEsZ0JBQU0sRUFBQyxxQkFBcUIsQ0FBQztHQUNqQixpQkFBaUIsQ0FtQjdCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXG1pZ3JhdGlvblxcZW50aXRpZXNcXGltcG9ydC10cmFuc2FjdGlvbi5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW50aXR5LFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBDb2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIEluZGV4LFxufSBmcm9tICd0eXBlb3JtJztcblxuQEVudGl0eSgnaW1wb3J0X3RyYW5zYWN0aW9ucycpXG5leHBvcnQgY2xhc3MgSW1wb3J0VHJhbnNhY3Rpb24ge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIGlkITogbnVtYmVyO1xuXG4gIEBJbmRleCgnaWR4X2lkZW1fa2V5JywgeyB1bmlxdWU6IHRydWUgfSlcbiAgQENvbHVtbih7IG5hbWU6ICdpZGVtcG90ZW5jeV9rZXknLCBsZW5ndGg6IDI1NSwgdW5pcXVlOiB0cnVlIH0pXG4gIGlkZW1wb3RlbmN5S2V5ITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnZG9jdW1lbnRfbnVtYmVyJywgbGVuZ3RoOiAxMDAsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGRvY3VtZW50TnVtYmVyITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnYmF0Y2hfaWQnLCBsZW5ndGg6IDEwMCwgbnVsbGFibGU6IHRydWUgfSlcbiAgYmF0Y2hJZCE6IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ3N0YXR1c19jb2RlJywgZGVmYXVsdDogMjAxIH0pXG4gIHN0YXR1c0NvZGUhOiBudW1iZXI7XG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/62/importtransactionentity_628b90e7a7504230203752d5578eafce.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/62/importtransactionentity_628b90e7a7504230203752d5578eafce.map new file mode 100644 index 0000000..896bae9 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/62/importtransactionentity_628b90e7a7504230203752d5578eafce.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\entities\\import-transaction.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAMiB;AAGV,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;CAmB7B,CAAA;AAnBY,8CAAiB;AAE5B;IADC,IAAA,gCAAsB,GAAE;;6CACb;AAIZ;IAFC,IAAA,eAAK,EAAC,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACvC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;yDACvC;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yDACzC;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kDACzC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;;qDAC1B;AAGpB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;oDAAC;4BAlBN,iBAAiB;IAD7B,IAAA,gBAAM,EAAC,qBAAqB,CAAC;GACjB,iBAAiB,CAmB7B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\entities\\import-transaction.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n Index,\n} from 'typeorm';\n\n@Entity('import_transactions')\nexport class ImportTransaction {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Index('idx_idem_key', { unique: true })\n @Column({ name: 'idempotency_key', length: 255, unique: true })\n idempotencyKey!: string;\n\n @Column({ name: 'document_number', length: 100, nullable: true })\n documentNumber!: string;\n\n @Column({ name: 'batch_id', length: 100, nullable: true })\n batchId!: string;\n\n @Column({ name: 'status_code', default: 201 })\n statusCode!: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/63/documentnumberingservice_63f23bba7d43943751607f2b8545eaf4 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/63/documentnumberingservice_63f23bba7d43943751607f2b8545eaf4 new file mode 100644 index 0000000..5899f63 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/63/documentnumberingservice_63f23bba7d43943751607f2b8545eaf4 @@ -0,0 +1,449 @@ +1a9b069726d4b7f21953a8159810d5a0 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var DocumentNumberingService_1; +var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DocumentNumberingService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const config_1 = require("@nestjs/config"); +const document_number_format_entity_1 = require("../entities/document-number-format.entity"); +const document_number_audit_entity_1 = require("../entities/document-number-audit.entity"); +const document_number_error_entity_1 = require("../entities/document-number-error.entity"); +// Services +const counter_service_1 = require("./counter.service"); +const reservation_service_1 = require("./reservation.service"); +const format_service_1 = require("./format.service"); +const document_numbering_lock_service_1 = require("./document-numbering-lock.service"); +const manual_override_service_1 = require("./manual-override.service"); +const metrics_service_1 = require("./metrics.service"); +const uuid_resolver_service_1 = require("../../../common/services/uuid-resolver.service"); +let DocumentNumberingService = DocumentNumberingService_1 = class DocumentNumberingService { + constructor(formatRepo, auditRepo, errorRepo, counterService, reservationService, formatService, lockService, configService, manualOverrideService, metricsService, entityManager, uuidResolver) { + this.formatRepo = formatRepo; + this.auditRepo = auditRepo; + this.errorRepo = errorRepo; + this.counterService = counterService; + this.reservationService = reservationService; + this.formatService = formatService; + this.lockService = lockService; + this.configService = configService; + this.manualOverrideService = manualOverrideService; + this.metricsService = metricsService; + this.entityManager = entityManager; + this.uuidResolver = uuidResolver; + this.logger = new common_1.Logger(DocumentNumberingService_1.name); + } + /** + * ADR-019: Public facade for controllers to resolve project/organization IDs + */ + async resolveIdForPreview(type, id) { + if (type === 'project') + return this.uuidResolver.resolveProjectId(id); + return this.uuidResolver.resolveOrganizationId(id); + } + async generateNextNumber(ctx) { + let lock = null; + try { + // 0. Check Idempotency (Ideally done in Guard/Middleware, but double check here if passed) + // Note: If idempotencyKey exists in ctx, check audit log for existing SUCCESS entry? + // Omitted for brevity as per spec usually handled by middleware or separate check. + const currentYear = new Date().getFullYear(); + const resetScope = `YEAR_${currentYear}`; + // 1. Prepare Counter Key + const key = { + projectId: ctx.projectId, + originatorOrganizationId: ctx.originatorOrganizationId, + recipientOrganizationId: ctx.recipientOrganizationId || 0, + correspondenceTypeId: ctx.typeId, + subTypeId: ctx.subTypeId || 0, + rfaTypeId: ctx.rfaTypeId || 0, + disciplineId: ctx.disciplineId || 0, + resetScope: resetScope, + }; + // 2. Acquire Redis Lock + try { + // Map CounterKeyDto to LockCounterKey (names slightly different or cast if same) + lock = await this.lockService.acquireLock({ + projectId: key.projectId, + originatorOrgId: key.originatorOrganizationId, + recipientOrgId: key.recipientOrganizationId, + correspondenceTypeId: key.correspondenceTypeId, + subTypeId: key.subTypeId, + rfaTypeId: key.rfaTypeId, + disciplineId: key.disciplineId, + resetScope: key.resetScope, + }); + } + catch (e) { + const errorMessage = e instanceof Error ? e.message : String(e); + this.logger.warn(`Failed to acquire Redis lock, falling back to DB lock only: ${errorMessage}`); + this.metricsService.lockFailures.inc({ + project_id: String(key.projectId), + }); + // Fallback: Proceed without Redlock, relying on CounterService DB optimistic lock + } + // 3. Increment Counter + const sequence = await this.counterService.incrementCounter(key); + // 4. Format Number + const { previewNumber: documentNumber } = await this.formatService.format({ + projectId: ctx.projectId, + correspondenceTypeId: ctx.typeId, + subTypeId: ctx.subTypeId, + rfaTypeId: ctx.rfaTypeId, + disciplineId: ctx.disciplineId, + sequence: sequence, + resetScope: resetScope, + year: currentYear, + originatorOrganizationId: ctx.originatorOrganizationId, + recipientOrganizationId: ctx.recipientOrganizationId, + }); + // 5. Audit Log + const audit = await this.logAudit({ + documentNumber, + counterKey: JSON.stringify(key), + templateUsed: 'DELEGATED_TO_FORMAT_SERVICE', + context: ctx, + isSuccess: true, + operation: 'GENERATE', + // metadata: { idempotencyKey: ctx.idempotencyKey } // If available + }); + this.metricsService.numbersGenerated.inc({ + project_id: String(ctx.projectId), + type_id: String(ctx.typeId), + }); + return { number: documentNumber, auditId: audit.id }; + } + catch (error) { + await this.logError(error, ctx, 'GENERATE'); + throw error; + } + finally { + if (lock) { + await this.lockService.releaseLock(lock); + } + } + } + async reserveNumber(dto, userId, ipAddress) { + try { + // Delegate completely to ReservationService + return await this.reservationService.reserve(dto, userId, ipAddress || '0.0.0.0', 'Unknown' // userAgent not passed in legacy call + ); + } + catch (error) { + this.logger.error('Reservation failed', error); + throw error; + } + } + async confirmReservation(dto, userId) { + return this.reservationService.confirm(dto, userId); + } + async cancelReservation(token, userId) { + return this.reservationService.cancel(token, userId); + } + async previewNumber(ctx) { + const currentYear = new Date().getFullYear(); + const resetScope = `YEAR_${currentYear}`; + const key = { + projectId: ctx.projectId, + originatorOrganizationId: ctx.originatorOrganizationId, + recipientOrganizationId: ctx.recipientOrganizationId || 0, + correspondenceTypeId: ctx.typeId, + subTypeId: ctx.subTypeId || 0, + rfaTypeId: ctx.rfaTypeId || 0, + disciplineId: ctx.disciplineId || 0, + resetScope: resetScope, + }; + const currentSeq = await this.counterService.getCurrentCounter(key); + const nextSequence = currentSeq + 1; + const { previewNumber, isDefault } = await this.formatService.format({ + projectId: ctx.projectId, + correspondenceTypeId: ctx.typeId, + subTypeId: ctx.subTypeId, + rfaTypeId: ctx.rfaTypeId, + disciplineId: ctx.disciplineId, + sequence: nextSequence, + resetScope: resetScope, + year: currentYear, + originatorOrganizationId: ctx.originatorOrganizationId, + recipientOrganizationId: ctx.recipientOrganizationId, + }); + return { previewNumber, nextSequence, isDefault }; + } + /** + * Generates a new number for a draft when its context changes. + */ + async updateNumberForDraft(currentNumber, oldCtx, newCtx) { + const result = await this.generateNextNumber(newCtx); + return result.number; + } + // --- Admin / Legacy --- + async getTemplates() { + return this.formatRepo.find({ + relations: ['project', 'correspondenceType'], + }); + } + async getTemplatesByProject(projectId) { + const internalId = await this.uuidResolver.resolveProjectId(projectId); + return this.formatRepo.find({ + where: { projectId: internalId }, + relations: ['project', 'correspondenceType'], + }); + } + async saveTemplate(dto) { + try { + this.logger.log(`Saving numbering template: ${JSON.stringify(dto)}`); + // Resolve project ID if it's a UUID/String + if (dto.projectId && typeof dto.projectId === 'string') { + dto.projectId = await this.uuidResolver.resolveProjectId(dto.projectId); + } + // Upsert logic: If no ID provided, check for existing template with same business key + if (!dto.id) { + const existing = await this.formatRepo.findOne({ + where: { + projectId: Number(dto.projectId), + correspondenceTypeId: dto.correspondenceTypeId + ? (0, typeorm_2.Equal)(dto.correspondenceTypeId) + : (0, typeorm_2.IsNull)(), + disciplineId: dto.disciplineId || 0, + }, + }); + if (existing) { + this.logger.log(`Found existing template ID: ${existing.id} for business key, updating instead of creating.`); + dto.id = existing.id; + } + } + const result = await this.formatRepo.save(dto); + this.logger.log(`Successfully saved template ID: ${result.id}`); + return result; + } + catch (e) { + this.logger.error(`Failed to save numbering template: ${e instanceof Error ? e.message : String(e)}`, e instanceof Error ? e.stack : undefined); + throw e; + } + } + async deleteTemplate(id) { + return this.formatRepo.delete(id); + } + async getAuditLogs(limit) { + return this.auditRepo.find({ take: limit, order: { createdAt: 'DESC' } }); + } + async getErrorLogs(limit) { + return this.errorRepo.find({ take: limit, order: { createdAt: 'DESC' } }); + } + async getSequences(projectId) { + await Promise.resolve(projectId); // satisfy unused + return []; + } + async setCounterValue(id, sequence) { + await Promise.resolve(id); // satisfy unused + await Promise.resolve(sequence); + throw new common_1.BadRequestException('Updating counter by single ID is not supported with composite keys. Use manualOverride.'); + } + async manualOverride(dto, userId) { + return this.manualOverrideService.applyOverride(dto, userId); + } + async voidAndReplace(dto) { + // 1. Find the audit log for this number to get context + const lastAudit = await this.auditRepo.findOne({ + where: { documentNumber: dto.documentNumber }, + order: { createdAt: 'DESC' }, + }); + if (!lastAudit) { + // If not found in audit, we can't easily regenerate with same context unless passed in dto. + // For now, log a warning and return error or just log the void decision. + this.logger.warn(`Void request for unknown number: ${dto.documentNumber}`); + // Create a void audit anyway if possible? + await this.logAudit({ + documentNumber: dto.documentNumber, + counterKey: {}, + templateUsed: 'VOID_UNKNOWN', + context: { userId: 0, ipAddress: '0.0.0.0' }, // System + isSuccess: true, + operation: 'VOID', + status: 'VOID', + newValue: 'VOIDED', + metadata: { reason: dto.reason }, + }); + return { status: 'VOIDED_UNKNOWN_CONTEXT' }; + } + // 2. Log VOID + await this.logAudit({ + documentNumber: dto.documentNumber, + counterKey: lastAudit.counterKey, + templateUsed: lastAudit.templateUsed, + context: { userId: 0, ipAddress: '0.0.0.0' }, // TODO: Pass userId from controller + isSuccess: true, + operation: 'VOID', + status: 'VOID', + oldValue: dto.documentNumber, + newValue: 'VOIDED', + metadata: { reason: dto.reason, replace: dto.replace }, + }); + if (dto.replace) { + // 3. Generate Replacement + // Parse context from lastAudit.counterKey? + // GenerateNumberContext needs more than counterKey. + // But we can reconstruct it. + let context; + try { + const rawKey = lastAudit.counterKey; + const key = typeof rawKey === 'string' + ? JSON.parse(rawKey) + : rawKey; + context = { + projectId: Number(key.projectId), + typeId: Number(key.correspondenceTypeId), + subTypeId: Number(key.subTypeId), + rfaTypeId: Number(key.rfaTypeId), + disciplineId: Number(key.disciplineId), + originatorOrganizationId: Number(key.originatorOrganizationId) || 0, + recipientOrganizationId: Number(key.recipientOrganizationId) || 0, + userId: 0, // System replacement + }; + const next = await this.generateNextNumber(context); + return { + status: 'REPLACED', + oldNumber: dto.documentNumber, + newNumber: next.number, + }; + } + catch (e) { + this.logger.error(`Failed to replace number ${dto.documentNumber}`, e); + return { + status: 'VOIDED_REPLACE_FAILED', + error: e instanceof Error ? e.message : String(e), + }; + } + } + return { status: 'VOIDED' }; + } + async cancelNumber(dto) { + // Similar to VOID but status CANCELLED + const lastAudit = await this.auditRepo.findOne({ + where: { documentNumber: dto.documentNumber }, + order: { createdAt: 'DESC' }, + }); + const contextKey = lastAudit?.counterKey; + await this.logAudit({ + documentNumber: dto.documentNumber, + counterKey: contextKey || {}, + templateUsed: lastAudit?.templateUsed || 'CANCEL', + context: { + userId: 0, + ipAddress: '0.0.0.0', + projectId: dto.projectId || 0, + }, + isSuccess: true, + operation: 'CANCEL', + status: 'CANCELLED', + metadata: { reason: dto.reason }, + }); + return { status: 'CANCELLED' }; + } + async bulkImport(items) { + const results = { success: 0, failed: 0, errors: [] }; + // items expected to be ManualOverrideDto[] or similar + // Actually bulk import usually means "Here is a list of EXISTING numbers used in legacy system" + // So we should parse them and update counters if they are higher. + // Implementation: For each item, likely delegate to ManualOverrideService if it fits schema. + // Or if items is just a number of CSV rows? + // Assuming items is parsed CSV rows. + for (const item of items) { + try { + // Adapt item to ManualOverrideDto + /* + CSV columns: ProjectID, TypeID, OriginatorID, RecipientID, LastNumber + */ + if (item.newLastNumber && item.correspondenceTypeId) { + await this.manualOverrideService.applyOverride(item, 0); // 0 = System + results.success++; + } + } + catch (e) { + results.failed++; + results.errors.push(`Failed item ${JSON.stringify(item)}: ${e instanceof Error ? e.message : String(e)}`); + } + } + return results; + } + async logAudit(data) { + const audit = this.auditRepo.create({ + documentNumber: data.documentNumber, + counterKey: data.counterKey, + templateUsed: data.templateUsed, + isSuccess: data.isSuccess, + operation: data.operation, + status: data.status, + oldValue: data.oldValue, + newValue: data.newValue, + metadata: data.metadata, + userId: data.context.userId, + ipAddress: data.context.ipAddress, + }); + return this.auditRepo.save(audit); + } + mapErrorType(error) { + const name = error.name || ''; + const msg = error.message || ''; + if (name === 'ConflictException' || msg.includes('version')) + return 'VERSION_CONFLICT'; + if (msg.includes('lock') || msg.includes('timeout')) + return 'LOCK_TIMEOUT'; + if (msg.includes('Redis') || msg.includes('redis')) + return 'REDIS_ERROR'; + if (msg.includes('duplicate') || msg.includes('Duplicate')) + return 'DUPLICATE_NUMBER'; + if (msg.includes('validation') || msg.includes('Validation')) + return 'VALIDATION_ERROR'; + if (msg.includes('exhausted') || msg.includes('maximum')) + return 'SEQUENCE_EXHAUSTED'; + if (msg.includes('expired') || msg.includes('reservation')) + return 'RESERVATION_EXPIRED'; + if (msg.includes('database') || msg.includes('query')) + return 'DB_ERROR'; + return 'GENERATE_ERROR'; + } + async logError(error, ctx, operation) { + try { + const err = error instanceof Error ? error : new Error(String(error)); + const errEntity = this.errorRepo.create({ + errorMessage: err.message || 'Unknown Error', + errorType: this.mapErrorType(err), + contextData: { + ...(typeof ctx === 'object' && ctx !== null + ? ctx + : {}), + operation, + }, + }); + await this.errorRepo.save(errEntity); + } + catch (e) { + this.logger.error('Failed to log error to DB', e); + } + } +}; +exports.DocumentNumberingService = DocumentNumberingService; +exports.DocumentNumberingService = DocumentNumberingService = DocumentNumberingService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(document_number_format_entity_1.DocumentNumberFormat)), + __param(1, (0, typeorm_1.InjectRepository)(document_number_audit_entity_1.DocumentNumberAudit)), + __param(2, (0, typeorm_1.InjectRepository)(document_number_error_entity_1.DocumentNumberError)), + __param(10, (0, typeorm_1.InjectEntityManager)()), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object, typeof (_b = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _b : Object, typeof (_c = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _c : Object, typeof (_d = typeof counter_service_1.CounterService !== "undefined" && counter_service_1.CounterService) === "function" ? _d : Object, typeof (_e = typeof reservation_service_1.ReservationService !== "undefined" && reservation_service_1.ReservationService) === "function" ? _e : Object, typeof (_f = typeof format_service_1.FormatService !== "undefined" && format_service_1.FormatService) === "function" ? _f : Object, typeof (_g = typeof document_numbering_lock_service_1.DocumentNumberingLockService !== "undefined" && document_numbering_lock_service_1.DocumentNumberingLockService) === "function" ? _g : Object, typeof (_h = typeof config_1.ConfigService !== "undefined" && config_1.ConfigService) === "function" ? _h : Object, typeof (_j = typeof manual_override_service_1.ManualOverrideService !== "undefined" && manual_override_service_1.ManualOverrideService) === "function" ? _j : Object, typeof (_k = typeof metrics_service_1.MetricsService !== "undefined" && metrics_service_1.MetricsService) === "function" ? _k : Object, typeof (_l = typeof typeorm_2.EntityManager !== "undefined" && typeorm_2.EntityManager) === "function" ? _l : Object, typeof (_m = typeof uuid_resolver_service_1.UuidResolverService !== "undefined" && uuid_resolver_service_1.UuidResolverService) === "function" ? _m : Object]) +], DocumentNumberingService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxzZXJ2aWNlc1xcZG9jdW1lbnQtbnVtYmVyaW5nLnNlcnZpY2UudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBeUU7QUFDekUsNkNBQXdFO0FBQ3hFLHFDQUFtRTtBQUNuRSwyQ0FBK0M7QUFFL0MsNkZBQWlGO0FBQ2pGLDJGQUErRTtBQUMvRSwyRkFBK0U7QUFFL0UsV0FBVztBQUNYLHVEQUFtRDtBQUNuRCwrREFBMkQ7QUFDM0QscURBQWlEO0FBQ2pELHVGQUFpRjtBQUNqRix1RUFBa0U7QUFDbEUsdURBQW1EO0FBY25ELDBGQUFxRjtBQUc5RSxJQUFNLHdCQUF3QixnQ0FBOUIsTUFBTSx3QkFBd0I7SUFHbkMsWUFFRSxVQUFvRCxFQUVwRCxTQUFrRCxFQUVsRCxTQUFrRCxFQUUxQyxjQUE4QixFQUM5QixrQkFBc0MsRUFDdEMsYUFBNEIsRUFDNUIsV0FBeUMsRUFDekMsYUFBNEIsRUFDNUIscUJBQTRDLEVBQzVDLGNBQThCLEVBRXRDLGFBQW9DLEVBQzVCLFlBQWlDO1FBZmpDLGVBQVUsR0FBVixVQUFVLENBQWtDO1FBRTVDLGNBQVMsR0FBVCxTQUFTLENBQWlDO1FBRTFDLGNBQVMsR0FBVCxTQUFTLENBQWlDO1FBRTFDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5Qix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGdCQUFXLEdBQVgsV0FBVyxDQUE4QjtRQUN6QyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QiwwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBQzVDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUU5QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUFuQjFCLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQywwQkFBd0IsQ0FB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XFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGRvY3VtZW50LW51bWJlcmluZ1xcc2VydmljZXNcXGRvY3VtZW50LW51bWJlcmluZy5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIExvZ2dlciwgQmFkUmVxdWVzdEV4Y2VwdGlvbiB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcclxuaW1wb3J0IHsgSW5qZWN0UmVwb3NpdG9yeSwgSW5qZWN0RW50aXR5TWFuYWdlciB9IGZyb20gJ0BuZXN0anMvdHlwZW9ybSc7XHJcbmltcG9ydCB7IFJlcG9zaXRvcnksIEVudGl0eU1hbmFnZXIsIElzTnVsbCwgRXF1YWwgfSBmcm9tICd0eXBlb3JtJztcclxuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJ0BuZXN0anMvY29uZmlnJztcclxuXHJcbmltcG9ydCB7IERvY3VtZW50TnVtYmVyRm9ybWF0IH0gZnJvbSAnLi4vZW50aXRpZXMvZG9jdW1lbnQtbnVtYmVyLWZvcm1hdC5lbnRpdHknO1xyXG5pbXBvcnQgeyBEb2N1bWVudE51bWJlckF1ZGl0IH0gZnJvbSAnLi4vZW50aXRpZXMvZG9jdW1lbnQtbnVtYmVyLWF1ZGl0LmVudGl0eSc7XHJcbmltcG9ydCB7IERvY3VtZW50TnVtYmVyRXJyb3IgfSBmcm9tICcuLi9lbnRpdGllcy9kb2N1bWVudC1udW1iZXItZXJyb3IuZW50aXR5JztcclxuXHJcbi8vIFNlcnZpY2VzXHJcbmltcG9ydCB7IENvdW50ZXJTZXJ2aWNlIH0gZnJvbSAnLi9jb3VudGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSZXNlcnZhdGlvblNlcnZpY2UgfSBmcm9tICcuL3Jlc2VydmF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGb3JtYXRTZXJ2aWNlIH0gZnJvbSAnLi9mb3JtYXQuc2VydmljZSc7XHJcbmltcG9ydCB7IERvY3VtZW50TnVtYmVyaW5nTG9ja1NlcnZpY2UgfSBmcm9tICcuL2RvY3VtZW50LW51bWJlcmluZy1sb2NrLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNYW51YWxPdmVycmlkZVNlcnZpY2UgfSBmcm9tICcuL21hbnVhbC1vdmVycmlkZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWV0cmljc1NlcnZpY2UgfSBmcm9tICcuL21ldHJpY3Muc2VydmljZSc7XHJcblxyXG4vLyBEVE9zXHJcbmltcG9ydCB7IENvdW50ZXJLZXlEdG8gfSBmcm9tICcuLi9kdG8vY291bnRlci1rZXkuZHRvJztcclxuaW1wb3J0IHsgR2VuZXJhdGVOdW1iZXJDb250ZXh0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9kb2N1bWVudC1udW1iZXJpbmcuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtcclxuICBSZXNlcnZlTnVtYmVyRHRvLFxyXG4gIFJlc2VydmVOdW1iZXJSZXNwb25zZUR0byxcclxufSBmcm9tICcuLi9kdG8vcmVzZXJ2ZS1udW1iZXIuZHRvJztcclxuaW1wb3J0IHtcclxuICBDb25maXJtUmVzZXJ2YXRpb25EdG8sXHJcbiAgQ29uZmlybVJlc2VydmF0aW9uUmVzcG9uc2VEdG8sXHJcbn0gZnJvbSAnLi4vZHRvL2NvbmZpcm0tcmVzZXJ2YXRpb24uZHRvJztcclxuaW1wb3J0IHsgTWFudWFsT3ZlcnJpZGVEdG8gfSBmcm9tICcuLi9kdG8vbWFudWFsLW92ZXJyaWRlLmR0byc7XHJcbmltcG9ydCB7IFV1aWRSZXNvbHZlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vc2VydmljZXMvdXVpZC1yZXNvbHZlci5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIERvY3VtZW50TnVtYmVyaW5nU2VydmljZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKERvY3VtZW50TnVtYmVyaW5nU2VydmljZS5uYW1lKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShEb2N1bWVudE51bWJlckZvcm1hdClcclxuICAgIHByaXZhdGUgZm9ybWF0UmVwbzogUmVwb3NpdG9yeTxEb2N1bWVudE51bWJlckZvcm1hdD4sXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShEb2N1bWVudE51bWJlckF1ZGl0KVxyXG4gICAgcHJpdmF0ZSBhdWRpdFJlcG86IFJlcG9zaXRvcnk8RG9jdW1lbnROdW1iZXJBdWRpdD4sXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShEb2N1bWVudE51bWJlckVycm9yKVxyXG4gICAgcHJpdmF0ZSBlcnJvclJlcG86IFJlcG9zaXRvcnk8RG9jdW1lbnROdW1iZXJFcnJvcj4sXHJcblxyXG4gICAgcHJpdmF0ZSBjb3VudGVyU2VydmljZTogQ291bnRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlc2VydmF0aW9uU2VydmljZTogUmVzZXJ2YXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmb3JtYXRTZXJ2aWNlOiBGb3JtYXRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBsb2NrU2VydmljZTogRG9jdW1lbnROdW1iZXJpbmdMb2NrU2VydmljZSxcclxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcclxuICAgIHByaXZhdGUgbWFudWFsT3ZlcnJpZGVTZXJ2aWNlOiBNYW51YWxPdmVycmlkZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1ldHJpY3NTZXJ2aWNlOiBNZXRyaWNzU2VydmljZSxcclxuICAgIEBJbmplY3RFbnRpdHlNYW5hZ2VyKClcclxuICAgIHByaXZhdGUgZW50aXR5TWFuYWdlcjogRW50aXR5TWFuYWdlcixcclxuICAgIHByaXZhdGUgdXVpZFJlc29sdmVyOiBVdWlkUmVzb2x2ZXJTZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICAvKipcclxuICAgKiBBRFItMDE5OiBQdWJsaWMgZmFjYWRlIGZvciBjb250cm9sbGVycyB0byByZXNvbHZlIHByb2plY3Qvb3JnYW5pemF0aW9uIElEc1xyXG4gICAqL1xyXG4gIGFzeW5jIHJlc29sdmVJZEZvclByZXZpZXcoXHJcbiAgICB0eXBlOiAncHJvamVjdCcgfCAnb3JnYW5pemF0aW9uJyxcclxuICAgIGlkOiBudW1iZXIgfCBzdHJpbmdcclxuICApOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgaWYgKHR5cGUgPT09ICdwcm9qZWN0JykgcmV0dXJuIHRoaXMudXVpZFJlc29sdmVyLnJlc29sdmVQcm9qZWN0SWQoaWQpO1xyXG4gICAgcmV0dXJuIHRoaXMudXVpZFJlc29sdmVyLnJlc29sdmVPcmdhbml6YXRpb25JZChpZCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZW5lcmF0ZU5leHROdW1iZXIoXHJcbiAgICBjdHg6IEdlbmVyYXRlTnVtYmVyQ29udGV4dFxyXG4gICk6IFByb21pc2U8eyBudW1iZXI6IHN0cmluZzsgYXVkaXRJZDogbnVtYmVyIH0+IHtcclxuICAgIGxldCBsb2NrID0gbnVsbDtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIDAuIENoZWNrIElkZW1wb3RlbmN5IChJZGVhbGx5IGRvbmUgaW4gR3VhcmQvTWlkZGxld2FyZSwgYnV0IGRvdWJsZSBjaGVjayBoZXJlIGlmIHBhc3NlZClcclxuICAgICAgLy8gTm90ZTogSWYgaWRlbXBvdGVuY3lLZXkgZXhpc3RzIGluIGN0eCwgY2hlY2sgYXVkaXQgbG9nIGZvciBleGlzdGluZyBTVUNDRVNTIGVudHJ5P1xyXG4gICAgICAvLyBPbWl0dGVkIGZvciBicmV2aXR5IGFzIHBlciBzcGVjIHVzdWFsbHkgaGFuZGxlZCBieSBtaWRkbGV3YXJlIG9yIHNlcGFyYXRlIGNoZWNrLlxyXG5cclxuICAgICAgY29uc3QgY3VycmVudFllYXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XHJcbiAgICAgIGNvbnN0IHJlc2V0U2NvcGUgPSBgWUVBUl8ke2N1cnJlbnRZZWFyfWA7XHJcblxyXG4gICAgICAvLyAxLiBQcmVwYXJlIENvdW50ZXIgS2V5XHJcbiAgICAgIGNvbnN0IGtleTogQ291bnRlcktleUR0byA9IHtcclxuICAgICAgICBwcm9qZWN0SWQ6IGN0eC5wcm9qZWN0SWQsXHJcbiAgICAgICAgb3JpZ2luYXRvck9yZ2FuaXphdGlvbklkOiBjdHgub3JpZ2luYXRvck9yZ2FuaXphdGlvbklkLFxyXG4gICAgICAgIHJlY2lwaWVudE9yZ2FuaXphdGlvbklkOiBjdHgucmVjaXBpZW50T3JnYW5pemF0aW9uSWQgfHwgMCxcclxuICAgICAgICBjb3JyZXNwb25kZW5jZVR5cGVJZDogY3R4LnR5cGVJZCxcclxuICAgICAgICBzdWJUeXBlSWQ6IGN0eC5zdWJUeXBlSWQgfHwgMCxcclxuICAgICAgICByZmFUeXBlSWQ6IGN0eC5yZmFUeXBlSWQgfHwgMCxcclxuICAgICAgICBkaXNjaXBsaW5lSWQ6IGN0eC5kaXNjaXBsaW5lSWQgfHwgMCxcclxuICAgICAgICByZXNldFNjb3BlOiByZXNldFNjb3BlLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgLy8gMi4gQWNxdWlyZSBSZWRpcyBMb2NrXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gTWFwIENvdW50ZXJLZXlEdG8gdG8gTG9ja0NvdW50ZXJLZXkgKG5hbWVzIHNsaWdodGx5IGRpZmZlcmVudCBvciBjYXN0IGlmIHNhbWUpXHJcbiAgICAgICAgbG9jayA9IGF3YWl0IHRoaXMubG9ja1NlcnZpY2UuYWNxdWlyZUxvY2soe1xyXG4gICAgICAgICAgcHJvamVjdElkOiBrZXkucHJvamVjdElkLFxyXG4gICAgICAgICAgb3JpZ2luYXRvck9yZ0lkOiBrZXkub3JpZ2luYXRvck9yZ2FuaXphdGlvbklkLFxyXG4gICAgICAgICAgcmVjaXBpZW50T3JnSWQ6IGtleS5yZWNpcGllbnRPcmdhbml6YXRpb25JZCxcclxuICAgICAgICAgIGNvcnJlc3BvbmRlbmNlVHlwZUlkOiBrZXkuY29ycmVzcG9uZGVuY2VUeXBlSWQsXHJcbiAgICAgICAgICBzdWJUeXBlSWQ6IGtleS5zdWJUeXBlSWQsXHJcbiAgICAgICAgICByZmFUeXBlSWQ6IGtleS5yZmFUeXBlSWQsXHJcbiAgICAgICAgICBkaXNjaXBsaW5lSWQ6IGtleS5kaXNjaXBsaW5lSWQsXHJcbiAgICAgICAgICByZXNldFNjb3BlOiBrZXkucmVzZXRTY29wZSxcclxuICAgICAgICB9KTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKTtcclxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxyXG4gICAgICAgICAgYEZhaWxlZCB0byBhY3F1aXJlIFJlZGlzIGxvY2ssIGZhbGxpbmcgYmFjayB0byBEQiBsb2NrIG9ubHk6ICR7ZXJyb3JNZXNzYWdlfWBcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMubWV0cmljc1NlcnZpY2UubG9ja0ZhaWx1cmVzLmluYyh7XHJcbiAgICAgICAgICBwcm9qZWN0X2lkOiBTdHJpbmcoa2V5LnByb2plY3RJZCksXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gRmFsbGJhY2s6IFByb2NlZWQgd2l0aG91dCBSZWRsb2NrLCByZWx5aW5nIG9uIENvdW50ZXJTZXJ2aWNlIERCIG9wdGltaXN0aWMgbG9ja1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyAzLiBJbmNyZW1lbnQgQ291bnRlclxyXG4gICAgICBjb25zdCBzZXF1ZW5jZSA9IGF3YWl0IHRoaXMuY291bnRlclNlcnZpY2UuaW5jcmVtZW50Q291bnRlcihrZXkpO1xyXG5cclxuICAgICAgLy8gNC4gRm9ybWF0IE51bWJlclxyXG4gICAgICBjb25zdCB7IHByZXZpZXdOdW1iZXI6IGRvY3VtZW50TnVtYmVyIH0gPSBhd2FpdCB0aGlzLmZvcm1hdFNlcnZpY2UuZm9ybWF0KFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHByb2plY3RJZDogY3R4LnByb2plY3RJZCxcclxuICAgICAgICAgIGNvcnJlc3BvbmRlbmNlVHlwZUlkOiBjdHgudHlwZUlkLFxyXG4gICAgICAgICAgc3ViVHlwZUlkOiBjdHguc3ViVHlwZUlkLFxyXG4gICAgICAgICAgcmZhVHlwZUlkOiBjdHgucmZhVHlwZUlkLFxyXG4gICAgICAgICAgZGlzY2lwbGluZUlkOiBjdHguZGlzY2lwbGluZUlkLFxyXG4gICAgICAgICAgc2VxdWVuY2U6IHNlcXVlbmNlLFxyXG4gICAgICAgICAgcmVzZXRTY29wZTogcmVzZXRTY29wZSxcclxuICAgICAgICAgIHllYXI6IGN1cnJlbnRZZWFyLFxyXG4gICAgICAgICAgb3JpZ2luYXRvck9yZ2FuaXphdGlvbklkOiBjdHgub3JpZ2luYXRvck9yZ2FuaXphdGlvbklkLFxyXG4gICAgICAgICAgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQ6IGN0eC5yZWNpcGllbnRPcmdhbml6YXRpb25JZCxcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcblxyXG4gICAgICAvLyA1LiBBdWRpdCBMb2dcclxuICAgICAgY29uc3QgYXVkaXQgPSBhd2FpdCB0aGlzLmxvZ0F1ZGl0KHtcclxuICAgICAgICBkb2N1bWVudE51bWJlcixcclxuICAgICAgICBjb3VudGVyS2V5OiBKU09OLnN0cmluZ2lmeShrZXkpLFxyXG4gICAgICAgIHRlbXBsYXRlVXNlZDogJ0RFTEVHQVRFRF9UT19GT1JNQVRfU0VSVklDRScsXHJcbiAgICAgICAgY29udGV4dDogY3R4LFxyXG4gICAgICAgIGlzU3VjY2VzczogdHJ1ZSxcclxuICAgICAgICBvcGVyYXRpb246ICdHRU5FUkFURScsXHJcbiAgICAgICAgLy8gbWV0YWRhdGE6IHsgaWRlbXBvdGVuY3lLZXk6IGN0eC5pZGVtcG90ZW5jeUtleSB9IC8vIElmIGF2YWlsYWJsZVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMubWV0cmljc1NlcnZpY2UubnVtYmVyc0dlbmVyYXRlZC5pbmMoe1xyXG4gICAgICAgIHByb2plY3RfaWQ6IFN0cmluZyhjdHgucHJvamVjdElkKSxcclxuICAgICAgICB0eXBlX2lkOiBTdHJpbmcoY3R4LnR5cGVJZCksXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIHsgbnVtYmVyOiBkb2N1bWVudE51bWJlciwgYXVkaXRJZDogYXVkaXQuaWQgfTtcclxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMubG9nRXJyb3IoZXJyb3IsIGN0eCwgJ0dFTkVSQVRFJyk7XHJcbiAgICAgIHRocm93IGVycm9yO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgaWYgKGxvY2spIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmxvY2tTZXJ2aWNlLnJlbGVhc2VMb2NrKGxvY2spO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyByZXNlcnZlTnVtYmVyKFxyXG4gICAgZHRvOiBSZXNlcnZlTnVtYmVyRHRvLFxyXG4gICAgdXNlcklkOiBudW1iZXIsXHJcbiAgICBpcEFkZHJlc3M/OiBzdHJpbmdcclxuICApOiBQcm9taXNlPFJlc2VydmVOdW1iZXJSZXNwb25zZUR0bz4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gRGVsZWdhdGUgY29tcGxldGVseSB0byBSZXNlcnZhdGlvblNlcnZpY2VcclxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVzZXJ2YXRpb25TZXJ2aWNlLnJlc2VydmUoXHJcbiAgICAgICAgZHRvLFxyXG4gICAgICAgIHVzZXJJZCxcclxuICAgICAgICBpcEFkZHJlc3MgfHwgJzAuMC4wLjAnLFxyXG4gICAgICAgICdVbmtub3duJyAvLyB1c2VyQWdlbnQgbm90IHBhc3NlZCBpbiBsZWdhY3kgY2FsbFxyXG4gICAgICApO1xyXG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ1Jlc2VydmF0aW9uIGZhaWxlZCcsIGVycm9yKTtcclxuICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBjb25maXJtUmVzZXJ2YXRpb24oXHJcbiAgICBkdG86IENvbmZpcm1SZXNlcnZhdGlvbkR0byxcclxuICAgIHVzZXJJZDogbnVtYmVyXHJcbiAgKTogUHJvbWlzZTxDb25maXJtUmVzZXJ2YXRpb25SZXNwb25zZUR0bz4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzZXJ2YXRpb25TZXJ2aWNlLmNvbmZpcm0oZHRvLCB1c2VySWQpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2FuY2VsUmVzZXJ2YXRpb24odG9rZW46IHN0cmluZywgdXNlcklkOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLnJlc2VydmF0aW9uU2VydmljZS5jYW5jZWwodG9rZW4sIHVzZXJJZCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBwcmV2aWV3TnVtYmVyKGN0eDogR2VuZXJhdGVOdW1iZXJDb250ZXh0KTogUHJvbWlzZTx7XHJcbiAgICBwcmV2aWV3TnVtYmVyOiBzdHJpbmc7XHJcbiAgICBuZXh0U2VxdWVuY2U6IG51bWJlcjtcclxuICAgIGlzRGVmYXVsdDogYm9vbGVhbjtcclxuICB9PiB7XHJcbiAgICBjb25zdCBjdXJyZW50WWVhciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcclxuICAgIGNvbnN0IHJlc2V0U2NvcGUgPSBgWUVBUl8ke2N1cnJlbnRZZWFyfWA7XHJcblxyXG4gICAgY29uc3Qga2V5OiBDb3VudGVyS2V5RHRvID0ge1xyXG4gICAgICBwcm9qZWN0SWQ6IGN0eC5wcm9qZWN0SWQsXHJcbiAgICAgIG9yaWdpbmF0b3JPcmdhbml6YXRpb25JZDogY3R4Lm9yaWdpbmF0b3JPcmdhbml6YXRpb25JZCxcclxuICAgICAgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQ6IGN0eC5yZWNpcGllbnRPcmdhbml6YXRpb25JZCB8fCAwLFxyXG4gICAgICBjb3JyZXNwb25kZW5jZVR5cGVJZDogY3R4LnR5cGVJZCxcclxuICAgICAgc3ViVHlwZUlkOiBjdHguc3ViVHlwZUlkIHx8IDAsXHJcbiAgICAgIHJmYVR5cGVJZDogY3R4LnJmYVR5cGVJZCB8fCAwLFxyXG4gICAgICBkaXNjaXBsaW5lSWQ6IGN0eC5kaXNjaXBsaW5lSWQgfHwgMCxcclxuICAgICAgcmVzZXRTY29wZTogcmVzZXRTY29wZSxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgY3VycmVudFNlcSA9IGF3YWl0IHRoaXMuY291bnRlclNlcnZpY2UuZ2V0Q3VycmVudENvdW50ZXIoa2V5KTtcclxuICAgIGNvbnN0IG5leHRTZXF1ZW5jZSA9IGN1cnJlbnRTZXEgKyAxO1xyXG5cclxuICAgIGNvbnN0IHsgcHJldmlld051bWJlciwgaXNEZWZhdWx0IH0gPSBhd2FpdCB0aGlzLmZvcm1hdFNlcnZpY2UuZm9ybWF0KHtcclxuICAgICAgcHJvamVjdElkOiBjdHgucHJvamVjdElkLFxyXG4gICAgICBjb3JyZXNwb25kZW5jZVR5cGVJZDogY3R4LnR5cGVJZCxcclxuICAgICAgc3ViVHlwZUlkOiBjdHguc3ViVHlwZUlkLFxyXG4gICAgICByZmFUeXBlSWQ6IGN0eC5yZmFUeXBlSWQsXHJcbiAgICAgIGRpc2NpcGxpbmVJZDogY3R4LmRpc2NpcGxpbmVJZCxcclxuICAgICAgc2VxdWVuY2U6IG5leHRTZXF1ZW5jZSxcclxuICAgICAgcmVzZXRTY29wZTogcmVzZXRTY29wZSxcclxuICAgICAgeWVhcjogY3VycmVudFllYXIsXHJcbiAgICAgIG9yaWdpbmF0b3JPcmdhbml6YXRpb25JZDogY3R4Lm9yaWdpbmF0b3JPcmdhbml6YXRpb25JZCxcclxuICAgICAgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQ6IGN0eC5yZWNpcGllbnRPcmdhbml6YXRpb25JZCxcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB7IHByZXZpZXdOdW1iZXIsIG5leHRTZXF1ZW5jZSwgaXNEZWZhdWx0IH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZXMgYSBuZXcgbnVtYmVyIGZvciBhIGRyYWZ0IHdoZW4gaXRzIGNvbnRleHQgY2hhbmdlcy5cclxuICAgKi9cclxuICBhc3luYyB1cGRhdGVOdW1iZXJGb3JEcmFmdChcclxuICAgIGN1cnJlbnROdW1iZXI6IHN0cmluZyxcclxuICAgIG9sZEN0eDogR2VuZXJhdGVOdW1iZXJDb250ZXh0LFxyXG4gICAgbmV3Q3R4OiBHZW5lcmF0ZU51bWJlckNvbnRleHRcclxuICApOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZW5lcmF0ZU5leHROdW1iZXIobmV3Q3R4KTtcclxuICAgIHJldHVybiByZXN1bHQubnVtYmVyO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tIEFkbWluIC8gTGVnYWN5IC0tLVxyXG5cclxuICBhc3luYyBnZXRUZW1wbGF0ZXMoKTogUHJvbWlzZTxEb2N1bWVudE51bWJlckZvcm1hdFtdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRSZXBvLmZpbmQoe1xyXG4gICAgICByZWxhdGlvbnM6IFsncHJvamVjdCcsICdjb3JyZXNwb25kZW5jZVR5cGUnXSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0VGVtcGxhdGVzQnlQcm9qZWN0KFxyXG4gICAgcHJvamVjdElkOiBudW1iZXIgfCBzdHJpbmdcclxuICApOiBQcm9taXNlPERvY3VtZW50TnVtYmVyRm9ybWF0W10+IHtcclxuICAgIGNvbnN0IGludGVybmFsSWQgPSBhd2FpdCB0aGlzLnV1aWRSZXNvbHZlci5yZXNvbHZlUHJvamVjdElkKHByb2plY3RJZCk7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRSZXBvLmZpbmQoe1xyXG4gICAgICB3aGVyZTogeyBwcm9qZWN0SWQ6IGludGVybmFsSWQgfSxcclxuICAgICAgcmVsYXRpb25zOiBbJ3Byb2plY3QnLCAnY29ycmVzcG9uZGVuY2VUeXBlJ10sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHNhdmVUZW1wbGF0ZShcclxuICAgIGR0bzogUGFydGlhbDxEb2N1bWVudE51bWJlckZvcm1hdD4gJiB7IHByb2plY3RJZD86IG51bWJlciB8IHN0cmluZyB9XHJcbiAgKTogUHJvbWlzZTxEb2N1bWVudE51bWJlckZvcm1hdD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5sb2dnZXIubG9nKGBTYXZpbmcgbnVtYmVyaW5nIHRlbXBsYXRlOiAke0pTT04uc3RyaW5naWZ5KGR0byl9YCk7XHJcblxyXG4gICAgICAvLyBSZXNvbHZlIHByb2plY3QgSUQgaWYgaXQncyBhIFVVSUQvU3RyaW5nXHJcbiAgICAgIGlmIChkdG8ucHJvamVjdElkICYmIHR5cGVvZiBkdG8ucHJvamVjdElkID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGR0by5wcm9qZWN0SWQgPSBhd2FpdCB0aGlzLnV1aWRSZXNvbHZlci5yZXNvbHZlUHJvamVjdElkKGR0by5wcm9qZWN0SWQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBVcHNlcnQgbG9naWM6IElmIG5vIElEIHByb3ZpZGVkLCBjaGVjayBmb3IgZXhpc3RpbmcgdGVtcGxhdGUgd2l0aCBzYW1lIGJ1c2luZXNzIGtleVxyXG4gICAgICBpZiAoIWR0by5pZCkge1xyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5mb3JtYXRSZXBvLmZpbmRPbmUoe1xyXG4gICAgICAgICAgd2hlcmU6IHtcclxuICAgICAgICAgICAgcHJvamVjdElkOiBOdW1iZXIoZHRvLnByb2plY3RJZCksXHJcbiAgICAgICAgICAgIGNvcnJlc3BvbmRlbmNlVHlwZUlkOiBkdG8uY29ycmVzcG9uZGVuY2VUeXBlSWRcclxuICAgICAgICAgICAgICA/IEVxdWFsKGR0by5jb3JyZXNwb25kZW5jZVR5cGVJZClcclxuICAgICAgICAgICAgICA6IElzTnVsbCgpLFxyXG4gICAgICAgICAgICBkaXNjaXBsaW5lSWQ6IGR0by5kaXNjaXBsaW5lSWQgfHwgMCxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XHJcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXHJcbiAgICAgICAgICAgIGBGb3VuZCBleGlzdGluZyB0ZW1wbGF0ZSBJRDogJHtleGlzdGluZy5pZH0gZm9yIGJ1c2luZXNzIGtleSwgdXBkYXRpbmcgaW5zdGVhZCBvZiBjcmVhdGluZy5gXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgZHRvLmlkID0gZXhpc3RpbmcuaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmZvcm1hdFJlcG8uc2F2ZShkdG8pO1xyXG4gICAgICB0aGlzLmxvZ2dlci5sb2coYFN1Y2Nlc3NmdWxseSBzYXZlZCB0ZW1wbGF0ZSBJRDogJHtyZXN1bHQuaWR9YCk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxyXG4gICAgICAgIGBGYWlsZWQgdG8gc2F2ZSBudW1iZXJpbmcgdGVtcGxhdGU6ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpfWAsXHJcbiAgICAgICAgZSBpbnN0YW5jZW9mIEVycm9yID8gZS5zdGFjayA6IHVuZGVmaW5lZFxyXG4gICAgICApO1xyXG4gICAgICB0aHJvdyBlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZGVsZXRlVGVtcGxhdGUoaWQ6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0UmVwby5kZWxldGUoaWQpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0QXVkaXRMb2dzKGxpbWl0OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmF1ZGl0UmVwby5maW5kKHsgdGFrZTogbGltaXQsIG9yZGVyOiB7IGNyZWF0ZWRBdDogJ0RFU0MnIH0gfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRFcnJvckxvZ3MobGltaXQ6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuZXJyb3JSZXBvLmZpbmQoeyB0YWtlOiBsaW1pdCwgb3JkZXI6IHsgY3JlYXRlZEF0OiAnREVTQycgfSB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldFNlcXVlbmNlcyhwcm9qZWN0SWQ/OiBudW1iZXIpIHtcclxuICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZShwcm9qZWN0SWQpOyAvLyBzYXRpc2Z5IHVudXNlZFxyXG4gICAgcmV0dXJuIFtdO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgc2V0Q291bnRlclZhbHVlKGlkOiBudW1iZXIsIHNlcXVlbmNlOiBudW1iZXIpIHtcclxuICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZShpZCk7IC8vIHNhdGlzZnkgdW51c2VkXHJcbiAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoc2VxdWVuY2UpO1xyXG4gICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXHJcbiAgICAgICdVcGRhdGluZyBjb3VudGVyIGJ5IHNpbmdsZSBJRCBpcyBub3Qgc3VwcG9ydGVkIHdpdGggY29tcG9zaXRlIGtleXMuIFVzZSBtYW51YWxPdmVycmlkZS4nXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgbWFudWFsT3ZlcnJpZGUoZHRvOiBNYW51YWxPdmVycmlkZUR0bywgdXNlcklkOiBudW1iZXIpIHtcclxuICAgIHJldHVybiB0aGlzLm1hbnVhbE92ZXJyaWRlU2VydmljZS5hcHBseU92ZXJyaWRlKGR0bywgdXNlcklkKTtcclxuICB9XHJcbiAgYXN5bmMgdm9pZEFuZFJlcGxhY2UoZHRvOiB7XHJcbiAgICBkb2N1bWVudE51bWJlcjogc3RyaW5nO1xyXG4gICAgcmVhc29uOiBzdHJpbmc7XHJcbiAgICByZXBsYWNlOiBib29sZWFuO1xyXG4gIH0pIHtcclxuICAgIC8vIDEuIEZpbmQgdGhlIGF1ZGl0IGxvZyBmb3IgdGhpcyBudW1iZXIgdG8gZ2V0IGNvbnRleHRcclxuICAgIGNvbnN0IGxhc3RBdWRpdCA9IGF3YWl0IHRoaXMuYXVkaXRSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBkb2N1bWVudE51bWJlcjogZHRvLmRvY3VtZW50TnVtYmVyIH0sXHJcbiAgICAgIG9yZGVyOiB7IGNyZWF0ZWRBdDogJ0RFU0MnIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIWxhc3RBdWRpdCkge1xyXG4gICAgICAvLyBJZiBub3QgZm91bmQgaW4gYXVkaXQsIHdlIGNhbid0IGVhc2lseSByZWdlbmVyYXRlIHdpdGggc2FtZSBjb250ZXh0IHVubGVzcyBwYXNzZWQgaW4gZHRvLlxyXG4gICAgICAvLyBGb3Igbm93LCBsb2cgYSB3YXJuaW5nIGFuZCByZXR1cm4gZXJyb3Igb3IganVzdCBsb2cgdGhlIHZvaWQgZGVjaXNpb24uXHJcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXHJcbiAgICAgICAgYFZvaWQgcmVxdWVzdCBmb3IgdW5rbm93biBudW1iZXI6ICR7ZHRvLmRvY3VtZW50TnVtYmVyfWBcclxuICAgICAgKTtcclxuICAgICAgLy8gQ3JlYXRlIGEgdm9pZCBhdWRpdCBhbnl3YXkgaWYgcG9zc2libGU/XHJcbiAgICAgIGF3YWl0IHRoaXMubG9nQXVkaXQoe1xyXG4gICAgICAgIGRvY3VtZW50TnVtYmVyOiBkdG8uZG9jdW1lbnROdW1iZXIsXHJcbiAgICAgICAgY291bnRlcktleToge30sXHJcbiAgICAgICAgdGVtcGxhdGVVc2VkOiAnVk9JRF9VTktOT1dOJyxcclxuICAgICAgICBjb250ZXh0OiB7IHVzZXJJZDogMCwgaXBBZGRyZXNzOiAnMC4wLjAuMCcgfSwgLy8gU3lzdGVtXHJcbiAgICAgICAgaXNTdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgIG9wZXJhdGlvbjogJ1ZPSUQnLFxyXG4gICAgICAgIHN0YXR1czogJ1ZPSUQnLFxyXG4gICAgICAgIG5ld1ZhbHVlOiAnVk9JREVEJyxcclxuICAgICAgICBtZXRhZGF0YTogeyByZWFzb246IGR0by5yZWFzb24gfSxcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiB7IHN0YXR1czogJ1ZPSURFRF9VTktOT1dOX0NPTlRFWFQnIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMi4gTG9nIFZPSURcclxuICAgIGF3YWl0IHRoaXMubG9nQXVkaXQoe1xyXG4gICAgICBkb2N1bWVudE51bWJlcjogZHRvLmRvY3VtZW50TnVtYmVyLFxyXG4gICAgICBjb3VudGVyS2V5OiBsYXN0QXVkaXQuY291bnRlcktleSxcclxuICAgICAgdGVtcGxhdGVVc2VkOiBsYXN0QXVkaXQudGVtcGxhdGVVc2VkLFxyXG4gICAgICBjb250ZXh0OiB7IHVzZXJJZDogMCwgaXBBZGRyZXNzOiAnMC4wLjAuMCcgfSwgLy8gVE9ETzogUGFzcyB1c2VySWQgZnJvbSBjb250cm9sbGVyXHJcbiAgICAgIGlzU3VjY2VzczogdHJ1ZSxcclxuICAgICAgb3BlcmF0aW9uOiAnVk9JRCcsXHJcbiAgICAgIHN0YXR1czogJ1ZPSUQnLFxyXG4gICAgICBvbGRWYWx1ZTogZHRvLmRvY3VtZW50TnVtYmVyLFxyXG4gICAgICBuZXdWYWx1ZTogJ1ZPSURFRCcsXHJcbiAgICAgIG1ldGFkYXRhOiB7IHJlYXNvbjogZHRvLnJlYXNvbiwgcmVwbGFjZTogZHRvLnJlcGxhY2UgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChkdG8ucmVwbGFjZSkge1xyXG4gICAgICAvLyAzLiBHZW5lcmF0ZSBSZXBsYWNlbWVudFxyXG4gICAgICAvLyBQYXJzZSBjb250ZXh0IGZyb20gbGFzdEF1ZGl0LmNvdW50ZXJLZXk/XHJcbiAgICAgIC8vIEdlbmVyYXRlTnVtYmVyQ29udGV4dCBuZWVkcyBtb3JlIHRoYW4gY291bnRlcktleS5cclxuICAgICAgLy8gQnV0IHdlIGNhbiByZWNvbnN0cnVjdCBpdC5cclxuICAgICAgbGV0IGNvbnRleHQ6IEdlbmVyYXRlTnVtYmVyQ29udGV4dDtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByYXdLZXkgPSBsYXN0QXVkaXQuY291bnRlcktleTtcclxuICAgICAgICBjb25zdCBrZXkgPVxyXG4gICAgICAgICAgdHlwZW9mIHJhd0tleSA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgPyAoSlNPTi5wYXJzZShyYXdLZXkpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxyXG4gICAgICAgICAgICA6IHJhd0tleTtcclxuXHJcbiAgICAgICAgY29udGV4dCA9IHtcclxuICAgICAgICAgIHByb2plY3RJZDogTnVtYmVyKGtleS5wcm9qZWN0SWQpLFxyXG4gICAgICAgICAgdHlwZUlkOiBOdW1iZXIoa2V5LmNvcnJlc3BvbmRlbmNlVHlwZUlkKSxcclxuICAgICAgICAgIHN1YlR5cGVJZDogTnVtYmVyKGtleS5zdWJUeXBlSWQpLFxyXG4gICAgICAgICAgcmZhVHlwZUlkOiBOdW1iZXIoa2V5LnJmYVR5cGVJZCksXHJcbiAgICAgICAgICBkaXNjaXBsaW5lSWQ6IE51bWJlcihrZXkuZGlzY2lwbGluZUlkKSxcclxuICAgICAgICAgIG9yaWdpbmF0b3JPcmdhbml6YXRpb25JZDogTnVtYmVyKGtleS5vcmlnaW5hdG9yT3JnYW5pemF0aW9uSWQpIHx8IDAsXHJcbiAgICAgICAgICByZWNpcGllbnRPcmdhbml6YXRpb25JZDogTnVtYmVyKGtleS5yZWNpcGllbnRPcmdhbml6YXRpb25JZCkgfHwgMCxcclxuICAgICAgICAgIHVzZXJJZDogMCwgLy8gU3lzdGVtIHJlcGxhY2VtZW50XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgbmV4dCA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVOZXh0TnVtYmVyKGNvbnRleHQpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBzdGF0dXM6ICdSRVBMQUNFRCcsXHJcbiAgICAgICAgICBvbGROdW1iZXI6IGR0by5kb2N1bWVudE51bWJlcixcclxuICAgICAgICAgIG5ld051bWJlcjogbmV4dC5udW1iZXIsXHJcbiAgICAgICAgfTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gcmVwbGFjZSBudW1iZXIgJHtkdG8uZG9jdW1lbnROdW1iZXJ9YCwgZSk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHN0YXR1czogJ1ZPSURFRF9SRVBMQUNFX0ZBSUxFRCcsXHJcbiAgICAgICAgICBlcnJvcjogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyBzdGF0dXM6ICdWT0lERUQnIH07XHJcbiAgfVxyXG5cclxuICBhc3luYyBjYW5jZWxOdW1iZXIoZHRvOiB7XHJcbiAgICBkb2N1bWVudE51bWJlcjogc3RyaW5nO1xyXG4gICAgcmVhc29uOiBzdHJpbmc7XHJcbiAgICBwcm9qZWN0SWQ/OiBudW1iZXI7XHJcbiAgfSkge1xyXG4gICAgLy8gU2ltaWxhciB0byBWT0lEIGJ1dCBzdGF0dXMgQ0FOQ0VMTEVEXHJcbiAgICBjb25zdCBsYXN0QXVkaXQgPSBhd2FpdCB0aGlzLmF1ZGl0UmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgZG9jdW1lbnROdW1iZXI6IGR0by5kb2N1bWVudE51bWJlciB9LFxyXG4gICAgICBvcmRlcjogeyBjcmVhdGVkQXQ6ICdERVNDJyB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgY29udGV4dEtleSA9IGxhc3RBdWRpdD8uY291bnRlcktleTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLmxvZ0F1ZGl0KHtcclxuICAgICAgZG9jdW1lbnROdW1iZXI6IGR0by5kb2N1bWVudE51bWJlcixcclxuICAgICAgY291bnRlcktleTogY29udGV4dEtleSB8fCB7fSxcclxuICAgICAgdGVtcGxhdGVVc2VkOiBsYXN0QXVkaXQ/LnRlbXBsYXRlVXNlZCB8fCAnQ0FOQ0VMJyxcclxuICAgICAgY29udGV4dDoge1xyXG4gICAgICAgIHVzZXJJZDogMCxcclxuICAgICAgICBpcEFkZHJlc3M6ICcwLjAuMC4wJyxcclxuICAgICAgICBwcm9qZWN0SWQ6IGR0by5wcm9qZWN0SWQgfHwgMCxcclxuICAgICAgfSxcclxuICAgICAgaXNTdWNjZXNzOiB0cnVlLFxyXG4gICAgICBvcGVyYXRpb246ICdDQU5DRUwnLFxyXG4gICAgICBzdGF0dXM6ICdDQU5DRUxMRUQnLFxyXG4gICAgICBtZXRhZGF0YTogeyByZWFzb246IGR0by5yZWFzb24gfSxcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB7IHN0YXR1czogJ0NBTkNFTExFRCcgfTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGJ1bGtJbXBvcnQoaXRlbXM6IE1hbnVhbE92ZXJyaWRlRHRvW10pIHtcclxuICAgIGNvbnN0IHJlc3VsdHMgPSB7IHN1Y2Nlc3M6IDAsIGZhaWxlZDogMCwgZXJyb3JzOiBbXSBhcyBzdHJpbmdbXSB9O1xyXG5cclxuICAgIC8vIGl0ZW1zIGV4cGVjdGVkIHRvIGJlIE1hbnVhbE92ZXJyaWRlRHRvW10gb3Igc2ltaWxhclxyXG4gICAgLy8gQWN0dWFsbHkgYnVsayBpbXBvcnQgdXN1YWxseSBtZWFucyBcIkhlcmUgaXMgYSBsaXN0IG9mIEVYSVNUSU5HIG51bWJlcnMgdXNlZCBpbiBsZWdhY3kgc3lzdGVtXCJcclxuICAgIC8vIFNvIHdlIHNob3VsZCBwYXJzZSB0aGVtIGFuZCB1cGRhdGUgY291bnRlcnMgaWYgdGhleSBhcmUgaGlnaGVyLlxyXG5cclxuICAgIC8vIEltcGxlbWVudGF0aW9uOiBGb3IgZWFjaCBpdGVtLCBsaWtlbHkgZGVsZWdhdGUgdG8gTWFudWFsT3ZlcnJpZGVTZXJ2aWNlIGlmIGl0IGZpdHMgc2NoZW1hLlxyXG4gICAgLy8gT3IgaWYgaXRlbXMgaXMganVzdCBhIG51bWJlciBvZiBDU1Ygcm93cz9cclxuICAgIC8vIEFzc3VtaW5nIGl0ZW1zIGlzIHBhcnNlZCBDU1Ygcm93cy5cclxuXHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICAvLyBBZGFwdCBpdGVtIHRvIE1hbnVhbE92ZXJyaWRlRHRvXHJcbiAgICAgICAgLypcclxuICAgICAgICAgIENTViBjb2x1bW5zOiBQcm9qZWN0SUQsIFR5cGVJRCwgT3JpZ2luYXRvcklELCBSZWNpcGllbnRJRCwgTGFzdE51bWJlclxyXG4gICAgICAgICovXHJcbiAgICAgICAgaWYgKGl0ZW0ubmV3TGFzdE51bWJlciAmJiBpdGVtLmNvcnJlc3BvbmRlbmNlVHlwZUlkKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLm1hbnVhbE92ZXJyaWRlU2VydmljZS5hcHBseU92ZXJyaWRlKGl0ZW0sIDApOyAvLyAwID0gU3lzdGVtXHJcbiAgICAgICAgICByZXN1bHRzLnN1Y2Nlc3MrKztcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICByZXN1bHRzLmZhaWxlZCsrO1xyXG4gICAgICAgIHJlc3VsdHMuZXJyb3JzLnB1c2goXHJcbiAgICAgICAgICBgRmFpbGVkIGl0ZW0gJHtKU09OLnN0cmluZ2lmeShpdGVtKX06ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpfWBcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0cztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbG9nQXVkaXQoZGF0YToge1xyXG4gICAgZG9jdW1lbnROdW1iZXI6IHN0cmluZztcclxuICAgIGNvdW50ZXJLZXk6IHVua25vd247XHJcbiAgICB0ZW1wbGF0ZVVzZWQ6IHN0cmluZztcclxuICAgIGNvbnRleHQ6IHsgcHJvamVjdElkPzogbnVtYmVyOyB1c2VySWQ/OiBudW1iZXI7IGlwQWRkcmVzcz86IHN0cmluZyB9O1xyXG4gICAgaXNTdWNjZXNzOiBib29sZWFuO1xyXG4gICAgb3BlcmF0aW9uOiBzdHJpbmc7XHJcbiAgICBzdGF0dXM/OiBzdHJpbmc7XHJcbiAgICBvbGRWYWx1ZT86IHN0cmluZztcclxuICAgIG5ld1ZhbHVlPzogc3RyaW5nO1xyXG4gICAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuICB9KTogUHJvbWlzZTxEb2N1bWVudE51bWJlckF1ZGl0PiB7XHJcbiAgICBjb25zdCBhdWRpdCA9IHRoaXMuYXVkaXRSZXBvLmNyZWF0ZSh7XHJcbiAgICAgIGRvY3VtZW50TnVtYmVyOiBkYXRhLmRvY3VtZW50TnVtYmVyLFxyXG4gICAgICBjb3VudGVyS2V5OiBkYXRhLmNvdW50ZXJLZXkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXHJcbiAgICAgIHRlbXBsYXRlVXNlZDogZGF0YS50ZW1wbGF0ZVVzZWQsXHJcbiAgICAgIGlzU3VjY2VzczogZGF0YS5pc1N1Y2Nlc3MsXHJcbiAgICAgIG9wZXJhdGlvbjogZGF0YS5vcGVyYXRpb24sXHJcbiAgICAgIHN0YXR1czogZGF0YS5zdGF0dXMsXHJcbiAgICAgIG9sZFZhbHVlOiBkYXRhLm9sZFZhbHVlLFxyXG4gICAgICBuZXdWYWx1ZTogZGF0YS5uZXdWYWx1ZSxcclxuICAgICAgbWV0YWRhdGE6IGRhdGEubWV0YWRhdGEsXHJcbiAgICAgIHVzZXJJZDogZGF0YS5jb250ZXh0LnVzZXJJZCxcclxuICAgICAgaXBBZGRyZXNzOiBkYXRhLmNvbnRleHQuaXBBZGRyZXNzLFxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGhpcy5hdWRpdFJlcG8uc2F2ZShhdWRpdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hcEVycm9yVHlwZShlcnJvcjogRXJyb3IpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbmFtZSA9IGVycm9yLm5hbWUgfHwgJyc7XHJcbiAgICBjb25zdCBtc2cgPSBlcnJvci5tZXNzYWdlIHx8ICcnO1xyXG4gICAgaWYgKG5hbWUgPT09ICdDb25mbGljdEV4Y2VwdGlvbicgfHwgbXNnLmluY2x1ZGVzKCd2ZXJzaW9uJykpXHJcbiAgICAgIHJldHVybiAnVkVSU0lPTl9DT05GTElDVCc7XHJcbiAgICBpZiAobXNnLmluY2x1ZGVzKCdsb2NrJykgfHwgbXNnLmluY2x1ZGVzKCd0aW1lb3V0JykpIHJldHVybiAnTE9DS19USU1FT1VUJztcclxuICAgIGlmIChtc2cuaW5jbHVkZXMoJ1JlZGlzJykgfHwgbXNnLmluY2x1ZGVzKCdyZWRpcycpKSByZXR1cm4gJ1JFRElTX0VSUk9SJztcclxuICAgIGlmIChtc2cuaW5jbHVkZXMoJ2R1cGxpY2F0ZScpIHx8IG1zZy5pbmNsdWRlcygnRHVwbGljYXRlJykpXHJcbiAgICAgIHJldHVybiAnRFVQTElDQVRFX05VTUJFUic7XHJcbiAgICBpZiAobXNnLmluY2x1ZGVzKCd2YWxpZGF0aW9uJykgfHwgbXNnLmluY2x1ZGVzKCdWYWxpZGF0aW9uJykpXHJcbiAgICAgIHJldHVybiAnVkFMSURBVElPTl9FUlJPUic7XHJcbiAgICBpZiAobXNnLmluY2x1ZGVzKCdleGhhdXN0ZWQnKSB8fCBtc2cuaW5jbHVkZXMoJ21heGltdW0nKSlcclxuICAgICAgcmV0dXJuICdTRVFVRU5DRV9FWEhBVVNURUQnO1xyXG4gICAgaWYgKG1zZy5pbmNsdWRlcygnZXhwaXJlZCcpIHx8IG1zZy5pbmNsdWRlcygncmVzZXJ2YXRpb24nKSlcclxuICAgICAgcmV0dXJuICdSRVNFUlZBVElPTl9FWFBJUkVEJztcclxuICAgIGlmIChtc2cuaW5jbHVkZXMoJ2RhdGFiYXNlJykgfHwgbXNnLmluY2x1ZGVzKCdxdWVyeScpKSByZXR1cm4gJ0RCX0VSUk9SJztcclxuICAgIHJldHVybiAnR0VORVJBVEVfRVJST1InO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2dFcnJvcihlcnJvcjogdW5rbm93biwgY3R4OiB1bmtub3duLCBvcGVyYXRpb246IHN0cmluZykge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZXJyID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xyXG4gICAgICBjb25zdCBlcnJFbnRpdHkgPSB0aGlzLmVycm9yUmVwby5jcmVhdGUoe1xyXG4gICAgICAgIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2UgfHwgJ1Vua25vd24gRXJyb3InLFxyXG4gICAgICAgIGVycm9yVHlwZTogdGhpcy5tYXBFcnJvclR5cGUoZXJyKSxcclxuICAgICAgICBjb250ZXh0RGF0YToge1xyXG4gICAgICAgICAgLi4uKHR5cGVvZiBjdHggPT09ICdvYmplY3QnICYmIGN0eCAhPT0gbnVsbFxyXG4gICAgICAgICAgICA/IChjdHggYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXHJcbiAgICAgICAgICAgIDoge30pLFxyXG4gICAgICAgICAgb3BlcmF0aW9uLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgICBhd2FpdCB0aGlzLmVycm9yUmVwby5zYXZlKGVyckVudGl0eSk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gbG9nIGVycm9yIHRvIERCJywgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/63/documentnumberingservice_63f23bba7d43943751607f2b8545eaf4.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/63/documentnumberingservice_63f23bba7d43943751607f2b8545eaf4.map new file mode 100644 index 0000000..166180e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/63/documentnumberingservice_63f23bba7d43943751607f2b8545eaf4.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\document-numbering.service.ts","mappings":";;;;;;;;;;;;;;;;;AAAA,2CAAyE;AACzE,6CAAwE;AACxE,qCAAmE;AACnE,2CAA+C;AAE/C,6FAAiF;AACjF,2FAA+E;AAC/E,2FAA+E;AAE/E,WAAW;AACX,uDAAmD;AACnD,+DAA2D;AAC3D,qDAAiD;AACjD,uFAAiF;AACjF,uEAAkE;AAClE,uDAAmD;AAcnD,0FAAqF;AAG9E,IAAM,wBAAwB,gCAA9B,MAAM,wBAAwB;IAGnC,YAEE,UAAoD,EAEpD,SAAkD,EAElD,SAAkD,EAE1C,cAA8B,EAC9B,kBAAsC,EACtC,aAA4B,EAC5B,WAAyC,EACzC,aAA4B,EAC5B,qBAA4C,EAC5C,cAA8B,EAEtC,aAAoC,EAC5B,YAAiC;QAfjC,eAAU,GAAV,UAAU,CAAkC;QAE5C,cAAS,GAAT,SAAS,CAAiC;QAE1C,cAAS,GAAT,SAAS,CAAiC;QAE1C,mBAAc,GAAd,cAAc,CAAgB;QAC9B,uBAAkB,GAAlB,kBAAkB,CAAoB;QACtC,kBAAa,GAAb,aAAa,CAAe;QAC5B,gBAAW,GAAX,WAAW,CAA8B;QACzC,kBAAa,GAAb,aAAa,CAAe;QAC5B,0BAAqB,GAArB,qBAAqB,CAAuB;QAC5C,mBAAc,GAAd,cAAc,CAAgB;QAE9B,kBAAa,GAAb,aAAa,CAAe;QAC5B,iBAAY,GAAZ,YAAY,CAAqB;QAnB1B,WAAM,GAAG,IAAI,eAAM,CAAC,0BAAwB,CAAC,IAAI,CAAC,CAAC;IAoBjE,CAAC;IAEJ;;OAEG;IACH,KAAK,CAAC,mBAAmB,CACvB,IAAgC,EAChC,EAAmB;QAEnB,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,GAA0B;QAE1B,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC;YACH,2FAA2F;YAC3F,qFAAqF;YACrF,mFAAmF;YAEnF,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC7C,MAAM,UAAU,GAAG,QAAQ,WAAW,EAAE,CAAC;YAEzC,yBAAyB;YACzB,MAAM,GAAG,GAAkB;gBACzB,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,wBAAwB,EAAE,GAAG,CAAC,wBAAwB;gBACtD,uBAAuB,EAAE,GAAG,CAAC,uBAAuB,IAAI,CAAC;gBACzD,oBAAoB,EAAE,GAAG,CAAC,MAAM;gBAChC,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,CAAC;gBAC7B,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,CAAC;gBAC7B,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,CAAC;gBACnC,UAAU,EAAE,UAAU;aACvB,CAAC;YAEF,wBAAwB;YACxB,IAAI,CAAC;gBACH,iFAAiF;gBACjF,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;oBACxC,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,eAAe,EAAE,GAAG,CAAC,wBAAwB;oBAC7C,cAAc,EAAE,GAAG,CAAC,uBAAuB;oBAC3C,oBAAoB,EAAE,GAAG,CAAC,oBAAoB;oBAC9C,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,YAAY,EAAE,GAAG,CAAC,YAAY;oBAC9B,UAAU,EAAE,GAAG,CAAC,UAAU;iBAC3B,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,YAAY,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAChE,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,+DAA+D,YAAY,EAAE,CAC9E,CAAC;gBACF,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,GAAG,CAAC;oBACnC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;iBAClC,CAAC,CAAC;gBACH,kFAAkF;YACpF,CAAC;YAED,uBAAuB;YACvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAEjE,mBAAmB;YACnB,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CACvE;gBACE,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,oBAAoB,EAAE,GAAG,CAAC,MAAM;gBAChC,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,QAAQ,EAAE,QAAQ;gBAClB,UAAU,EAAE,UAAU;gBACtB,IAAI,EAAE,WAAW;gBACjB,wBAAwB,EAAE,GAAG,CAAC,wBAAwB;gBACtD,uBAAuB,EAAE,GAAG,CAAC,uBAAuB;aACrD,CACF,CAAC;YAEF,eAAe;YACf,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC;gBAChC,cAAc;gBACd,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;gBAC/B,YAAY,EAAE,6BAA6B;gBAC3C,OAAO,EAAE,GAAG;gBACZ,SAAS,EAAE,IAAI;gBACf,SAAS,EAAE,UAAU;gBACrB,mEAAmE;aACpE,CAAC,CAAC;YAEH,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,GAAG,CAAC;gBACvC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;gBACjC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;aAC5B,CAAC,CAAC;YAEH,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;QACvD,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;YAC5C,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,GAAqB,EACrB,MAAc,EACd,SAAkB;QAElB,IAAI,CAAC;YACH,4CAA4C;YAC5C,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAC1C,GAAG,EACH,MAAM,EACN,SAAS,IAAI,SAAS,EACtB,SAAS,CAAC,sCAAsC;aACjD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;YAC/C,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,GAA0B,EAC1B,MAAc;QAEd,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,KAAa,EAAE,MAAc;QACnD,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAA0B;QAK5C,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,QAAQ,WAAW,EAAE,CAAC;QAEzC,MAAM,GAAG,GAAkB;YACzB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,wBAAwB,EAAE,GAAG,CAAC,wBAAwB;YACtD,uBAAuB,EAAE,GAAG,CAAC,uBAAuB,IAAI,CAAC;YACzD,oBAAoB,EAAE,GAAG,CAAC,MAAM;YAChC,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,CAAC;YAC7B,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,CAAC;YAC7B,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,CAAC;YACnC,UAAU,EAAE,UAAU;SACvB,CAAC;QAEF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACpE,MAAM,YAAY,GAAG,UAAU,GAAG,CAAC,CAAC;QAEpC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;YACnE,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,oBAAoB,EAAE,GAAG,CAAC,MAAM;YAChC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,QAAQ,EAAE,YAAY;YACtB,UAAU,EAAE,UAAU;YACtB,IAAI,EAAE,WAAW;YACjB,wBAAwB,EAAE,GAAG,CAAC,wBAAwB;YACtD,uBAAuB,EAAE,GAAG,CAAC,uBAAuB;SACrD,CAAC,CAAC;QAEH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,oBAAoB,CACxB,aAAqB,EACrB,MAA6B,EAC7B,MAA6B;QAE7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACrD,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,yBAAyB;IAEzB,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAC1B,SAAS,EAAE,CAAC,SAAS,EAAE,oBAAoB,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,qBAAqB,CACzB,SAA0B;QAE1B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAC1B,KAAK,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE;YAChC,SAAS,EAAE,CAAC,SAAS,EAAE,oBAAoB,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,GAAoE;QAEpE,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,8BAA8B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAErE,2CAA2C;YAC3C,IAAI,GAAG,CAAC,SAAS,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;gBACvD,GAAG,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC1E,CAAC;YAED,sFAAsF;YACtF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;oBAC7C,KAAK,EAAE;wBACL,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;wBAChC,oBAAoB,EAAE,GAAG,CAAC,oBAAoB;4BAC5C,CAAC,CAAC,IAAA,eAAK,EAAC,GAAG,CAAC,oBAAoB,CAAC;4BACjC,CAAC,CAAC,IAAA,gBAAM,GAAE;wBACZ,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,CAAC;qBACpC;iBACF,CAAC,CAAC;gBACH,IAAI,QAAQ,EAAE,CAAC;oBACb,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,+BAA+B,QAAQ,CAAC,EAAE,kDAAkD,CAC7F,CAAC;oBACF,GAAG,CAAC,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC;gBACvB,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC/C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,mCAAmC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YAChE,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,sCAAsC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAClF,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CACzC,CAAC;YACF,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EAAU;QAC7B,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAa;QAC9B,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAa;QAC9B,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAAkB;QACnC,MAAM,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB;QACnD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,EAAU,EAAE,QAAgB;QAChD,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB;QAC5C,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,IAAI,4BAAmB,CAC3B,yFAAyF,CAC1F,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,GAAsB,EAAE,MAAc;QACzD,OAAO,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC/D,CAAC;IACD,KAAK,CAAC,cAAc,CAAC,GAIpB;QACC,uDAAuD;QACvD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YAC7C,KAAK,EAAE,EAAE,cAAc,EAAE,GAAG,CAAC,cAAc,EAAE;YAC7C,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;SAC7B,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,4FAA4F;YAC5F,yEAAyE;YACzE,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,oCAAoC,GAAG,CAAC,cAAc,EAAE,CACzD,CAAC;YACF,0CAA0C;YAC1C,MAAM,IAAI,CAAC,QAAQ,CAAC;gBAClB,cAAc,EAAE,GAAG,CAAC,cAAc;gBAClC,UAAU,EAAE,EAAE;gBACd,YAAY,EAAE,cAAc;gBAC5B,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,SAAS;gBACvD,SAAS,EAAE,IAAI;gBACf,SAAS,EAAE,MAAM;gBACjB,MAAM,EAAE,MAAM;gBACd,QAAQ,EAAE,QAAQ;gBAClB,QAAQ,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;aACjC,CAAC,CAAC;YACH,OAAO,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;QAC9C,CAAC;QAED,cAAc;QACd,MAAM,IAAI,CAAC,QAAQ,CAAC;YAClB,cAAc,EAAE,GAAG,CAAC,cAAc;YAClC,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,YAAY,EAAE,SAAS,CAAC,YAAY;YACpC,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,oCAAoC;YAClF,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,MAAM;YACjB,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,GAAG,CAAC,cAAc;YAC5B,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;SACvD,CAAC,CAAC;QAEH,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,0BAA0B;YAC1B,2CAA2C;YAC3C,oDAAoD;YACpD,6BAA6B;YAC7B,IAAI,OAA8B,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC;gBACpC,MAAM,GAAG,GACP,OAAO,MAAM,KAAK,QAAQ;oBACxB,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAA6B;oBACjD,CAAC,CAAC,MAAM,CAAC;gBAEb,OAAO,GAAG;oBACR,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;oBAChC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC;oBACxC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;oBAChC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;oBAChC,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC;oBACtC,wBAAwB,EAAE,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,IAAI,CAAC;oBACnE,uBAAuB,EAAE,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,CAAC;oBACjE,MAAM,EAAE,CAAC,EAAE,qBAAqB;iBACjC,CAAC;gBAEF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;gBACpD,OAAO;oBACL,MAAM,EAAE,UAAU;oBAClB,SAAS,EAAE,GAAG,CAAC,cAAc;oBAC7B,SAAS,EAAE,IAAI,CAAC,MAAM;iBACvB,CAAC;YACJ,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC;gBACvE,OAAO;oBACL,MAAM,EAAE,uBAAuB;oBAC/B,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;iBAClD,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAIlB;QACC,uCAAuC;QACvC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YAC7C,KAAK,EAAE,EAAE,cAAc,EAAE,GAAG,CAAC,cAAc,EAAE;YAC7C,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;SAC7B,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,SAAS,EAAE,UAAU,CAAC;QAEzC,MAAM,IAAI,CAAC,QAAQ,CAAC;YAClB,cAAc,EAAE,GAAG,CAAC,cAAc;YAClC,UAAU,EAAE,UAAU,IAAI,EAAE;YAC5B,YAAY,EAAE,SAAS,EAAE,YAAY,IAAI,QAAQ;YACjD,OAAO,EAAE;gBACP,MAAM,EAAE,CAAC;gBACT,SAAS,EAAE,SAAS;gBACpB,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,CAAC;aAC9B;YACD,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,QAAQ;YACnB,MAAM,EAAE,WAAW;YACnB,QAAQ,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;SACjC,CAAC,CAAC;QAEH,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAA0B;QACzC,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,EAAc,EAAE,CAAC;QAElE,sDAAsD;QACtD,gGAAgG;QAChG,kEAAkE;QAElE,6FAA6F;QAC7F,4CAA4C;QAC5C,qCAAqC;QAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,kCAAkC;gBAClC;;kBAEE;gBACF,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBACpD,MAAM,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa;oBACtE,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,MAAM,EAAE,CAAC;gBACjB,OAAO,CAAC,MAAM,CAAC,IAAI,CACjB,eAAe,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACrF,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,IAWtB;QACC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YAClC,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,UAAU,EAAE,IAAI,CAAC,UAAqC;YACtD,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;YAC3B,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;SAClC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAEO,YAAY,CAAC,KAAY;QAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;QAChC,IAAI,IAAI,KAAK,mBAAmB,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;YACzD,OAAO,kBAAkB,CAAC;QAC5B,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,cAAc,CAAC;QAC3E,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,aAAa,CAAC;QACzE,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC;YACxD,OAAO,kBAAkB,CAAC;QAC5B,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC1D,OAAO,kBAAkB,CAAC;QAC5B,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;YACtD,OAAO,oBAAoB,CAAC;QAC9B,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC;YACxD,OAAO,qBAAqB,CAAC;QAC/B,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,UAAU,CAAC;QACzE,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,KAAc,EAAE,GAAY,EAAE,SAAiB;QACpE,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACtE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;gBACtC,YAAY,EAAE,GAAG,CAAC,OAAO,IAAI,eAAe;gBAC5C,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;gBACjC,WAAW,EAAE;oBACX,GAAG,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;wBACzC,CAAC,CAAE,GAA+B;wBAClC,CAAC,CAAC,EAAE,CAAC;oBACP,SAAS;iBACV;aACF,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;CACF,CAAA;AA/fY,4DAAwB;mCAAxB,wBAAwB;IADpC,IAAA,mBAAU,GAAE;IAKR,WAAA,IAAA,0BAAgB,EAAC,oDAAoB,CAAC,CAAA;IAEtC,WAAA,IAAA,0BAAgB,EAAC,kDAAmB,CAAC,CAAA;IAErC,WAAA,IAAA,0BAAgB,EAAC,kDAAmB,CAAC,CAAA;IAUrC,YAAA,IAAA,6BAAmB,GAAE,CAAA;yDAbF,oBAAU,oBAAV,oBAAU,oDAEX,oBAAU,oBAAV,oBAAU,oDAEV,oBAAU,oBAAV,oBAAU,oDAEL,gCAAc,oBAAd,gCAAc,oDACV,wCAAkB,oBAAlB,wCAAkB,oDACvB,8BAAa,oBAAb,8BAAa,oDACf,8DAA4B,oBAA5B,8DAA4B,oDAC1B,sBAAa,oBAAb,sBAAa,oDACL,+CAAqB,oBAArB,+CAAqB,oDAC5B,gCAAc,oBAAd,gCAAc,oDAEf,uBAAa,oBAAb,uBAAa,oDACd,2CAAmB,oBAAnB,2CAAmB;GApBhC,wBAAwB,CA+fpC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\document-numbering.service.ts"],"sourcesContent":["import { Injectable, Logger, BadRequestException } from '@nestjs/common';\r\nimport { InjectRepository, InjectEntityManager } from '@nestjs/typeorm';\r\nimport { Repository, EntityManager, IsNull, Equal } from 'typeorm';\r\nimport { ConfigService } from '@nestjs/config';\r\n\r\nimport { DocumentNumberFormat } from '../entities/document-number-format.entity';\r\nimport { DocumentNumberAudit } from '../entities/document-number-audit.entity';\r\nimport { DocumentNumberError } from '../entities/document-number-error.entity';\r\n\r\n// Services\r\nimport { CounterService } from './counter.service';\r\nimport { ReservationService } from './reservation.service';\r\nimport { FormatService } from './format.service';\r\nimport { DocumentNumberingLockService } from './document-numbering-lock.service';\r\nimport { ManualOverrideService } from './manual-override.service';\r\nimport { MetricsService } from './metrics.service';\r\n\r\n// DTOs\r\nimport { CounterKeyDto } from '../dto/counter-key.dto';\r\nimport { GenerateNumberContext } from '../interfaces/document-numbering.interface';\r\nimport {\r\n ReserveNumberDto,\r\n ReserveNumberResponseDto,\r\n} from '../dto/reserve-number.dto';\r\nimport {\r\n ConfirmReservationDto,\r\n ConfirmReservationResponseDto,\r\n} from '../dto/confirm-reservation.dto';\r\nimport { ManualOverrideDto } from '../dto/manual-override.dto';\r\nimport { UuidResolverService } from '../../../common/services/uuid-resolver.service';\r\n\r\n@Injectable()\r\nexport class DocumentNumberingService {\r\n private readonly logger = new Logger(DocumentNumberingService.name);\r\n\r\n constructor(\r\n @InjectRepository(DocumentNumberFormat)\r\n private formatRepo: Repository,\r\n @InjectRepository(DocumentNumberAudit)\r\n private auditRepo: Repository,\r\n @InjectRepository(DocumentNumberError)\r\n private errorRepo: Repository,\r\n\r\n private counterService: CounterService,\r\n private reservationService: ReservationService,\r\n private formatService: FormatService,\r\n private lockService: DocumentNumberingLockService,\r\n private configService: ConfigService,\r\n private manualOverrideService: ManualOverrideService,\r\n private metricsService: MetricsService,\r\n @InjectEntityManager()\r\n private entityManager: EntityManager,\r\n private uuidResolver: UuidResolverService\r\n ) {}\r\n\r\n /**\r\n * ADR-019: Public facade for controllers to resolve project/organization IDs\r\n */\r\n async resolveIdForPreview(\r\n type: 'project' | 'organization',\r\n id: number | string\r\n ): Promise {\r\n if (type === 'project') return this.uuidResolver.resolveProjectId(id);\r\n return this.uuidResolver.resolveOrganizationId(id);\r\n }\r\n\r\n async generateNextNumber(\r\n ctx: GenerateNumberContext\r\n ): Promise<{ number: string; auditId: number }> {\r\n let lock = null;\r\n try {\r\n // 0. Check Idempotency (Ideally done in Guard/Middleware, but double check here if passed)\r\n // Note: If idempotencyKey exists in ctx, check audit log for existing SUCCESS entry?\r\n // Omitted for brevity as per spec usually handled by middleware or separate check.\r\n\r\n const currentYear = new Date().getFullYear();\r\n const resetScope = `YEAR_${currentYear}`;\r\n\r\n // 1. Prepare Counter Key\r\n const key: CounterKeyDto = {\r\n projectId: ctx.projectId,\r\n originatorOrganizationId: ctx.originatorOrganizationId,\r\n recipientOrganizationId: ctx.recipientOrganizationId || 0,\r\n correspondenceTypeId: ctx.typeId,\r\n subTypeId: ctx.subTypeId || 0,\r\n rfaTypeId: ctx.rfaTypeId || 0,\r\n disciplineId: ctx.disciplineId || 0,\r\n resetScope: resetScope,\r\n };\r\n\r\n // 2. Acquire Redis Lock\r\n try {\r\n // Map CounterKeyDto to LockCounterKey (names slightly different or cast if same)\r\n lock = await this.lockService.acquireLock({\r\n projectId: key.projectId,\r\n originatorOrgId: key.originatorOrganizationId,\r\n recipientOrgId: key.recipientOrganizationId,\r\n correspondenceTypeId: key.correspondenceTypeId,\r\n subTypeId: key.subTypeId,\r\n rfaTypeId: key.rfaTypeId,\r\n disciplineId: key.disciplineId,\r\n resetScope: key.resetScope,\r\n });\r\n } catch (e) {\r\n const errorMessage = e instanceof Error ? e.message : String(e);\r\n this.logger.warn(\r\n `Failed to acquire Redis lock, falling back to DB lock only: ${errorMessage}`\r\n );\r\n this.metricsService.lockFailures.inc({\r\n project_id: String(key.projectId),\r\n });\r\n // Fallback: Proceed without Redlock, relying on CounterService DB optimistic lock\r\n }\r\n\r\n // 3. Increment Counter\r\n const sequence = await this.counterService.incrementCounter(key);\r\n\r\n // 4. Format Number\r\n const { previewNumber: documentNumber } = await this.formatService.format(\r\n {\r\n projectId: ctx.projectId,\r\n correspondenceTypeId: ctx.typeId,\r\n subTypeId: ctx.subTypeId,\r\n rfaTypeId: ctx.rfaTypeId,\r\n disciplineId: ctx.disciplineId,\r\n sequence: sequence,\r\n resetScope: resetScope,\r\n year: currentYear,\r\n originatorOrganizationId: ctx.originatorOrganizationId,\r\n recipientOrganizationId: ctx.recipientOrganizationId,\r\n }\r\n );\r\n\r\n // 5. Audit Log\r\n const audit = await this.logAudit({\r\n documentNumber,\r\n counterKey: JSON.stringify(key),\r\n templateUsed: 'DELEGATED_TO_FORMAT_SERVICE',\r\n context: ctx,\r\n isSuccess: true,\r\n operation: 'GENERATE',\r\n // metadata: { idempotencyKey: ctx.idempotencyKey } // If available\r\n });\r\n\r\n this.metricsService.numbersGenerated.inc({\r\n project_id: String(ctx.projectId),\r\n type_id: String(ctx.typeId),\r\n });\r\n\r\n return { number: documentNumber, auditId: audit.id };\r\n } catch (error: unknown) {\r\n await this.logError(error, ctx, 'GENERATE');\r\n throw error;\r\n } finally {\r\n if (lock) {\r\n await this.lockService.releaseLock(lock);\r\n }\r\n }\r\n }\r\n\r\n async reserveNumber(\r\n dto: ReserveNumberDto,\r\n userId: number,\r\n ipAddress?: string\r\n ): Promise {\r\n try {\r\n // Delegate completely to ReservationService\r\n return await this.reservationService.reserve(\r\n dto,\r\n userId,\r\n ipAddress || '0.0.0.0',\r\n 'Unknown' // userAgent not passed in legacy call\r\n );\r\n } catch (error: unknown) {\r\n this.logger.error('Reservation failed', error);\r\n throw error;\r\n }\r\n }\r\n\r\n async confirmReservation(\r\n dto: ConfirmReservationDto,\r\n userId: number\r\n ): Promise {\r\n return this.reservationService.confirm(dto, userId);\r\n }\r\n\r\n async cancelReservation(token: string, userId: number): Promise {\r\n return this.reservationService.cancel(token, userId);\r\n }\r\n\r\n async previewNumber(ctx: GenerateNumberContext): Promise<{\r\n previewNumber: string;\r\n nextSequence: number;\r\n isDefault: boolean;\r\n }> {\r\n const currentYear = new Date().getFullYear();\r\n const resetScope = `YEAR_${currentYear}`;\r\n\r\n const key: CounterKeyDto = {\r\n projectId: ctx.projectId,\r\n originatorOrganizationId: ctx.originatorOrganizationId,\r\n recipientOrganizationId: ctx.recipientOrganizationId || 0,\r\n correspondenceTypeId: ctx.typeId,\r\n subTypeId: ctx.subTypeId || 0,\r\n rfaTypeId: ctx.rfaTypeId || 0,\r\n disciplineId: ctx.disciplineId || 0,\r\n resetScope: resetScope,\r\n };\r\n\r\n const currentSeq = await this.counterService.getCurrentCounter(key);\r\n const nextSequence = currentSeq + 1;\r\n\r\n const { previewNumber, isDefault } = await this.formatService.format({\r\n projectId: ctx.projectId,\r\n correspondenceTypeId: ctx.typeId,\r\n subTypeId: ctx.subTypeId,\r\n rfaTypeId: ctx.rfaTypeId,\r\n disciplineId: ctx.disciplineId,\r\n sequence: nextSequence,\r\n resetScope: resetScope,\r\n year: currentYear,\r\n originatorOrganizationId: ctx.originatorOrganizationId,\r\n recipientOrganizationId: ctx.recipientOrganizationId,\r\n });\r\n\r\n return { previewNumber, nextSequence, isDefault };\r\n }\r\n\r\n /**\r\n * Generates a new number for a draft when its context changes.\r\n */\r\n async updateNumberForDraft(\r\n currentNumber: string,\r\n oldCtx: GenerateNumberContext,\r\n newCtx: GenerateNumberContext\r\n ): Promise {\r\n const result = await this.generateNextNumber(newCtx);\r\n return result.number;\r\n }\r\n\r\n // --- Admin / Legacy ---\r\n\r\n async getTemplates(): Promise {\r\n return this.formatRepo.find({\r\n relations: ['project', 'correspondenceType'],\r\n });\r\n }\r\n\r\n async getTemplatesByProject(\r\n projectId: number | string\r\n ): Promise {\r\n const internalId = await this.uuidResolver.resolveProjectId(projectId);\r\n return this.formatRepo.find({\r\n where: { projectId: internalId },\r\n relations: ['project', 'correspondenceType'],\r\n });\r\n }\r\n\r\n async saveTemplate(\r\n dto: Partial & { projectId?: number | string }\r\n ): Promise {\r\n try {\r\n this.logger.log(`Saving numbering template: ${JSON.stringify(dto)}`);\r\n\r\n // Resolve project ID if it's a UUID/String\r\n if (dto.projectId && typeof dto.projectId === 'string') {\r\n dto.projectId = await this.uuidResolver.resolveProjectId(dto.projectId);\r\n }\r\n\r\n // Upsert logic: If no ID provided, check for existing template with same business key\r\n if (!dto.id) {\r\n const existing = await this.formatRepo.findOne({\r\n where: {\r\n projectId: Number(dto.projectId),\r\n correspondenceTypeId: dto.correspondenceTypeId\r\n ? Equal(dto.correspondenceTypeId)\r\n : IsNull(),\r\n disciplineId: dto.disciplineId || 0,\r\n },\r\n });\r\n if (existing) {\r\n this.logger.log(\r\n `Found existing template ID: ${existing.id} for business key, updating instead of creating.`\r\n );\r\n dto.id = existing.id;\r\n }\r\n }\r\n\r\n const result = await this.formatRepo.save(dto);\r\n this.logger.log(`Successfully saved template ID: ${result.id}`);\r\n return result;\r\n } catch (e: unknown) {\r\n this.logger.error(\r\n `Failed to save numbering template: ${e instanceof Error ? e.message : String(e)}`,\r\n e instanceof Error ? e.stack : undefined\r\n );\r\n throw e;\r\n }\r\n }\r\n\r\n async deleteTemplate(id: number) {\r\n return this.formatRepo.delete(id);\r\n }\r\n\r\n async getAuditLogs(limit: number) {\r\n return this.auditRepo.find({ take: limit, order: { createdAt: 'DESC' } });\r\n }\r\n\r\n async getErrorLogs(limit: number) {\r\n return this.errorRepo.find({ take: limit, order: { createdAt: 'DESC' } });\r\n }\r\n\r\n async getSequences(projectId?: number) {\r\n await Promise.resolve(projectId); // satisfy unused\r\n return [];\r\n }\r\n\r\n async setCounterValue(id: number, sequence: number) {\r\n await Promise.resolve(id); // satisfy unused\r\n await Promise.resolve(sequence);\r\n throw new BadRequestException(\r\n 'Updating counter by single ID is not supported with composite keys. Use manualOverride.'\r\n );\r\n }\r\n\r\n async manualOverride(dto: ManualOverrideDto, userId: number) {\r\n return this.manualOverrideService.applyOverride(dto, userId);\r\n }\r\n async voidAndReplace(dto: {\r\n documentNumber: string;\r\n reason: string;\r\n replace: boolean;\r\n }) {\r\n // 1. Find the audit log for this number to get context\r\n const lastAudit = await this.auditRepo.findOne({\r\n where: { documentNumber: dto.documentNumber },\r\n order: { createdAt: 'DESC' },\r\n });\r\n\r\n if (!lastAudit) {\r\n // If not found in audit, we can't easily regenerate with same context unless passed in dto.\r\n // For now, log a warning and return error or just log the void decision.\r\n this.logger.warn(\r\n `Void request for unknown number: ${dto.documentNumber}`\r\n );\r\n // Create a void audit anyway if possible?\r\n await this.logAudit({\r\n documentNumber: dto.documentNumber,\r\n counterKey: {},\r\n templateUsed: 'VOID_UNKNOWN',\r\n context: { userId: 0, ipAddress: '0.0.0.0' }, // System\r\n isSuccess: true,\r\n operation: 'VOID',\r\n status: 'VOID',\r\n newValue: 'VOIDED',\r\n metadata: { reason: dto.reason },\r\n });\r\n return { status: 'VOIDED_UNKNOWN_CONTEXT' };\r\n }\r\n\r\n // 2. Log VOID\r\n await this.logAudit({\r\n documentNumber: dto.documentNumber,\r\n counterKey: lastAudit.counterKey,\r\n templateUsed: lastAudit.templateUsed,\r\n context: { userId: 0, ipAddress: '0.0.0.0' }, // TODO: Pass userId from controller\r\n isSuccess: true,\r\n operation: 'VOID',\r\n status: 'VOID',\r\n oldValue: dto.documentNumber,\r\n newValue: 'VOIDED',\r\n metadata: { reason: dto.reason, replace: dto.replace },\r\n });\r\n\r\n if (dto.replace) {\r\n // 3. Generate Replacement\r\n // Parse context from lastAudit.counterKey?\r\n // GenerateNumberContext needs more than counterKey.\r\n // But we can reconstruct it.\r\n let context: GenerateNumberContext;\r\n try {\r\n const rawKey = lastAudit.counterKey;\r\n const key =\r\n typeof rawKey === 'string'\r\n ? (JSON.parse(rawKey) as Record)\r\n : rawKey;\r\n\r\n context = {\r\n projectId: Number(key.projectId),\r\n typeId: Number(key.correspondenceTypeId),\r\n subTypeId: Number(key.subTypeId),\r\n rfaTypeId: Number(key.rfaTypeId),\r\n disciplineId: Number(key.disciplineId),\r\n originatorOrganizationId: Number(key.originatorOrganizationId) || 0,\r\n recipientOrganizationId: Number(key.recipientOrganizationId) || 0,\r\n userId: 0, // System replacement\r\n };\r\n\r\n const next = await this.generateNextNumber(context);\r\n return {\r\n status: 'REPLACED',\r\n oldNumber: dto.documentNumber,\r\n newNumber: next.number,\r\n };\r\n } catch (e) {\r\n this.logger.error(`Failed to replace number ${dto.documentNumber}`, e);\r\n return {\r\n status: 'VOIDED_REPLACE_FAILED',\r\n error: e instanceof Error ? e.message : String(e),\r\n };\r\n }\r\n }\r\n\r\n return { status: 'VOIDED' };\r\n }\r\n\r\n async cancelNumber(dto: {\r\n documentNumber: string;\r\n reason: string;\r\n projectId?: number;\r\n }) {\r\n // Similar to VOID but status CANCELLED\r\n const lastAudit = await this.auditRepo.findOne({\r\n where: { documentNumber: dto.documentNumber },\r\n order: { createdAt: 'DESC' },\r\n });\r\n\r\n const contextKey = lastAudit?.counterKey;\r\n\r\n await this.logAudit({\r\n documentNumber: dto.documentNumber,\r\n counterKey: contextKey || {},\r\n templateUsed: lastAudit?.templateUsed || 'CANCEL',\r\n context: {\r\n userId: 0,\r\n ipAddress: '0.0.0.0',\r\n projectId: dto.projectId || 0,\r\n },\r\n isSuccess: true,\r\n operation: 'CANCEL',\r\n status: 'CANCELLED',\r\n metadata: { reason: dto.reason },\r\n });\r\n\r\n return { status: 'CANCELLED' };\r\n }\r\n\r\n async bulkImport(items: ManualOverrideDto[]) {\r\n const results = { success: 0, failed: 0, errors: [] as string[] };\r\n\r\n // items expected to be ManualOverrideDto[] or similar\r\n // Actually bulk import usually means \"Here is a list of EXISTING numbers used in legacy system\"\r\n // So we should parse them and update counters if they are higher.\r\n\r\n // Implementation: For each item, likely delegate to ManualOverrideService if it fits schema.\r\n // Or if items is just a number of CSV rows?\r\n // Assuming items is parsed CSV rows.\r\n\r\n for (const item of items) {\r\n try {\r\n // Adapt item to ManualOverrideDto\r\n /*\r\n CSV columns: ProjectID, TypeID, OriginatorID, RecipientID, LastNumber\r\n */\r\n if (item.newLastNumber && item.correspondenceTypeId) {\r\n await this.manualOverrideService.applyOverride(item, 0); // 0 = System\r\n results.success++;\r\n }\r\n } catch (e) {\r\n results.failed++;\r\n results.errors.push(\r\n `Failed item ${JSON.stringify(item)}: ${e instanceof Error ? e.message : String(e)}`\r\n );\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n private async logAudit(data: {\r\n documentNumber: string;\r\n counterKey: unknown;\r\n templateUsed: string;\r\n context: { projectId?: number; userId?: number; ipAddress?: string };\r\n isSuccess: boolean;\r\n operation: string;\r\n status?: string;\r\n oldValue?: string;\r\n newValue?: string;\r\n metadata?: Record;\r\n }): Promise {\r\n const audit = this.auditRepo.create({\r\n documentNumber: data.documentNumber,\r\n counterKey: data.counterKey as Record,\r\n templateUsed: data.templateUsed,\r\n isSuccess: data.isSuccess,\r\n operation: data.operation,\r\n status: data.status,\r\n oldValue: data.oldValue,\r\n newValue: data.newValue,\r\n metadata: data.metadata,\r\n userId: data.context.userId,\r\n ipAddress: data.context.ipAddress,\r\n });\r\n return this.auditRepo.save(audit);\r\n }\r\n\r\n private mapErrorType(error: Error): string {\r\n const name = error.name || '';\r\n const msg = error.message || '';\r\n if (name === 'ConflictException' || msg.includes('version'))\r\n return 'VERSION_CONFLICT';\r\n if (msg.includes('lock') || msg.includes('timeout')) return 'LOCK_TIMEOUT';\r\n if (msg.includes('Redis') || msg.includes('redis')) return 'REDIS_ERROR';\r\n if (msg.includes('duplicate') || msg.includes('Duplicate'))\r\n return 'DUPLICATE_NUMBER';\r\n if (msg.includes('validation') || msg.includes('Validation'))\r\n return 'VALIDATION_ERROR';\r\n if (msg.includes('exhausted') || msg.includes('maximum'))\r\n return 'SEQUENCE_EXHAUSTED';\r\n if (msg.includes('expired') || msg.includes('reservation'))\r\n return 'RESERVATION_EXPIRED';\r\n if (msg.includes('database') || msg.includes('query')) return 'DB_ERROR';\r\n return 'GENERATE_ERROR';\r\n }\r\n\r\n private async logError(error: unknown, ctx: unknown, operation: string) {\r\n try {\r\n const err = error instanceof Error ? error : new Error(String(error));\r\n const errEntity = this.errorRepo.create({\r\n errorMessage: err.message || 'Unknown Error',\r\n errorType: this.mapErrorType(err),\r\n contextData: {\r\n ...(typeof ctx === 'object' && ctx !== null\r\n ? (ctx as Record)\r\n : {}),\r\n operation,\r\n },\r\n });\r\n await this.errorRepo.save(errEntity);\r\n } catch (e) {\r\n this.logger.error('Failed to log error to DB', e);\r\n }\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/63/nil_6310299ee9928c1f054cce44dffdedbd b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/63/nil_6310299ee9928c1f054cce44dffdedbd new file mode 100644 index 0000000..eee9391 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/63/nil_6310299ee9928c1f054cce44dffdedbd @@ -0,0 +1,5 @@ +c2a712c6b525f286e4effb0ce8a2dc78 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = '00000000-0000-0000-0000-000000000000'; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcbmlsLmpzIiwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUNiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlELE9BQU8sQ0FBQyxPQUFPLEdBQUcsc0NBQXNDLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcbmlsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCc7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/63/nil_6310299ee9928c1f054cce44dffdedbd.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/63/nil_6310299ee9928c1f054cce44dffdedbd.map new file mode 100644 index 0000000..44b65a7 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/63/nil_6310299ee9928c1f054cce44dffdedbd.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\nil.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,OAAO,CAAC,OAAO,GAAG,sCAAsC,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\nil.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = '00000000-0000-0000-0000-000000000000';\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/64/userservicespec_64bccaa90f006507e557550ed585fcf5 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/64/userservicespec_64bccaa90f006507e557550ed585fcf5 new file mode 100644 index 0000000..f058357 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/64/userservicespec_64bccaa90f006507e557550ed585fcf5 @@ -0,0 +1,117 @@ +c4d8e9b5d70fc0a19569b9239d9381a7 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +// File: src/modules/user/user.service.spec.ts +const testing_1 = require("@nestjs/testing"); +const typeorm_1 = require("@nestjs/typeorm"); +const cache_manager_1 = require("@nestjs/cache-manager"); +const user_service_1 = require("./user.service"); +const user_entity_1 = require("./entities/user.entity"); +const role_entity_1 = require("./entities/role.entity"); +const permission_entity_1 = require("./entities/permission.entity"); +const uuid_resolver_service_1 = require("../../common/services/uuid-resolver.service"); +// Mock Repository +const mockUserRepository = { + find: jest.fn(), + findOne: jest.fn(), + create: jest.fn(), + save: jest.fn(), + merge: jest.fn(), + softDelete: jest.fn(), + query: jest.fn(), + createQueryBuilder: jest.fn(() => ({ + leftJoinAndSelect: jest.fn().mockReturnThis(), + select: jest.fn().mockReturnThis(), + andWhere: jest.fn().mockReturnThis(), + skip: jest.fn().mockReturnThis(), + take: jest.fn().mockReturnThis(), + getManyAndCount: jest.fn().mockResolvedValue([[], 0]), + })), +}; +// Mock Cache Manager +const mockCacheManager = { + get: jest.fn(), + set: jest.fn(), + del: jest.fn(), +}; +describe('UserService', () => { + let service; + beforeEach(async () => { + const module = await testing_1.Test.createTestingModule({ + providers: [ + user_service_1.UserService, + { + provide: (0, typeorm_1.getRepositoryToken)(user_entity_1.User), + useValue: mockUserRepository, + }, + { + provide: cache_manager_1.CACHE_MANAGER, + useValue: mockCacheManager, + }, + { + provide: (0, typeorm_1.getRepositoryToken)(role_entity_1.Role), + useValue: mockUserRepository, // Reuse generic mock + }, + { + provide: (0, typeorm_1.getRepositoryToken)(permission_entity_1.Permission), + useValue: mockUserRepository, // Reuse generic mock + }, + { + provide: uuid_resolver_service_1.UuidResolverService, + useValue: { + resolveOrganizationId: jest.fn().mockResolvedValue(1), + resolveProjectId: jest.fn().mockResolvedValue(1), + }, + }, + ], + }).compile(); + service = module.get(user_service_1.UserService); + }); + afterEach(() => { + jest.clearAllMocks(); + }); + it('should be defined', () => { + expect(service).toBeDefined(); + }); + describe('findAll', () => { + it('should return paginated users', async () => { + const mockUsers = [{ user_id: 1, username: 'test' }]; + const mockTotal = 1; + const mockQB = { + leftJoinAndSelect: jest.fn().mockReturnThis(), + select: jest.fn().mockReturnThis(), + andWhere: jest.fn().mockReturnThis(), + skip: jest.fn().mockReturnThis(), + take: jest.fn().mockReturnThis(), + getManyAndCount: jest.fn().mockResolvedValue([mockUsers, mockTotal]), + }; + mockUserRepository.createQueryBuilder.mockReturnValue(mockQB); + const result = await service.findAll(); + expect(result.data).toEqual(mockUsers); + expect(result.total).toEqual(mockTotal); + expect(mockUserRepository.createQueryBuilder).toHaveBeenCalled(); + }); + }); + describe('getUserPermissions', () => { + it('should return cached permissions if available', async () => { + const cachedPermissions = ['document.view', 'document.create']; + mockCacheManager.get.mockResolvedValue(cachedPermissions); + const result = await service.getUserPermissions(1); + expect(result).toEqual(cachedPermissions); + expect(mockCacheManager.get).toHaveBeenCalledWith('permissions:user:1'); + expect(mockUserRepository.query).not.toHaveBeenCalled(); + }); + it('should query DB and cache if not in cache', async () => { + const dbPermissions = [ + { permission_name: 'document.view' }, + { permission_name: 'document.create' }, + ]; + mockCacheManager.get.mockResolvedValue(null); + mockUserRepository.query.mockResolvedValue(dbPermissions); + const result = await service.getUserPermissions(1); + expect(result).toEqual(['document.view', 'document.create']); + expect(mockCacheManager.set).toHaveBeenCalled(); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcdXNlclxcdXNlci5zZXJ2aWNlLnNwZWMudHMiLCJtYXBwaW5ncyI6Ijs7QUFBQSw4Q0FBOEM7QUFDOUMsNkNBQXNEO0FBQ3RELDZDQUFxRDtBQUNyRCx5REFBc0Q7QUFDdEQsaURBQTZDO0FBQzdDLHdEQUE4QztBQUM5Qyx3REFBOEM7QUFDOUMsb0VBQTBEO0FBQzFELHVGQUFrRjtBQUVsRixrQkFBa0I7QUFDbEIsTUFBTSxrQkFBa0IsR0FBRztJQUN6QixJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtJQUNmLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO0lBQ2xCLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO0lBQ2pCLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO0lBQ2YsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7SUFDaEIsVUFBVSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7SUFDckIsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7SUFDaEIsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxjQUFjLEVBQUU7UUFDN0MsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxjQUFjLEVBQUU7UUFDbEMsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxjQUFjLEVBQUU7UUFDcEMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxjQUFjLEVBQUU7UUFDaEMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxjQUFjLEVBQUU7UUFDaEMsZUFBZSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUN0RCxD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SUFBSSxDQUFDLENBQUM7WUFDN0Msa0JBQWtCLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRTFELE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRW5ELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1lBQzdELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ2xELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFx1c2VyXFx1c2VyLnNlcnZpY2Uuc3BlYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGaWxlOiBzcmMvbW9kdWxlcy91c2VyL3VzZXIuc2VydmljZS5zcGVjLnRzXG5pbXBvcnQgeyBUZXN0LCBUZXN0aW5nTW9kdWxlIH0gZnJvbSAnQG5lc3Rqcy90ZXN0aW5nJztcbmltcG9ydCB7IGdldFJlcG9zaXRvcnlUb2tlbiB9IGZyb20gJ0BuZXN0anMvdHlwZW9ybSc7XG5pbXBvcnQgeyBDQUNIRV9NQU5BR0VSIH0gZnJvbSAnQG5lc3Rqcy9jYWNoZS1tYW5hZ2VyJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi91c2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4vZW50aXRpZXMvdXNlci5lbnRpdHknO1xuaW1wb3J0IHsgUm9sZSB9IGZyb20gJy4vZW50aXRpZXMvcm9sZS5lbnRpdHknO1xuaW1wb3J0IHsgUGVybWlzc2lvbiB9IGZyb20gJy4vZW50aXRpZXMvcGVybWlzc2lvbi5lbnRpdHknO1xuaW1wb3J0IHsgVXVpZFJlc29sdmVyU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9zZXJ2aWNlcy91dWlkLXJlc29sdmVyLnNlcnZpY2UnO1xuXG4vLyBNb2NrIFJlcG9zaXRvcnlcbmNvbnN0IG1vY2tVc2VyUmVwb3NpdG9yeSA9IHtcbiAgZmluZDogamVzdC5mbigpLFxuICBmaW5kT25lOiBqZXN0LmZuKCksXG4gIGNyZWF0ZTogamVzdC5mbigpLFxuICBzYXZlOiBqZXN0LmZuKCksXG4gIG1lcmdlOiBqZXN0LmZuKCksXG4gIHNvZnREZWxldGU6IGplc3QuZm4oKSxcbiAgcXVlcnk6IGplc3QuZm4oKSxcbiAgY3JlYXRlUXVlcnlCdWlsZGVyOiBqZXN0LmZuKCgpID0+ICh7XG4gICAgbGVmdEpvaW5BbmRTZWxlY3Q6IGplc3QuZm4oKS5tb2NrUmV0dXJuVGhpcygpLFxuICAgIHNlbGVjdDogamVzdC5mbigpLm1vY2tSZXR1cm5UaGlzKCksXG4gICAgYW5kV2hlcmU6IGplc3QuZm4oKS5tb2NrUmV0dXJuVGhpcygpLFxuICAgIHNraXA6IGplc3QuZm4oKS5tb2NrUmV0dXJuVGhpcygpLFxuICAgIHRha2U6IGplc3QuZm4oKS5tb2NrUmV0dXJuVGhpcygpLFxuICAgIGdldE1hbnlBbmRDb3VudDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKFtbXSwgMF0pLFxuICB9KSksXG59O1xuXG4vLyBNb2NrIENhY2hlIE1hbmFnZXJcbmNvbnN0IG1vY2tDYWNoZU1hbmFnZXIgPSB7XG4gIGdldDogamVzdC5mbigpLFxuICBzZXQ6IGplc3QuZm4oKSxcbiAgZGVsOiBqZXN0LmZuKCksXG59O1xuXG5kZXNjcmliZSgnVXNlclNlcnZpY2UnLCAoKSA9PiB7XG4gIGxldCBzZXJ2aWNlOiBVc2VyU2VydmljZTtcblxuICBiZWZvcmVFYWNoKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBtb2R1bGU6IFRlc3RpbmdNb2R1bGUgPSBhd2FpdCBUZXN0LmNyZWF0ZVRlc3RpbmdNb2R1bGUoe1xuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIFVzZXJTZXJ2aWNlLFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogZ2V0UmVwb3NpdG9yeVRva2VuKFVzZXIpLFxuICAgICAgICAgIHVzZVZhbHVlOiBtb2NrVXNlclJlcG9zaXRvcnksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBDQUNIRV9NQU5BR0VSLFxuICAgICAgICAgIHVzZVZhbHVlOiBtb2NrQ2FjaGVNYW5hZ2VyLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogZ2V0UmVwb3NpdG9yeVRva2VuKFJvbGUpLFxuICAgICAgICAgIHVzZVZhbHVlOiBtb2NrVXNlclJlcG9zaXRvcnksIC8vIFJldXNlIGdlbmVyaWMgbW9ja1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogZ2V0UmVwb3NpdG9yeVRva2VuKFBlcm1pc3Npb24pLFxuICAgICAgICAgIHVzZVZhbHVlOiBtb2NrVXNlclJlcG9zaXRvcnksIC8vIFJldXNlIGdlbmVyaWMgbW9ja1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogVXVpZFJlc29sdmVyU2VydmljZSxcbiAgICAgICAgICB1c2VWYWx1ZToge1xuICAgICAgICAgICAgcmVzb2x2ZU9yZ2FuaXphdGlvbklkOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoMSksXG4gICAgICAgICAgICByZXNvbHZlUHJvamVjdElkOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoMSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSkuY29tcGlsZSgpO1xuXG4gICAgc2VydmljZSA9IG1vZHVsZS5nZXQ8VXNlclNlcnZpY2U+KFVzZXJTZXJ2aWNlKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBqZXN0LmNsZWFyQWxsTW9ja3MoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBiZSBkZWZpbmVkJywgKCkgPT4ge1xuICAgIGV4cGVjdChzZXJ2aWNlKS50b0JlRGVmaW5lZCgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnZmluZEFsbCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBwYWdpbmF0ZWQgdXNlcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBtb2NrVXNlcnMgPSBbeyB1c2VyX2lkOiAxLCB1c2VybmFtZTogJ3Rlc3QnIH1dO1xuICAgICAgY29uc3QgbW9ja1RvdGFsID0gMTtcblxuICAgICAgY29uc3QgbW9ja1FCID0ge1xuICAgICAgICBsZWZ0Sm9pbkFuZFNlbGVjdDogamVzdC5mbigpLm1vY2tSZXR1cm5UaGlzKCksXG4gICAgICAgIHNlbGVjdDogamVzdC5mbigpLm1vY2tSZXR1cm5UaGlzKCksXG4gICAgICAgIGFuZFdoZXJlOiBqZXN0LmZuKCkubW9ja1JldHVyblRoaXMoKSxcbiAgICAgICAgc2tpcDogamVzdC5mbigpLm1vY2tSZXR1cm5UaGlzKCksXG4gICAgICAgIHRha2U6IGplc3QuZm4oKS5tb2NrUmV0dXJuVGhpcygpLFxuICAgICAgICBnZXRNYW55QW5kQ291bnQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShbbW9ja1VzZXJzLCBtb2NrVG90YWxdKSxcbiAgICAgIH07XG5cbiAgICAgIG1vY2tVc2VyUmVwb3NpdG9yeS5jcmVhdGVRdWVyeUJ1aWxkZXIubW9ja1JldHVyblZhbHVlKG1vY2tRQik7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlcnZpY2UuZmluZEFsbCgpO1xuXG4gICAgICBleHBlY3QocmVzdWx0LmRhdGEpLnRvRXF1YWwobW9ja1VzZXJzKTtcbiAgICAgIGV4cGVjdChyZXN1bHQudG90YWwpLnRvRXF1YWwobW9ja1RvdGFsKTtcbiAgICAgIGV4cGVjdChtb2NrVXNlclJlcG9zaXRvcnkuY3JlYXRlUXVlcnlCdWlsZGVyKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRVc2VyUGVybWlzc2lvbnMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY2FjaGVkIHBlcm1pc3Npb25zIGlmIGF2YWlsYWJsZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlZFBlcm1pc3Npb25zID0gWydkb2N1bWVudC52aWV3JywgJ2RvY3VtZW50LmNyZWF0ZSddO1xuICAgICAgbW9ja0NhY2hlTWFuYWdlci5nZXQubW9ja1Jlc29sdmVkVmFsdWUoY2FjaGVkUGVybWlzc2lvbnMpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXJ2aWNlLmdldFVzZXJQZXJtaXNzaW9ucygxKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChjYWNoZWRQZXJtaXNzaW9ucyk7XG4gICAgICBleHBlY3QobW9ja0NhY2hlTWFuYWdlci5nZXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdwZXJtaXNzaW9uczp1c2VyOjEnKTtcbiAgICAgIGV4cGVjdChtb2NrVXNlclJlcG9zaXRvcnkucXVlcnkpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHF1ZXJ5IERCIGFuZCBjYWNoZSBpZiBub3QgaW4gY2FjaGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBkYlBlcm1pc3Npb25zID0gW1xuICAgICAgICB7IHBlcm1pc3Npb25fbmFtZTogJ2RvY3VtZW50LnZpZXcnIH0sXG4gICAgICAgIHsgcGVybWlzc2lvbl9uYW1lOiAnZG9jdW1lbnQuY3JlYXRlJyB9LFxuICAgICAgXTtcbiAgICAgIG1vY2tDYWNoZU1hbmFnZXIuZ2V0Lm1vY2tSZXNvbHZlZFZhbHVlKG51bGwpO1xuICAgICAgbW9ja1VzZXJSZXBvc2l0b3J5LnF1ZXJ5Lm1vY2tSZXNvbHZlZFZhbHVlKGRiUGVybWlzc2lvbnMpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXJ2aWNlLmdldFVzZXJQZXJtaXNzaW9ucygxKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChbJ2RvY3VtZW50LnZpZXcnLCAnZG9jdW1lbnQuY3JlYXRlJ10pO1xuICAgICAgZXhwZWN0KG1vY2tDYWNoZU1hbmFnZXIuc2V0KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/64/userservicespec_64bccaa90f006507e557550ed585fcf5.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/64/userservicespec_64bccaa90f006507e557550ed585fcf5.map new file mode 100644 index 0000000..61eb625 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/64/userservicespec_64bccaa90f006507e557550ed585fcf5.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\user.service.spec.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\user.service.spec.ts"],"sourcesContent":["// File: src/modules/user/user.service.spec.ts\nimport { Test, TestingModule } from '@nestjs/testing';\nimport { getRepositoryToken } from '@nestjs/typeorm';\nimport { CACHE_MANAGER } from '@nestjs/cache-manager';\nimport { UserService } from './user.service';\nimport { User } from './entities/user.entity';\nimport { Role } from './entities/role.entity';\nimport { Permission } from './entities/permission.entity';\nimport { UuidResolverService } from '../../common/services/uuid-resolver.service';\n\n// Mock Repository\nconst mockUserRepository = {\n find: jest.fn(),\n findOne: jest.fn(),\n create: jest.fn(),\n save: jest.fn(),\n merge: jest.fn(),\n softDelete: jest.fn(),\n query: jest.fn(),\n createQueryBuilder: jest.fn(() => ({\n leftJoinAndSelect: jest.fn().mockReturnThis(),\n select: jest.fn().mockReturnThis(),\n andWhere: jest.fn().mockReturnThis(),\n skip: jest.fn().mockReturnThis(),\n take: jest.fn().mockReturnThis(),\n getManyAndCount: jest.fn().mockResolvedValue([[], 0]),\n })),\n};\n\n// Mock Cache Manager\nconst mockCacheManager = {\n get: jest.fn(),\n set: jest.fn(),\n del: jest.fn(),\n};\n\ndescribe('UserService', () => {\n let service: UserService;\n\n beforeEach(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n UserService,\n {\n provide: getRepositoryToken(User),\n useValue: mockUserRepository,\n },\n {\n provide: CACHE_MANAGER,\n useValue: mockCacheManager,\n },\n {\n provide: getRepositoryToken(Role),\n useValue: mockUserRepository, // Reuse generic mock\n },\n {\n provide: getRepositoryToken(Permission),\n useValue: mockUserRepository, // Reuse generic mock\n },\n {\n provide: UuidResolverService,\n useValue: {\n resolveOrganizationId: jest.fn().mockResolvedValue(1),\n resolveProjectId: jest.fn().mockResolvedValue(1),\n },\n },\n ],\n }).compile();\n\n service = module.get(UserService);\n });\n\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n it('should be defined', () => {\n expect(service).toBeDefined();\n });\n\n describe('findAll', () => {\n it('should return paginated users', async () => {\n const mockUsers = [{ user_id: 1, username: 'test' }];\n const mockTotal = 1;\n\n const mockQB = {\n leftJoinAndSelect: jest.fn().mockReturnThis(),\n select: jest.fn().mockReturnThis(),\n andWhere: jest.fn().mockReturnThis(),\n skip: jest.fn().mockReturnThis(),\n take: jest.fn().mockReturnThis(),\n getManyAndCount: jest.fn().mockResolvedValue([mockUsers, mockTotal]),\n };\n\n mockUserRepository.createQueryBuilder.mockReturnValue(mockQB);\n\n const result = await service.findAll();\n\n expect(result.data).toEqual(mockUsers);\n expect(result.total).toEqual(mockTotal);\n expect(mockUserRepository.createQueryBuilder).toHaveBeenCalled();\n });\n });\n\n describe('getUserPermissions', () => {\n it('should return cached permissions if available', async () => {\n const cachedPermissions = ['document.view', 'document.create'];\n mockCacheManager.get.mockResolvedValue(cachedPermissions);\n\n const result = await service.getUserPermissions(1);\n\n expect(result).toEqual(cachedPermissions);\n expect(mockCacheManager.get).toHaveBeenCalledWith('permissions:user:1');\n expect(mockUserRepository.query).not.toHaveBeenCalled();\n });\n\n it('should query DB and cache if not in cache', async () => {\n const dbPermissions = [\n { permission_name: 'document.view' },\n { permission_name: 'document.create' },\n ];\n mockCacheManager.get.mockResolvedValue(null);\n mockUserRepository.query.mockResolvedValue(dbPermissions);\n\n const result = await service.getUserPermissions(1);\n\n expect(result).toEqual(['document.view', 'document.create']);\n expect(mockCacheManager.set).toHaveBeenCalled();\n });\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/64/validate_6469029621a113f8adf6688e5b4e660f b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/64/validate_6469029621a113f8adf6688e5b4e660f new file mode 100644 index 0000000..e2cf0ff --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/64/validate_6469029621a113f8adf6688e5b4e660f @@ -0,0 +1,9 @@ +97ce9981402cb6375346f5c4bb5e8a22 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const regex_js_1 = require("./regex.js"); +function validate(uuid) { + return typeof uuid === 'string' && regex_js_1.default.test(uuid); +} +exports.default = validate; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdmFsaWRhdGUuanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDO0FBQ2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3pDLFNBQVMsUUFBUSxDQUFDLElBQUk7SUFDbEIsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUNELE9BQU8sQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxub2RlX21vZHVsZXNcXC5wbnBtXFx1dWlkQDExLjEuMFxcbm9kZV9tb2R1bGVzXFx1dWlkXFxkaXN0XFxjanNcXHZhbGlkYXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgcmVnZXhfanNfMSA9IHJlcXVpcmUoXCIuL3JlZ2V4LmpzXCIpO1xuZnVuY3Rpb24gdmFsaWRhdGUodXVpZCkge1xuICAgIHJldHVybiB0eXBlb2YgdXVpZCA9PT0gJ3N0cmluZycgJiYgcmVnZXhfanNfMS5kZWZhdWx0LnRlc3QodXVpZCk7XG59XG5leHBvcnRzLmRlZmF1bHQgPSB2YWxpZGF0ZTtcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/64/validate_6469029621a113f8adf6688e5b4e660f.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/64/validate_6469029621a113f8adf6688e5b4e660f.map new file mode 100644 index 0000000..f5c50f3 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/64/validate_6469029621a113f8adf6688e5b4e660f.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\validate.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;AACzC,SAAS,QAAQ,CAAC,IAAI;IAClB,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrE,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\validate.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst regex_js_1 = require(\"./regex.js\");\nfunction validate(uuid) {\n return typeof uuid === 'string' && regex_js_1.default.test(uuid);\n}\nexports.default = validate;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/65/createjsonschemadto_65bf7d6e9c485421a9f64c6b5ced8846 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/65/createjsonschemadto_65bf7d6e9c485421a9f64c6b5ced8846 new file mode 100644 index 0000000..3afb11e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/65/createjsonschemadto_65bf7d6e9c485421a9f64c6b5ced8846 @@ -0,0 +1,92 @@ +0ccf29ff8dcf7bb7440c3853e8a5357f +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CreateJsonSchemaDto = exports.VirtualColumnConfigDto = void 0; +// File: src/modules/json-schema/dto/create-json-schema.dto.ts +const class_validator_1 = require("class-validator"); +const class_transformer_1 = require("class-transformer"); +class VirtualColumnConfigDto { +} +exports.VirtualColumnConfigDto = VirtualColumnConfigDto; +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], VirtualColumnConfigDto.prototype, "jsonPath", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], VirtualColumnConfigDto.prototype, "columnName", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], VirtualColumnConfigDto.prototype, "dataType", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], VirtualColumnConfigDto.prototype, "indexType", void 0); +__decorate([ + (0, class_validator_1.IsBoolean)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Boolean) +], VirtualColumnConfigDto.prototype, "isRequired", void 0); +class CreateJsonSchemaDto { +} +exports.CreateJsonSchemaDto = CreateJsonSchemaDto; +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], CreateJsonSchemaDto.prototype, "schemaCode", void 0); +__decorate([ + (0, class_validator_1.IsString)() // ✅ เพิ่ม Validation + , + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], CreateJsonSchemaDto.prototype, "tableName", void 0); +__decorate([ + (0, class_validator_1.IsInt)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], CreateJsonSchemaDto.prototype, "version", void 0); +__decorate([ + (0, class_validator_1.IsObject)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", typeof (_a = typeof Record !== "undefined" && Record) === "function" ? _a : Object) +], CreateJsonSchemaDto.prototype, "schemaDefinition", void 0); +__decorate([ + (0, class_validator_1.IsObject)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", typeof (_b = typeof Record !== "undefined" && Record) === "function" ? _b : Object) +], CreateJsonSchemaDto.prototype, "uiSchema", void 0); +__decorate([ + (0, class_validator_1.IsArray)(), + (0, class_validator_1.IsOptional)(), + (0, class_validator_1.ValidateNested)({ each: true }), + (0, class_transformer_1.Type)(() => VirtualColumnConfigDto), + __metadata("design:type", Array) +], CreateJsonSchemaDto.prototype, "virtualColumns", void 0); +__decorate([ + (0, class_validator_1.IsObject)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", typeof (_c = typeof Record !== "undefined" && Record) === "function" ? _c : Object) +], CreateJsonSchemaDto.prototype, "migrationScript", void 0); +__decorate([ + (0, class_validator_1.IsBoolean)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Boolean) +], CreateJsonSchemaDto.prototype, "isActive", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcanNvbi1zY2hlbWFcXGR0b1xcY3JlYXRlLWpzb24tc2NoZW1hLmR0by50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEsOERBQThEO0FBQzlELHFEQVN5QjtBQUN6Qix5REFBeUM7QUFFekMsTUFBYSxzQkFBc0I7Q0FvQmxDO0FBcEJELHdEQW9CQztBQWpCQztJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7d0RBQ0s7QUFJbEI7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7OzBEQUNPO0FBSXBCO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzt3REFDOEQ7QUFJM0U7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7O3lEQUMrQjtBQUk1QztJQUZDLElBQUEsMkJBQVMsR0FBRTtJQUNYLElBQUEsNEJBQVUsR0FBRTs7MERBQ1E7QUFHdkIsTUFBYSxtQkFBbUI7Q0FrQy9CO0FBbENELGtEQWtDQztBQS9CQztJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7dURBQ087QUFJcEI7SUFGQyxJQUFBLDBCQUFRLEdBQUUsQ0FBQyxxQkFBcUI7O0lBQ2hDLElBQUEsNEJBQVUsR0FBRTs7c0RBQ007QUFJbkI7SUFGQyxJQUFBLHVCQUFLLEdBQUU7SUFDUCxJQUFBLDRCQUFVLEdBQUU7O29EQUNJO0FBSWpCO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFO2tEQUNNLE1BQU0sb0JBQU4sTUFBTTs2REFBa0I7QUFJM0M7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7a0RBQ0YsTUFBTSxvQkFBTixNQUFNO3FEQUFrQjtBQU1uQztJQUpDLElBQUEseUJBQU8sR0FBRTtJQUNULElBQUEsNEJBQVUsR0FBRTtJQUNaLElBQUEsZ0NBQWMsRUFBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUM5QixJQUFBLHdCQUFJLEVBQUMsR0FBRyxFQUFFLENBQUMsc0JBQXNCLENBQUM7OzJEQUNPO0FBSTFDO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFO2tEQUNLLE1BQU0sb0JBQU4sTUFBTTs0REFBa0I7QUFJMUM7SUFGQyxJQUFBLDJCQUFTLEdBQUU7SUFDWCxJQUFBLDRCQUFVLEdBQUU7O3FEQUNNIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGpzb24tc2NoZW1hXFxkdG9cXGNyZWF0ZS1qc29uLXNjaGVtYS5kdG8udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRmlsZTogc3JjL21vZHVsZXMvanNvbi1zY2hlbWEvZHRvL2NyZWF0ZS1qc29uLXNjaGVtYS5kdG8udHNcclxuaW1wb3J0IHtcclxuICBJc1N0cmluZyxcclxuICBJc05vdEVtcHR5LFxyXG4gIElzSW50LFxyXG4gIElzT3B0aW9uYWwsXHJcbiAgSXNCb29sZWFuLFxyXG4gIElzT2JqZWN0LFxyXG4gIElzQXJyYXksXHJcbiAgVmFsaWRhdGVOZXN0ZWQsXHJcbn0gZnJvbSAnY2xhc3MtdmFsaWRhdG9yJztcclxuaW1wb3J0IHsgVHlwZSB9IGZyb20gJ2NsYXNzLXRyYW5zZm9ybWVyJztcclxuXHJcbmV4cG9ydCBjbGFzcyBWaXJ0dWFsQ29sdW1uQ29uZmlnRHRvIHtcclxuICBASXNTdHJpbmcoKVxyXG4gIEBJc05vdEVtcHR5KClcclxuICBqc29uUGF0aCE6IHN0cmluZztcclxuXHJcbiAgQElzU3RyaW5nKClcclxuICBASXNOb3RFbXB0eSgpXHJcbiAgY29sdW1uTmFtZSE6IHN0cmluZztcclxuXHJcbiAgQElzU3RyaW5nKClcclxuICBASXNOb3RFbXB0eSgpXHJcbiAgZGF0YVR5cGUhOiAnSU5UJyB8ICdWQVJDSEFSJyB8ICdCT09MRUFOJyB8ICdEQVRFJyB8ICdERUNJTUFMJyB8ICdEQVRFVElNRSc7XHJcblxyXG4gIEBJc1N0cmluZygpXHJcbiAgQElzT3B0aW9uYWwoKVxyXG4gIGluZGV4VHlwZT86ICdJTkRFWCcgfCAnVU5JUVVFJyB8ICdGVUxMVEVYVCc7XHJcblxyXG4gIEBJc0Jvb2xlYW4oKVxyXG4gIEBJc09wdGlvbmFsKClcclxuICBpc1JlcXVpcmVkPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIENyZWF0ZUpzb25TY2hlbWFEdG8ge1xyXG4gIEBJc1N0cmluZygpXHJcbiAgQElzTm90RW1wdHkoKVxyXG4gIHNjaGVtYUNvZGUhOiBzdHJpbmc7XHJcblxyXG4gIEBJc1N0cmluZygpIC8vIOKchSDguYDguJ7guLTguYjguKEgVmFsaWRhdGlvblxyXG4gIEBJc05vdEVtcHR5KClcclxuICB0YWJsZU5hbWUhOiBzdHJpbmc7XHJcblxyXG4gIEBJc0ludCgpXHJcbiAgQElzT3B0aW9uYWwoKVxyXG4gIHZlcnNpb24/OiBudW1iZXI7XHJcblxyXG4gIEBJc09iamVjdCgpXHJcbiAgQElzTm90RW1wdHkoKVxyXG4gIHNjaGVtYURlZmluaXRpb24hOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuXHJcbiAgQElzT2JqZWN0KClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgdWlTY2hlbWE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuXHJcbiAgQElzQXJyYXkoKVxyXG4gIEBJc09wdGlvbmFsKClcclxuICBAVmFsaWRhdGVOZXN0ZWQoeyBlYWNoOiB0cnVlIH0pXHJcbiAgQFR5cGUoKCkgPT4gVmlydHVhbENvbHVtbkNvbmZpZ0R0bylcclxuICB2aXJ0dWFsQ29sdW1ucz86IFZpcnR1YWxDb2x1bW5Db25maWdEdG9bXTtcclxuXHJcbiAgQElzT2JqZWN0KClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgbWlncmF0aW9uU2NyaXB0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcblxyXG4gIEBJc0Jvb2xlYW4oKVxyXG4gIEBJc09wdGlvbmFsKClcclxuICBpc0FjdGl2ZT86IGJvb2xlYW47XHJcbn1cclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/65/createjsonschemadto_65bf7d6e9c485421a9f64c6b5ced8846.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/65/createjsonschemadto_65bf7d6e9c485421a9f64c6b5ced8846.map new file mode 100644 index 0000000..3d9600a --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/65/createjsonschemadto_65bf7d6e9c485421a9f64c6b5ced8846.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\dto\\create-json-schema.dto.ts","mappings":";;;;;;;;;;;;;AAAA,8DAA8D;AAC9D,qDASyB;AACzB,yDAAyC;AAEzC,MAAa,sBAAsB;CAoBlC;AApBD,wDAoBC;AAjBC;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;wDACK;AAIlB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;0DACO;AAIpB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;wDAC8D;AAI3E;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;yDAC+B;AAI5C;IAFC,IAAA,2BAAS,GAAE;IACX,IAAA,4BAAU,GAAE;;0DACQ;AAGvB,MAAa,mBAAmB;CAkC/B;AAlCD,kDAkCC;AA/BC;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;uDACO;AAIpB;IAFC,IAAA,0BAAQ,GAAE,CAAC,qBAAqB;;IAChC,IAAA,4BAAU,GAAE;;sDACM;AAInB;IAFC,IAAA,uBAAK,GAAE;IACP,IAAA,4BAAU,GAAE;;oDACI;AAIjB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;kDACM,MAAM,oBAAN,MAAM;6DAAkB;AAI3C;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;kDACF,MAAM,oBAAN,MAAM;qDAAkB;AAMnC;IAJC,IAAA,yBAAO,GAAE;IACT,IAAA,4BAAU,GAAE;IACZ,IAAA,gCAAc,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC;;2DACO;AAI1C;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;kDACK,MAAM,oBAAN,MAAM;4DAAkB;AAI1C;IAFC,IAAA,2BAAS,GAAE;IACX,IAAA,4BAAU,GAAE;;qDACM","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\dto\\create-json-schema.dto.ts"],"sourcesContent":["// File: src/modules/json-schema/dto/create-json-schema.dto.ts\r\nimport {\r\n IsString,\r\n IsNotEmpty,\r\n IsInt,\r\n IsOptional,\r\n IsBoolean,\r\n IsObject,\r\n IsArray,\r\n ValidateNested,\r\n} from 'class-validator';\r\nimport { Type } from 'class-transformer';\r\n\r\nexport class VirtualColumnConfigDto {\r\n @IsString()\r\n @IsNotEmpty()\r\n jsonPath!: string;\r\n\r\n @IsString()\r\n @IsNotEmpty()\r\n columnName!: string;\r\n\r\n @IsString()\r\n @IsNotEmpty()\r\n dataType!: 'INT' | 'VARCHAR' | 'BOOLEAN' | 'DATE' | 'DECIMAL' | 'DATETIME';\r\n\r\n @IsString()\r\n @IsOptional()\r\n indexType?: 'INDEX' | 'UNIQUE' | 'FULLTEXT';\r\n\r\n @IsBoolean()\r\n @IsOptional()\r\n isRequired?: boolean;\r\n}\r\n\r\nexport class CreateJsonSchemaDto {\r\n @IsString()\r\n @IsNotEmpty()\r\n schemaCode!: string;\r\n\r\n @IsString() // ✅ เพิ่ม Validation\r\n @IsNotEmpty()\r\n tableName!: string;\r\n\r\n @IsInt()\r\n @IsOptional()\r\n version?: number;\r\n\r\n @IsObject()\r\n @IsNotEmpty()\r\n schemaDefinition!: Record;\r\n\r\n @IsObject()\r\n @IsOptional()\r\n uiSchema?: Record;\r\n\r\n @IsArray()\r\n @IsOptional()\r\n @ValidateNested({ each: true })\r\n @Type(() => VirtualColumnConfigDto)\r\n virtualColumns?: VirtualColumnConfigDto[];\r\n\r\n @IsObject()\r\n @IsOptional()\r\n migrationScript?: Record;\r\n\r\n @IsBoolean()\r\n @IsOptional()\r\n isActive?: boolean;\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/65/rfaworkflowtemplateentity_655794e2120ea78769f9f4f1a5c5be24 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/65/rfaworkflowtemplateentity_655794e2120ea78769f9f4f1a5c5be24 new file mode 100644 index 0000000..c3cf734 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/65/rfaworkflowtemplateentity_655794e2120ea78769f9f4f1a5c5be24 @@ -0,0 +1,57 @@ +a1c2d0819481fdf8c2ca438feda317f8 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RfaWorkflowTemplate = void 0; +const typeorm_1 = require("typeorm"); +const rfa_workflow_template_step_entity_1 = require("./rfa-workflow-template-step.entity"); +let RfaWorkflowTemplate = class RfaWorkflowTemplate { +}; +exports.RfaWorkflowTemplate = RfaWorkflowTemplate; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], RfaWorkflowTemplate.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'template_name', length: 100 }), + __metadata("design:type", String) +], RfaWorkflowTemplate.prototype, "templateName", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], RfaWorkflowTemplate.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true }), + __metadata("design:type", Boolean) +], RfaWorkflowTemplate.prototype, "isActive", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'json', nullable: true }), + __metadata("design:type", typeof (_a = typeof Record !== "undefined" && Record) === "function" ? _a : Object) +], RfaWorkflowTemplate.prototype, "workflowConfig", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], RfaWorkflowTemplate.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], RfaWorkflowTemplate.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.OneToMany)(() => rfa_workflow_template_step_entity_1.RfaWorkflowTemplateStep, (step) => step.template, { + cascade: true, + }), + __metadata("design:type", Array) +], RfaWorkflowTemplate.prototype, "steps", void 0); +exports.RfaWorkflowTemplate = RfaWorkflowTemplate = __decorate([ + (0, typeorm_1.Entity)('rfa_workflow_templates') +], RfaWorkflowTemplate); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccmZhXFxlbnRpdGllc1xccmZhLXdvcmtmbG93LXRlbXBsYXRlLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBT2lCO0FBQ2pCLDJGQUE4RTtBQUd2RSxJQUFNLG1CQUFtQixHQUF6QixNQUFNLG1CQUFtQjtDQTJCL0IsQ0FBQTtBQTNCWSxrREFBbUI7QUFFOUI7SUFEQyxJQUFBLGdDQUFzQixHQUFFOzsrQ0FDYjtBQUdaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7O3lEQUN6QjtBQUd0QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzt3REFDcEI7QUFHckI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7cURBQzFCO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7a0RBQ3hCLE1BQU0sb0JBQU4sTUFBTTsyREFBa0I7QUFHekM7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7c0RBQUM7QUFHakI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7c0RBQUM7QUFNakI7SUFIQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsMkRBQXVCLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7UUFDakUsT0FBTyxFQUFFLElBQUk7S0FDZCxDQUFDOztrREFDZ0M7OEJBMUJ2QixtQkFBbUI7SUFEL0IsSUFBQSxnQkFBTSxFQUFDLHdCQUF3QixDQUFDO0dBQ3BCLG1CQUFtQixDQTJCL0IiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccmZhXFxlbnRpdGllc1xccmZhLXdvcmtmbG93LXRlbXBsYXRlLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHksXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXG4gIENvbHVtbixcbiAgQ3JlYXRlRGF0ZUNvbHVtbixcbiAgVXBkYXRlRGF0ZUNvbHVtbixcbiAgT25lVG9NYW55LFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFJmYVdvcmtmbG93VGVtcGxhdGVTdGVwIH0gZnJvbSAnLi9yZmEtd29ya2Zsb3ctdGVtcGxhdGUtc3RlcC5lbnRpdHknO1xuXG5ARW50aXR5KCdyZmFfd29ya2Zsb3dfdGVtcGxhdGVzJylcbmV4cG9ydCBjbGFzcyBSZmFXb3JrZmxvd1RlbXBsYXRlIHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuICBpZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3RlbXBsYXRlX25hbWUnLCBsZW5ndGg6IDEwMCB9KVxuICB0ZW1wbGF0ZU5hbWUhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdpc19hY3RpdmUnLCBkZWZhdWx0OiB0cnVlIH0pXG4gIGlzQWN0aXZlITogYm9vbGVhbjtcblxuICBAQ29sdW1uKHsgdHlwZTogJ2pzb24nLCBudWxsYWJsZTogdHJ1ZSB9KVxuICB3b3JrZmxvd0NvbmZpZz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyAvLyBDb25maWd1cmF0aW9uIOC5gOC4nuC4tOC5iOC4oeC5gOC4leC4tOC4oVxuXG4gIEBDcmVhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG5cbiAgQFVwZGF0ZURhdGVDb2x1bW4oeyBuYW1lOiAndXBkYXRlZF9hdCcgfSlcbiAgdXBkYXRlZEF0ITogRGF0ZTtcblxuICAvLyBSZWxhdGlvbnNcbiAgQE9uZVRvTWFueSgoKSA9PiBSZmFXb3JrZmxvd1RlbXBsYXRlU3RlcCwgKHN0ZXApID0+IHN0ZXAudGVtcGxhdGUsIHtcbiAgICBjYXNjYWRlOiB0cnVlLFxuICB9KVxuICBzdGVwcyE6IFJmYVdvcmtmbG93VGVtcGxhdGVTdGVwW107XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/65/rfaworkflowtemplateentity_655794e2120ea78769f9f4f1a5c5be24.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/65/rfaworkflowtemplateentity_655794e2120ea78769f9f4f1a5c5be24.map new file mode 100644 index 0000000..7c55e1f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/65/rfaworkflowtemplateentity_655794e2120ea78769f9f4f1a5c5be24.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-workflow-template.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAOiB;AACjB,2FAA8E;AAGvE,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;CA2B/B,CAAA;AA3BY,kDAAmB;AAE9B;IADC,IAAA,gCAAsB,GAAE;;+CACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;yDACzB;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;wDACpB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;qDAC1B;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACxB,MAAM,oBAAN,MAAM;2DAAkB;AAGzC;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;sDAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;sDAAC;AAMjB;IAHC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,2DAAuB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE;QACjE,OAAO,EAAE,IAAI;KACd,CAAC;;kDACgC;8BA1BvB,mBAAmB;IAD/B,IAAA,gBAAM,EAAC,wBAAwB,CAAC;GACpB,mBAAmB,CA2B/B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-workflow-template.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n UpdateDateColumn,\n OneToMany,\n} from 'typeorm';\nimport { RfaWorkflowTemplateStep } from './rfa-workflow-template-step.entity';\n\n@Entity('rfa_workflow_templates')\nexport class RfaWorkflowTemplate {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'template_name', length: 100 })\n templateName!: string;\n\n @Column({ type: 'text', nullable: true })\n description?: string;\n\n @Column({ name: 'is_active', default: true })\n isActive!: boolean;\n\n @Column({ type: 'json', nullable: true })\n workflowConfig?: Record; // Configuration เพิ่มเติม\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n // Relations\n @OneToMany(() => RfaWorkflowTemplateStep, (step) => step.template, {\n cascade: true,\n })\n steps!: RfaWorkflowTemplateStep[];\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/66/documentnumbercounterentity_665fa52a65aaf5309e56d1ee239d8d48 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/66/documentnumbercounterentity_665fa52a65aaf5309e56d1ee239d8d48 new file mode 100644 index 0000000..daff489 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/66/documentnumbercounterentity_665fa52a65aaf5309e56d1ee239d8d48 @@ -0,0 +1,71 @@ +a61c4ba4d5fdbac05238ed3724e66b2c +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DocumentNumberCounter = void 0; +// File: src/modules/document-numbering/entities/document-number-counter.entity.ts +const typeorm_1 = require("typeorm"); +let DocumentNumberCounter = class DocumentNumberCounter { +}; +exports.DocumentNumberCounter = DocumentNumberCounter; +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'project_id' }), + __metadata("design:type", Number) +], DocumentNumberCounter.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'originator_organization_id' }), + __metadata("design:type", Number) +], DocumentNumberCounter.prototype, "originatorId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'recipient_organization_id' }), + __metadata("design:type", Number) +], DocumentNumberCounter.prototype, "recipientOrganizationId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'correspondence_type_id' }), + __metadata("design:type", Number) +], DocumentNumberCounter.prototype, "correspondenceTypeId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'sub_type_id' }), + __metadata("design:type", Number) +], DocumentNumberCounter.prototype, "subTypeId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'rfa_type_id' }), + __metadata("design:type", Number) +], DocumentNumberCounter.prototype, "rfaTypeId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'discipline_id' }), + __metadata("design:type", Number) +], DocumentNumberCounter.prototype, "disciplineId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'reset_scope', length: 20 }), + __metadata("design:type", String) +], DocumentNumberCounter.prototype, "resetScope", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'last_number', default: 0 }), + __metadata("design:type", Number) +], DocumentNumberCounter.prototype, "lastNumber", void 0); +__decorate([ + (0, typeorm_1.VersionColumn)({ name: 'version' }), + __metadata("design:type", Number) +], DocumentNumberCounter.prototype, "version", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], DocumentNumberCounter.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], DocumentNumberCounter.prototype, "updatedAt", void 0); +exports.DocumentNumberCounter = DocumentNumberCounter = __decorate([ + (0, typeorm_1.Entity)('document_number_counters') +], DocumentNumberCounter); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxlbnRpdGllc1xcZG9jdW1lbnQtbnVtYmVyLWNvdW50ZXIuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxrRkFBa0Y7QUFDbEYscUNBQXVFO0FBR2hFLElBQU0scUJBQXFCLEdBQTNCLE1BQU0scUJBQXFCO0NBb0NqQyxDQUFBO0FBcENZLHNEQUFxQjtBQUVoQztJQURDLElBQUEsdUJBQWEsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7d0RBQ25CO0FBR25CO0lBREMsSUFBQSx1QkFBYSxFQUFDLEVBQUUsSUFBSSxFQUFFLDRCQUE0QixFQUFFLENBQUM7OzJEQUNoQztBQUd0QjtJQURDLElBQUEsdUJBQWEsRUFBQyxFQUFFLElBQUksRUFBRSwyQkFBMkIsRUFBRSxDQUFDOztzRUFDcEI7QUFHakM7SUFEQyxJQUFBLHVCQUFhLEVBQUMsRUFBRSxJQUFJLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQzs7bUVBQ3BCO0FBRzlCO0lBREMsSUFBQSx1QkFBYSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDOzt3REFDcEI7QUFHbkI7SUFEQyxJQUFBLHVCQUFhLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLENBQUM7O3dEQUNwQjtBQUduQjtJQURDLElBQUEsdUJBQWEsRUFBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQzs7MkRBQ25CO0FBR3RCO0lBREMsSUFBQSx1QkFBYSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7O3lEQUMvQjtBQUdwQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDOzt5REFDeEI7QUFHcEI7SUFEQyxJQUFBLHVCQUFhLEVBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7O3NEQUNsQjtBQUdqQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDbkIsSUFBSSxvQkFBSixJQUFJO3dEQUFDO0FBR2pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUNuQixJQUFJLG9CQUFKLElBQUk7d0RBQUM7Z0NBbkNOLHFCQUFxQjtJQURqQyxJQUFBLGdCQUFNLEVBQUMsMEJBQTBCLENBQUM7R0FDdEIscUJBQXFCLENBb0NqQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxkb2N1bWVudC1udW1iZXJpbmdcXGVudGl0aWVzXFxkb2N1bWVudC1udW1iZXItY291bnRlci5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRmlsZTogc3JjL21vZHVsZXMvZG9jdW1lbnQtbnVtYmVyaW5nL2VudGl0aWVzL2RvY3VtZW50LW51bWJlci1jb3VudGVyLmVudGl0eS50c1xuaW1wb3J0IHsgRW50aXR5LCBDb2x1bW4sIFByaW1hcnlDb2x1bW4sIFZlcnNpb25Db2x1bW4gfSBmcm9tICd0eXBlb3JtJztcblxuQEVudGl0eSgnZG9jdW1lbnRfbnVtYmVyX2NvdW50ZXJzJylcbmV4cG9ydCBjbGFzcyBEb2N1bWVudE51bWJlckNvdW50ZXIge1xuICBAUHJpbWFyeUNvbHVtbih7IG5hbWU6ICdwcm9qZWN0X2lkJyB9KVxuICBwcm9qZWN0SWQhOiBudW1iZXI7XG5cbiAgQFByaW1hcnlDb2x1bW4oeyBuYW1lOiAnb3JpZ2luYXRvcl9vcmdhbml6YXRpb25faWQnIH0pXG4gIG9yaWdpbmF0b3JJZCE6IG51bWJlcjtcblxuICBAUHJpbWFyeUNvbHVtbih7IG5hbWU6ICdyZWNpcGllbnRfb3JnYW5pemF0aW9uX2lkJyB9KVxuICByZWNpcGllbnRPcmdhbml6YXRpb25JZCE6IG51bWJlcjtcblxuICBAUHJpbWFyeUNvbHVtbih7IG5hbWU6ICdjb3JyZXNwb25kZW5jZV90eXBlX2lkJyB9KVxuICBjb3JyZXNwb25kZW5jZVR5cGVJZCE6IG51bWJlcjtcblxuICBAUHJpbWFyeUNvbHVtbih7IG5hbWU6ICdzdWJfdHlwZV9pZCcgfSlcbiAgc3ViVHlwZUlkITogbnVtYmVyO1xuXG4gIEBQcmltYXJ5Q29sdW1uKHsgbmFtZTogJ3JmYV90eXBlX2lkJyB9KVxuICByZmFUeXBlSWQhOiBudW1iZXI7XG5cbiAgQFByaW1hcnlDb2x1bW4oeyBuYW1lOiAnZGlzY2lwbGluZV9pZCcgfSlcbiAgZGlzY2lwbGluZUlkITogbnVtYmVyO1xuXG4gIEBQcmltYXJ5Q29sdW1uKHsgbmFtZTogJ3Jlc2V0X3Njb3BlJywgbGVuZ3RoOiAyMCB9KVxuICByZXNldFNjb3BlITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnbGFzdF9udW1iZXInLCBkZWZhdWx0OiAwIH0pXG4gIGxhc3ROdW1iZXIhOiBudW1iZXI7XG5cbiAgQFZlcnNpb25Db2x1bW4oeyBuYW1lOiAndmVyc2lvbicgfSlcbiAgdmVyc2lvbiE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG5cbiAgQENvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxuICB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/66/documentnumbercounterentity_665fa52a65aaf5309e56d1ee239d8d48.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/66/documentnumbercounterentity_665fa52a65aaf5309e56d1ee239d8d48.map new file mode 100644 index 0000000..33474c7 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/66/documentnumbercounterentity_665fa52a65aaf5309e56d1ee239d8d48.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\entities\\document-number-counter.entity.ts","mappings":";;;;;;;;;;;;;AAAA,kFAAkF;AAClF,qCAAuE;AAGhE,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;CAoCjC,CAAA;AApCY,sDAAqB;AAEhC;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;wDACnB;AAGnB;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC;;2DAChC;AAGtB;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAC;;sEACpB;AAGjC;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC;;mEACpB;AAG9B;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;wDACpB;AAGnB;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;wDACpB;AAGnB;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;;2DACnB;AAGtB;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;yDAC/B;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;yDACxB;AAGpB;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;sDAClB;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACnB,IAAI,oBAAJ,IAAI;wDAAC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACnB,IAAI,oBAAJ,IAAI;wDAAC;gCAnCN,qBAAqB;IADjC,IAAA,gBAAM,EAAC,0BAA0B,CAAC;GACtB,qBAAqB,CAoCjC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\entities\\document-number-counter.entity.ts"],"sourcesContent":["// File: src/modules/document-numbering/entities/document-number-counter.entity.ts\nimport { Entity, Column, PrimaryColumn, VersionColumn } from 'typeorm';\n\n@Entity('document_number_counters')\nexport class DocumentNumberCounter {\n @PrimaryColumn({ name: 'project_id' })\n projectId!: number;\n\n @PrimaryColumn({ name: 'originator_organization_id' })\n originatorId!: number;\n\n @PrimaryColumn({ name: 'recipient_organization_id' })\n recipientOrganizationId!: number;\n\n @PrimaryColumn({ name: 'correspondence_type_id' })\n correspondenceTypeId!: number;\n\n @PrimaryColumn({ name: 'sub_type_id' })\n subTypeId!: number;\n\n @PrimaryColumn({ name: 'rfa_type_id' })\n rfaTypeId!: number;\n\n @PrimaryColumn({ name: 'discipline_id' })\n disciplineId!: number;\n\n @PrimaryColumn({ name: 'reset_scope', length: 20 })\n resetScope!: string;\n\n @Column({ name: 'last_number', default: 0 })\n lastNumber!: number;\n\n @VersionColumn({ name: 'version' })\n version!: number;\n\n @Column({ name: 'created_at' })\n createdAt!: Date;\n\n @Column({ name: 'updated_at' })\n updatedAt!: Date;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/66/sha1_66e6dcc6acc3f3541177f968539b9ce6 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/66/sha1_66e6dcc6acc3f3541177f968539b9ce6 new file mode 100644 index 0000000..c616dbc --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/66/sha1_66e6dcc6acc3f3541177f968539b9ce6 @@ -0,0 +1,15 @@ +9f889dd92690586b4e12f8881b89854e +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const crypto_1 = require("crypto"); +function sha1(bytes) { + if (Array.isArray(bytes)) { + bytes = Buffer.from(bytes); + } + else if (typeof bytes === 'string') { + bytes = Buffer.from(bytes, 'utf8'); + } + return (0, crypto_1.createHash)('sha1').update(bytes).digest(); +} +exports.default = sha1; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcc2hhMS5qcyIsIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7QUFDYixNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM5RCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDbkMsU0FBUyxJQUFJLENBQUMsS0FBSztJQUNmLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7U0FDSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2pDLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ25FLENBQUM7QUFDRCxPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcbm9kZV9tb2R1bGVzXFwucG5wbVxcdXVpZEAxMS4xLjBcXG5vZGVfbW9kdWxlc1xcdXVpZFxcZGlzdFxcY2pzXFxzaGExLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgY3J5cHRvXzEgPSByZXF1aXJlKFwiY3J5cHRvXCIpO1xuZnVuY3Rpb24gc2hhMShieXRlcykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGJ5dGVzKSkge1xuICAgICAgICBieXRlcyA9IEJ1ZmZlci5mcm9tKGJ5dGVzKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICBieXRlcyA9IEJ1ZmZlci5mcm9tKGJ5dGVzLCAndXRmOCcpO1xuICAgIH1cbiAgICByZXR1cm4gKDAsIGNyeXB0b18xLmNyZWF0ZUhhc2gpKCdzaGExJykudXBkYXRlKGJ5dGVzKS5kaWdlc3QoKTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IHNoYTE7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/66/sha1_66e6dcc6acc3f3541177f968539b9ce6.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/66/sha1_66e6dcc6acc3f3541177f968539b9ce6.map new file mode 100644 index 0000000..bd7b281 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/66/sha1_66e6dcc6acc3f3541177f968539b9ce6.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\sha1.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AACnC,SAAS,IAAI,CAAC,KAAK;IACf,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;SACI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACjC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;AACnE,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\sha1.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst crypto_1 = require(\"crypto\");\nfunction sha1(bytes) {\n if (Array.isArray(bytes)) {\n bytes = Buffer.from(bytes);\n }\n else if (typeof bytes === 'string') {\n bytes = Buffer.from(bytes, 'utf8');\n }\n return (0, crypto_1.createHash)('sha1').update(bytes).digest();\n}\nexports.default = sha1;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/68/v5_68c452f27d93aa45cead3864553364cb b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/68/v5_68c452f27d93aa45cead3864553364cb new file mode 100644 index 0000000..e1b192d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/68/v5_68c452f27d93aa45cead3864553364cb @@ -0,0 +1,16 @@ +4f0b13d6135bf2c077974b3e858be63c +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.URL = exports.DNS = void 0; +const sha1_js_1 = require("./sha1.js"); +const v35_js_1 = require("./v35.js"); +var v35_js_2 = require("./v35.js"); +Object.defineProperty(exports, "DNS", { enumerable: true, get: function () { return v35_js_2.DNS; } }); +Object.defineProperty(exports, "URL", { enumerable: true, get: function () { return v35_js_2.URL; } }); +function v5(value, namespace, buf, offset) { + return (0, v35_js_1.default)(0x50, sha1_js_1.default, value, namespace, buf, offset); +} +v5.DNS = v35_js_1.DNS; +v5.URL = v35_js_1.URL; +exports.default = v5; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdjUuanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDO0FBQ2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUQsT0FBTyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQ25DLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN2QyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDckMsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLGNBQWMsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN2RyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxjQUFjLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdkcsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTTtJQUNyQyxPQUFPLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBQ0QsRUFBRSxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDO0FBQ3RCLEVBQUUsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQztBQUN0QixPQUFPLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcbm9kZV9tb2R1bGVzXFwucG5wbVxcdXVpZEAxMS4xLjBcXG5vZGVfbW9kdWxlc1xcdXVpZFxcZGlzdFxcY2pzXFx2NS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuVVJMID0gZXhwb3J0cy5ETlMgPSB2b2lkIDA7XG5jb25zdCBzaGExX2pzXzEgPSByZXF1aXJlKFwiLi9zaGExLmpzXCIpO1xuY29uc3QgdjM1X2pzXzEgPSByZXF1aXJlKFwiLi92MzUuanNcIik7XG52YXIgdjM1X2pzXzIgPSByZXF1aXJlKFwiLi92MzUuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJETlNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHYzNV9qc18yLkROUzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlVSTFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdjM1X2pzXzIuVVJMOyB9IH0pO1xuZnVuY3Rpb24gdjUodmFsdWUsIG5hbWVzcGFjZSwgYnVmLCBvZmZzZXQpIHtcbiAgICByZXR1cm4gKDAsIHYzNV9qc18xLmRlZmF1bHQpKDB4NTAsIHNoYTFfanNfMS5kZWZhdWx0LCB2YWx1ZSwgbmFtZXNwYWNlLCBidWYsIG9mZnNldCk7XG59XG52NS5ETlMgPSB2MzVfanNfMS5ETlM7XG52NS5VUkwgPSB2MzVfanNfMS5VUkw7XG5leHBvcnRzLmRlZmF1bHQgPSB2NTtcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/68/v5_68c452f27d93aa45cead3864553364cb.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/68/v5_68c452f27d93aa45cead3864553364cb.map new file mode 100644 index 0000000..20add0e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/68/v5_68c452f27d93aa45cead3864553364cb.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v5.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC;AACnC,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACrC,IAAI,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACnC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACvG,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACvG,SAAS,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM;IACrC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AACzF,CAAC;AACD,EAAE,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;AACtB,EAAE,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;AACtB,OAAO,CAAC,OAAO,GAAG,EAAE,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v5.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.URL = exports.DNS = void 0;\nconst sha1_js_1 = require(\"./sha1.js\");\nconst v35_js_1 = require(\"./v35.js\");\nvar v35_js_2 = require(\"./v35.js\");\nObject.defineProperty(exports, \"DNS\", { enumerable: true, get: function () { return v35_js_2.DNS; } });\nObject.defineProperty(exports, \"URL\", { enumerable: true, get: function () { return v35_js_2.URL; } });\nfunction v5(value, namespace, buf, offset) {\n return (0, v35_js_1.default)(0x50, sha1_js_1.default, value, namespace, buf, offset);\n}\nv5.DNS = v35_js_1.DNS;\nv5.URL = v35_js_1.URL;\nexports.default = v5;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6b/migrationservice_6bb0fde7b04e8e16815dc23ab0aff0f6 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6b/migrationservice_6bb0fde7b04e8e16815dc23ab0aff0f6 new file mode 100644 index 0000000..b0572a9 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6b/migrationservice_6bb0fde7b04e8e16815dc23ab0aff0f6 @@ -0,0 +1,535 @@ +44890aed019b59b7b3aa7b6416eab11f +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var MigrationService_1; +var _a, _b, _c, _d, _e, _f, _g, _h; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MigrationService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const import_transaction_entity_1 = require("./entities/import-transaction.entity"); +const correspondence_entity_1 = require("../correspondence/entities/correspondence.entity"); +const correspondence_revision_entity_1 = require("../correspondence/entities/correspondence-revision.entity"); +const correspondence_type_entity_1 = require("../correspondence/entities/correspondence-type.entity"); +const correspondence_status_entity_1 = require("../correspondence/entities/correspondence-status.entity"); +const project_entity_1 = require("../project/entities/project.entity"); +const file_storage_service_1 = require("../../common/file-storage/file-storage.service"); +const migration_review_queue_entity_1 = require("./entities/migration-review-queue.entity"); +const migration_error_entity_1 = require("./entities/migration-error.entity"); +const attachment_entity_1 = require("../../common/file-storage/entities/attachment.entity"); +const fs_1 = require("fs"); +const path = __importStar(require("path")); +const rfa_entity_1 = require("../rfa/entities/rfa.entity"); +const rfa_revision_entity_1 = require("../rfa/entities/rfa-revision.entity"); +let MigrationService = MigrationService_1 = class MigrationService { + constructor(dataSource, importTransactionRepo, correspondenceTypeRepo, correspondenceStatusRepo, projectRepo, reviewQueueRepo, errorRepo, fileStorageService) { + this.dataSource = dataSource; + this.importTransactionRepo = importTransactionRepo; + this.correspondenceTypeRepo = correspondenceTypeRepo; + this.correspondenceStatusRepo = correspondenceStatusRepo; + this.projectRepo = projectRepo; + this.reviewQueueRepo = reviewQueueRepo; + this.errorRepo = errorRepo; + this.fileStorageService = fileStorageService; + this.logger = new common_1.Logger(MigrationService_1.name); + } + async importCorrespondence(dto, idempotencyKey, userId) { + if (!idempotencyKey) { + throw new common_1.BadRequestException('Idempotency-Key header is required'); + } + // 1. Idempotency Check + const existingTransaction = await this.importTransactionRepo.findOne({ + where: { idempotencyKey }, + }); + if (existingTransaction) { + if (existingTransaction.statusCode === 201) { + this.logger.log(`Idempotency key ${idempotencyKey} already processed. Returning cached success.`); + return { + message: 'Already processed', + transaction: existingTransaction, + }; + } + else { + throw new common_1.ConflictException(`Transaction failed previously with status ${existingTransaction.statusCode}`); + } + } + // 2. Fetch Dependencies + // Alias map: n8n AI categories → correspondence_types.type_code + const CATEGORY_ALIAS = { + Correspondence: 'LETTER', + Letter: 'LETTER', + Drawing: 'OTHER', + Report: 'OTHER', + Other: 'OTHER', + }; + const type = await this.correspondenceTypeRepo.findOne({ + where: { typeName: dto.category }, + }); + // If exact name isn't found, try typeCode just in case + let typeId = type + ? type.id + : (await this.correspondenceTypeRepo.findOne({ + where: { typeCode: dto.category }, + }))?.id; + // Third-level fallback: resolve via alias map + if (!typeId && dto.category && CATEGORY_ALIAS[dto.category]) { + typeId = (await this.correspondenceTypeRepo.findOne({ + where: { typeCode: CATEGORY_ALIAS[dto.category] }, + }))?.id; + } + if (!typeId) { + throw new common_1.BadRequestException(`Category "${dto.category}" not found in system.`); + } + // Default status for correspondence + let status = await this.correspondenceStatusRepo.findOne({ + where: { statusCode: 'CLBOWN' }, + }); + if (!status) { + status = await this.correspondenceStatusRepo.findOne({ + where: { statusCode: 'DRAFT' }, + }); + } + if (!status) { + throw new common_1.InternalServerErrorException('CRITICAL: No default correspondence status found (missing CLBOWN/DRAFT)'); + } + // We now use project_id from n8n (instead of hardcoding LCBP3) + const project = await this.projectRepo.findOne({ + where: { id: dto.projectId }, + }); + if (!project) { + throw new common_1.BadRequestException(`Project ID ${dto.projectId} not found in database`); + } + const isRFA = type?.typeCode === 'RFA' || dto.category === 'RFA'; + const queryRunner = this.dataSource.createQueryRunner(); + await queryRunner.connect(); + await queryRunner.startTransaction(); + try { + // 3. Find or Create Correspondence + let correspondence = await queryRunner.manager.findOne(correspondence_entity_1.Correspondence, { + where: { + correspondenceNumber: dto.documentNumber, + projectId: project.id, + }, + }); + if (!correspondence) { + correspondence = queryRunner.manager.create(correspondence_entity_1.Correspondence, { + correspondenceNumber: dto.documentNumber, + correspondenceTypeId: typeId, + projectId: project.id, + disciplineId: dto.disciplineId || undefined, + originatorId: dto.senderId || undefined, // Set explicitly from DTO + isInternal: false, + createdBy: userId, + }); + await queryRunner.manager.save(correspondence); + // --- CTI: insert RFA class --- + if (isRFA) { + // Default RFA type generic mapping + const rfaTypeRes = await queryRunner.manager.query("SELECT id FROM rfa_types WHERE type_code = 'GEN' LIMIT 1"); + const rfa = queryRunner.manager.create(rfa_entity_1.Rfa, { + id: correspondence.id, + rfaTypeId: rfaTypeRes[0]?.id || 1, // fallback to id 1 + createdBy: userId, + }); + await queryRunner.manager.save(rfa_entity_1.Rfa, rfa); + } + } + else { + // Update values if missing + let hasChanges = false; + if (dto.disciplineId && !correspondence.disciplineId) { + correspondence.disciplineId = dto.disciplineId; + hasChanges = true; + } + if (dto.senderId && !correspondence.originatorId) { + correspondence.originatorId = dto.senderId; + hasChanges = true; + } + if (hasChanges) { + await queryRunner.manager.save(correspondence); + } + } + // 4. File Handling + let attachmentId = null; + if (dto.tempAttachmentId) { + attachmentId = dto.tempAttachmentId; + try { + // Mark attachment as permanent + await queryRunner.manager.update(attachment_entity_1.Attachment, { id: attachmentId }, { isTemporary: false }); + } + catch (fileError) { + const errMsg = fileError instanceof Error ? fileError.message : String(fileError); + this.logger.warn(`Failed to update temp_file [id:${attachmentId}]: ${errMsg}`); + } + } + else if (dto.sourceFilePath) { + try { + const attachment = await this.fileStorageService.importStagingFile(dto.sourceFilePath, userId, { documentType: dto.category }); + attachmentId = attachment.id; + } + catch (fileError) { + const errMsg = fileError instanceof Error ? fileError.message : String(fileError); + this.logger.warn(`Failed to import file for [${dto.documentNumber}], continuing without attachment: ${errMsg}`); + } + } + // Helper function to parse Date safety + const parseDateStr = (d) => { + if (!d) + return undefined; + const num = Number(d); + if (!isNaN(num) && num > 20000 && num < 100000) { + return new Date(Math.round((num - 25569) * 86400 * 1000)); + } + const parsed = new Date(d); + if (isNaN(parsed.getTime())) + return undefined; + if (parsed.getFullYear() > 2100 || parsed.getFullYear() < 1900) + return undefined; + return parsed; + }; + // 5. Create Revision + const revisionCount = await queryRunner.manager.count(correspondence_revision_entity_1.CorrespondenceRevision, { + where: { correspondenceId: correspondence.id }, + }); + const revNum = revisionCount; + const revision = queryRunner.manager.create(correspondence_revision_entity_1.CorrespondenceRevision, { + correspondenceId: correspondence.id, + revisionNumber: revNum, + revisionLabel: revNum === 0 ? '0' : revNum.toString(), + isCurrent: true, + statusId: status.id, + subject: dto.subject, + description: 'Migrated from legacy system via Auto Ingest', + body: dto.body || undefined, + documentDate: parseDateStr(dto.documentDate || dto.issuedDate), + issuedDate: parseDateStr(dto.issuedDate), + receivedDate: parseDateStr(dto.receivedDate), + details: { + ...dto.details, + ai_confidence: dto.aiConfidence, + ai_issues: dto.aiIssues, + source_file_path: dto.sourceFilePath, + attachment_id: attachmentId, + }, + schemaVersion: 1, + createdBy: userId, + }); + if (revisionCount > 0) { + await queryRunner.manager.update(correspondence_revision_entity_1.CorrespondenceRevision, { correspondenceId: correspondence.id, isCurrent: true }, { isCurrent: false }); + } + await queryRunner.manager.save(revision); + // --- CTI: insert RfaRevision --- + if (isRFA) { + // Map Status code to RFA Equivalent 'APP' (Approved) if exist, or id 3 (typically Approved) + const rfaStatusRes = await queryRunner.manager.query("SELECT id FROM rfa_status_codes WHERE status_code = 'APP' LIMIT 1"); + const rfaRev = queryRunner.manager.create(rfa_revision_entity_1.RfaRevision, { + id: revision.id, + rfaStatusCodeId: rfaStatusRes[0]?.id || 3, // Fallback to 3 if APP not found + details: { + // Keep drawingCount as 0 for migration stub + drawingCount: 0, + }, + schemaVersion: 1, + }); + await queryRunner.manager.save(rfa_revision_entity_1.RfaRevision, rfaRev); + } + // 5.5 Handle Tags + if (dto.details && + Array.isArray(dto.details.tags) && + dto.details.tags.length > 0) { + for (const tagItem of dto.details.tags) { + let tagName; + if (typeof tagItem === 'string') { + tagName = tagItem; + } + else if (tagItem && typeof tagItem === 'object') { + const tObj = tagItem; + if (typeof tObj.tagName === 'string') { + tagName = tObj.tagName; + } + } + if (!tagName) + continue; + // Find or create Tag + const tagRes = await queryRunner.manager.query('SELECT id FROM tags WHERE project_id = ? AND tag_name = ? LIMIT 1', [project.id, tagName]); + let tagId; + if (tagRes && tagRes.length > 0) { + tagId = tagRes[0].id; + } + else { + const insertRes = await queryRunner.manager.query("INSERT INTO tags (project_id, tag_name, color_code, created_by) VALUES (?, ?, 'default', ?)", [project.id, tagName, userId]); + tagId = insertRes.insertId; + } + // Link to correspondence + await queryRunner.manager.query('INSERT IGNORE INTO correspondence_tags (correspondence_id, tag_id) VALUES (?, ?)', [correspondence.id, tagId]); + } + } + // 6. Track Transaction + const transaction = queryRunner.manager.create(import_transaction_entity_1.ImportTransaction, { + idempotencyKey, + documentNumber: dto.documentNumber, + batchId: dto.batchId, + statusCode: 201, + }); + await queryRunner.manager.save(transaction); + await queryRunner.commitTransaction(); + this.logger.log(`Ingested document [${dto.documentNumber}] successfully (Batch: ${dto.batchId})`); + return { + message: 'Import successful', + correspondenceId: correspondence.id, + revisionId: revision.id, + transactionId: transaction.id, + }; + } + catch (error) { + await queryRunner.rollbackTransaction(); + const errorMessage = error instanceof Error ? error.message : String(error); + const errorStack = error instanceof Error ? error.stack : undefined; + this.logger.error(`Import failed for document [${dto.documentNumber}]: ${errorMessage}`, errorStack); + const failedTransaction = this.importTransactionRepo.create({ + idempotencyKey, + documentNumber: dto.documentNumber, + batchId: dto.batchId, + statusCode: 500, + }); + await this.importTransactionRepo.save(failedTransaction).catch(() => { }); + throw new common_1.InternalServerErrorException('Migration import failed: ' + errorMessage); + } + finally { + await queryRunner.release(); + } + } + async enqueueRecord(dto) { + if (!dto.documentNumber) { + throw new common_1.BadRequestException('documentNumber is required'); + } + // Determine status based on confidence policy in ADR-017 + let autoStatus = migration_review_queue_entity_1.MigrationReviewStatus.PENDING; + if (dto.isValid === false || + (dto.confidence != null && dto.confidence < 0.6)) { + autoStatus = migration_review_queue_entity_1.MigrationReviewStatus.REJECTED; + } + // Upsert or create new queue item + let queueItem = await this.reviewQueueRepo.findOne({ + where: { documentNumber: dto.documentNumber }, + }); + if (!queueItem) { + queueItem = this.reviewQueueRepo.create({ + documentNumber: dto.documentNumber, + }); + } + queueItem.subject = dto.subject; + queueItem.originalSubject = dto.originalSubject; + queueItem.body = dto.body; + queueItem.aiSuggestedCategory = dto.category; + queueItem.aiIssues = dto.aiIssues; + queueItem.projectId = dto.projectId; + queueItem.senderOrganizationId = dto.senderOrgId; + queueItem.receiverOrganizationId = dto.receiverOrgId; + queueItem.remarks = dto.remarks; + queueItem.aiSummary = dto.aiSummary; + queueItem.extractedTags = dto.extractedTags; + queueItem.tempAttachmentId = dto.tempAttachmentId; + queueItem.status = autoStatus; + if (dto.issuedDate) { + const parsed = new Date(dto.issuedDate); + if (!isNaN(parsed.getTime())) + queueItem.issuedDate = parsed; + } + if (dto.receivedDate) { + const parsed = new Date(dto.receivedDate); + if (!isNaN(parsed.getTime())) + queueItem.receivedDate = parsed; + } + await this.reviewQueueRepo.save(queueItem); + this.logger.log(`Enqueued document [${dto.documentNumber}] to staging queue with status [${autoStatus}]`); + return { + message: 'Document enqueued successfully', + id: queueItem.id, + status: autoStatus, + }; + } + async getReviewQueue(query) { + const { page = 1, limit = 10, status } = query; + const skip = (page - 1) * limit; + const queryBuilder = this.reviewQueueRepo.createQueryBuilder('queue'); + if (status) { + queryBuilder.where('queue.status = :status', { status }); + } + queryBuilder.orderBy('queue.createdAt', 'DESC'); + queryBuilder.skip(skip).take(limit); + const [items, total] = await queryBuilder.getManyAndCount(); + return { + items, + total, + page, + limit, + totalPages: Math.ceil(total / limit), + }; + } + async getQueueItemById(id) { + const item = await this.reviewQueueRepo.findOne({ where: { id } }); + if (!item) { + throw new common_1.BadRequestException(`Queue item with ID ${id} not found`); + } + return item; + } + async createError(dto) { + const error = this.errorRepo.create({ + batchId: dto.batchId, + documentNumber: dto.documentNumber, + errorType: dto.errorType, + errorMessage: dto.errorMessage, + rawAiResponse: dto.rawAiResponse, + }); + const saved = await this.errorRepo.save(error); + this.logger.warn(`Migration error logged [${dto.errorType}] for doc [${dto.documentNumber}] batch [${dto.batchId}]`); + return { message: 'Error logged', id: saved.id }; + } + async getErrors(page = 1, limit = 10) { + const skip = (page - 1) * limit; + const [items, total] = await this.errorRepo.findAndCount({ + order: { createdAt: 'DESC' }, + skip, + take: limit, + }); + return { + items, + total, + page, + limit, + totalPages: Math.ceil(total / limit), + }; + } + async approveQueueItem(id, dto, idempotencyKey, userId) { + const queueItem = await this.reviewQueueRepo.findOne({ where: { id } }); + if (!queueItem) { + throw new common_1.BadRequestException(`Queue item ${id} not found`); + } + if (queueItem.status !== migration_review_queue_entity_1.MigrationReviewStatus.PENDING) { + throw new common_1.BadRequestException(`Queue item ${id} is already ${queueItem.status}`); + } + // Attempt the import + const result = await this.importCorrespondence(dto, idempotencyKey, userId); + // If successful, update the queue item status + queueItem.status = migration_review_queue_entity_1.MigrationReviewStatus.APPROVED; + queueItem.reviewedBy = userId.toString(); + queueItem.reviewedAt = new Date(); + await this.reviewQueueRepo.save(queueItem); + return result; + } + async commitBatch(dto, idempotencyKey, userId) { + if (!idempotencyKey) { + throw new common_1.BadRequestException('Idempotency-Key header is required'); + } + const results = []; + const errors = []; + // We let each import have its own transaction via approveQueueItem + // to avoid one bad record failing the entire batch of valid ones. + for (const item of dto.items) { + // Create a unique sub-key for each item to avoid idempotency conflicts + // when using a batch idempotency key. + const subKey = `${idempotencyKey}_${item.queueId}`; + // Force batchId on the item dto + item.dto.batchId = dto.batchId; + try { + const result = await this.approveQueueItem(item.queueId, item.dto, subKey, userId); + results.push({ queueId: item.queueId, result }); + } + catch (err) { + const errorMessage = err instanceof Error ? err.message : String(err); + errors.push({ queueId: item.queueId, error: errorMessage }); + this.logger.error(`Batch commit failed for queue ID ${item.queueId}: ${errorMessage}`); + } + } + return { + message: 'Batch processing completed', + batchId: dto.batchId, + processed: results.length, + failed: errors.length, + results, + errors, + }; + } + async rejectQueueItem(id, userId) { + const queueItem = await this.reviewQueueRepo.findOne({ where: { id } }); + if (!queueItem) { + throw new common_1.BadRequestException('Queue item not found'); + } + queueItem.status = migration_review_queue_entity_1.MigrationReviewStatus.REJECTED; + queueItem.reviewedBy = userId.toString(); + queueItem.reviewedAt = new Date(); + await this.reviewQueueRepo.save(queueItem); + return { + message: 'Document rejected successfully', + id: queueItem.id, + }; + } + getStagingFileStream(filePath) { + if (!filePath) { + throw new common_1.BadRequestException('File path is required'); + } + const resolvedPath = path.resolve(filePath); + if (!(0, fs_1.existsSync)(resolvedPath)) { + throw new common_1.BadRequestException('File not found at specified path'); + } + return (0, fs_1.createReadStream)(resolvedPath); + } +}; +exports.MigrationService = MigrationService; +exports.MigrationService = MigrationService = MigrationService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(1, (0, typeorm_1.InjectRepository)(import_transaction_entity_1.ImportTransaction)), + __param(2, (0, typeorm_1.InjectRepository)(correspondence_type_entity_1.CorrespondenceType)), + __param(3, (0, typeorm_1.InjectRepository)(correspondence_status_entity_1.CorrespondenceStatus)), + __param(4, (0, typeorm_1.InjectRepository)(project_entity_1.Project)), + __param(5, (0, typeorm_1.InjectRepository)(migration_review_queue_entity_1.MigrationReviewQueue)), + __param(6, (0, typeorm_1.InjectRepository)(migration_error_entity_1.MigrationError)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.DataSource !== "undefined" && typeorm_2.DataSource) === "function" ? _a : Object, typeof (_b = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _b : Object, typeof (_c = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _c : Object, typeof (_d = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _d : Object, typeof (_e = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _e : Object, typeof (_f = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _f : Object, typeof (_g = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _g : Object, typeof (_h = typeof file_storage_service_1.FileStorageService !== "undefined" && file_storage_service_1.FileStorageService) === "function" ? _h : Object]) +], MigrationService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxtaWdyYXRpb24uc2VydmljZS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQU13QjtBQUN4Qiw2Q0FBbUQ7QUFDbkQscUNBQWlEO0FBS2pELG9GQUF5RTtBQUN6RSw0RkFBa0Y7QUFDbEYsOEdBQW1HO0FBQ25HLHNHQUEyRjtBQUMzRiwwR0FBK0Y7QUFDL0YsdUVBQTZEO0FBQzdELHlGQUFvRjtBQUNwRiw0RkFHa0Q7QUFDbEQsOEVBQW1FO0FBRW5FLDRGQUFrRjtBQUNsRiwyQkFBa0Q7QUFDbEQsMkNBQTZCO0FBQzdCLDJEQUFpRDtBQUNqRCw2RUFBa0U7QUFHM0QsSUFBTSxnQkFBZ0Isd0JBQXRCLE1BQU0sZ0JBQWdCO0lBRzNCLFlBQ21CLFVBQXNCLEVBRXZDLHFCQUFxRSxFQUVyRSxzQkFBdUUsRUFFdkUsd0JBQTJFLEVBRTNFLFdBQWlELEVBRWpELGVBQWtFLEVBRWxFLFNBQXNELEVBQ3JDLGtCQUFzQztRQWJ0QyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBRXRCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBK0I7UUFFcEQsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUFnQztRQUV0RCw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQWtDO1FBRTFELGdCQUFXLEdBQVgsV0FBVyxDQUFxQjtRQUVoQyxvQkFBZSxHQUFmLGVBQWUsQ0FBa0M7UUFFakQsY0FBUyxHQUFULFNBQVMsQ0FBNEI7UUFDckMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQWhCeEMsV0FBTSxHQUFHLElBQUksZUFBTSxDQUFDLGtCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBaUJ6RCxDQUFDO0lBRUosS0FBSyxDQUFDLG9CQUFvQixDQUN4QixHQUE0QixFQUM1QixjQUFzQixFQUN0QixNQUFjO1FBRWQsSUFBSSxDQUFDLGNBQWMsRUFBRSxD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VixvQkFBVSxvREFFaEIsb0JBQVUsb0JBQVYsb0JBQVUsb0RBQ0QseUNBQWtCLG9CQUFsQix5Q0FBa0I7R0FqQjlDLGdCQUFnQixDQStsQjVCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXG1pZ3JhdGlvblxcbWlncmF0aW9uLnNlcnZpY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBJbmplY3RhYmxlLFxyXG4gIExvZ2dlcixcclxuICBDb25mbGljdEV4Y2VwdGlvbixcclxuICBCYWRSZXF1ZXN0RXhjZXB0aW9uLFxyXG4gIEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24sXHJcbn0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xyXG5pbXBvcnQgeyBJbmplY3RSZXBvc2l0b3J5IH0gZnJvbSAnQG5lc3Rqcy90eXBlb3JtJztcclxuaW1wb3J0IHsgUmVwb3NpdG9yeSwgRGF0YVNvdXJjZSB9IGZyb20gJ3R5cGVvcm0nO1xyXG5pbXBvcnQgeyBJbXBvcnRDb3JyZXNwb25kZW5jZUR0byB9IGZyb20gJy4vZHRvL2ltcG9ydC1jb3JyZXNwb25kZW5jZS5kdG8nO1xyXG5pbXBvcnQgeyBFbnF1ZXVlTWlncmF0aW9uRHRvIH0gZnJvbSAnLi9kdG8vZW5xdWV1ZS1taWdyYXRpb24uZHRvJztcclxuaW1wb3J0IHsgQ29tbWl0QmF0Y2hEdG8gfSBmcm9tICcuL2R0by9jb21taXQtYmF0Y2guZHRvJztcclxuaW1wb3J0IHsgQ3JlYXRlTWlncmF0aW9uRXJyb3JEdG8gfSBmcm9tICcuL2R0by9jcmVhdGUtbWlncmF0aW9uLWVycm9yLmR0byc7XHJcbmltcG9ydCB7IEltcG9ydFRyYW5zYWN0aW9uIH0gZnJvbSAnLi9lbnRpdGllcy9pbXBvcnQtdHJhbnNhY3Rpb24uZW50aXR5JztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2UgfSBmcm9tICcuLi9jb3JyZXNwb25kZW5jZS9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJldmlzaW9uIH0gZnJvbSAnLi4vY29ycmVzcG9uZGVuY2UvZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtcmV2aXNpb24uZW50aXR5JztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VUeXBlIH0gZnJvbSAnLi4vY29ycmVzcG9uZGVuY2UvZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtdHlwZS5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVN0YXR1cyB9IGZyb20gJy4uL2NvcnJlc3BvbmRlbmNlL2VudGl0aWVzL2NvcnJlc3BvbmRlbmNlLXN0YXR1cy5lbnRpdHknO1xyXG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC9lbnRpdGllcy9wcm9qZWN0LmVudGl0eSc7XHJcbmltcG9ydCB7IEZpbGVTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9maWxlLXN0b3JhZ2UvZmlsZS1zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIE1pZ3JhdGlvblJldmlld1F1ZXVlLFxyXG4gIE1pZ3JhdGlvblJldmlld1N0YXR1cyxcclxufSBmcm9tICcuL2VudGl0aWVzL21pZ3JhdGlvbi1yZXZpZXctcXVldWUuZW50aXR5JztcclxuaW1wb3J0IHsgTWlncmF0aW9uRXJyb3IgfSBmcm9tICcuL2VudGl0aWVzL21pZ3JhdGlvbi1lcnJvci5lbnRpdHknO1xyXG5pbXBvcnQgeyBNaWdyYXRpb25RdWV1ZVF1ZXJ5RHRvIH0gZnJvbSAnLi9kdG8vbWlncmF0aW9uLXF1ZXVlLXF1ZXJ5LmR0byc7XHJcbmltcG9ydCB7IEF0dGFjaG1lbnQgfSBmcm9tICcuLi8uLi9jb21tb24vZmlsZS1zdG9yYWdlL2VudGl0aWVzL2F0dGFjaG1lbnQuZW50aXR5JztcclxuaW1wb3J0IHsgY3JlYXRlUmVhZFN0cmVhbSwgZXhpc3RzU3luYyB9IGZyb20gJ2ZzJztcclxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcclxuaW1wb3J0IHsgUmZhIH0gZnJvbSAnLi4vcmZhL2VudGl0aWVzL3JmYS5lbnRpdHknO1xyXG5pbXBvcnQgeyBSZmFSZXZpc2lvbiB9IGZyb20gJy4uL3JmYS9lbnRpdGllcy9yZmEtcmV2aXNpb24uZW50aXR5JztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIE1pZ3JhdGlvblNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IExvZ2dlcihNaWdyYXRpb25TZXJ2aWNlLm5hbWUpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KEltcG9ydFRyYW5zYWN0aW9uKVxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbXBvcnRUcmFuc2FjdGlvblJlcG86IFJlcG9zaXRvcnk8SW1wb3J0VHJhbnNhY3Rpb24+LFxyXG4gICAgQEluamVjdFJlcG9zaXRvcnkoQ29ycmVzcG9uZGVuY2VUeXBlKVxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb3JyZXNwb25kZW5jZVR5cGVSZXBvOiBSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlVHlwZT4sXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShDb3JyZXNwb25kZW5jZVN0YXR1cylcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29ycmVzcG9uZGVuY2VTdGF0dXNSZXBvOiBSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlU3RhdHVzPixcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KFByb2plY3QpXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb2plY3RSZXBvOiBSZXBvc2l0b3J5PFByb2plY3Q+LFxyXG4gICAgQEluamVjdFJlcG9zaXRvcnkoTWlncmF0aW9uUmV2aWV3UXVldWUpXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJldmlld1F1ZXVlUmVwbzogUmVwb3NpdG9yeTxNaWdyYXRpb25SZXZpZXdRdWV1ZT4sXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShNaWdyYXRpb25FcnJvcilcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXJyb3JSZXBvOiBSZXBvc2l0b3J5PE1pZ3JhdGlvbkVycm9yPixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmlsZVN0b3JhZ2VTZXJ2aWNlOiBGaWxlU3RvcmFnZVNlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIGFzeW5jIGltcG9ydENvcnJlc3BvbmRlbmNlKFxyXG4gICAgZHRvOiBJbXBvcnRDb3JyZXNwb25kZW5jZUR0byxcclxuICAgIGlkZW1wb3RlbmN5S2V5OiBzdHJpbmcsXHJcbiAgICB1c2VySWQ6IG51bWJlclxyXG4gICkge1xyXG4gICAgaWYgKCFpZGVtcG90ZW5jeUtleSkge1xyXG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbignSWRlbXBvdGVuY3ktS2V5IGhlYWRlciBpcyByZXF1aXJlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDEuIElkZW1wb3RlbmN5IENoZWNrXHJcbiAgICBjb25zdCBleGlzdGluZ1RyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5pbXBvcnRUcmFuc2FjdGlvblJlcG8uZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7IGlkZW1wb3RlbmN5S2V5IH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoZXhpc3RpbmdUcmFuc2FjdGlvbikge1xyXG4gICAgICBpZiAoZXhpc3RpbmdUcmFuc2FjdGlvbi5zdGF0dXNDb2RlID09PSAyMDEpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci5sb2coXHJcbiAgICAgICAgICBgSWRlbXBvdGVuY3kga2V5ICR7aWRlbXBvdGVuY3lLZXl9IGFscmVhZHkgcHJvY2Vzc2VkLiBSZXR1cm5pbmcgY2FjaGVkIHN1Y2Nlc3MuYFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIG1lc3NhZ2U6ICdBbHJlYWR5IHByb2Nlc3NlZCcsXHJcbiAgICAgICAgICB0cmFuc2FjdGlvbjogZXhpc3RpbmdUcmFuc2FjdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBDb25mbGljdEV4Y2VwdGlvbihcclxuICAgICAgICAgIGBUcmFuc2FjdGlvbiBmYWlsZWQgcHJldmlvdXNseSB3aXRoIHN0YXR1cyAke2V4aXN0aW5nVHJhbnNhY3Rpb24uc3RhdHVzQ29kZX1gXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIDIuIEZldGNoIERlcGVuZGVuY2llc1xyXG4gICAgLy8gQWxpYXMgbWFwOiBuOG4gQUkgY2F0ZWdvcmllcyDihpIgY29ycmVzcG9uZGVuY2VfdHlwZXMudHlwZV9jb2RlXHJcbiAgICBjb25zdCBDQVRFR09SWV9BTElBUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcclxuICAgICAgQ29ycmVzcG9uZGVuY2U6ICdMRVRURVInLFxyXG4gICAgICBMZXR0ZXI6ICdMRVRURVInLFxyXG4gICAgICBEcmF3aW5nOiAnT1RIRVInLFxyXG4gICAgICBSZXBvcnQ6ICdPVEhFUicsXHJcbiAgICAgIE90aGVyOiAnT1RIRVInLFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCB0eXBlID0gYXdhaXQgdGhpcy5jb3JyZXNwb25kZW5jZVR5cGVSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyB0eXBlTmFtZTogZHRvLmNhdGVnb3J5IH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBJZiBleGFjdCBuYW1lIGlzbid0IGZvdW5kLCB0cnkgdHlwZUNvZGUganVzdCBpbiBjYXNlXHJcbiAgICBsZXQgdHlwZUlkID0gdHlwZVxyXG4gICAgICA/IHR5cGUuaWRcclxuICAgICAgOiAoXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmNvcnJlc3BvbmRlbmNlVHlwZVJlcG8uZmluZE9uZSh7XHJcbiAgICAgICAgICAgIHdoZXJlOiB7IHR5cGVDb2RlOiBkdG8uY2F0ZWdvcnkgfSxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKT8uaWQ7XHJcblxyXG4gICAgLy8gVGhpcmQtbGV2ZWwgZmFsbGJhY2s6IHJlc29sdmUgdmlhIGFsaWFzIG1hcFxyXG4gICAgaWYgKCF0eXBlSWQgJiYgZHRvLmNhdGVnb3J5ICYmIENBVEVHT1JZX0FMSUFTW2R0by5jYXRlZ29yeV0pIHtcclxuICAgICAgdHlwZUlkID0gKFxyXG4gICAgICAgIGF3YWl0IHRoaXMuY29ycmVzcG9uZGVuY2VUeXBlUmVwby5maW5kT25lKHtcclxuICAgICAgICAgIHdoZXJlOiB7IHR5cGVDb2RlOiBDQVRFR09SWV9BTElBU1tkdG8uY2F0ZWdvcnldIH0sXHJcbiAgICAgICAgfSlcclxuICAgICAgKT8uaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0eXBlSWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXHJcbiAgICAgICAgYENhdGVnb3J5IFwiJHtkdG8uY2F0ZWdvcnl9XCIgbm90IGZvdW5kIGluIHN5c3RlbS5gXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGVmYXVsdCBzdGF0dXMgZm9yIGNvcnJlc3BvbmRlbmNlXHJcbiAgICBsZXQgc3RhdHVzID0gYXdhaXQgdGhpcy5jb3JyZXNwb25kZW5jZVN0YXR1c1JlcG8uZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7IHN0YXR1c0NvZGU6ICdDTEJPV04nIH0sXHJcbiAgICB9KTtcclxuICAgIGlmICghc3RhdHVzKSB7XHJcbiAgICAgIHN0YXR1cyA9IGF3YWl0IHRoaXMuY29ycmVzcG9uZGVuY2VTdGF0dXNSZXBvLmZpbmRPbmUoe1xyXG4gICAgICAgIHdoZXJlOiB7IHN0YXR1c0NvZGU6ICdEUkFGVCcgfSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXN0YXR1cykge1xyXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbihcclxuICAgICAgICAnQ1JJVElDQUw6IE5vIGRlZmF1bHQgY29ycmVzcG9uZGVuY2Ugc3RhdHVzIGZvdW5kIChtaXNzaW5nIENMQk9XTi9EUkFGVCknXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2Ugbm93IHVzZSBwcm9qZWN0X2lkIGZyb20gbjhuIChpbnN0ZWFkIG9mIGhhcmRjb2RpbmcgTENCUDMpXHJcbiAgICBjb25zdCBwcm9qZWN0ID0gYXdhaXQgdGhpcy5wcm9qZWN0UmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgaWQ6IGR0by5wcm9qZWN0SWQgfSxcclxuICAgIH0pO1xyXG4gICAgaWYgKCFwcm9qZWN0KSB7XHJcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxyXG4gICAgICAgIGBQcm9qZWN0IElEICR7ZHRvLnByb2plY3RJZH0gbm90IGZvdW5kIGluIGRhdGFiYXNlYFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGlzUkZBID0gdHlwZT8udHlwZUNvZGUgPT09ICdSRkEnIHx8IGR0by5jYXRlZ29yeSA9PT0gJ1JGQSc7XHJcblxyXG4gICAgY29uc3QgcXVlcnlSdW5uZXIgPSB0aGlzLmRhdGFTb3VyY2UuY3JlYXRlUXVlcnlSdW5uZXIoKTtcclxuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbm5lY3QoKTtcclxuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAvLyAzLiBGaW5kIG9yIENyZWF0ZSBDb3JyZXNwb25kZW5jZVxyXG4gICAgICBsZXQgY29ycmVzcG9uZGVuY2UgPSBhd2FpdCBxdWVyeVJ1bm5lci5tYW5hZ2VyLmZpbmRPbmUoQ29ycmVzcG9uZGVuY2UsIHtcclxuICAgICAgICB3aGVyZToge1xyXG4gICAgICAgICAgY29ycmVzcG9uZGVuY2VOdW1iZXI6IGR0by5kb2N1bWVudE51bWJlcixcclxuICAgICAgICAgIHByb2plY3RJZDogcHJvamVjdC5pZCxcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmICghY29ycmVzcG9uZGVuY2UpIHtcclxuICAgICAgICBjb3JyZXNwb25kZW5jZSA9IHF1ZXJ5UnVubmVyLm1hbmFnZXIuY3JlYXRlKENvcnJlc3BvbmRlbmNlLCB7XHJcbiAgICAgICAgICBjb3JyZXNwb25kZW5jZU51bWJlcjogZHRvLmRvY3VtZW50TnVtYmVyLFxyXG4gICAgICAgICAgY29ycmVzcG9uZGVuY2VUeXBlSWQ6IHR5cGVJZCxcclxuICAgICAgICAgIHByb2plY3RJZDogcHJvamVjdC5pZCxcclxuICAgICAgICAgIGRpc2NpcGxpbmVJZDogZHRvLmRpc2NpcGxpbmVJZCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICBvcmlnaW5hdG9ySWQ6IGR0by5zZW5kZXJJZCB8fCB1bmRlZmluZWQsIC8vIFNldCBleHBsaWNpdGx5IGZyb20gRFRPXHJcbiAgICAgICAgICBpc0ludGVybmFsOiBmYWxzZSxcclxuICAgICAgICAgIGNyZWF0ZWRCeTogdXNlcklkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIuc2F2ZShjb3JyZXNwb25kZW5jZSk7XHJcblxyXG4gICAgICAgIC8vIC0tLSBDVEk6IGluc2VydCBSRkEgY2xhc3MgLS0tXHJcbiAgICAgICAgaWYgKGlzUkZBKSB7XHJcbiAgICAgICAgICAvLyBEZWZhdWx0IFJGQSB0eXBlIGdlbmVyaWMgbWFwcGluZ1xyXG4gICAgICAgICAgY29uc3QgcmZhVHlwZVJlcyA9IGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIucXVlcnk8eyBpZDogbnVtYmVyIH1bXT4oXHJcbiAgICAgICAgICAgIFwiU0VMRUNUIGlkIEZST00gcmZhX3R5cGVzIFdIRVJFIHR5cGVfY29kZSA9ICdHRU4nIExJTUlUIDFcIlxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGNvbnN0IHJmYSA9IHF1ZXJ5UnVubmVyLm1hbmFnZXIuY3JlYXRlKFJmYSwge1xyXG4gICAgICAgICAgICBpZDogY29ycmVzcG9uZGVuY2UuaWQsXHJcbiAgICAgICAgICAgIHJmYVR5cGVJZDogcmZhVHlwZVJlc1swXT8uaWQgfHwgMSwgLy8gZmFsbGJhY2sgdG8gaWQgMVxyXG4gICAgICAgICAgICBjcmVhdGVkQnk6IHVzZXJJZCxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgYXdhaXQgcXVlcnlSdW5uZXIubWFuYWdlci5zYXZlKFJmYSwgcmZhKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gVXBkYXRlIHZhbHVlcyBpZiBtaXNzaW5nXHJcbiAgICAgICAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcclxuICAgICAgICBpZiAoZHRvLmRpc2NpcGxpbmVJZCAmJiAhY29ycmVzcG9uZGVuY2UuZGlzY2lwbGluZUlkKSB7XHJcbiAgICAgICAgICBjb3JyZXNwb25kZW5jZS5kaXNjaXBsaW5lSWQgPSBkdG8uZGlzY2lwbGluZUlkO1xyXG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkdG8uc2VuZGVySWQgJiYgIWNvcnJlc3BvbmRlbmNlLm9yaWdpbmF0b3JJZCkge1xyXG4gICAgICAgICAgY29ycmVzcG9uZGVuY2Uub3JpZ2luYXRvcklkID0gZHRvLnNlbmRlcklkO1xyXG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChoYXNDaGFuZ2VzKSB7XHJcbiAgICAgICAgICBhd2FpdCBxdWVyeVJ1bm5lci5tYW5hZ2VyLnNhdmUoY29ycmVzcG9uZGVuY2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gNC4gRmlsZSBIYW5kbGluZ1xyXG4gICAgICBsZXQgYXR0YWNobWVudElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgICAgaWYgKGR0by50ZW1wQXR0YWNobWVudElkKSB7XHJcbiAgICAgICAgYXR0YWNobWVudElkID0gZHRvLnRlbXBBdHRhY2htZW50SWQ7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIC8vIE1hcmsgYXR0YWNobWVudCBhcyBwZXJtYW5lbnRcclxuICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIudXBkYXRlKFxyXG4gICAgICAgICAgICBBdHRhY2htZW50LFxyXG4gICAgICAgICAgICB7IGlkOiBhdHRhY2htZW50SWQgfSxcclxuICAgICAgICAgICAgeyBpc1RlbXBvcmFyeTogZmFsc2UgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGNhdGNoIChmaWxlRXJyb3I6IHVua25vd24pIHtcclxuICAgICAgICAgIGNvbnN0IGVyck1zZyA9XHJcbiAgICAgICAgICAgIGZpbGVFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZmlsZUVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZmlsZUVycm9yKTtcclxuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXHJcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gdXBkYXRlIHRlbXBfZmlsZSBbaWQ6JHthdHRhY2htZW50SWR9XTogJHtlcnJNc2d9YFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoZHRvLnNvdXJjZUZpbGVQYXRoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnQgPSBhd2FpdCB0aGlzLmZpbGVTdG9yYWdlU2VydmljZS5pbXBvcnRTdGFnaW5nRmlsZShcclxuICAgICAgICAgICAgZHRvLnNvdXJjZUZpbGVQYXRoLFxyXG4gICAgICAgICAgICB1c2VySWQsXHJcbiAgICAgICAgICAgIHsgZG9jdW1lbnRUeXBlOiBkdG8uY2F0ZWdvcnkgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGF0dGFjaG1lbnRJZCA9IGF0dGFjaG1lbnQuaWQ7XHJcbiAgICAgICAgfSBjYXRjaCAoZmlsZUVycm9yOiB1bmtub3duKSB7XHJcbiAgICAgICAgICBjb25zdCBlcnJNc2cgPVxyXG4gICAgICAgICAgICBmaWxlRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGZpbGVFcnJvci5tZXNzYWdlIDogU3RyaW5nKGZpbGVFcnJvcik7XHJcblxyXG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcclxuICAgICAgICAgICAgYEZhaWxlZCB0byBpbXBvcnQgZmlsZSBmb3IgWyR7ZHRvLmRvY3VtZW50TnVtYmVyfV0sIGNvbnRpbnVpbmcgd2l0aG91dCBhdHRhY2htZW50OiAke2Vyck1zZ31gXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHBhcnNlIERhdGUgc2FmZXR5XHJcbiAgICAgIGNvbnN0IHBhcnNlRGF0ZVN0ciA9IChkPzogc3RyaW5nIHwgbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgaWYgKCFkKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIGNvbnN0IG51bSA9IE51bWJlcihkKTtcclxuICAgICAgICBpZiAoIWlzTmFOKG51bSkgJiYgbnVtID4gMjAwMDAgJiYgbnVtIDwgMTAwMDAwKSB7XHJcbiAgICAgICAgICByZXR1cm4gbmV3IERhdGUoTWF0aC5yb3VuZCgobnVtIC0gMjU1NjkpICogODY0MDAgKiAxMDAwKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBEYXRlKGQpO1xyXG4gICAgICAgIGlmIChpc05hTihwYXJzZWQuZ2V0VGltZSgpKSkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAocGFyc2VkLmdldEZ1bGxZZWFyKCkgPiAyMTAwIHx8IHBhcnNlZC5nZXRGdWxsWWVhcigpIDwgMTkwMClcclxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlZDtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIDUuIENyZWF0ZSBSZXZpc2lvblxyXG4gICAgICBjb25zdCByZXZpc2lvbkNvdW50ID0gYXdhaXQgcXVlcnlSdW5uZXIubWFuYWdlci5jb3VudChcclxuICAgICAgICBDb3JyZXNwb25kZW5jZVJldmlzaW9uLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHdoZXJlOiB7IGNvcnJlc3BvbmRlbmNlSWQ6IGNvcnJlc3BvbmRlbmNlLmlkIH0sXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3QgcmV2TnVtID0gcmV2aXNpb25Db3VudDtcclxuICAgICAgY29uc3QgcmV2aXNpb24gPSBxdWVyeVJ1bm5lci5tYW5hZ2VyLmNyZWF0ZShDb3JyZXNwb25kZW5jZVJldmlzaW9uLCB7XHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VJZDogY29ycmVzcG9uZGVuY2UuaWQsXHJcbiAgICAgICAgcmV2aXNpb25OdW1iZXI6IHJldk51bSxcclxuICAgICAgICByZXZpc2lvbkxhYmVsOiByZXZOdW0gPT09IDAgPyAnMCcgOiByZXZOdW0udG9TdHJpbmcoKSxcclxuICAgICAgICBpc0N1cnJlbnQ6IHRydWUsXHJcbiAgICAgICAgc3RhdHVzSWQ6IHN0YXR1cy5pZCxcclxuICAgICAgICBzdWJqZWN0OiBkdG8uc3ViamVjdCxcclxuICAgICAgICBkZXNjcmlwdGlvbjogJ01pZ3JhdGVkIGZyb20gbGVnYWN5IHN5c3RlbSB2aWEgQXV0byBJbmdlc3QnLFxyXG4gICAgICAgIGJvZHk6IGR0by5ib2R5IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICBkb2N1bWVudERhdGU6IHBhcnNlRGF0ZVN0cihkdG8uZG9jdW1lbnREYXRlIHx8IGR0by5pc3N1ZWREYXRlKSxcclxuICAgICAgICBpc3N1ZWREYXRlOiBwYXJzZURhdGVTdHIoZHRvLmlzc3VlZERhdGUpLFxyXG4gICAgICAgIHJlY2VpdmVkRGF0ZTogcGFyc2VEYXRlU3RyKGR0by5yZWNlaXZlZERhdGUpLFxyXG4gICAgICAgIGRldGFpbHM6IHtcclxuICAgICAgICAgIC4uLmR0by5kZXRhaWxzLFxyXG4gICAgICAgICAgYWlfY29uZmlkZW5jZTogZHRvLmFpQ29uZmlkZW5jZSxcclxuICAgICAgICAgIGFpX2lzc3VlczogZHRvLmFpSXNzdWVzIGFzIHVua25vd24sXHJcbiAgICAgICAgICBzb3VyY2VfZmlsZV9wYXRoOiBkdG8uc291cmNlRmlsZVBhdGgsXHJcbiAgICAgICAgICBhdHRhY2htZW50X2lkOiBhdHRhY2htZW50SWQsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzY2hlbWFWZXJzaW9uOiAxLFxyXG4gICAgICAgIGNyZWF0ZWRCeTogdXNlcklkLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmIChyZXZpc2lvbkNvdW50ID4gMCkge1xyXG4gICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIudXBkYXRlKFxyXG4gICAgICAgICAgQ29ycmVzcG9uZGVuY2VSZXZpc2lvbixcclxuICAgICAgICAgIHsgY29ycmVzcG9uZGVuY2VJZDogY29ycmVzcG9uZGVuY2UuaWQsIGlzQ3VycmVudDogdHJ1ZSB9LFxyXG4gICAgICAgICAgeyBpc0N1cnJlbnQ6IGZhbHNlIH1cclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5tYW5hZ2VyLnNhdmUocmV2aXNpb24pO1xyXG5cclxuICAgICAgLy8gLS0tIENUSTogaW5zZXJ0IFJmYVJldmlzaW9uIC0tLVxyXG4gICAgICBpZiAoaXNSRkEpIHtcclxuICAgICAgICAvLyBNYXAgU3RhdHVzIGNvZGUgdG8gUkZBIEVxdWl2YWxlbnQgJ0FQUCcgKEFwcHJvdmVkKSBpZiBleGlzdCwgb3IgaWQgMyAodHlwaWNhbGx5IEFwcHJvdmVkKVxyXG4gICAgICAgIGNvbnN0IHJmYVN0YXR1c1JlcyA9IGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIucXVlcnk8eyBpZDogbnVtYmVyIH1bXT4oXHJcbiAgICAgICAgICBcIlNFTEVDVCBpZCBGUk9NIHJmYV9zdGF0dXNfY29kZXMgV0hFUkUgc3RhdHVzX2NvZGUgPSAnQVBQJyBMSU1JVCAxXCJcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBjb25zdCByZmFSZXYgPSBxdWVyeVJ1bm5lci5tYW5hZ2VyLmNyZWF0ZShSZmFSZXZpc2lvbiwge1xyXG4gICAgICAgICAgaWQ6IHJldmlzaW9uLmlkLFxyXG4gICAgICAgICAgcmZhU3RhdHVzQ29kZUlkOiByZmFTdGF0dXNSZXNbMF0/LmlkIHx8IDMsIC8vIEZhbGxiYWNrIHRvIDMgaWYgQVBQIG5vdCBmb3VuZFxyXG4gICAgICAgICAgZGV0YWlsczoge1xyXG4gICAgICAgICAgICAvLyBLZWVwIGRyYXdpbmdDb3VudCBhcyAwIGZvciBtaWdyYXRpb24gc3R1YlxyXG4gICAgICAgICAgICBkcmF3aW5nQ291bnQ6IDAsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgc2NoZW1hVmVyc2lvbjogMSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBhd2FpdCBxdWVyeVJ1bm5lci5tYW5hZ2VyLnNhdmUoUmZhUmV2aXNpb24sIHJmYVJldik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIDUuNSBIYW5kbGUgVGFnc1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgZHRvLmRldGFpbHMgJiZcclxuICAgICAgICBBcnJheS5pc0FycmF5KGR0by5kZXRhaWxzLnRhZ3MpICYmXHJcbiAgICAgICAgZHRvLmRldGFpbHMudGFncy5sZW5ndGggPiAwXHJcbiAgICAgICkge1xyXG4gICAgICAgIGZvciAoY29uc3QgdGFnSXRlbSBvZiBkdG8uZGV0YWlscy50YWdzKSB7XHJcbiAgICAgICAgICBsZXQgdGFnTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICAgIGlmICh0eXBlb2YgdGFnSXRlbSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgdGFnTmFtZSA9IHRhZ0l0ZW07XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHRhZ0l0ZW0gJiYgdHlwZW9mIHRhZ0l0ZW0gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRPYmogPSB0YWdJdGVtIGFzIHsgdGFnTmFtZT86IHVua25vd24gfTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0T2JqLnRhZ05hbWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgdGFnTmFtZSA9IHRPYmoudGFnTmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICghdGFnTmFtZSkgY29udGludWU7XHJcblxyXG4gICAgICAgICAgLy8gRmluZCBvciBjcmVhdGUgVGFnXHJcbiAgICAgICAgICBjb25zdCB0YWdSZXMgPSBhd2FpdCBxdWVyeVJ1bm5lci5tYW5hZ2VyLnF1ZXJ5PHsgaWQ6IG51bWJlciB9W10+KFxyXG4gICAgICAgICAgICAnU0VMRUNUIGlkIEZST00gdGFncyBXSEVSRSBwcm9qZWN0X2lkID0gPyBBTkQgdGFnX25hbWUgPSA/IExJTUlUIDEnLFxyXG4gICAgICAgICAgICBbcHJvamVjdC5pZCwgdGFnTmFtZV1cclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgbGV0IHRhZ0lkOiBudW1iZXI7XHJcbiAgICAgICAgICBpZiAodGFnUmVzICYmIHRhZ1Jlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRhZ0lkID0gdGFnUmVzWzBdLmlkO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgaW5zZXJ0UmVzID0gYXdhaXQgcXVlcnlSdW5uZXIubWFuYWdlci5xdWVyeTx7XHJcbiAgICAgICAgICAgICAgaW5zZXJ0SWQ6IG51bWJlcjtcclxuICAgICAgICAgICAgfT4oXHJcbiAgICAgICAgICAgICAgXCJJTlNFUlQgSU5UTyB0YWdzIChwcm9qZWN0X2lkLCB0YWdfbmFtZSwgY29sb3JfY29kZSwgY3JlYXRlZF9ieSkgVkFMVUVTICg/LCA/LCAnZGVmYXVsdCcsID8pXCIsXHJcbiAgICAgICAgICAgICAgW3Byb2plY3QuaWQsIHRhZ05hbWUsIHVzZXJJZF1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGFnSWQgPSBpbnNlcnRSZXMuaW5zZXJ0SWQ7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gTGluayB0byBjb3JyZXNwb25kZW5jZVxyXG4gICAgICAgICAgYXdhaXQgcXVlcnlSdW5uZXIubWFuYWdlci5xdWVyeShcclxuICAgICAgICAgICAgJ0lOU0VSVCBJR05PUkUgSU5UTyBjb3JyZXNwb25kZW5jZV90YWdzIChjb3JyZXNwb25kZW5jZV9pZCwgdGFnX2lkKSBWQUxVRVMgKD8sID8pJyxcclxuICAgICAgICAgICAgW2NvcnJlc3BvbmRlbmNlLmlkLCB0YWdJZF1cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIDYuIFRyYWNrIFRyYW5zYWN0aW9uXHJcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gcXVlcnlSdW5uZXIubWFuYWdlci5jcmVhdGUoSW1wb3J0VHJhbnNhY3Rpb24sIHtcclxuICAgICAgICBpZGVtcG90ZW5jeUtleSxcclxuICAgICAgICBkb2N1bWVudE51bWJlcjogZHRvLmRvY3VtZW50TnVtYmVyLFxyXG4gICAgICAgIGJhdGNoSWQ6IGR0by5iYXRjaElkLFxyXG4gICAgICAgIHN0YXR1c0NvZGU6IDIwMSxcclxuICAgICAgfSk7XHJcbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIuc2F2ZSh0cmFuc2FjdGlvbik7XHJcblxyXG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpO1xyXG5cclxuICAgICAgdGhpcy5sb2dnZXIubG9nKFxyXG4gICAgICAgIGBJbmdlc3RlZCBkb2N1bWVudCBbJHtkdG8uZG9jdW1lbnROdW1iZXJ9XSBzdWNjZXNzZnVsbHkgKEJhdGNoOiAke2R0by5iYXRjaElkfSlgXHJcbiAgICAgICk7XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdJbXBvcnQgc3VjY2Vzc2Z1bCcsXHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VJZDogY29ycmVzcG9uZGVuY2UuaWQsXHJcbiAgICAgICAgcmV2aXNpb25JZDogcmV2aXNpb24uaWQsXHJcbiAgICAgICAgdHJhbnNhY3Rpb25JZDogdHJhbnNhY3Rpb24uaWQsXHJcbiAgICAgIH07XHJcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xyXG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKCk7XHJcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9XHJcbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xyXG4gICAgICBjb25zdCBlcnJvclN0YWNrID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogdW5kZWZpbmVkO1xyXG5cclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXHJcbiAgICAgICAgYEltcG9ydCBmYWlsZWQgZm9yIGRvY3VtZW50IFske2R0by5kb2N1bWVudE51bWJlcn1dOiAke2Vycm9yTWVzc2FnZX1gLFxyXG4gICAgICAgIGVycm9yU3RhY2tcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IGZhaWxlZFRyYW5zYWN0aW9uID0gdGhpcy5pbXBvcnRUcmFuc2FjdGlvblJlcG8uY3JlYXRlKHtcclxuICAgICAgICBpZGVtcG90ZW5jeUtleSxcclxuICAgICAgICBkb2N1bWVudE51bWJlcjogZHRvLmRvY3VtZW50TnVtYmVyLFxyXG4gICAgICAgIGJhdGNoSWQ6IGR0by5iYXRjaElkLFxyXG4gICAgICAgIHN0YXR1c0NvZGU6IDUwMCxcclxuICAgICAgfSk7XHJcbiAgICAgIGF3YWl0IHRoaXMuaW1wb3J0VHJhbnNhY3Rpb25SZXBvLnNhdmUoZmFpbGVkVHJhbnNhY3Rpb24pLmNhdGNoKCgpID0+IHt9KTtcclxuXHJcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKFxyXG4gICAgICAgICdNaWdyYXRpb24gaW1wb3J0IGZhaWxlZDogJyArIGVycm9yTWVzc2FnZVxyXG4gICAgICApO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucmVsZWFzZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZW5xdWV1ZVJlY29yZChkdG86IEVucXVldWVNaWdyYXRpb25EdG8pIHtcclxuICAgIGlmICghZHRvLmRvY3VtZW50TnVtYmVyKSB7XHJcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCdkb2N1bWVudE51bWJlciBpcyByZXF1aXJlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERldGVybWluZSBzdGF0dXMgYmFzZWQgb24gY29uZmlkZW5jZSBwb2xpY3kgaW4gQURSLTAxN1xyXG4gICAgbGV0IGF1dG9TdGF0dXMgPSBNaWdyYXRpb25SZXZpZXdTdGF0dXMuUEVORElORztcclxuICAgIGlmIChcclxuICAgICAgZHRvLmlzVmFsaWQgPT09IGZhbHNlIHx8XHJcbiAgICAgIChkdG8uY29uZmlkZW5jZSAhPSBudWxsICYmIGR0by5jb25maWRlbmNlIDwgMC42KVxyXG4gICAgKSB7XHJcbiAgICAgIGF1dG9TdGF0dXMgPSBNaWdyYXRpb25SZXZpZXdTdGF0dXMuUkVKRUNURUQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVXBzZXJ0IG9yIGNyZWF0ZSBuZXcgcXVldWUgaXRlbVxyXG4gICAgbGV0IHF1ZXVlSXRlbSA9IGF3YWl0IHRoaXMucmV2aWV3UXVldWVSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBkb2N1bWVudE51bWJlcjogZHRvLmRvY3VtZW50TnVtYmVyIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIXF1ZXVlSXRlbSkge1xyXG4gICAgICBxdWV1ZUl0ZW0gPSB0aGlzLnJldmlld1F1ZXVlUmVwby5jcmVhdGUoe1xyXG4gICAgICAgIGRvY3VtZW50TnVtYmVyOiBkdG8uZG9jdW1lbnROdW1iZXIsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHF1ZXVlSXRlbS5zdWJqZWN0ID0gZHRvLnN1YmplY3Q7XHJcbiAgICBxdWV1ZUl0ZW0ub3JpZ2luYWxTdWJqZWN0ID0gZHRvLm9yaWdpbmFsU3ViamVjdDtcclxuICAgIHF1ZXVlSXRlbS5ib2R5ID0gZHRvLmJvZHk7XHJcbiAgICBxdWV1ZUl0ZW0uYWlTdWdnZXN0ZWRDYXRlZ29yeSA9IGR0by5jYXRlZ29yeTtcclxuICAgIHF1ZXVlSXRlbS5haUlzc3VlcyA9IGR0by5haUlzc3VlcztcclxuICAgIHF1ZXVlSXRlbS5wcm9qZWN0SWQgPSBkdG8ucHJvamVjdElkO1xyXG4gICAgcXVldWVJdGVtLnNlbmRlck9yZ2FuaXphdGlvbklkID0gZHRvLnNlbmRlck9yZ0lkO1xyXG4gICAgcXVldWVJdGVtLnJlY2VpdmVyT3JnYW5pemF0aW9uSWQgPSBkdG8ucmVjZWl2ZXJPcmdJZDtcclxuICAgIHF1ZXVlSXRlbS5yZW1hcmtzID0gZHRvLnJlbWFya3M7XHJcbiAgICBxdWV1ZUl0ZW0uYWlTdW1tYXJ5ID0gZHRvLmFpU3VtbWFyeTtcclxuICAgIHF1ZXVlSXRlbS5leHRyYWN0ZWRUYWdzID0gZHRvLmV4dHJhY3RlZFRhZ3M7XHJcbiAgICBxdWV1ZUl0ZW0udGVtcEF0dGFjaG1lbnRJZCA9IGR0by50ZW1wQXR0YWNobWVudElkO1xyXG4gICAgcXVldWVJdGVtLnN0YXR1cyA9IGF1dG9TdGF0dXM7XHJcblxyXG4gICAgaWYgKGR0by5pc3N1ZWREYXRlKSB7XHJcbiAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBEYXRlKGR0by5pc3N1ZWREYXRlKTtcclxuICAgICAgaWYgKCFpc05hTihwYXJzZWQuZ2V0VGltZSgpKSkgcXVldWVJdGVtLmlzc3VlZERhdGUgPSBwYXJzZWQ7XHJcbiAgICB9XHJcbiAgICBpZiAoZHRvLnJlY2VpdmVkRGF0ZSkge1xyXG4gICAgICBjb25zdCBwYXJzZWQgPSBuZXcgRGF0ZShkdG8ucmVjZWl2ZWREYXRlKTtcclxuICAgICAgaWYgKCFpc05hTihwYXJzZWQuZ2V0VGltZSgpKSkgcXVldWVJdGVtLnJlY2VpdmVkRGF0ZSA9IHBhcnNlZDtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCB0aGlzLnJldmlld1F1ZXVlUmVwby5zYXZlKHF1ZXVlSXRlbSk7XHJcblxyXG4gICAgdGhpcy5sb2dnZXIubG9nKFxyXG4gICAgICBgRW5xdWV1ZWQgZG9jdW1lbnQgWyR7ZHRvLmRvY3VtZW50TnVtYmVyfV0gdG8gc3RhZ2luZyBxdWV1ZSB3aXRoIHN0YXR1cyBbJHthdXRvU3RhdHVzfV1gXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIG1lc3NhZ2U6ICdEb2N1bWVudCBlbnF1ZXVlZCBzdWNjZXNzZnVsbHknLFxyXG4gICAgICBpZDogcXVldWVJdGVtLmlkLFxyXG4gICAgICBzdGF0dXM6IGF1dG9TdGF0dXMsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0UmV2aWV3UXVldWUocXVlcnk6IE1pZ3JhdGlvblF1ZXVlUXVlcnlEdG8pIHtcclxuICAgIGNvbnN0IHsgcGFnZSA9IDEsIGxpbWl0ID0gMTAsIHN0YXR1cyB9ID0gcXVlcnk7XHJcbiAgICBjb25zdCBza2lwID0gKHBhZ2UgLSAxKSAqIGxpbWl0O1xyXG5cclxuICAgIGNvbnN0IHF1ZXJ5QnVpbGRlciA9IHRoaXMucmV2aWV3UXVldWVSZXBvLmNyZWF0ZVF1ZXJ5QnVpbGRlcigncXVldWUnKTtcclxuICAgIGlmIChzdGF0dXMpIHtcclxuICAgICAgcXVlcnlCdWlsZGVyLndoZXJlKCdxdWV1ZS5zdGF0dXMgPSA6c3RhdHVzJywgeyBzdGF0dXMgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcXVlcnlCdWlsZGVyLm9yZGVyQnkoJ3F1ZXVlLmNyZWF0ZWRBdCcsICdERVNDJyk7XHJcbiAgICBxdWVyeUJ1aWxkZXIuc2tpcChza2lwKS50YWtlKGxpbWl0KTtcclxuXHJcbiAgICBjb25zdCBbaXRlbXMsIHRvdGFsXSA9IGF3YWl0IHF1ZXJ5QnVpbGRlci5nZXRNYW55QW5kQ291bnQoKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpdGVtcyxcclxuICAgICAgdG90YWwsXHJcbiAgICAgIHBhZ2UsXHJcbiAgICAgIGxpbWl0LFxyXG4gICAgICB0b3RhbFBhZ2VzOiBNYXRoLmNlaWwodG90YWwgLyBsaW1pdCksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0UXVldWVJdGVtQnlJZChpZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBpdGVtID0gYXdhaXQgdGhpcy5yZXZpZXdRdWV1ZVJlcG8uZmluZE9uZSh7IHdoZXJlOiB7IGlkIH0gfSk7XHJcbiAgICBpZiAoIWl0ZW0pIHtcclxuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oYFF1ZXVlIGl0ZW0gd2l0aCBJRCAke2lkfSBub3QgZm91bmRgKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpdGVtO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY3JlYXRlRXJyb3IoZHRvOiBDcmVhdGVNaWdyYXRpb25FcnJvckR0bykge1xyXG4gICAgY29uc3QgZXJyb3IgPSB0aGlzLmVycm9yUmVwby5jcmVhdGUoe1xyXG4gICAgICBiYXRjaElkOiBkdG8uYmF0Y2hJZCxcclxuICAgICAgZG9jdW1lbnROdW1iZXI6IGR0by5kb2N1bWVudE51bWJlcixcclxuICAgICAgZXJyb3JUeXBlOiBkdG8uZXJyb3JUeXBlLFxyXG4gICAgICBlcnJvck1lc3NhZ2U6IGR0by5lcnJvck1lc3NhZ2UsXHJcbiAgICAgIHJhd0FpUmVzcG9uc2U6IGR0by5yYXdBaVJlc3BvbnNlLFxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBzYXZlZCA9IGF3YWl0IHRoaXMuZXJyb3JSZXBvLnNhdmUoZXJyb3IpO1xyXG4gICAgdGhpcy5sb2dnZXIud2FybihcclxuICAgICAgYE1pZ3JhdGlvbiBlcnJvciBsb2dnZWQgWyR7ZHRvLmVycm9yVHlwZX1dIGZvciBkb2MgWyR7ZHRvLmRvY3VtZW50TnVtYmVyfV0gYmF0Y2ggWyR7ZHRvLmJhdGNoSWR9XWBcclxuICAgICk7XHJcbiAgICByZXR1cm4geyBtZXNzYWdlOiAnRXJyb3IgbG9nZ2VkJywgaWQ6IHNhdmVkLmlkIH07XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRFcnJvcnMocGFnZTogbnVtYmVyID0gMSwgbGltaXQ6IG51bWJlciA9IDEwKSB7XHJcbiAgICBjb25zdCBza2lwID0gKHBhZ2UgLSAxKSAqIGxpbWl0O1xyXG5cclxuICAgIGNvbnN0IFtpdGVtcywgdG90YWxdID0gYXdhaXQgdGhpcy5lcnJvclJlcG8uZmluZEFuZENvdW50KHtcclxuICAgICAgb3JkZXI6IHsgY3JlYXRlZEF0OiAnREVTQycgfSxcclxuICAgICAgc2tpcCxcclxuICAgICAgdGFrZTogbGltaXQsXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpdGVtcyxcclxuICAgICAgdG90YWwsXHJcbiAgICAgIHBhZ2UsXHJcbiAgICAgIGxpbWl0LFxyXG4gICAgICB0b3RhbFBhZ2VzOiBNYXRoLmNlaWwodG90YWwgLyBsaW1pdCksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYXBwcm92ZVF1ZXVlSXRlbShcclxuICAgIGlkOiBudW1iZXIsXHJcbiAgICBkdG86IEltcG9ydENvcnJlc3BvbmRlbmNlRHRvLFxyXG4gICAgaWRlbXBvdGVuY3lLZXk6IHN0cmluZyxcclxuICAgIHVzZXJJZDogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICBjb25zdCBxdWV1ZUl0ZW0gPSBhd2FpdCB0aGlzLnJldmlld1F1ZXVlUmVwby5maW5kT25lKHsgd2hlcmU6IHsgaWQgfSB9KTtcclxuICAgIGlmICghcXVldWVJdGVtKSB7XHJcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKGBRdWV1ZSBpdGVtICR7aWR9IG5vdCBmb3VuZGApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChxdWV1ZUl0ZW0uc3RhdHVzICE9PSBNaWdyYXRpb25SZXZpZXdTdGF0dXMuUEVORElORykge1xyXG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcclxuICAgICAgICBgUXVldWUgaXRlbSAke2lkfSBpcyBhbHJlYWR5ICR7cXVldWVJdGVtLnN0YXR1c31gXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQXR0ZW1wdCB0aGUgaW1wb3J0XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmltcG9ydENvcnJlc3BvbmRlbmNlKGR0bywgaWRlbXBvdGVuY3lLZXksIHVzZXJJZCk7XHJcblxyXG4gICAgLy8gSWYgc3VjY2Vzc2Z1bCwgdXBkYXRlIHRoZSBxdWV1ZSBpdGVtIHN0YXR1c1xyXG4gICAgcXVldWVJdGVtLnN0YXR1cyA9IE1pZ3JhdGlvblJldmlld1N0YXR1cy5BUFBST1ZFRDtcclxuICAgIHF1ZXVlSXRlbS5yZXZpZXdlZEJ5ID0gdXNlcklkLnRvU3RyaW5nKCk7XHJcbiAgICBxdWV1ZUl0ZW0ucmV2aWV3ZWRBdCA9IG5ldyBEYXRlKCk7XHJcbiAgICBhd2FpdCB0aGlzLnJldmlld1F1ZXVlUmVwby5zYXZlKHF1ZXVlSXRlbSk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbW1pdEJhdGNoKFxyXG4gICAgZHRvOiBDb21taXRCYXRjaER0byxcclxuICAgIGlkZW1wb3RlbmN5S2V5OiBzdHJpbmcsXHJcbiAgICB1c2VySWQ6IG51bWJlclxyXG4gICkge1xyXG4gICAgaWYgKCFpZGVtcG90ZW5jeUtleSkge1xyXG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbignSWRlbXBvdGVuY3ktS2V5IGhlYWRlciBpcyByZXF1aXJlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcclxuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xyXG5cclxuICAgIC8vIFdlIGxldCBlYWNoIGltcG9ydCBoYXZlIGl0cyBvd24gdHJhbnNhY3Rpb24gdmlhIGFwcHJvdmVRdWV1ZUl0ZW1cclxuICAgIC8vIHRvIGF2b2lkIG9uZSBiYWQgcmVjb3JkIGZhaWxpbmcgdGhlIGVudGlyZSBiYXRjaCBvZiB2YWxpZCBvbmVzLlxyXG5cclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBkdG8uaXRlbXMpIHtcclxuICAgICAgLy8gQ3JlYXRlIGEgdW5pcXVlIHN1Yi1rZXkgZm9yIGVhY2ggaXRlbSB0byBhdm9pZCBpZGVtcG90ZW5jeSBjb25mbGljdHNcclxuICAgICAgLy8gd2hlbiB1c2luZyBhIGJhdGNoIGlkZW1wb3RlbmN5IGtleS5cclxuICAgICAgY29uc3Qgc3ViS2V5ID0gYCR7aWRlbXBvdGVuY3lLZXl9XyR7aXRlbS5xdWV1ZUlkfWA7XHJcblxyXG4gICAgICAvLyBGb3JjZSBiYXRjaElkIG9uIHRoZSBpdGVtIGR0b1xyXG4gICAgICBpdGVtLmR0by5iYXRjaElkID0gZHRvLmJhdGNoSWQ7XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXBwcm92ZVF1ZXVlSXRlbShcclxuICAgICAgICAgIGl0ZW0ucXVldWVJZCxcclxuICAgICAgICAgIGl0ZW0uZHRvLFxyXG4gICAgICAgICAgc3ViS2V5LFxyXG4gICAgICAgICAgdXNlcklkXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXN1bHRzLnB1c2goeyBxdWV1ZUlkOiBpdGVtLnF1ZXVlSWQsIHJlc3VsdCB9KTtcclxuICAgICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XHJcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xyXG4gICAgICAgIGVycm9ycy5wdXNoKHsgcXVldWVJZDogaXRlbS5xdWV1ZUlkLCBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxyXG4gICAgICAgICAgYEJhdGNoIGNvbW1pdCBmYWlsZWQgZm9yIHF1ZXVlIElEICR7aXRlbS5xdWV1ZUlkfTogJHtlcnJvck1lc3NhZ2V9YFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBtZXNzYWdlOiAnQmF0Y2ggcHJvY2Vzc2luZyBjb21wbGV0ZWQnLFxyXG4gICAgICBiYXRjaElkOiBkdG8uYmF0Y2hJZCxcclxuICAgICAgcHJvY2Vzc2VkOiByZXN1bHRzLmxlbmd0aCxcclxuICAgICAgZmFpbGVkOiBlcnJvcnMubGVuZ3RoLFxyXG4gICAgICByZXN1bHRzLFxyXG4gICAgICBlcnJvcnMsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVqZWN0UXVldWVJdGVtKGlkOiBudW1iZXIsIHVzZXJJZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBxdWV1ZUl0ZW0gPSBhd2FpdCB0aGlzLnJldmlld1F1ZXVlUmVwby5maW5kT25lKHsgd2hlcmU6IHsgaWQgfSB9KTtcclxuICAgIGlmICghcXVldWVJdGVtKSB7XHJcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCdRdWV1ZSBpdGVtIG5vdCBmb3VuZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHF1ZXVlSXRlbS5zdGF0dXMgPSBNaWdyYXRpb25SZXZpZXdTdGF0dXMuUkVKRUNURUQ7XHJcbiAgICBxdWV1ZUl0ZW0ucmV2aWV3ZWRCeSA9IHVzZXJJZC50b1N0cmluZygpO1xyXG4gICAgcXVldWVJdGVtLnJldmlld2VkQXQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgYXdhaXQgdGhpcy5yZXZpZXdRdWV1ZVJlcG8uc2F2ZShxdWV1ZUl0ZW0pO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIG1lc3NhZ2U6ICdEb2N1bWVudCByZWplY3RlZCBzdWNjZXNzZnVsbHknLFxyXG4gICAgICBpZDogcXVldWVJdGVtLmlkLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGdldFN0YWdpbmdGaWxlU3RyZWFtKGZpbGVQYXRoOiBzdHJpbmcpIHtcclxuICAgIGlmICghZmlsZVBhdGgpIHtcclxuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oJ0ZpbGUgcGF0aCBpcyByZXF1aXJlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHBhdGgucmVzb2x2ZShmaWxlUGF0aCk7XHJcbiAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZWRQYXRoKSkge1xyXG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbignRmlsZSBub3QgZm91bmQgYXQgc3BlY2lmaWVkIHBhdGgnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY3JlYXRlUmVhZFN0cmVhbShyZXNvbHZlZFBhdGgpO1xyXG4gIH1cclxufVxyXG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6b/migrationservice_6bb0fde7b04e8e16815dc23ab0aff0f6.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6b/migrationservice_6bb0fde7b04e8e16815dc23ab0aff0f6.map new file mode 100644 index 0000000..b75a639 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6b/migrationservice_6bb0fde7b04e8e16815dc23ab0aff0f6.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\migration.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\migration.service.ts"],"sourcesContent":["import {\r\n Injectable,\r\n Logger,\r\n ConflictException,\r\n BadRequestException,\r\n InternalServerErrorException,\r\n} from '@nestjs/common';\r\nimport { InjectRepository } from '@nestjs/typeorm';\r\nimport { Repository, DataSource } from 'typeorm';\r\nimport { ImportCorrespondenceDto } from './dto/import-correspondence.dto';\r\nimport { EnqueueMigrationDto } from './dto/enqueue-migration.dto';\r\nimport { CommitBatchDto } from './dto/commit-batch.dto';\r\nimport { CreateMigrationErrorDto } from './dto/create-migration-error.dto';\r\nimport { ImportTransaction } from './entities/import-transaction.entity';\r\nimport { Correspondence } from '../correspondence/entities/correspondence.entity';\r\nimport { CorrespondenceRevision } from '../correspondence/entities/correspondence-revision.entity';\r\nimport { CorrespondenceType } from '../correspondence/entities/correspondence-type.entity';\r\nimport { CorrespondenceStatus } from '../correspondence/entities/correspondence-status.entity';\r\nimport { Project } from '../project/entities/project.entity';\r\nimport { FileStorageService } from '../../common/file-storage/file-storage.service';\r\nimport {\r\n MigrationReviewQueue,\r\n MigrationReviewStatus,\r\n} from './entities/migration-review-queue.entity';\r\nimport { MigrationError } from './entities/migration-error.entity';\r\nimport { MigrationQueueQueryDto } from './dto/migration-queue-query.dto';\r\nimport { Attachment } from '../../common/file-storage/entities/attachment.entity';\r\nimport { createReadStream, existsSync } from 'fs';\r\nimport * as path from 'path';\r\nimport { Rfa } from '../rfa/entities/rfa.entity';\r\nimport { RfaRevision } from '../rfa/entities/rfa-revision.entity';\r\n\r\n@Injectable()\r\nexport class MigrationService {\r\n private readonly logger = new Logger(MigrationService.name);\r\n\r\n constructor(\r\n private readonly dataSource: DataSource,\r\n @InjectRepository(ImportTransaction)\r\n private readonly importTransactionRepo: Repository,\r\n @InjectRepository(CorrespondenceType)\r\n private readonly correspondenceTypeRepo: Repository,\r\n @InjectRepository(CorrespondenceStatus)\r\n private readonly correspondenceStatusRepo: Repository,\r\n @InjectRepository(Project)\r\n private readonly projectRepo: Repository,\r\n @InjectRepository(MigrationReviewQueue)\r\n private readonly reviewQueueRepo: Repository,\r\n @InjectRepository(MigrationError)\r\n private readonly errorRepo: Repository,\r\n private readonly fileStorageService: FileStorageService\r\n ) {}\r\n\r\n async importCorrespondence(\r\n dto: ImportCorrespondenceDto,\r\n idempotencyKey: string,\r\n userId: number\r\n ) {\r\n if (!idempotencyKey) {\r\n throw new BadRequestException('Idempotency-Key header is required');\r\n }\r\n\r\n // 1. Idempotency Check\r\n const existingTransaction = await this.importTransactionRepo.findOne({\r\n where: { idempotencyKey },\r\n });\r\n\r\n if (existingTransaction) {\r\n if (existingTransaction.statusCode === 201) {\r\n this.logger.log(\r\n `Idempotency key ${idempotencyKey} already processed. Returning cached success.`\r\n );\r\n return {\r\n message: 'Already processed',\r\n transaction: existingTransaction,\r\n };\r\n } else {\r\n throw new ConflictException(\r\n `Transaction failed previously with status ${existingTransaction.statusCode}`\r\n );\r\n }\r\n }\r\n\r\n // 2. Fetch Dependencies\r\n // Alias map: n8n AI categories → correspondence_types.type_code\r\n const CATEGORY_ALIAS: Record = {\r\n Correspondence: 'LETTER',\r\n Letter: 'LETTER',\r\n Drawing: 'OTHER',\r\n Report: 'OTHER',\r\n Other: 'OTHER',\r\n };\r\n\r\n const type = await this.correspondenceTypeRepo.findOne({\r\n where: { typeName: dto.category },\r\n });\r\n\r\n // If exact name isn't found, try typeCode just in case\r\n let typeId = type\r\n ? type.id\r\n : (\r\n await this.correspondenceTypeRepo.findOne({\r\n where: { typeCode: dto.category },\r\n })\r\n )?.id;\r\n\r\n // Third-level fallback: resolve via alias map\r\n if (!typeId && dto.category && CATEGORY_ALIAS[dto.category]) {\r\n typeId = (\r\n await this.correspondenceTypeRepo.findOne({\r\n where: { typeCode: CATEGORY_ALIAS[dto.category] },\r\n })\r\n )?.id;\r\n }\r\n\r\n if (!typeId) {\r\n throw new BadRequestException(\r\n `Category \"${dto.category}\" not found in system.`\r\n );\r\n }\r\n\r\n // Default status for correspondence\r\n let status = await this.correspondenceStatusRepo.findOne({\r\n where: { statusCode: 'CLBOWN' },\r\n });\r\n if (!status) {\r\n status = await this.correspondenceStatusRepo.findOne({\r\n where: { statusCode: 'DRAFT' },\r\n });\r\n }\r\n if (!status) {\r\n throw new InternalServerErrorException(\r\n 'CRITICAL: No default correspondence status found (missing CLBOWN/DRAFT)'\r\n );\r\n }\r\n\r\n // We now use project_id from n8n (instead of hardcoding LCBP3)\r\n const project = await this.projectRepo.findOne({\r\n where: { id: dto.projectId },\r\n });\r\n if (!project) {\r\n throw new BadRequestException(\r\n `Project ID ${dto.projectId} not found in database`\r\n );\r\n }\r\n\r\n const isRFA = type?.typeCode === 'RFA' || dto.category === 'RFA';\r\n\r\n const queryRunner = this.dataSource.createQueryRunner();\r\n await queryRunner.connect();\r\n await queryRunner.startTransaction();\r\n\r\n try {\r\n // 3. Find or Create Correspondence\r\n let correspondence = await queryRunner.manager.findOne(Correspondence, {\r\n where: {\r\n correspondenceNumber: dto.documentNumber,\r\n projectId: project.id,\r\n },\r\n });\r\n\r\n if (!correspondence) {\r\n correspondence = queryRunner.manager.create(Correspondence, {\r\n correspondenceNumber: dto.documentNumber,\r\n correspondenceTypeId: typeId,\r\n projectId: project.id,\r\n disciplineId: dto.disciplineId || undefined,\r\n originatorId: dto.senderId || undefined, // Set explicitly from DTO\r\n isInternal: false,\r\n createdBy: userId,\r\n });\r\n await queryRunner.manager.save(correspondence);\r\n\r\n // --- CTI: insert RFA class ---\r\n if (isRFA) {\r\n // Default RFA type generic mapping\r\n const rfaTypeRes = await queryRunner.manager.query<{ id: number }[]>(\r\n \"SELECT id FROM rfa_types WHERE type_code = 'GEN' LIMIT 1\"\r\n );\r\n const rfa = queryRunner.manager.create(Rfa, {\r\n id: correspondence.id,\r\n rfaTypeId: rfaTypeRes[0]?.id || 1, // fallback to id 1\r\n createdBy: userId,\r\n });\r\n await queryRunner.manager.save(Rfa, rfa);\r\n }\r\n } else {\r\n // Update values if missing\r\n let hasChanges = false;\r\n if (dto.disciplineId && !correspondence.disciplineId) {\r\n correspondence.disciplineId = dto.disciplineId;\r\n hasChanges = true;\r\n }\r\n if (dto.senderId && !correspondence.originatorId) {\r\n correspondence.originatorId = dto.senderId;\r\n hasChanges = true;\r\n }\r\n if (hasChanges) {\r\n await queryRunner.manager.save(correspondence);\r\n }\r\n }\r\n\r\n // 4. File Handling\r\n let attachmentId: number | null = null;\r\n if (dto.tempAttachmentId) {\r\n attachmentId = dto.tempAttachmentId;\r\n try {\r\n // Mark attachment as permanent\r\n await queryRunner.manager.update(\r\n Attachment,\r\n { id: attachmentId },\r\n { isTemporary: false }\r\n );\r\n } catch (fileError: unknown) {\r\n const errMsg =\r\n fileError instanceof Error ? fileError.message : String(fileError);\r\n this.logger.warn(\r\n `Failed to update temp_file [id:${attachmentId}]: ${errMsg}`\r\n );\r\n }\r\n } else if (dto.sourceFilePath) {\r\n try {\r\n const attachment = await this.fileStorageService.importStagingFile(\r\n dto.sourceFilePath,\r\n userId,\r\n { documentType: dto.category }\r\n );\r\n attachmentId = attachment.id;\r\n } catch (fileError: unknown) {\r\n const errMsg =\r\n fileError instanceof Error ? fileError.message : String(fileError);\r\n\r\n this.logger.warn(\r\n `Failed to import file for [${dto.documentNumber}], continuing without attachment: ${errMsg}`\r\n );\r\n }\r\n }\r\n\r\n // Helper function to parse Date safety\r\n const parseDateStr = (d?: string | number) => {\r\n if (!d) return undefined;\r\n const num = Number(d);\r\n if (!isNaN(num) && num > 20000 && num < 100000) {\r\n return new Date(Math.round((num - 25569) * 86400 * 1000));\r\n }\r\n const parsed = new Date(d);\r\n if (isNaN(parsed.getTime())) return undefined;\r\n if (parsed.getFullYear() > 2100 || parsed.getFullYear() < 1900)\r\n return undefined;\r\n return parsed;\r\n };\r\n\r\n // 5. Create Revision\r\n const revisionCount = await queryRunner.manager.count(\r\n CorrespondenceRevision,\r\n {\r\n where: { correspondenceId: correspondence.id },\r\n }\r\n );\r\n\r\n const revNum = revisionCount;\r\n const revision = queryRunner.manager.create(CorrespondenceRevision, {\r\n correspondenceId: correspondence.id,\r\n revisionNumber: revNum,\r\n revisionLabel: revNum === 0 ? '0' : revNum.toString(),\r\n isCurrent: true,\r\n statusId: status.id,\r\n subject: dto.subject,\r\n description: 'Migrated from legacy system via Auto Ingest',\r\n body: dto.body || undefined,\r\n documentDate: parseDateStr(dto.documentDate || dto.issuedDate),\r\n issuedDate: parseDateStr(dto.issuedDate),\r\n receivedDate: parseDateStr(dto.receivedDate),\r\n details: {\r\n ...dto.details,\r\n ai_confidence: dto.aiConfidence,\r\n ai_issues: dto.aiIssues as unknown,\r\n source_file_path: dto.sourceFilePath,\r\n attachment_id: attachmentId,\r\n },\r\n schemaVersion: 1,\r\n createdBy: userId,\r\n });\r\n\r\n if (revisionCount > 0) {\r\n await queryRunner.manager.update(\r\n CorrespondenceRevision,\r\n { correspondenceId: correspondence.id, isCurrent: true },\r\n { isCurrent: false }\r\n );\r\n }\r\n\r\n await queryRunner.manager.save(revision);\r\n\r\n // --- CTI: insert RfaRevision ---\r\n if (isRFA) {\r\n // Map Status code to RFA Equivalent 'APP' (Approved) if exist, or id 3 (typically Approved)\r\n const rfaStatusRes = await queryRunner.manager.query<{ id: number }[]>(\r\n \"SELECT id FROM rfa_status_codes WHERE status_code = 'APP' LIMIT 1\"\r\n );\r\n\r\n const rfaRev = queryRunner.manager.create(RfaRevision, {\r\n id: revision.id,\r\n rfaStatusCodeId: rfaStatusRes[0]?.id || 3, // Fallback to 3 if APP not found\r\n details: {\r\n // Keep drawingCount as 0 for migration stub\r\n drawingCount: 0,\r\n },\r\n schemaVersion: 1,\r\n });\r\n await queryRunner.manager.save(RfaRevision, rfaRev);\r\n }\r\n\r\n // 5.5 Handle Tags\r\n if (\r\n dto.details &&\r\n Array.isArray(dto.details.tags) &&\r\n dto.details.tags.length > 0\r\n ) {\r\n for (const tagItem of dto.details.tags) {\r\n let tagName: string | undefined;\r\n\r\n if (typeof tagItem === 'string') {\r\n tagName = tagItem;\r\n } else if (tagItem && typeof tagItem === 'object') {\r\n const tObj = tagItem as { tagName?: unknown };\r\n if (typeof tObj.tagName === 'string') {\r\n tagName = tObj.tagName;\r\n }\r\n }\r\n\r\n if (!tagName) continue;\r\n\r\n // Find or create Tag\r\n const tagRes = await queryRunner.manager.query<{ id: number }[]>(\r\n 'SELECT id FROM tags WHERE project_id = ? AND tag_name = ? LIMIT 1',\r\n [project.id, tagName]\r\n );\r\n\r\n let tagId: number;\r\n if (tagRes && tagRes.length > 0) {\r\n tagId = tagRes[0].id;\r\n } else {\r\n const insertRes = await queryRunner.manager.query<{\r\n insertId: number;\r\n }>(\r\n \"INSERT INTO tags (project_id, tag_name, color_code, created_by) VALUES (?, ?, 'default', ?)\",\r\n [project.id, tagName, userId]\r\n );\r\n tagId = insertRes.insertId;\r\n }\r\n\r\n // Link to correspondence\r\n await queryRunner.manager.query(\r\n 'INSERT IGNORE INTO correspondence_tags (correspondence_id, tag_id) VALUES (?, ?)',\r\n [correspondence.id, tagId]\r\n );\r\n }\r\n }\r\n // 6. Track Transaction\r\n const transaction = queryRunner.manager.create(ImportTransaction, {\r\n idempotencyKey,\r\n documentNumber: dto.documentNumber,\r\n batchId: dto.batchId,\r\n statusCode: 201,\r\n });\r\n await queryRunner.manager.save(transaction);\r\n\r\n await queryRunner.commitTransaction();\r\n\r\n this.logger.log(\r\n `Ingested document [${dto.documentNumber}] successfully (Batch: ${dto.batchId})`\r\n );\r\n\r\n return {\r\n message: 'Import successful',\r\n correspondenceId: correspondence.id,\r\n revisionId: revision.id,\r\n transactionId: transaction.id,\r\n };\r\n } catch (error: unknown) {\r\n await queryRunner.rollbackTransaction();\r\n const errorMessage =\r\n error instanceof Error ? error.message : String(error);\r\n const errorStack = error instanceof Error ? error.stack : undefined;\r\n\r\n this.logger.error(\r\n `Import failed for document [${dto.documentNumber}]: ${errorMessage}`,\r\n errorStack\r\n );\r\n\r\n const failedTransaction = this.importTransactionRepo.create({\r\n idempotencyKey,\r\n documentNumber: dto.documentNumber,\r\n batchId: dto.batchId,\r\n statusCode: 500,\r\n });\r\n await this.importTransactionRepo.save(failedTransaction).catch(() => {});\r\n\r\n throw new InternalServerErrorException(\r\n 'Migration import failed: ' + errorMessage\r\n );\r\n } finally {\r\n await queryRunner.release();\r\n }\r\n }\r\n\r\n async enqueueRecord(dto: EnqueueMigrationDto) {\r\n if (!dto.documentNumber) {\r\n throw new BadRequestException('documentNumber is required');\r\n }\r\n\r\n // Determine status based on confidence policy in ADR-017\r\n let autoStatus = MigrationReviewStatus.PENDING;\r\n if (\r\n dto.isValid === false ||\r\n (dto.confidence != null && dto.confidence < 0.6)\r\n ) {\r\n autoStatus = MigrationReviewStatus.REJECTED;\r\n }\r\n\r\n // Upsert or create new queue item\r\n let queueItem = await this.reviewQueueRepo.findOne({\r\n where: { documentNumber: dto.documentNumber },\r\n });\r\n\r\n if (!queueItem) {\r\n queueItem = this.reviewQueueRepo.create({\r\n documentNumber: dto.documentNumber,\r\n });\r\n }\r\n\r\n queueItem.subject = dto.subject;\r\n queueItem.originalSubject = dto.originalSubject;\r\n queueItem.body = dto.body;\r\n queueItem.aiSuggestedCategory = dto.category;\r\n queueItem.aiIssues = dto.aiIssues;\r\n queueItem.projectId = dto.projectId;\r\n queueItem.senderOrganizationId = dto.senderOrgId;\r\n queueItem.receiverOrganizationId = dto.receiverOrgId;\r\n queueItem.remarks = dto.remarks;\r\n queueItem.aiSummary = dto.aiSummary;\r\n queueItem.extractedTags = dto.extractedTags;\r\n queueItem.tempAttachmentId = dto.tempAttachmentId;\r\n queueItem.status = autoStatus;\r\n\r\n if (dto.issuedDate) {\r\n const parsed = new Date(dto.issuedDate);\r\n if (!isNaN(parsed.getTime())) queueItem.issuedDate = parsed;\r\n }\r\n if (dto.receivedDate) {\r\n const parsed = new Date(dto.receivedDate);\r\n if (!isNaN(parsed.getTime())) queueItem.receivedDate = parsed;\r\n }\r\n\r\n await this.reviewQueueRepo.save(queueItem);\r\n\r\n this.logger.log(\r\n `Enqueued document [${dto.documentNumber}] to staging queue with status [${autoStatus}]`\r\n );\r\n\r\n return {\r\n message: 'Document enqueued successfully',\r\n id: queueItem.id,\r\n status: autoStatus,\r\n };\r\n }\r\n\r\n async getReviewQueue(query: MigrationQueueQueryDto) {\r\n const { page = 1, limit = 10, status } = query;\r\n const skip = (page - 1) * limit;\r\n\r\n const queryBuilder = this.reviewQueueRepo.createQueryBuilder('queue');\r\n if (status) {\r\n queryBuilder.where('queue.status = :status', { status });\r\n }\r\n\r\n queryBuilder.orderBy('queue.createdAt', 'DESC');\r\n queryBuilder.skip(skip).take(limit);\r\n\r\n const [items, total] = await queryBuilder.getManyAndCount();\r\n\r\n return {\r\n items,\r\n total,\r\n page,\r\n limit,\r\n totalPages: Math.ceil(total / limit),\r\n };\r\n }\r\n\r\n async getQueueItemById(id: number) {\r\n const item = await this.reviewQueueRepo.findOne({ where: { id } });\r\n if (!item) {\r\n throw new BadRequestException(`Queue item with ID ${id} not found`);\r\n }\r\n return item;\r\n }\r\n\r\n async createError(dto: CreateMigrationErrorDto) {\r\n const error = this.errorRepo.create({\r\n batchId: dto.batchId,\r\n documentNumber: dto.documentNumber,\r\n errorType: dto.errorType,\r\n errorMessage: dto.errorMessage,\r\n rawAiResponse: dto.rawAiResponse,\r\n });\r\n const saved = await this.errorRepo.save(error);\r\n this.logger.warn(\r\n `Migration error logged [${dto.errorType}] for doc [${dto.documentNumber}] batch [${dto.batchId}]`\r\n );\r\n return { message: 'Error logged', id: saved.id };\r\n }\r\n\r\n async getErrors(page: number = 1, limit: number = 10) {\r\n const skip = (page - 1) * limit;\r\n\r\n const [items, total] = await this.errorRepo.findAndCount({\r\n order: { createdAt: 'DESC' },\r\n skip,\r\n take: limit,\r\n });\r\n\r\n return {\r\n items,\r\n total,\r\n page,\r\n limit,\r\n totalPages: Math.ceil(total / limit),\r\n };\r\n }\r\n\r\n async approveQueueItem(\r\n id: number,\r\n dto: ImportCorrespondenceDto,\r\n idempotencyKey: string,\r\n userId: number\r\n ) {\r\n const queueItem = await this.reviewQueueRepo.findOne({ where: { id } });\r\n if (!queueItem) {\r\n throw new BadRequestException(`Queue item ${id} not found`);\r\n }\r\n\r\n if (queueItem.status !== MigrationReviewStatus.PENDING) {\r\n throw new BadRequestException(\r\n `Queue item ${id} is already ${queueItem.status}`\r\n );\r\n }\r\n\r\n // Attempt the import\r\n const result = await this.importCorrespondence(dto, idempotencyKey, userId);\r\n\r\n // If successful, update the queue item status\r\n queueItem.status = MigrationReviewStatus.APPROVED;\r\n queueItem.reviewedBy = userId.toString();\r\n queueItem.reviewedAt = new Date();\r\n await this.reviewQueueRepo.save(queueItem);\r\n\r\n return result;\r\n }\r\n\r\n async commitBatch(\r\n dto: CommitBatchDto,\r\n idempotencyKey: string,\r\n userId: number\r\n ) {\r\n if (!idempotencyKey) {\r\n throw new BadRequestException('Idempotency-Key header is required');\r\n }\r\n\r\n const results = [];\r\n const errors = [];\r\n\r\n // We let each import have its own transaction via approveQueueItem\r\n // to avoid one bad record failing the entire batch of valid ones.\r\n\r\n for (const item of dto.items) {\r\n // Create a unique sub-key for each item to avoid idempotency conflicts\r\n // when using a batch idempotency key.\r\n const subKey = `${idempotencyKey}_${item.queueId}`;\r\n\r\n // Force batchId on the item dto\r\n item.dto.batchId = dto.batchId;\r\n\r\n try {\r\n const result = await this.approveQueueItem(\r\n item.queueId,\r\n item.dto,\r\n subKey,\r\n userId\r\n );\r\n results.push({ queueId: item.queueId, result });\r\n } catch (err: unknown) {\r\n const errorMessage = err instanceof Error ? err.message : String(err);\r\n errors.push({ queueId: item.queueId, error: errorMessage });\r\n this.logger.error(\r\n `Batch commit failed for queue ID ${item.queueId}: ${errorMessage}`\r\n );\r\n }\r\n }\r\n\r\n return {\r\n message: 'Batch processing completed',\r\n batchId: dto.batchId,\r\n processed: results.length,\r\n failed: errors.length,\r\n results,\r\n errors,\r\n };\r\n }\r\n\r\n async rejectQueueItem(id: number, userId: number) {\r\n const queueItem = await this.reviewQueueRepo.findOne({ where: { id } });\r\n if (!queueItem) {\r\n throw new BadRequestException('Queue item not found');\r\n }\r\n\r\n queueItem.status = MigrationReviewStatus.REJECTED;\r\n queueItem.reviewedBy = userId.toString();\r\n queueItem.reviewedAt = new Date();\r\n await this.reviewQueueRepo.save(queueItem);\r\n\r\n return {\r\n message: 'Document rejected successfully',\r\n id: queueItem.id,\r\n };\r\n }\r\n\r\n getStagingFileStream(filePath: string) {\r\n if (!filePath) {\r\n throw new BadRequestException('File path is required');\r\n }\r\n\r\n const resolvedPath = path.resolve(filePath);\r\n if (!existsSync(resolvedPath)) {\r\n throw new BadRequestException('File not found at specified path');\r\n }\r\n\r\n return createReadStream(resolvedPath);\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6b/organizationentity_6b3ce0cffafbe10506b3d48552a95df7 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6b/organizationentity_6b3ce0cffafbe10506b3d48552a95df7 new file mode 100644 index 0000000..738c98b --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6b/organizationentity_6b3ce0cffafbe10506b3d48552a95df7 @@ -0,0 +1,64 @@ +43aab2cc2f71ed8207bc09b8d574e3bc +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Organization = void 0; +const typeorm_1 = require("typeorm"); +const organization_role_entity_1 = require("./organization-role.entity"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const class_transformer_1 = require("class-transformer"); +let Organization = class Organization extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.Organization = Organization; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], Organization.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'organization_code', length: 20, unique: true }), + (0, typeorm_1.Index)('idx_org_code'), + __metadata("design:type", String) +], Organization.prototype, "organizationCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'organization_name', length: 255 }), + __metadata("design:type", String) +], Organization.prototype, "organizationName", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'role_id', nullable: true }), + __metadata("design:type", Number) +], Organization.prototype, "roleId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true }), + __metadata("design:type", Boolean) +], Organization.prototype, "isActive", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], Organization.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], Organization.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.DeleteDateColumn)({ name: 'deleted_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], Organization.prototype, "deletedAt", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => organization_role_entity_1.OrganizationRole, { nullable: true }), + (0, typeorm_1.JoinColumn)({ name: 'role_id' }), + __metadata("design:type", typeof (_d = typeof organization_role_entity_1.OrganizationRole !== "undefined" && organization_role_entity_1.OrganizationRole) === "function" ? _d : Object) +], Organization.prototype, "organizationRole", void 0); +exports.Organization = Organization = __decorate([ + (0, typeorm_1.Entity)('organizations') +], Organization); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcb3JnYW5pemF0aW9uXFxlbnRpdGllc1xcb3JnYW5pemF0aW9uLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBVWlCO0FBQ2pCLHlFQUE4RDtBQUM5RCxnRkFBMkU7QUFDM0UseURBQTRDO0FBR3JDLElBQU0sWUFBWSxHQUFsQixNQUFNLFlBQWEsU0FBUSxpQ0FBYztDQStCL0MsQ0FBQTtBQS9CWSxvQ0FBWTtBQUd2QjtJQUZDLElBQUEsZ0NBQXNCLEdBQUU7SUFDeEIsSUFBQSwyQkFBTyxHQUFFOzt3Q0FDRTtBQUlaO0lBRkMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQy9ELElBQUEsZUFBSyxFQUFDLGNBQWMsQ0FBQzs7c0RBQ0k7QUFHMUI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOztzREFDekI7QUFHMUI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7NENBQzVCO0FBR2hCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7OzhDQUMxQjtBQUduQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTsrQ0FBQztBQUdqQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTsrQ0FBQztBQUdqQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTsrQ0FBQztBQUtqQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQywyQ0FBZ0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNyRCxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7a0RBQ2IsMkNBQWdCLG9CQUFoQiwyQ0FBZ0I7c0RBQUM7dUJBOUJ6QixZQUFZO0lBRHhCLElBQUEsZ0JBQU0sRUFBQyxlQUFlLENBQUM7R0FDWCxZQUFZLENBK0J4QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxvcmdhbml6YXRpb25cXGVudGl0aWVzXFxvcmdhbml6YXRpb24uZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVudGl0eSxcbiAgQ29sdW1uLFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBDcmVhdGVEYXRlQ29sdW1uLFxuICBVcGRhdGVEYXRlQ29sdW1uLFxuICBEZWxldGVEYXRlQ29sdW1uLFxuICBJbmRleCxcbiAgTWFueVRvT25lLFxuICBKb2luQ29sdW1uLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IE9yZ2FuaXphdGlvblJvbGUgfSBmcm9tICcuL29yZ2FuaXphdGlvbi1yb2xlLmVudGl0eSc7XG5pbXBvcnQgeyBVdWlkQmFzZUVudGl0eSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9lbnRpdGllcy91dWlkLWJhc2UuZW50aXR5JztcbmltcG9ydCB7IEV4Y2x1ZGUgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XG5cbkBFbnRpdHkoJ29yZ2FuaXphdGlvbnMnKVxuZXhwb3J0IGNsYXNzIE9yZ2FuaXphdGlvbiBleHRlbmRzIFV1aWRCYXNlRW50aXR5IHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuICBARXhjbHVkZSgpXG4gIGlkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnb3JnYW5pemF0aW9uX2NvZGUnLCBsZW5ndGg6IDIwLCB1bmlxdWU6IHRydWUgfSlcbiAgQEluZGV4KCdpZHhfb3JnX2NvZGUnKVxuICBvcmdhbml6YXRpb25Db2RlITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnb3JnYW5pemF0aW9uX25hbWUnLCBsZW5ndGg6IDI1NSB9KVxuICBvcmdhbml6YXRpb25OYW1lITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncm9sZV9pZCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHJvbGVJZD86IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2lzX2FjdGl2ZScsIGRlZmF1bHQ6IHRydWUgfSlcbiAgaXNBY3RpdmUhOiBib29sZWFuO1xuXG4gIEBDcmVhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG5cbiAgQFVwZGF0ZURhdGVDb2x1bW4oeyBuYW1lOiAndXBkYXRlZF9hdCcgfSlcbiAgdXBkYXRlZEF0ITogRGF0ZTtcblxuICBARGVsZXRlRGF0ZUNvbHVtbih7IG5hbWU6ICdkZWxldGVkX2F0JyB9KVxuICBkZWxldGVkQXQhOiBEYXRlO1xuXG4gIC8vIFJlbGF0aW9uc1xuICBATWFueVRvT25lKCgpID0+IE9yZ2FuaXphdGlvblJvbGUsIHsgbnVsbGFibGU6IHRydWUgfSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAncm9sZV9pZCcgfSlcbiAgb3JnYW5pemF0aW9uUm9sZT86IE9yZ2FuaXphdGlvblJvbGU7XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6b/organizationentity_6b3ce0cffafbe10506b3d48552a95df7.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6b/organizationentity_6b3ce0cffafbe10506b3d48552a95df7.map new file mode 100644 index 0000000..402e94f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6b/organizationentity_6b3ce0cffafbe10506b3d48552a95df7.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\organization\\entities\\organization.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAUiB;AACjB,yEAA8D;AAC9D,gFAA2E;AAC3E,yDAA4C;AAGrC,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,iCAAc;CA+B/C,CAAA;AA/BY,oCAAY;AAGvB;IAFC,IAAA,gCAAsB,GAAE;IACxB,IAAA,2BAAO,GAAE;;wCACE;AAIZ;IAFC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC/D,IAAA,eAAK,EAAC,cAAc,CAAC;;sDACI;AAG1B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;sDACzB;AAG1B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4CAC5B;AAGhB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;8CAC1B;AAGnB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;+CAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;+CAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;+CAAC;AAKjB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,2CAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACrD,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;kDACb,2CAAgB,oBAAhB,2CAAgB;sDAAC;uBA9BzB,YAAY;IADxB,IAAA,gBAAM,EAAC,eAAe,CAAC;GACX,YAAY,CA+BxB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\organization\\entities\\organization.entity.ts"],"sourcesContent":["import {\n Entity,\n Column,\n PrimaryGeneratedColumn,\n CreateDateColumn,\n UpdateDateColumn,\n DeleteDateColumn,\n Index,\n ManyToOne,\n JoinColumn,\n} from 'typeorm';\nimport { OrganizationRole } from './organization-role.entity';\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\nimport { Exclude } from 'class-transformer';\n\n@Entity('organizations')\nexport class Organization extends UuidBaseEntity {\n @PrimaryGeneratedColumn()\n @Exclude()\n id!: number;\n\n @Column({ name: 'organization_code', length: 20, unique: true })\n @Index('idx_org_code')\n organizationCode!: string;\n\n @Column({ name: 'organization_name', length: 255 })\n organizationName!: string;\n\n @Column({ name: 'role_id', nullable: true })\n roleId?: number;\n\n @Column({ name: 'is_active', default: true })\n isActive!: boolean;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n @DeleteDateColumn({ name: 'deleted_at' })\n deletedAt!: Date;\n\n // Relations\n @ManyToOne(() => OrganizationRole, { nullable: true })\n @JoinColumn({ name: 'role_id' })\n organizationRole?: OrganizationRole;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6c/correspondencestatusentity_6cd9674f6d716087b5f3d16aa634606c b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6c/correspondencestatusentity_6cd9674f6d716087b5f3d16aa634606c new file mode 100644 index 0000000..3571b1e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6c/correspondencestatusentity_6cd9674f6d716087b5f3d16aa634606c @@ -0,0 +1,41 @@ +6fa83a86bc2faa50d71e1e700c1485aa +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceStatus = void 0; +const typeorm_1 = require("typeorm"); +let CorrespondenceStatus = class CorrespondenceStatus { +}; +exports.CorrespondenceStatus = CorrespondenceStatus; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], CorrespondenceStatus.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'status_code', unique: true, length: 50 }), + __metadata("design:type", String) +], CorrespondenceStatus.prototype, "statusCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'status_name', length: 255 }), + __metadata("design:type", String) +], CorrespondenceStatus.prototype, "statusName", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sort_order', default: 0 }), + __metadata("design:type", Number) +], CorrespondenceStatus.prototype, "sortOrder", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true, type: 'tinyint' }), + __metadata("design:type", Boolean) +], CorrespondenceStatus.prototype, "isActive", void 0); +exports.CorrespondenceStatus = CorrespondenceStatus = __decorate([ + (0, typeorm_1.Entity)('correspondence_status') +], CorrespondenceStatus); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGVudGl0aWVzXFxjb3JyZXNwb25kZW5jZS1zdGF0dXMuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLHFDQUFpRTtBQUcxRCxJQUFNLG9CQUFvQixHQUExQixNQUFNLG9CQUFvQjtDQWVoQyxDQUFBO0FBZlksb0RBQW9CO0FBRS9CO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7Z0RBQ2I7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7O3dEQUN0QztBQUdwQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOzt3REFDekI7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7dURBQ3hCO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7c0RBQzNDOytCQWRSLG9CQUFvQjtJQURoQyxJQUFBLGdCQUFNLEVBQUMsdUJBQXVCLENBQUM7R0FDbkIsb0JBQW9CLENBZWhDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGNvcnJlc3BvbmRlbmNlXFxlbnRpdGllc1xcY29ycmVzcG9uZGVuY2Utc3RhdHVzLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHksIENvbHVtbiwgUHJpbWFyeUdlbmVyYXRlZENvbHVtbiB9IGZyb20gJ3R5cGVvcm0nO1xuXG5ARW50aXR5KCdjb3JyZXNwb25kZW5jZV9zdGF0dXMnKVxuZXhwb3J0IGNsYXNzIENvcnJlc3BvbmRlbmNlU3RhdHVzIHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuICBpZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3N0YXR1c19jb2RlJywgdW5pcXVlOiB0cnVlLCBsZW5ndGg6IDUwIH0pXG4gIHN0YXR1c0NvZGUhOiBzdHJpbmc7IC8vIOC5gOC4iuC5iOC4mSBEUkFGVCwgU1VCT1dOXG5cbiAgQENvbHVtbih7IG5hbWU6ICdzdGF0dXNfbmFtZScsIGxlbmd0aDogMjU1IH0pXG4gIHN0YXR1c05hbWUhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdzb3J0X29yZGVyJywgZGVmYXVsdDogMCB9KVxuICBzb3J0T3JkZXIhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdpc19hY3RpdmUnLCBkZWZhdWx0OiB0cnVlLCB0eXBlOiAndGlueWludCcgfSlcbiAgaXNBY3RpdmUhOiBib29sZWFuO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6c/correspondencestatusentity_6cd9674f6d716087b5f3d16aa634606c.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6c/correspondencestatusentity_6cd9674f6d716087b5f3d16aa634606c.map new file mode 100644 index 0000000..8fcebde --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6c/correspondencestatusentity_6cd9674f6d716087b5f3d16aa634606c.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-status.entity.ts","mappings":";;;;;;;;;;;;AAAA,qCAAiE;AAG1D,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;CAehC,CAAA;AAfY,oDAAoB;AAE/B;IADC,IAAA,gCAAsB,GAAE;;gDACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;wDACtC;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;wDACzB;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;uDACxB;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;sDAC3C;+BAdR,oBAAoB;IADhC,IAAA,gBAAM,EAAC,uBAAuB,CAAC;GACnB,oBAAoB,CAehC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-status.entity.ts"],"sourcesContent":["import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';\n\n@Entity('correspondence_status')\nexport class CorrespondenceStatus {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'status_code', unique: true, length: 50 })\n statusCode!: string; // เช่น DRAFT, SUBOWN\n\n @Column({ name: 'status_name', length: 255 })\n statusName!: string;\n\n @Column({ name: 'sort_order', default: 0 })\n sortOrder!: number;\n\n @Column({ name: 'is_active', default: true, type: 'tinyint' })\n isActive!: boolean;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6c/filestoragecontroller_6c267c2f0fe72bae92837146680df4ea b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6c/filestoragecontroller_6c267c2f0fe72bae92837146680df4ea new file mode 100644 index 0000000..1da0b02 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6c/filestoragecontroller_6c267c2f0fe72bae92837146680df4ea @@ -0,0 +1,97 @@ +439bc90324a1506d6342fa9a1b50472c +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.FileStorageController = void 0; +// File: src/common/file-storage/file-storage.controller.ts +const common_1 = require("@nestjs/common"); +const platform_express_1 = require("@nestjs/platform-express"); +const file_storage_service_1 = require("./file-storage.service"); +const jwt_auth_guard_1 = require("../guards/jwt-auth.guard"); +let FileStorageController = class FileStorageController { + constructor(fileStorageService) { + this.fileStorageService = fileStorageService; + } + async uploadFile(file, req) { + // ส่ง userId จาก Token ไปด้วย + return this.fileStorageService.upload(file, req.user.user_id); + } + /** + * Endpoint สำหรับดาวน์โหลดไฟล์ + * GET /files/:id/download + */ + async downloadFile(id, res) { + const { stream, attachment } = await this.fileStorageService.download(id); + // Encode ชื่อไฟล์เพื่อรองรับภาษาไทยและตัวอักษรพิเศษใน Header + const encodedFilename = encodeURIComponent(attachment.originalFilename); + res.set({ + 'Content-Type': attachment.mimeType, + // บังคับให้ browser ดาวน์โหลดไฟล์ แทนการ preview + 'Content-Disposition': `attachment; filename="${encodedFilename}"; filename*=UTF-8''${encodedFilename}`, + 'Content-Length': attachment.fileSize, + }); + return new common_1.StreamableFile(stream); + } + /** + * ✅ NEW: Delete Endpoint + * DELETE /files/:id + */ + async deleteFile(id, req) { + // ส่ง userId ไปด้วยเพื่อตรวจสอบความเป็นเจ้าของ + await this.fileStorageService.delete(id, req.user.user_id); + return { message: 'File deleted successfully', id }; + } +}; +exports.FileStorageController = FileStorageController; +__decorate([ + (0, common_1.Post)('upload'), + (0, common_1.UseInterceptors)((0, platform_express_1.FileInterceptor)('file')) // รับ field ชื่อ 'file' + , + __param(0, (0, common_1.UploadedFile)(new common_1.ParseFilePipe({ + validators: [ + new common_1.MaxFileSizeValidator({ maxSize: 50 * 1024 * 1024 }), // 50MB + // ตรวจสอบประเภทไฟล์ (Regex) - รวม image, pdf, docs, zip + new common_1.FileTypeValidator({ + fileType: /(pdf|msword|openxmlformats|zip|octet-stream|image|jpeg|png)/, + }), + ], + }))), + __param(1, (0, common_1.Request)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_c = typeof Express !== "undefined" && (_b = Express.Multer) !== void 0 && _b.File) === "function" ? _c : Object, Object]), + __metadata("design:returntype", Promise) +], FileStorageController.prototype, "uploadFile", null); +__decorate([ + (0, common_1.Get)(':id/download'), + __param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)), + __param(1, (0, common_1.Res)({ passthrough: true })), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Number, Object]), + __metadata("design:returntype", typeof (_d = typeof Promise !== "undefined" && Promise) === "function" ? _d : Object) +], FileStorageController.prototype, "downloadFile", null); +__decorate([ + (0, common_1.Delete)(':id'), + __param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)), + __param(1, (0, common_1.Request)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Number, Object]), + __metadata("design:returntype", Promise) +], FileStorageController.prototype, "deleteFile", null); +exports.FileStorageController = FileStorageController = __decorate([ + (0, common_1.Controller)('files'), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard), + __metadata("design:paramtypes", [typeof (_a = typeof file_storage_service_1.FileStorageService !== "undefined" && file_storage_service_1.FileStorageService) === "function" ? _a : Object]) +], FileStorageController); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxmaWxlLXN0b3JhZ2VcXGZpbGUtc3RvcmFnZS5jb250cm9sbGVyLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyREFBMkQ7QUFDM0QsMkNBZ0J3QjtBQUV4QiwrREFBMkQ7QUFDM0QsaUVBQTREO0FBQzVELDZEQUF3RDtBQUtqRCxJQUFNLHFCQUFxQixHQUEzQixNQUFNLHFCQUFxQjtJQUNoQyxZQUE2QixrQkFBc0M7UUFBdEMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtJQUFHLENBQUM7SUFJakUsQUFBTixLQUFLLENBQUMsVUFBVSxDQWFkLElBQXlCLEVBQ2QsR0FBb0I7UUFFL0IsOEJBQThCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQ7OztPQUdHO0lBRUcsQUFBTixLQUFLLENBQUMsWUFBWSxDQUNXLEVBQVUsRUFDVCxHQUFhO1FBRXpDLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTFFLDZEQUE2RDtRQUM3RCxNQUFNLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUV4RSxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ04sY0FBYyxFQUFFLFVBQVUsQ0FBQyxRQUFRO1lBQ25DLGlEQUFpRDtZQUNqRCxxQkFBcUIsRUFBRSx5QkFBeUIsZUFBZSx1QkFBdUIsZUFBZSxFQUFFO1lBQ3ZHLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxRQUFRO1NBQ3RDLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSx1QkFBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7O09BR0c7SUFFRyxBQUFOLEtBQUssQ0FBQyxVQUFVLENBQ2EsRUFBVSxFQUMxQixHQUFvQjtRQUUvQiwrQ0FBK0M7UUFDL0MsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDdEQsQ0FBQztDQUNGLENBQUE7QUE5RFksc0RBQXFCO0FBSzFCO0lBRkwsSUFBQSxhQUFJLEVBQUMsUUFBUSxDQUFDO0lBQ2QsSUFBQSx3QkFBZSxFQUFDLElBQUEsa0NBQWUsRUFBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLHdCQUF3Qjs7SUFFL0QsV0FBQSxJQUFBLHFCQUFZLEVBQ1gsSUFBSSxzQkFBYSxDQUFDO1FBQ2hCLFVBQVUsRUFBRTtZQUNWLElBQUksNkJBQW9CLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLE9BQU87WUFDaEUsd0RBQXdEO1lBQ3hELElBQUksMEJBQWlCLENBQUM7Z0JBQ3BCLFFBQVEsRUFDTiw2REFBNkQ7YUFDaEUsQ0FBQztTQUNIO0tBQ0YsQ0FBQyxDQUNILENBQUE7SUFFQSxXQUFBLElBQUEsZ0JBQU8sR0FBRSxDQUFBOzt5REFESixPQUFPLDBCQUFQLE9BQU8sQ0FBQyxNQUFNLG1CQUFDLElBQUk7O3VEQUsxQjtBQU9LO0lBREwsSUFBQSxZQUFHLEVBQUMsY0FBYyxDQUFDO0lBRWpCLFdBQUEsSUFBQSxjQUFLLEVBQUMsSUFBSSxFQUFFLHFCQUFZLENBQUMsQ0FBQTtJQUN6QixXQUFBLElBQUEsWUFBRyxFQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7Ozt3REFDMUIsT0FBTyxvQkFBUCxPQUFPO3lEQWNUO0FBT0s7SUFETCxJQUFBLGVBQU0sRUFBQyxLQUFLLENBQUM7SUFFWCxXQUFBLElBQUEsY0FBSyxFQUFDLElBQUksRUFBRSxxQkFBWSxDQUFDLENBQUE7SUFDekIsV0FBQSxJQUFBLGdCQUFPLEdBQUUsQ0FBQTs7Ozt1REFLWDtnQ0E3RFUscUJBQXFCO0lBRmpDLElBQUEsbUJBQVUsRUFBQyxPQUFPLENBQUM7SUFDbkIsSUFBQSxrQkFBUyxFQUFDLDZCQUFZLENBQUM7eURBRTJCLHlDQUFrQixvQkFBbEIseUNBQWtCO0dBRHhELHFCQUFxQixDQThEakMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxmaWxlLXN0b3JhZ2VcXGZpbGUtc3RvcmFnZS5jb250cm9sbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9jb21tb24vZmlsZS1zdG9yYWdlL2ZpbGUtc3RvcmFnZS5jb250cm9sbGVyLnRzXG5pbXBvcnQge1xuICBDb250cm9sbGVyLFxuICBQb3N0LFxuICBHZXQsXG4gIERlbGV0ZSwgLy8g4pyFIEltcG9ydCBEZWxldGVcbiAgUGFyYW0sXG4gIFVzZUludGVyY2VwdG9ycyxcbiAgVXBsb2FkZWRGaWxlLFxuICBVc2VHdWFyZHMsXG4gIFJlcXVlc3QsXG4gIFBhcnNlRmlsZVBpcGUsXG4gIE1heEZpbGVTaXplVmFsaWRhdG9yLFxuICBGaWxlVHlwZVZhbGlkYXRvcixcbiAgUmVzLFxuICBTdHJlYW1hYmxlRmlsZSxcbiAgUGFyc2VJbnRQaXBlLFxufSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7IFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBGaWxlSW50ZXJjZXB0b3IgfSBmcm9tICdAbmVzdGpzL3BsYXRmb3JtLWV4cHJlc3MnO1xuaW1wb3J0IHsgRmlsZVN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi9maWxlLXN0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBKd3RBdXRoR3VhcmQgfSBmcm9tICcuLi9ndWFyZHMvand0LWF1dGguZ3VhcmQnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0V2l0aFVzZXIgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcXVlc3Qtd2l0aC11c2VyLmludGVyZmFjZSc7XG5cbkBDb250cm9sbGVyKCdmaWxlcycpXG5AVXNlR3VhcmRzKEp3dEF1dGhHdWFyZClcbmV4cG9ydCBjbGFzcyBGaWxlU3RvcmFnZUNvbnRyb2xsZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGZpbGVTdG9yYWdlU2VydmljZTogRmlsZVN0b3JhZ2VTZXJ2aWNlKSB7fVxuXG4gIEBQb3N0KCd1cGxvYWQnKVxuICBAVXNlSW50ZXJjZXB0b3JzKEZpbGVJbnRlcmNlcHRvcignZmlsZScpKSAvLyDguKPguLHguJogZmllbGQg4LiK4Li34LmI4LitICdmaWxlJ1xuICBhc3luYyB1cGxvYWRGaWxlKFxuICAgIEBVcGxvYWRlZEZpbGUoXG4gICAgICBuZXcgUGFyc2VGaWxlUGlwZSh7XG4gICAgICAgIHZhbGlkYXRvcnM6IFtcbiAgICAgICAgICBuZXcgTWF4RmlsZVNpemVWYWxpZGF0b3IoeyBtYXhTaXplOiA1MCAqIDEwMjQgKiAxMDI0IH0pLCAvLyA1ME1CXG4gICAgICAgICAgLy8g4LiV4Lij4Lin4LiI4Liq4Lit4Lia4Lib4Lij4Liw4LmA4Lig4LiX4LmE4Lif4Lil4LmMIChSZWdleCkgLSDguKPguKfguKEgaW1hZ2UsIHBkZiwgZG9jcywgemlwXG4gICAgICAgICAgbmV3IEZpbGVUeXBlVmFsaWRhdG9yKHtcbiAgICAgICAgICAgIGZpbGVUeXBlOlxuICAgICAgICAgICAgICAvKHBkZnxtc3dvcmR8b3BlbnhtbGZvcm1hdHN8emlwfG9jdGV0LXN0cmVhbXxpbWFnZXxqcGVnfHBuZykvLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICApXG4gICAgZmlsZTogRXhwcmVzcy5NdWx0ZXIuRmlsZSxcbiAgICBAUmVxdWVzdCgpIHJlcTogUmVxdWVzdFdpdGhVc2VyXG4gICkge1xuICAgIC8vIOC4quC5iOC4hyB1c2VySWQg4LiI4Liy4LiBIFRva2VuIOC5hOC4m+C4lOC5ieC4p+C4olxuICAgIHJldHVybiB0aGlzLmZpbGVTdG9yYWdlU2VydmljZS51cGxvYWQoZmlsZSwgcmVxLnVzZXIudXNlcl9pZCk7XG4gIH1cblxuICAvKipcbiAgICogRW5kcG9pbnQg4Liq4Liz4Lir4Lij4Lix4Lia4LiU4Liy4Lin4LiZ4LmM4LmC4Lir4Lil4LiU4LmE4Lif4Lil4LmMXG4gICAqIEdFVCAvZmlsZXMvOmlkL2Rvd25sb2FkXG4gICAqL1xuICBAR2V0KCc6aWQvZG93bmxvYWQnKVxuICBhc3luYyBkb3dubG9hZEZpbGUoXG4gICAgQFBhcmFtKCdpZCcsIFBhcnNlSW50UGlwZSkgaWQ6IG51bWJlcixcbiAgICBAUmVzKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgcmVzOiBSZXNwb25zZVxuICApOiBQcm9taXNlPFN0cmVhbWFibGVGaWxlPiB7XG4gICAgY29uc3QgeyBzdHJlYW0sIGF0dGFjaG1lbnQgfSA9IGF3YWl0IHRoaXMuZmlsZVN0b3JhZ2VTZXJ2aWNlLmRvd25sb2FkKGlkKTtcblxuICAgIC8vIEVuY29kZSDguIrguLfguYjguK3guYTguJ/guKXguYzguYDguJ7guLfguYjguK3guKPguK3guIfguKPguLHguJrguKDguLLguKnguLLguYTguJfguKLguYHguKXguLDguJXguLHguKfguK3guLHguIHguKnguKPguJ7guLTguYDguKjguKnguYPguJkgSGVhZGVyXG4gICAgY29uc3QgZW5jb2RlZEZpbGVuYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KGF0dGFjaG1lbnQub3JpZ2luYWxGaWxlbmFtZSk7XG5cbiAgICByZXMuc2V0KHtcbiAgICAgICdDb250ZW50LVR5cGUnOiBhdHRhY2htZW50Lm1pbWVUeXBlLFxuICAgICAgLy8g4Lia4Lix4LiH4LiE4Lix4Lia4LmD4Lir4LmJIGJyb3dzZXIg4LiU4Liy4Lin4LiZ4LmM4LmC4Lir4Lil4LiU4LmE4Lif4Lil4LmMIOC5geC4l+C4meC4geC4suC4oyBwcmV2aWV3XG4gICAgICAnQ29udGVudC1EaXNwb3NpdGlvbic6IGBhdHRhY2htZW50OyBmaWxlbmFtZT1cIiR7ZW5jb2RlZEZpbGVuYW1lfVwiOyBmaWxlbmFtZSo9VVRGLTgnJyR7ZW5jb2RlZEZpbGVuYW1lfWAsXG4gICAgICAnQ29udGVudC1MZW5ndGgnOiBhdHRhY2htZW50LmZpbGVTaXplLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBTdHJlYW1hYmxlRmlsZShzdHJlYW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOKchSBORVc6IERlbGV0ZSBFbmRwb2ludFxuICAgKiBERUxFVEUgL2ZpbGVzLzppZFxuICAgKi9cbiAgQERlbGV0ZSgnOmlkJylcbiAgYXN5bmMgZGVsZXRlRmlsZShcbiAgICBAUGFyYW0oJ2lkJywgUGFyc2VJbnRQaXBlKSBpZDogbnVtYmVyLFxuICAgIEBSZXF1ZXN0KCkgcmVxOiBSZXF1ZXN0V2l0aFVzZXJcbiAgKSB7XG4gICAgLy8g4Liq4LmI4LiHIHVzZXJJZCDguYTguJvguJTguYnguKfguKLguYDguJ7guLfguYjguK3guJXguKPguKfguIjguKrguK3guJrguITguKfguLLguKHguYDguJvguYfguJnguYDguIjguYnguLLguILguK3guIdcbiAgICBhd2FpdCB0aGlzLmZpbGVTdG9yYWdlU2VydmljZS5kZWxldGUoaWQsIHJlcS51c2VyLnVzZXJfaWQpO1xuICAgIHJldHVybiB7IG1lc3NhZ2U6ICdGaWxlIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5JywgaWQgfTtcbiAgfVxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6c/filestoragecontroller_6c267c2f0fe72bae92837146680df4ea.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6c/filestoragecontroller_6c267c2f0fe72bae92837146680df4ea.map new file mode 100644 index 0000000..5adea99 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/6c/filestoragecontroller_6c267c2f0fe72bae92837146680df4ea.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\file-storage\\file-storage.controller.ts","mappings":";;;;;;;;;;;;;;;;AAAA,2DAA2D;AAC3D,2CAgBwB;AAExB,+DAA2D;AAC3D,iEAA4D;AAC5D,6DAAwD;AAKjD,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IAChC,YAA6B,kBAAsC;QAAtC,uBAAkB,GAAlB,kBAAkB,CAAoB;IAAG,CAAC;IAIjE,AAAN,KAAK,CAAC,UAAU,CAad,IAAyB,EACd,GAAoB;QAE/B,8BAA8B;QAC9B,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChE,CAAC;IAED;;;OAGG;IAEG,AAAN,KAAK,CAAC,YAAY,CACW,EAAU,EACT,GAAa;QAEzC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAE1E,6DAA6D;QAC7D,MAAM,eAAe,GAAG,kBAAkB,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;QAExE,GAAG,CAAC,GAAG,CAAC;YACN,cAAc,EAAE,UAAU,CAAC,QAAQ;YACnC,iDAAiD;YACjD,qBAAqB,EAAE,yBAAyB,eAAe,uBAAuB,eAAe,EAAE;YACvG,gBAAgB,EAAE,UAAU,CAAC,QAAQ;SACtC,CAAC,CAAC;QAEH,OAAO,IAAI,uBAAc,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED;;;OAGG;IAEG,AAAN,KAAK,CAAC,UAAU,CACa,EAAU,EAC1B,GAAoB;QAE/B,+CAA+C;QAC/C,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3D,OAAO,EAAE,OAAO,EAAE,2BAA2B,EAAE,EAAE,EAAE,CAAC;IACtD,CAAC;CACF,CAAA;AA9DY,sDAAqB;AAK1B;IAFL,IAAA,aAAI,EAAC,QAAQ,CAAC;IACd,IAAA,wBAAe,EAAC,IAAA,kCAAe,EAAC,MAAM,CAAC,CAAC,CAAC,wBAAwB;;IAE/D,WAAA,IAAA,qBAAY,EACX,IAAI,sBAAa,CAAC;QAChB,UAAU,EAAE;YACV,IAAI,6BAAoB,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,EAAE,OAAO;YAChE,wDAAwD;YACxD,IAAI,0BAAiB,CAAC;gBACpB,QAAQ,EACN,6DAA6D;aAChE,CAAC;SACH;KACF,CAAC,CACH,CAAA;IAEA,WAAA,IAAA,gBAAO,GAAE,CAAA;;yDADJ,OAAO,0BAAP,OAAO,CAAC,MAAM,mBAAC,IAAI;;uDAK1B;AAOK;IADL,IAAA,YAAG,EAAC,cAAc,CAAC;IAEjB,WAAA,IAAA,cAAK,EAAC,IAAI,EAAE,qBAAY,CAAC,CAAA;IACzB,WAAA,IAAA,YAAG,EAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;;;wDAC1B,OAAO,oBAAP,OAAO;yDAcT;AAOK;IADL,IAAA,eAAM,EAAC,KAAK,CAAC;IAEX,WAAA,IAAA,cAAK,EAAC,IAAI,EAAE,qBAAY,CAAC,CAAA;IACzB,WAAA,IAAA,gBAAO,GAAE,CAAA;;;;uDAKX;gCA7DU,qBAAqB;IAFjC,IAAA,mBAAU,EAAC,OAAO,CAAC;IACnB,IAAA,kBAAS,EAAC,6BAAY,CAAC;yDAE2B,yCAAkB,oBAAlB,yCAAkB;GADxD,qBAAqB,CA8DjC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\file-storage\\file-storage.controller.ts"],"sourcesContent":["// File: src/common/file-storage/file-storage.controller.ts\nimport {\n Controller,\n Post,\n Get,\n Delete, // ✅ Import Delete\n Param,\n UseInterceptors,\n UploadedFile,\n UseGuards,\n Request,\n ParseFilePipe,\n MaxFileSizeValidator,\n FileTypeValidator,\n Res,\n StreamableFile,\n ParseIntPipe,\n} from '@nestjs/common';\nimport type { Response } from 'express';\nimport { FileInterceptor } from '@nestjs/platform-express';\nimport { FileStorageService } from './file-storage.service';\nimport { JwtAuthGuard } from '../guards/jwt-auth.guard';\nimport type { RequestWithUser } from '../interfaces/request-with-user.interface';\n\n@Controller('files')\n@UseGuards(JwtAuthGuard)\nexport class FileStorageController {\n constructor(private readonly fileStorageService: FileStorageService) {}\n\n @Post('upload')\n @UseInterceptors(FileInterceptor('file')) // รับ field ชื่อ 'file'\n async uploadFile(\n @UploadedFile(\n new ParseFilePipe({\n validators: [\n new MaxFileSizeValidator({ maxSize: 50 * 1024 * 1024 }), // 50MB\n // ตรวจสอบประเภทไฟล์ (Regex) - รวม image, pdf, docs, zip\n new FileTypeValidator({\n fileType:\n /(pdf|msword|openxmlformats|zip|octet-stream|image|jpeg|png)/,\n }),\n ],\n })\n )\n file: Express.Multer.File,\n @Request() req: RequestWithUser\n ) {\n // ส่ง userId จาก Token ไปด้วย\n return this.fileStorageService.upload(file, req.user.user_id);\n }\n\n /**\n * Endpoint สำหรับดาวน์โหลดไฟล์\n * GET /files/:id/download\n */\n @Get(':id/download')\n async downloadFile(\n @Param('id', ParseIntPipe) id: number,\n @Res({ passthrough: true }) res: Response\n ): Promise {\n const { stream, attachment } = await this.fileStorageService.download(id);\n\n // Encode ชื่อไฟล์เพื่อรองรับภาษาไทยและตัวอักษรพิเศษใน Header\n const encodedFilename = encodeURIComponent(attachment.originalFilename);\n\n res.set({\n 'Content-Type': attachment.mimeType,\n // บังคับให้ browser ดาวน์โหลดไฟล์ แทนการ preview\n 'Content-Disposition': `attachment; filename=\"${encodedFilename}\"; filename*=UTF-8''${encodedFilename}`,\n 'Content-Length': attachment.fileSize,\n });\n\n return new StreamableFile(stream);\n }\n\n /**\n * ✅ NEW: Delete Endpoint\n * DELETE /files/:id\n */\n @Delete(':id')\n async deleteFile(\n @Param('id', ParseIntPipe) id: number,\n @Request() req: RequestWithUser\n ) {\n // ส่ง userId ไปด้วยเพื่อตรวจสอบความเป็นเจ้าของ\n await this.fileStorageService.delete(id, req.user.user_id);\n return { message: 'File deleted successfully', id };\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/71/abilityfactory_71acd4f06948161a9038ed8bb92a44d9 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/71/abilityfactory_71acd4f06948161a9038ed8bb92a44d9 new file mode 100644 index 0000000..2c4a1f4 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/71/abilityfactory_71acd4f06948161a9038ed8bb92a44d9 @@ -0,0 +1,101 @@ +31b94bf61a13f4a2cfe503fcf5c04aa0 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AbilityFactory = void 0; +const common_1 = require("@nestjs/common"); +const ability_1 = require("@casl/ability"); +let AbilityFactory = class AbilityFactory { + /** + * สร้าง Ability object สำหรับ User ในบริบทที่กำหนด + * รองรับ 4-Level Hierarchical RBAC: + * - Level 1: Global (no scope) + * - Level 2: Organization + * - Level 3: Project + * - Level 4: Contract + */ + createForUser(user, context) { + const { can, build } = new ability_1.AbilityBuilder(ability_1.Ability); + if (!user || !user.assignments) { + // No permissions for unauthenticated or incomplete user + return build(); + } + // Iterate through user's role assignments + // Iterate through user's role assignments + user.assignments.forEach((assignment) => { + // Check if assignment matches the current context + if (this.matchesScope(assignment, context)) { + // Grant permissions from the role + assignment.role.permissions?.forEach((permission) => { + const [action, subject] = this.parsePermission(permission.permissionName); + can(action, subject); + }); + } + }); + return build({ + // Detect subject type (for future use with objects) + detectSubjectType: (item) => { + if (typeof item === 'string') + return item; + return item + .constructor; + }, + }); + } + /** + * ตรวจสอบว่า Assignment ตรงกับ Scope Context หรือไม่ + * Hierarchical matching: + * - Global assignment matches all contexts + * - Organization assignment matches if org IDs match + * - Project assignment matches if project IDs match + * - Contract assignment matches if contract IDs match + */ + matchesScope(assignment, context) { + // Level 1: Global scope (no organizationId, projectId, contractId) + if (!assignment.organizationId && + !assignment.projectId && + !assignment.contractId) { + return true; // Global admin can access everything + } + // Level 4: Contract scope (most specific) + if (assignment.contractId) { + return context.contractId === assignment.contractId; + } + // Level 3: Project scope + if (assignment.projectId) { + return context.projectId === assignment.projectId; + } + // Level 2: Organization scope + if (assignment.organizationId) { + return context.organizationId === assignment.organizationId; + } + return false; + } + /** + * แปลง permission name เป็น [action, subject] + * Format: "correspondence.create" → ["create", "correspondence"] + * "project.view" → ["view", "project"] + */ + parsePermission(permissionName) { + // Fallback for special permissions like "system.manage_all" + if (permissionName === 'system.manage_all') { + return ['manage', 'all']; + } + const parts = permissionName.split('.'); + if (parts.length === 2) { + const [subject, action] = parts; + return [action, subject]; + } + throw new Error(`Invalid permission format: ${permissionName}`); + } +}; +exports.AbilityFactory = AbilityFactory; +exports.AbilityFactory = AbilityFactory = __decorate([ + (0, common_1.Injectable)() +], AbilityFactory); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxhdXRoXFxjYXNsXFxhYmlsaXR5LmZhY3RvcnkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsMkNBQTRDO0FBQzVDLDJDQUFzRTtBQThCL0QsSUFBTSxjQUFjLEdBQXBCLE1BQU0sY0FBYztJQUN6Qjs7Ozs7OztPQU9HO0lBQ0gsYUFBYSxDQUFDLElBQVUsRUFBRSxPQUFxQjtRQUM3QyxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksd0JBQWMsQ0FDdkMsaUJBQW1DLENBQ3BDLENBQUM7UUFFRixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQy9CLHdEQUF3RDtZQUN4RCxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2pCLENBQUM7UUFFRCwwQ0FBMEM7UUFDMUMsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBMEIsRUFBRSxFQUFFO1lBQ3RELGtEQUFrRDtZQUNsRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQzNDLGtDQUFrQztnQkFDbEMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7b0JBQ2xELE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FDNUMsVUFBVSxDQUFDLGNBQWMsQ0FDMUIsQ0FBQztvQkFDRixHQUFHLENBQUMsTUFBaUIsRUFBRSxPQUFtQixDQUFDLENBQUM7Z0JBQzlDLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxLQUFLLENBQUM7WUFDWCxvREFBb0Q7WUFDcEQsaUJBQWlCLEVBQUUsQ0FBQyxJQUFZLEVBQUUsRUFBRTtnQkFDbEMsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUMxQyxPQUFRLElBQWdDO3FCQUNyQyxXQUFrQyxDQUFDO1lBQ3hDLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNLLFlBQVksQ0FDbEIsVUFBMEIsRUFDMUIsT0FBcUI7UUFFckIsbUVBQW1FO1FBQ25FLElBQ0UsQ0FBQyxVQUFVLENBQUMsY0FBYztZQUMxQixDQUFDLFVBQVUsQ0FBQyxTQUFTO1lBQ3JCLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFDdEIsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDLENBQUMscUNBQXFDO1FBQ3BELENBQUM7UUFFRCwwQ0FBMEM7UUFDMUMsSUFBSSxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDMUIsT0FBTyxPQUFPLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FBQyxVQUFVLENBQUM7UUFDdEQsQ0FBQztRQUVELHlCQUF5QjtRQUN6QixJQUFJLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN6QixPQUFPLE9BQU8sQ0FBQyxTQUFTLEtBQUssVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUNwRCxDQUFDO1FBRUQsOEJBQThCO1FBQzlCLElBQUksVUFBVSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzlCLE9BQU8sT0FBTyxDQUFDLGNBQWMsS0FBSyxVQUFVLENBQUMsY0FBYyxDQUFDO1FBQzlELENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssZUFBZSxDQUFDLGNBQXNCO1FBQzVDLDREQUE0RDtRQUM1RCxJQUFJLGNBQWMsS0FBSyxtQkFBbUIsRUFBRSxDQUFDO1lBQzNDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDbEUsQ0FBQztDQUNGLENBQUE7QUF0R1ksd0NBQWM7eUJBQWQsY0FBYztJQUQxQixJQUFBLG1CQUFVLEdBQUU7R0FDQSxjQUFjLENBc0cxQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxjb21tb25cXGF1dGhcXGNhc2xcXGFiaWxpdHkuZmFjdG9yeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xuaW1wb3J0IHsgQWJpbGl0eSwgQWJpbGl0eUJ1aWxkZXIsIEFiaWxpdHlDbGFzcyB9IGZyb20gJ0BjYXNsL2FiaWxpdHknO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uLy4uL21vZHVsZXMvdXNlci9lbnRpdGllcy91c2VyLmVudGl0eSc7XG5pbXBvcnQgeyBVc2VyQXNzaWdubWVudCB9IGZyb20gJy4uLy4uLy4uL21vZHVsZXMvdXNlci9lbnRpdGllcy91c2VyLWFzc2lnbm1lbnQuZW50aXR5JztcblxuLy8gRGVmaW5lIGFjdGlvbiB0eXBlc1xuZXhwb3J0IHR5cGUgQWN0aW9ucyA9ICdjcmVhdGUnIHwgJ3JlYWQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB8ICdtYW5hZ2UnO1xuXG4vLyBEZWZpbmUgc3ViamVjdCB0eXBlcyAocmVzb3VyY2VzKVxuZXhwb3J0IHR5cGUgU3ViamVjdHMgPVxuICB8ICdjb3JyZXNwb25kZW5jZSdcbiAgfCAncmZhJ1xuICB8ICdkcmF3aW5nJ1xuICB8ICd0cmFuc21pdHRhbCdcbiAgfCAnY2lyY3VsYXRpb24nXG4gIHwgJ3Byb2plY3QnXG4gIHwgJ29yZ2FuaXphdGlvbidcbiAgfCAndXNlcidcbiAgfCAncm9sZSdcbiAgfCAnd29ya2Zsb3cnXG4gIHwgJ2FsbCc7XG5cbmV4cG9ydCB0eXBlIEFwcEFiaWxpdHkgPSBBYmlsaXR5PFtBY3Rpb25zLCBTdWJqZWN0c10+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFNjb3BlQ29udGV4dCB7XG4gIG9yZ2FuaXphdGlvbklkPzogbnVtYmVyO1xuICBwcm9qZWN0SWQ/OiBudW1iZXI7XG4gIGNvbnRyYWN0SWQ/OiBudW1iZXI7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBYmlsaXR5RmFjdG9yeSB7XG4gIC8qKlxuICAgKiDguKrguKPguYnguLLguIcgQWJpbGl0eSBvYmplY3Qg4Liq4Liz4Lir4Lij4Lix4LiaIFVzZXIg4LmD4LiZ4Lia4Lij4Li04Lia4LiX4LiX4Li14LmI4LiB4Liz4Lir4LiZ4LiUXG4gICAqIOC4o+C4reC4h+C4o+C4seC4miA0LUxldmVsIEhpZXJhcmNoaWNhbCBSQkFDOlxuICAgKiAtIExldmVsIDE6IEdsb2JhbCAobm8gc2NvcGUpXG4gICAqIC0gTGV2ZWwgMjogT3JnYW5pemF0aW9uXG4gICAqIC0gTGV2ZWwgMzogUHJvamVjdFxuICAgKiAtIExldmVsIDQ6IENvbnRyYWN0XG4gICAqL1xuICBjcmVhdGVGb3JVc2VyKHVzZXI6IFVzZXIsIGNvbnRleHQ6IFNjb3BlQ29udGV4dCk6IEFwcEFiaWxpdHkge1xuICAgIGNvbnN0IHsgY2FuLCBidWlsZCB9ID0gbmV3IEFiaWxpdHlCdWlsZGVyPEFwcEFiaWxpdHk+KFxuICAgICAgQWJpbGl0eSBhcyBBYmlsaXR5Q2xhc3M8QXBwQWJpbGl0eT5cbiAgICApO1xuXG4gICAgaWYgKCF1c2VyIHx8ICF1c2VyLmFzc2lnbm1lbnRzKSB7XG4gICAgICAvLyBObyBwZXJtaXNzaW9ucyBmb3IgdW5hdXRoZW50aWNhdGVkIG9yIGluY29tcGxldGUgdXNlclxuICAgICAgcmV0dXJuIGJ1aWxkKCk7XG4gICAgfVxuXG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHVzZXIncyByb2xlIGFzc2lnbm1lbnRzXG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHVzZXIncyByb2xlIGFzc2lnbm1lbnRzXG4gICAgdXNlci5hc3NpZ25tZW50cy5mb3JFYWNoKChhc3NpZ25tZW50OiBVc2VyQXNzaWdubWVudCkgPT4ge1xuICAgICAgLy8gQ2hlY2sgaWYgYXNzaWdubWVudCBtYXRjaGVzIHRoZSBjdXJyZW50IGNvbnRleHRcbiAgICAgIGlmICh0aGlzLm1hdGNoZXNTY29wZShhc3NpZ25tZW50LCBjb250ZXh0KSkge1xuICAgICAgICAvLyBHcmFudCBwZXJtaXNzaW9ucyBmcm9tIHRoZSByb2xlXG4gICAgICAgIGFzc2lnbm1lbnQucm9sZS5wZXJtaXNzaW9ucz8uZm9yRWFjaCgocGVybWlzc2lvbikgPT4ge1xuICAgICAgICAgIGNvbnN0IFthY3Rpb24sIHN1YmplY3RdID0gdGhpcy5wYXJzZVBlcm1pc3Npb24oXG4gICAgICAgICAgICBwZXJtaXNzaW9uLnBlcm1pc3Npb25OYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjYW4oYWN0aW9uIGFzIEFjdGlvbnMsIHN1YmplY3QgYXMgU3ViamVjdHMpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBidWlsZCh7XG4gICAgICAvLyBEZXRlY3Qgc3ViamVjdCB0eXBlIChmb3IgZnV0dXJlIHVzZSB3aXRoIG9iamVjdHMpXG4gICAgICBkZXRlY3RTdWJqZWN0VHlwZTogKGl0ZW06IG9iamVjdCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSByZXR1cm4gaXRlbTtcbiAgICAgICAgcmV0dXJuIChpdGVtIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICAgIC5jb25zdHJ1Y3RvciBhcyB1bmtub3duIGFzIFN1YmplY3RzO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDguJXguKPguKfguIjguKrguK3guJrguKfguYjguLIgQXNzaWdubWVudCDguJXguKPguIfguIHguLHguJogU2NvcGUgQ29udGV4dCDguKvguKPguLfguK3guYTguKHguYhcbiAgICogSGllcmFyY2hpY2FsIG1hdGNoaW5nOlxuICAgKiAtIEdsb2JhbCBhc3NpZ25tZW50IG1hdGNoZXMgYWxsIGNvbnRleHRzXG4gICAqIC0gT3JnYW5pemF0aW9uIGFzc2lnbm1lbnQgbWF0Y2hlcyBpZiBvcmcgSURzIG1hdGNoXG4gICAqIC0gUHJvamVjdCBhc3NpZ25tZW50IG1hdGNoZXMgaWYgcHJvamVjdCBJRHMgbWF0Y2hcbiAgICogLSBDb250cmFjdCBhc3NpZ25tZW50IG1hdGNoZXMgaWYgY29udHJhY3QgSURzIG1hdGNoXG4gICAqL1xuICBwcml2YXRlIG1hdGNoZXNTY29wZShcbiAgICBhc3NpZ25tZW50OiBVc2VyQXNzaWdubWVudCxcbiAgICBjb250ZXh0OiBTY29wZUNvbnRleHRcbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gTGV2ZWwgMTogR2xvYmFsIHNjb3BlIChubyBvcmdhbml6YXRpb25JZCwgcHJvamVjdElkLCBjb250cmFjdElkKVxuICAgIGlmIChcbiAgICAgICFhc3NpZ25tZW50Lm9yZ2FuaXphdGlvbklkICYmXG4gICAgICAhYXNzaWdubWVudC5wcm9qZWN0SWQgJiZcbiAgICAgICFhc3NpZ25tZW50LmNvbnRyYWN0SWRcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlOyAvLyBHbG9iYWwgYWRtaW4gY2FuIGFjY2VzcyBldmVyeXRoaW5nXG4gICAgfVxuXG4gICAgLy8gTGV2ZWwgNDogQ29udHJhY3Qgc2NvcGUgKG1vc3Qgc3BlY2lmaWMpXG4gICAgaWYgKGFzc2lnbm1lbnQuY29udHJhY3RJZCkge1xuICAgICAgcmV0dXJuIGNvbnRleHQuY29udHJhY3RJZCA9PT0gYXNzaWdubWVudC5jb250cmFjdElkO1xuICAgIH1cblxuICAgIC8vIExldmVsIDM6IFByb2plY3Qgc2NvcGVcbiAgICBpZiAoYXNzaWdubWVudC5wcm9qZWN0SWQpIHtcbiAgICAgIHJldHVybiBjb250ZXh0LnByb2plY3RJZCA9PT0gYXNzaWdubWVudC5wcm9qZWN0SWQ7XG4gICAgfVxuXG4gICAgLy8gTGV2ZWwgMjogT3JnYW5pemF0aW9uIHNjb3BlXG4gICAgaWYgKGFzc2lnbm1lbnQub3JnYW5pemF0aW9uSWQpIHtcbiAgICAgIHJldHVybiBjb250ZXh0Lm9yZ2FuaXphdGlvbklkID09PSBhc3NpZ25tZW50Lm9yZ2FuaXphdGlvbklkO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDguYHguJvguKXguIcgcGVybWlzc2lvbiBuYW1lIOC5gOC4m+C5h+C4mSBbYWN0aW9uLCBzdWJqZWN0XVxuICAgKiBGb3JtYXQ6IFwiY29ycmVzcG9uZGVuY2UuY3JlYXRlXCIg4oaSIFtcImNyZWF0ZVwiLCBcImNvcnJlc3BvbmRlbmNlXCJdXG4gICAqICAgICAgICAgXCJwcm9qZWN0LnZpZXdcIiDihpIgW1widmlld1wiLCBcInByb2plY3RcIl1cbiAgICovXG4gIHByaXZhdGUgcGFyc2VQZXJtaXNzaW9uKHBlcm1pc3Npb25OYW1lOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICAvLyBGYWxsYmFjayBmb3Igc3BlY2lhbCBwZXJtaXNzaW9ucyBsaWtlIFwic3lzdGVtLm1hbmFnZV9hbGxcIlxuICAgIGlmIChwZXJtaXNzaW9uTmFtZSA9PT0gJ3N5c3RlbS5tYW5hZ2VfYWxsJykge1xuICAgICAgcmV0dXJuIFsnbWFuYWdlJywgJ2FsbCddO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRzID0gcGVybWlzc2lvbk5hbWUuc3BsaXQoJy4nKTtcbiAgICBpZiAocGFydHMubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCBbc3ViamVjdCwgYWN0aW9uXSA9IHBhcnRzO1xuICAgICAgcmV0dXJuIFthY3Rpb24sIHN1YmplY3RdO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwZXJtaXNzaW9uIGZvcm1hdDogJHtwZXJtaXNzaW9uTmFtZX1gKTtcbiAgfVxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/71/abilityfactory_71acd4f06948161a9038ed8bb92a44d9.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/71/abilityfactory_71acd4f06948161a9038ed8bb92a44d9.map new file mode 100644 index 0000000..0abb2d6 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/71/abilityfactory_71acd4f06948161a9038ed8bb92a44d9.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\auth\\casl\\ability.factory.ts","mappings":";;;;;;;;;AAAA,2CAA4C;AAC5C,2CAAsE;AA8B/D,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB;;;;;;;OAOG;IACH,aAAa,CAAC,IAAU,EAAE,OAAqB;QAC7C,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,IAAI,wBAAc,CACvC,iBAAmC,CACpC,CAAC;QAEF,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/B,wDAAwD;YACxD,OAAO,KAAK,EAAE,CAAC;QACjB,CAAC;QAED,0CAA0C;QAC1C,0CAA0C;QAC1C,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,UAA0B,EAAE,EAAE;YACtD,kDAAkD;YAClD,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC3C,kCAAkC;gBAClC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;oBAClD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,eAAe,CAC5C,UAAU,CAAC,cAAc,CAC1B,CAAC;oBACF,GAAG,CAAC,MAAiB,EAAE,OAAmB,CAAC,CAAC;gBAC9C,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC;YACX,oDAAoD;YACpD,iBAAiB,EAAE,CAAC,IAAY,EAAE,EAAE;gBAClC,IAAI,OAAO,IAAI,KAAK,QAAQ;oBAAE,OAAO,IAAI,CAAC;gBAC1C,OAAQ,IAAgC;qBACrC,WAAkC,CAAC;YACxC,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACK,YAAY,CAClB,UAA0B,EAC1B,OAAqB;QAErB,mEAAmE;QACnE,IACE,CAAC,UAAU,CAAC,cAAc;YAC1B,CAAC,UAAU,CAAC,SAAS;YACrB,CAAC,UAAU,CAAC,UAAU,EACtB,CAAC;YACD,OAAO,IAAI,CAAC,CAAC,qCAAqC;QACpD,CAAC;QAED,0CAA0C;QAC1C,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;YAC1B,OAAO,OAAO,CAAC,UAAU,KAAK,UAAU,CAAC,UAAU,CAAC;QACtD,CAAC;QAED,yBAAyB;QACzB,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;YACzB,OAAO,OAAO,CAAC,SAAS,KAAK,UAAU,CAAC,SAAS,CAAC;QACpD,CAAC;QAED,8BAA8B;QAC9B,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;YAC9B,OAAO,OAAO,CAAC,cAAc,KAAK,UAAU,CAAC,cAAc,CAAC;QAC9D,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;OAIG;IACK,eAAe,CAAC,cAAsB;QAC5C,4DAA4D;QAC5D,IAAI,cAAc,KAAK,mBAAmB,EAAE,CAAC;YAC3C,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC3B,CAAC;QAED,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;YAChC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3B,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,8BAA8B,cAAc,EAAE,CAAC,CAAC;IAClE,CAAC;CACF,CAAA;AAtGY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;GACA,cAAc,CAsG1B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\auth\\casl\\ability.factory.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { Ability, AbilityBuilder, AbilityClass } from '@casl/ability';\nimport { User } from '../../../modules/user/entities/user.entity';\nimport { UserAssignment } from '../../../modules/user/entities/user-assignment.entity';\n\n// Define action types\nexport type Actions = 'create' | 'read' | 'update' | 'delete' | 'manage';\n\n// Define subject types (resources)\nexport type Subjects =\n | 'correspondence'\n | 'rfa'\n | 'drawing'\n | 'transmittal'\n | 'circulation'\n | 'project'\n | 'organization'\n | 'user'\n | 'role'\n | 'workflow'\n | 'all';\n\nexport type AppAbility = Ability<[Actions, Subjects]>;\n\nexport interface ScopeContext {\n organizationId?: number;\n projectId?: number;\n contractId?: number;\n}\n\n@Injectable()\nexport class AbilityFactory {\n /**\n * สร้าง Ability object สำหรับ User ในบริบทที่กำหนด\n * รองรับ 4-Level Hierarchical RBAC:\n * - Level 1: Global (no scope)\n * - Level 2: Organization\n * - Level 3: Project\n * - Level 4: Contract\n */\n createForUser(user: User, context: ScopeContext): AppAbility {\n const { can, build } = new AbilityBuilder(\n Ability as AbilityClass\n );\n\n if (!user || !user.assignments) {\n // No permissions for unauthenticated or incomplete user\n return build();\n }\n\n // Iterate through user's role assignments\n // Iterate through user's role assignments\n user.assignments.forEach((assignment: UserAssignment) => {\n // Check if assignment matches the current context\n if (this.matchesScope(assignment, context)) {\n // Grant permissions from the role\n assignment.role.permissions?.forEach((permission) => {\n const [action, subject] = this.parsePermission(\n permission.permissionName\n );\n can(action as Actions, subject as Subjects);\n });\n }\n });\n\n return build({\n // Detect subject type (for future use with objects)\n detectSubjectType: (item: object) => {\n if (typeof item === 'string') return item;\n return (item as Record)\n .constructor as unknown as Subjects;\n },\n });\n }\n\n /**\n * ตรวจสอบว่า Assignment ตรงกับ Scope Context หรือไม่\n * Hierarchical matching:\n * - Global assignment matches all contexts\n * - Organization assignment matches if org IDs match\n * - Project assignment matches if project IDs match\n * - Contract assignment matches if contract IDs match\n */\n private matchesScope(\n assignment: UserAssignment,\n context: ScopeContext\n ): boolean {\n // Level 1: Global scope (no organizationId, projectId, contractId)\n if (\n !assignment.organizationId &&\n !assignment.projectId &&\n !assignment.contractId\n ) {\n return true; // Global admin can access everything\n }\n\n // Level 4: Contract scope (most specific)\n if (assignment.contractId) {\n return context.contractId === assignment.contractId;\n }\n\n // Level 3: Project scope\n if (assignment.projectId) {\n return context.projectId === assignment.projectId;\n }\n\n // Level 2: Organization scope\n if (assignment.organizationId) {\n return context.organizationId === assignment.organizationId;\n }\n\n return false;\n }\n\n /**\n * แปลง permission name เป็น [action, subject]\n * Format: \"correspondence.create\" → [\"create\", \"correspondence\"]\n * \"project.view\" → [\"view\", \"project\"]\n */\n private parsePermission(permissionName: string): [string, string] {\n // Fallback for special permissions like \"system.manage_all\"\n if (permissionName === 'system.manage_all') {\n return ['manage', 'all'];\n }\n\n const parts = permissionName.split('.');\n if (parts.length === 2) {\n const [subject, action] = parts;\n return [action, subject];\n }\n\n throw new Error(`Invalid permission format: ${permissionName}`);\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/72/projectcontrollerspec_728cd9096ddc1d7290817f9d4949f2e0 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/72/projectcontrollerspec_728cd9096ddc1d7290817f9d4949f2e0 new file mode 100644 index 0000000..947f428 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/72/projectcontrollerspec_728cd9096ddc1d7290817f9d4949f2e0 @@ -0,0 +1,58 @@ +613056b7c57e56ac00ba0b480dd19a30 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const testing_1 = require("@nestjs/testing"); +const project_controller_1 = require("./project.controller"); +const project_service_1 = require("./project.service"); +const jwt_auth_guard_1 = require("../../common/guards/jwt-auth.guard"); +const rbac_guard_1 = require("../../common/guards/rbac.guard"); +describe('ProjectController', () => { + let controller; + let mockProjectService; + beforeEach(async () => { + mockProjectService = { + create: jest.fn(), + findAll: jest.fn(), + findOne: jest.fn(), + update: jest.fn(), + remove: jest.fn(), + findAllOrganizations: jest.fn(), + }; + const module = await testing_1.Test.createTestingModule({ + controllers: [project_controller_1.ProjectController], + providers: [ + { + provide: project_service_1.ProjectService, + useValue: mockProjectService, + }, + ], + }) + // Override guards to avoid dependency issues + .overrideGuard(jwt_auth_guard_1.JwtAuthGuard) + .useValue({ canActivate: () => true }) + .overrideGuard(rbac_guard_1.RbacGuard) + .useValue({ canActivate: () => true }) + .compile(); + controller = module.get(project_controller_1.ProjectController); + }); + it('should be defined', () => { + expect(controller).toBeDefined(); + }); + describe('findAll', () => { + it('should call projectService.findAll', async () => { + const mockResult = { data: [], meta: {} }; + mockProjectService.findAll.mockResolvedValue(mockResult); + const _result = await controller.findAll({ page: 1, limit: 10 }); + expect(mockProjectService.findAll).toHaveBeenCalled(); + }); + }); + describe('findAllOrganizations', () => { + it('should call projectService.findAllOrganizations', async () => { + const mockOrgs = [{ organization_id: 1, name: 'Test Org' }]; + mockProjectService.findAllOrganizations.mockResolvedValue(mockOrgs); + const _result = await controller.findAllOrgs(); + expect(mockProjectService.findAllOrganizations).toHaveBeenCalled(); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccHJvamVjdFxccHJvamVjdC5jb250cm9sbGVyLnNwZWMudHMiLCJtYXBwaW5ncyI6Ijs7QUFBQSw2Q0FBc0Q7QUFDdEQsNkRBQXlEO0FBQ3pELHVEQUFtRDtBQUNuRCx1RUFBa0U7QUFDbEUsK0RBQTJEO0FBRTNELFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUU7SUFDakMsSUFBSSxVQUE2QixDQUFDO0lBQ2xDLElBQUksa0JBQTJDLENBQUM7SUFFaEQsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ3BCLGtCQUFrQixHQUFHO1lBQ25CLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ2pCLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ2xCLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ2xCLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ2pCLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ2pCLG9CQUFvQixFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7U0FDaEMsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFrQixNQUFNLGNBQUksQ0FBQyxtQkFBbUIsQ0FBQztZQUMzRCxXQUFXLEVBQUUsQ0FBQyxzQ0FBaUIsQ0FBQztZQUNoQyxTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsT0FBTyxFQUFFLGdDQUFjO29CQUN2QixRQUFRLEVBQUUsa0JBQWtCO2lCQUM3QjthQUNGO1NBQ0YsQ0FBQztZQUNBLDZDQUE2QzthQUM1QyxhQUFhLENBQUMsNkJBQVksQ0FBQzthQUMzQixRQUFRLENBQUMsRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDckMsYUFBYSxDQUFDLHNCQUFTLENBQUM7YUFDeEIsUUFBUSxDQUFDLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ3JDLE9BQU8sRUFBRSxDQUFDO1FBRWIsVUFBVSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQW9CLHNDQUFpQixDQUFDLENBQUM7SUFDaEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxFQUFFO1FBQzNCLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNuQyxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO1FBQ3ZCLEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNsRCxNQUFNLFVBQVUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLGtCQUFrQixDQUFDLE9BQXFCLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFeEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUVqRSxNQUFNLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtRQUNwQyxFQUFFLENBQUMsaURBQWlELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDL0QsTUFBTSxRQUFRLEdBQUcsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDM0Qsa0JBQWtCLENBQUMsb0JBQWtDLENBQUMsaUJBQWlCLENBQ3RFLFFBQVEsQ0FDVCxDQUFDO1lBRUYsTUFBTSxPQUFPLEdBQUcsTUFBTSxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFL0MsTUFBTSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNyRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccHJvamVjdFxccHJvamVjdC5jb250cm9sbGVyLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVzdCwgVGVzdGluZ01vZHVsZSB9IGZyb20gJ0BuZXN0anMvdGVzdGluZyc7XG5pbXBvcnQgeyBQcm9qZWN0Q29udHJvbGxlciB9IGZyb20gJy4vcHJvamVjdC5jb250cm9sbGVyJztcbmltcG9ydCB7IFByb2plY3RTZXJ2aWNlIH0gZnJvbSAnLi9wcm9qZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgSnd0QXV0aEd1YXJkIH0gZnJvbSAnLi4vLi4vY29tbW9uL2d1YXJkcy9qd3QtYXV0aC5ndWFyZCc7XG5pbXBvcnQgeyBSYmFjR3VhcmQgfSBmcm9tICcuLi8uLi9jb21tb24vZ3VhcmRzL3JiYWMuZ3VhcmQnO1xuXG5kZXNjcmliZSgnUHJvamVjdENvbnRyb2xsZXInLCAoKSA9PiB7XG4gIGxldCBjb250cm9sbGVyOiBQcm9qZWN0Q29udHJvbGxlcjtcbiAgbGV0IG1vY2tQcm9qZWN0U2VydmljZTogUGFydGlhbDxQcm9qZWN0U2VydmljZT47XG5cbiAgYmVmb3JlRWFjaChhc3luYyAoKSA9PiB7XG4gICAgbW9ja1Byb2plY3RTZXJ2aWNlID0ge1xuICAgICAgY3JlYXRlOiBqZXN0LmZuKCksXG4gICAgICBmaW5kQWxsOiBqZXN0LmZuKCksXG4gICAgICBmaW5kT25lOiBqZXN0LmZuKCksXG4gICAgICB1cGRhdGU6IGplc3QuZm4oKSxcbiAgICAgIHJlbW92ZTogamVzdC5mbigpLFxuICAgICAgZmluZEFsbE9yZ2FuaXphdGlvbnM6IGplc3QuZm4oKSxcbiAgICB9O1xuXG4gICAgY29uc3QgbW9kdWxlOiBUZXN0aW5nTW9kdWxlID0gYXdhaXQgVGVzdC5jcmVhdGVUZXN0aW5nTW9kdWxlKHtcbiAgICAgIGNvbnRyb2xsZXJzOiBbUHJvamVjdENvbnRyb2xsZXJdLFxuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBQcm9qZWN0U2VydmljZSxcbiAgICAgICAgICB1c2VWYWx1ZTogbW9ja1Byb2plY3RTZXJ2aWNlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KVxuICAgICAgLy8gT3ZlcnJpZGUgZ3VhcmRzIHRvIGF2b2lkIGRlcGVuZGVuY3kgaXNzdWVzXG4gICAgICAub3ZlcnJpZGVHdWFyZChKd3RBdXRoR3VhcmQpXG4gICAgICAudXNlVmFsdWUoeyBjYW5BY3RpdmF0ZTogKCkgPT4gdHJ1ZSB9KVxuICAgICAgLm92ZXJyaWRlR3VhcmQoUmJhY0d1YXJkKVxuICAgICAgLnVzZVZhbHVlKHsgY2FuQWN0aXZhdGU6ICgpID0+IHRydWUgfSlcbiAgICAgIC5jb21waWxlKCk7XG5cbiAgICBjb250cm9sbGVyID0gbW9kdWxlLmdldDxQcm9qZWN0Q29udHJvbGxlcj4oUHJvamVjdENvbnRyb2xsZXIpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJlIGRlZmluZWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KGNvbnRyb2xsZXIpLnRvQmVEZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmaW5kQWxsJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY2FsbCBwcm9qZWN0U2VydmljZS5maW5kQWxsJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbW9ja1Jlc3VsdCA9IHsgZGF0YTogW10sIG1ldGE6IHt9IH07XG4gICAgICAobW9ja1Byb2plY3RTZXJ2aWNlLmZpbmRBbGwgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZShtb2NrUmVzdWx0KTtcblxuICAgICAgY29uc3QgX3Jlc3VsdCA9IGF3YWl0IGNvbnRyb2xsZXIuZmluZEFsbCh7IHBhZ2U6IDEsIGxpbWl0OiAxMCB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tQcm9qZWN0U2VydmljZS5maW5kQWxsKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmaW5kQWxsT3JnYW5pemF0aW9ucycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgcHJvamVjdFNlcnZpY2UuZmluZEFsbE9yZ2FuaXphdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBtb2NrT3JncyA9IFt7IG9yZ2FuaXphdGlvbl9pZDogMSwgbmFtZTogJ1Rlc3QgT3JnJyB9XTtcbiAgICAgIChtb2NrUHJvamVjdFNlcnZpY2UuZmluZEFsbE9yZ2FuaXphdGlvbnMgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZShcbiAgICAgICAgbW9ja09yZ3NcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IF9yZXN1bHQgPSBhd2FpdCBjb250cm9sbGVyLmZpbmRBbGxPcmdzKCk7XG5cbiAgICAgIGV4cGVjdChtb2NrUHJvamVjdFNlcnZpY2UuZmluZEFsbE9yZ2FuaXphdGlvbnMpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/72/projectcontrollerspec_728cd9096ddc1d7290817f9d4949f2e0.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/72/projectcontrollerspec_728cd9096ddc1d7290817f9d4949f2e0.map new file mode 100644 index 0000000..c2b5465 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/72/projectcontrollerspec_728cd9096ddc1d7290817f9d4949f2e0.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\project\\project.controller.spec.ts","mappings":";;AAAA,6CAAsD;AACtD,6DAAyD;AACzD,uDAAmD;AACnD,uEAAkE;AAClE,+DAA2D;AAE3D,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,UAA6B,CAAC;IAClC,IAAI,kBAA2C,CAAC;IAEhD,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,kBAAkB,GAAG;YACnB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;YACjB,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;YAClB,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;YAClB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;YACjB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;YACjB,oBAAoB,EAAE,IAAI,CAAC,EAAE,EAAE;SAChC,CAAC;QAEF,MAAM,MAAM,GAAkB,MAAM,cAAI,CAAC,mBAAmB,CAAC;YAC3D,WAAW,EAAE,CAAC,sCAAiB,CAAC;YAChC,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,gCAAc;oBACvB,QAAQ,EAAE,kBAAkB;iBAC7B;aACF;SACF,CAAC;YACA,6CAA6C;aAC5C,aAAa,CAAC,6BAAY,CAAC;aAC3B,QAAQ,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;aACrC,aAAa,CAAC,sBAAS,CAAC;aACxB,QAAQ,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;aACrC,OAAO,EAAE,CAAC;QAEb,UAAU,GAAG,MAAM,CAAC,GAAG,CAAoB,sCAAiB,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,UAAU,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;YACzC,kBAAkB,CAAC,OAAqB,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAExE,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YAEjE,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,QAAQ,GAAG,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YAC3D,kBAAkB,CAAC,oBAAkC,CAAC,iBAAiB,CACtE,QAAQ,CACT,CAAC;YAEF,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,CAAC;YAE/C,MAAM,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACrE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\project\\project.controller.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\nimport { ProjectController } from './project.controller';\nimport { ProjectService } from './project.service';\nimport { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';\nimport { RbacGuard } from '../../common/guards/rbac.guard';\n\ndescribe('ProjectController', () => {\n let controller: ProjectController;\n let mockProjectService: Partial;\n\n beforeEach(async () => {\n mockProjectService = {\n create: jest.fn(),\n findAll: jest.fn(),\n findOne: jest.fn(),\n update: jest.fn(),\n remove: jest.fn(),\n findAllOrganizations: jest.fn(),\n };\n\n const module: TestingModule = await Test.createTestingModule({\n controllers: [ProjectController],\n providers: [\n {\n provide: ProjectService,\n useValue: mockProjectService,\n },\n ],\n })\n // Override guards to avoid dependency issues\n .overrideGuard(JwtAuthGuard)\n .useValue({ canActivate: () => true })\n .overrideGuard(RbacGuard)\n .useValue({ canActivate: () => true })\n .compile();\n\n controller = module.get(ProjectController);\n });\n\n it('should be defined', () => {\n expect(controller).toBeDefined();\n });\n\n describe('findAll', () => {\n it('should call projectService.findAll', async () => {\n const mockResult = { data: [], meta: {} };\n (mockProjectService.findAll as jest.Mock).mockResolvedValue(mockResult);\n\n const _result = await controller.findAll({ page: 1, limit: 10 });\n\n expect(mockProjectService.findAll).toHaveBeenCalled();\n });\n });\n\n describe('findAllOrganizations', () => {\n it('should call projectService.findAllOrganizations', async () => {\n const mockOrgs = [{ organization_id: 1, name: 'Test Org' }];\n (mockProjectService.findAllOrganizations as jest.Mock).mockResolvedValue(\n mockOrgs\n );\n\n const _result = await controller.findAllOrgs();\n\n expect(mockProjectService.findAllOrganizations).toHaveBeenCalled();\n });\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/73/correspondenceservicespec_734bdcab2dfb6efde612c0805c2de895 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/73/correspondenceservicespec_734bdcab2dfb6efde612c0805c2de895 new file mode 100644 index 0000000..fd8b435 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/73/correspondenceservicespec_734bdcab2dfb6efde612c0805c2de895 @@ -0,0 +1,625 @@ +8d9fc56a57a84188bfe3664893624510 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const testing_1 = require("@nestjs/testing"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const common_1 = require("@nestjs/common"); +const correspondence_service_1 = require("./correspondence.service"); +const correspondence_entity_1 = require("./entities/correspondence.entity"); +const correspondence_revision_entity_1 = require("./entities/correspondence-revision.entity"); +const correspondence_type_entity_1 = require("./entities/correspondence-type.entity"); +const correspondence_status_entity_1 = require("./entities/correspondence-status.entity"); +const correspondence_reference_entity_1 = require("./entities/correspondence-reference.entity"); +const correspondence_tag_entity_1 = require("./entities/correspondence-tag.entity"); +const organization_entity_1 = require("../organization/entities/organization.entity"); +const correspondence_recipient_entity_1 = require("./entities/correspondence-recipient.entity"); +const correspondence_revision_attachment_entity_1 = require("./entities/correspondence-revision-attachment.entity"); +const document_numbering_service_1 = require("../document-numbering/services/document-numbering.service"); +const json_schema_service_1 = require("../json-schema/json-schema.service"); +const workflow_engine_service_1 = require("../workflow-engine/workflow-engine.service"); +const user_service_1 = require("../user/user.service"); +const search_service_1 = require("../search/search.service"); +const file_storage_service_1 = require("../../common/file-storage/file-storage.service"); +const uuid_resolver_service_1 = require("../../common/services/uuid-resolver.service"); +const notification_service_1 = require("../notification/notification.service"); +describe('CorrespondenceService', () => { + let service; + let numberingService; + let correspondenceRepo; + let revisionRepo; + let testingModule; + let _dataSource; + const createMockRepository = () => ({ + find: jest.fn(), + findOne: jest.fn(), + create: jest.fn(), + save: jest.fn(), + update: jest.fn(), + delete: jest.fn(), + softDelete: jest.fn(), + createQueryBuilder: jest.fn(() => ({ + leftJoinAndSelect: jest.fn().mockReturnThis(), + where: jest.fn().mockReturnThis(), + andWhere: jest.fn().mockReturnThis(), + orderBy: jest.fn().mockReturnThis(), + skip: jest.fn().mockReturnThis(), + take: jest.fn().mockReturnThis(), + getOne: jest.fn().mockResolvedValue(null), + getMany: jest.fn().mockResolvedValue([]), + getManyAndCount: jest.fn().mockResolvedValue([[], 0]), + })), + }); + const mockDataSource = { + createQueryRunner: jest.fn(() => ({ + connect: jest.fn(), + startTransaction: jest.fn(), + commitTransaction: jest.fn(), + rollbackTransaction: jest.fn(), + release: jest.fn(), + manager: { + create: jest.fn(), + save: jest.fn(), + findOne: jest.fn(), + }, + })), + getRepository: jest.fn(() => createMockRepository()), + manager: { + findOne: jest.fn(), + }, + }; + beforeEach(async () => { + testingModule = await testing_1.Test.createTestingModule({ + providers: [ + correspondence_service_1.CorrespondenceService, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_entity_1.Correspondence), + useValue: createMockRepository(), + }, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_revision_entity_1.CorrespondenceRevision), + useValue: createMockRepository(), + }, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_type_entity_1.CorrespondenceType), + useValue: createMockRepository(), + }, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus), + useValue: createMockRepository(), + }, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_reference_entity_1.CorrespondenceReference), + useValue: createMockRepository(), + }, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_tag_entity_1.CorrespondenceTag), + useValue: createMockRepository(), + }, + { + provide: (0, typeorm_1.getRepositoryToken)(organization_entity_1.Organization), + useValue: createMockRepository(), + }, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_recipient_entity_1.CorrespondenceRecipient), + useValue: createMockRepository(), + }, + { + provide: document_numbering_service_1.DocumentNumberingService, + useValue: { + generateNextNumber: jest.fn(), + updateNumberForDraft: jest.fn(), + previewNextNumber: jest.fn(), + }, + }, + { + provide: json_schema_service_1.JsonSchemaService, + useValue: { validate: jest.fn() }, + }, + { + provide: workflow_engine_service_1.WorkflowEngineService, + useValue: { createInstance: jest.fn() }, + }, + { + provide: user_service_1.UserService, + useValue: { + findOne: jest.fn(), + getUserPermissions: jest.fn().mockResolvedValue([]), + }, + }, + { + provide: typeorm_2.DataSource, + useValue: mockDataSource, + }, + { + provide: search_service_1.SearchService, + useValue: { indexDocument: jest.fn() }, + }, + { + provide: file_storage_service_1.FileStorageService, + useValue: { commit: jest.fn().mockResolvedValue([]) }, + }, + { + provide: uuid_resolver_service_1.UuidResolverService, + useValue: { + resolveProjectId: jest.fn().mockResolvedValue(1), + resolveOrganizationId: jest.fn().mockResolvedValue(1), + }, + }, + { + provide: notification_service_1.NotificationService, + useValue: { send: jest.fn().mockResolvedValue(undefined) }, + }, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_revision_attachment_entity_1.CorrespondenceRevisionAttachment), + useValue: createMockRepository(), + }, + ], + }).compile(); + service = testingModule.get(correspondence_service_1.CorrespondenceService); + numberingService = testingModule.get(document_numbering_service_1.DocumentNumberingService); + correspondenceRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_entity_1.Correspondence)); + revisionRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_revision_entity_1.CorrespondenceRevision)); + _dataSource = testingModule.get(typeorm_2.DataSource); + }); + it('should be defined', () => { + expect(service).toBeDefined(); + }); + describe('update', () => { + it('should allow non-draft update for org-admin+ permissions', async () => { + const mockUser = { + user_id: 1, + primaryOrganizationId: 10, + }; + const mockRevision = { + id: 100, + correspondenceId: 1, + isCurrent: true, + statusId: 23, + }; + jest + .spyOn(revisionRepo, 'findOne') + .mockResolvedValue(mockRevision); + const statusRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus)); + statusRepo.findOne.mockResolvedValue({ + id: 23, + statusCode: 'SUBOWN', + }); + const userService = testingModule.get(user_service_1.UserService); + userService.getUserPermissions.mockResolvedValue([ + 'correspondence.cancel', + ]); + jest.spyOn(correspondenceRepo, 'findOne').mockResolvedValue({ + id: 1, + publicId: 'corr-uuid-1', + correspondenceNumber: 'CORR-001', + projectId: 1, + createdAt: new Date(), + revisions: [], + }); + await expect(service.update(1, { subject: 'Updated Subject' }, mockUser)).resolves.toBeDefined(); + }); + it('should reject non-draft update for non-admin permissions', async () => { + const mockUser = { + user_id: 2, + primaryOrganizationId: 10, + }; + const mockRevision = { + id: 101, + correspondenceId: 2, + isCurrent: true, + statusId: 23, + }; + jest + .spyOn(revisionRepo, 'findOne') + .mockResolvedValue(mockRevision); + const statusRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus)); + statusRepo.findOne.mockResolvedValue({ + id: 23, + statusCode: 'SUBOWN', + }); + const userService = testingModule.get(user_service_1.UserService); + userService.getUserPermissions.mockResolvedValue([ + 'correspondence.edit', + ]); + await expect(service.update(2, { subject: 'Should Fail' }, mockUser)).rejects.toThrow(common_1.ForbiddenException); + }); + it('should NOT regenerate number if critical fields unchanged', async () => { + const mockUser = { id: 1, primaryOrganizationId: 10 }; + const mockRevision = { + id: 100, + correspondenceId: 1, + isCurrent: true, + statusId: 5, + }; + jest + .spyOn(revisionRepo, 'findOne') + .mockResolvedValue(mockRevision); + const mockCorr = { + id: 1, + projectId: 1, + correspondenceTypeId: 2, + disciplineId: 3, + originatorId: 10, + correspondenceNumber: 'OLD-NUM', + recipients: [{ recipientType: 'TO', recipientOrganizationId: 99 }], + }; + jest + .spyOn(correspondenceRepo, 'findOne') + .mockResolvedValue(mockCorr); + const updateDto = { + projectId: 1, + disciplineId: 3, + }; + await service.update(1, updateDto, mockUser); + expect(numberingService.updateNumberForDraft).not.toHaveBeenCalled(); + }); + it('should regenerate number if Project ID changes', async () => { + const mockUser = { id: 1, primaryOrganizationId: 10 }; + const mockRevision = { + id: 100, + correspondenceId: 1, + isCurrent: true, + statusId: 5, + }; + jest + .spyOn(revisionRepo, 'findOne') + .mockResolvedValue(mockRevision); + const mockCorr = { + id: 1, + projectId: 1, + correspondenceTypeId: 2, + disciplineId: 3, + originatorId: 10, + correspondenceNumber: 'OLD-NUM', + recipients: [{ recipientType: 'TO', recipientOrganizationId: 99 }], + }; + jest + .spyOn(correspondenceRepo, 'findOne') + .mockResolvedValue(mockCorr); + const updateDto = { + projectId: 2, + }; + const uuidResolver = testingModule.get(uuid_resolver_service_1.UuidResolverService); + uuidResolver.resolveProjectId.mockResolvedValue(2); + await service.update(1, updateDto, mockUser); + expect(numberingService.updateNumberForDraft).toHaveBeenCalled(); + }); + it('should regenerate number if Document Type changes', async () => { + const mockUser = { id: 1, primaryOrganizationId: 10 }; + const mockRevision = { + id: 100, + correspondenceId: 1, + isCurrent: true, + statusId: 5, + }; + jest + .spyOn(revisionRepo, 'findOne') + .mockResolvedValue(mockRevision); + const mockCorr = { + id: 1, + projectId: 1, + correspondenceTypeId: 2, + disciplineId: 3, + originatorId: 10, + correspondenceNumber: 'OLD-NUM', + recipients: [{ recipientType: 'TO', recipientOrganizationId: 99 }], + }; + jest + .spyOn(correspondenceRepo, 'findOne') + .mockResolvedValue(mockCorr); + const updateDto = { + typeId: 999, + }; + const typeRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_type_entity_1.CorrespondenceType)); + typeRepo.findOne.mockResolvedValue({ + id: 999, + typeCode: 'NEW-TYPE', + }); + await service.update(1, updateDto, mockUser); + expect(numberingService.updateNumberForDraft).toHaveBeenCalled(); + }); + it('should regenerate number if Recipient Organization changes', async () => { + const mockUser = { id: 1, primaryOrganizationId: 10 }; + const mockRevision = { + id: 100, + correspondenceId: 1, + isCurrent: true, + statusId: 5, + }; + jest + .spyOn(revisionRepo, 'findOne') + .mockResolvedValue(mockRevision); + const mockCorr = { + id: 1, + projectId: 1, + correspondenceTypeId: 2, + disciplineId: 3, + originatorId: 10, + correspondenceNumber: 'OLD-NUM', + recipients: [{ recipientType: 'TO', recipientOrganizationId: 99 }], + }; + jest + .spyOn(correspondenceRepo, 'findOne') + .mockResolvedValue(mockCorr); + // Access DataSource manager for mocking + mockDataSource.manager.findOne.mockResolvedValue({ + id: 88, + organizationCode: 'NEW-ORG', + }); + const updateDto = { + recipients: [{ type: 'TO', organizationId: 88 }], + }; + await service.update(1, updateDto, mockUser); + expect(numberingService.updateNumberForDraft).toHaveBeenCalled(); + }); + }); + describe('create', () => { + it('should allow system.manage_all user without primaryOrganizationId when originatorId is provided', async () => { + const mockUser = { + user_id: 1, + primaryOrganizationId: null, + }; + const createDto = { + projectId: 'project-uuid', + typeId: 1, + subject: 'Test Subject', + originatorId: 'originator-uuid', + recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }], + }; + const userService = testingModule.get(user_service_1.UserService); + const typeRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_type_entity_1.CorrespondenceType)); + const statusRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus)); + const uuidResolver = testingModule.get(uuid_resolver_service_1.UuidResolverService); + userService.findOne.mockResolvedValue({ + user_id: 1, + primaryOrganizationId: null, + }); + userService.getUserPermissions.mockResolvedValue([ + 'system.manage_all', + ]); + uuidResolver.resolveProjectId.mockResolvedValue(100); + uuidResolver.resolveOrganizationId.mockImplementation((value) => { + if (value === 'originator-uuid') + return 10; + if (value === 'recipient-uuid') + return 20; + return 0; + }); + typeRepo.findOne.mockResolvedValue({ + id: 1, + typeCode: 'LTR', + }); + statusRepo.findOne.mockResolvedValue({ + id: 1, + statusCode: 'DRAFT', + }); + numberingService.generateNextNumber.mockResolvedValue({ + number: 'DOC-001', + }); + mockDataSource.manager.findOne + .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' }) + .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' }); + const queryRunner = { + connect: jest.fn(), + startTransaction: jest.fn(), + commitTransaction: jest.fn(), + rollbackTransaction: jest.fn(), + release: jest.fn(), + manager: { + create: jest.fn((_entity, payload) => payload), + save: jest + .fn() + .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' }) + .mockResolvedValueOnce({ id: 1000 }) + .mockResolvedValueOnce([]), + findOne: jest.fn(), + }, + }; + mockDataSource.createQueryRunner.mockReturnValue(queryRunner); + await service.create(createDto, mockUser); + expect(queryRunner.manager.create).toHaveBeenCalledWith(correspondence_entity_1.Correspondence, expect.objectContaining({ originatorId: 10 })); + }); + it('should set revisionLabel to "A" for RFA type', async () => { + const mockUser = { + user_id: 1, + primaryOrganizationId: 10, + }; + const createDto = { + projectId: 'project-uuid', + typeId: 1, + subject: 'Test Subject', + recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }], + }; + const typeRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_type_entity_1.CorrespondenceType)); + const statusRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus)); + const uuidResolver = testingModule.get(uuid_resolver_service_1.UuidResolverService); + uuidResolver.resolveProjectId.mockResolvedValue(100); + uuidResolver.resolveOrganizationId.mockResolvedValue(20); + typeRepo.findOne.mockResolvedValue({ + id: 1, + typeCode: 'RFA', + }); + statusRepo.findOne.mockResolvedValue({ + id: 1, + statusCode: 'DRAFT', + }); + numberingService.generateNextNumber.mockResolvedValue({ + number: 'DOC-001', + }); + mockDataSource.manager.findOne + .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' }) + .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' }); + const queryRunner = { + connect: jest.fn(), + startTransaction: jest.fn(), + commitTransaction: jest.fn(), + rollbackTransaction: jest.fn(), + release: jest.fn(), + manager: { + create: jest.fn((_entity, payload) => payload), + save: jest + .fn() + .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' }) + .mockResolvedValueOnce({ id: 1000 }) + .mockResolvedValueOnce([]), + findOne: jest.fn(), + }, + }; + mockDataSource.createQueryRunner.mockReturnValue(queryRunner); + await service.create(createDto, mockUser); + expect(queryRunner.manager.create).toHaveBeenCalledWith(correspondence_revision_entity_1.CorrespondenceRevision, expect.objectContaining({ revisionLabel: 'A' })); + }); + it('should set revisionLabel to "A" for RFI type', async () => { + const mockUser = { + user_id: 1, + primaryOrganizationId: 10, + }; + const createDto = { + projectId: 'project-uuid', + typeId: 1, + subject: 'Test Subject', + recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }], + }; + const typeRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_type_entity_1.CorrespondenceType)); + const statusRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus)); + const uuidResolver = testingModule.get(uuid_resolver_service_1.UuidResolverService); + uuidResolver.resolveProjectId.mockResolvedValue(100); + uuidResolver.resolveOrganizationId.mockResolvedValue(20); + typeRepo.findOne.mockResolvedValue({ + id: 1, + typeCode: 'RFI', + }); + statusRepo.findOne.mockResolvedValue({ + id: 1, + statusCode: 'DRAFT', + }); + numberingService.generateNextNumber.mockResolvedValue({ + number: 'DOC-001', + }); + mockDataSource.manager.findOne + .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' }) + .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' }); + const queryRunner = { + connect: jest.fn(), + startTransaction: jest.fn(), + commitTransaction: jest.fn(), + rollbackTransaction: jest.fn(), + release: jest.fn(), + manager: { + create: jest.fn((_entity, payload) => payload), + save: jest + .fn() + .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' }) + .mockResolvedValueOnce({ id: 1000 }) + .mockResolvedValueOnce([]), + findOne: jest.fn(), + }, + }; + mockDataSource.createQueryRunner.mockReturnValue(queryRunner); + await service.create(createDto, mockUser); + expect(queryRunner.manager.create).toHaveBeenCalledWith(correspondence_revision_entity_1.CorrespondenceRevision, expect.objectContaining({ revisionLabel: 'A' })); + }); + it('should set revisionLabel to null for LETTER type', async () => { + const mockUser = { + user_id: 1, + primaryOrganizationId: 10, + }; + const createDto = { + projectId: 'project-uuid', + typeId: 1, + subject: 'Test Subject', + recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }], + }; + const typeRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_type_entity_1.CorrespondenceType)); + const statusRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus)); + const uuidResolver = testingModule.get(uuid_resolver_service_1.UuidResolverService); + uuidResolver.resolveProjectId.mockResolvedValue(100); + uuidResolver.resolveOrganizationId.mockResolvedValue(20); + typeRepo.findOne.mockResolvedValue({ + id: 1, + typeCode: 'LETTER', + }); + statusRepo.findOne.mockResolvedValue({ + id: 1, + statusCode: 'DRAFT', + }); + numberingService.generateNextNumber.mockResolvedValue({ + number: 'DOC-001', + }); + mockDataSource.manager.findOne + .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' }) + .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' }); + const queryRunner = { + connect: jest.fn(), + startTransaction: jest.fn(), + commitTransaction: jest.fn(), + rollbackTransaction: jest.fn(), + release: jest.fn(), + manager: { + create: jest.fn((_entity, payload) => payload), + save: jest + .fn() + .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' }) + .mockResolvedValueOnce({ id: 1000 }) + .mockResolvedValueOnce([]), + findOne: jest.fn(), + }, + }; + mockDataSource.createQueryRunner.mockReturnValue(queryRunner); + await service.create(createDto, mockUser); + expect(queryRunner.manager.create).toHaveBeenCalledWith(correspondence_revision_entity_1.CorrespondenceRevision, expect.objectContaining({ revisionLabel: undefined })); + }); + it('should set revisionLabel to undefined for MEMO type', async () => { + const mockUser = { + user_id: 1, + primaryOrganizationId: 10, + }; + const createDto = { + projectId: 'project-uuid', + typeId: 1, + subject: 'Test Subject', + recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }], + }; + const typeRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_type_entity_1.CorrespondenceType)); + const statusRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus)); + const uuidResolver = testingModule.get(uuid_resolver_service_1.UuidResolverService); + uuidResolver.resolveProjectId.mockResolvedValue(100); + uuidResolver.resolveOrganizationId.mockResolvedValue(20); + typeRepo.findOne.mockResolvedValue({ + id: 1, + typeCode: 'MEMO', + }); + statusRepo.findOne.mockResolvedValue({ + id: 1, + statusCode: 'DRAFT', + }); + numberingService.generateNextNumber.mockResolvedValue({ + number: 'DOC-001', + }); + mockDataSource.manager.findOne + .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' }) + .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' }); + const queryRunner = { + connect: jest.fn(), + startTransaction: jest.fn(), + commitTransaction: jest.fn(), + rollbackTransaction: jest.fn(), + release: jest.fn(), + manager: { + create: jest.fn((_entity, payload) => payload), + save: jest + .fn() + .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' }) + .mockResolvedValueOnce({ id: 1000 }) + .mockResolvedValueOnce([]), + findOne: jest.fn(), + }, + }; + mockDataSource.createQueryRunner.mockReturnValue(queryRunner); + await service.create(createDto, mockUser); + expect(queryRunner.manager.create).toHaveBeenCalledWith(correspondence_revision_entity_1.CorrespondenceRevision, expect.objectContaining({ revisionLabel: undefined })); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGNvcnJlc3BvbmRlbmNlLnNlcnZpY2Uuc3BlYy50cyIsIm1hcHBpbmdzIjoiOztBQUFBLDZDQUFzRDtBQUN0RCw2Q0FBcUQ7QUFDckQscUNBQWlEO0FBQ2pELDJDQUFvRDtBQUNwRCxxRUFBaUU7QUFDakUsNEVBQWtFO0FBQ2xFLDhGQUFtRjtBQUNuRixzRkFBMkU7QUFDM0UsMEZBQStFO0FBQy9FLGdHQUFxRjtBQUNyRixvRkFBeUU7QUFDekUsc0ZBQTRFO0FBQzVFLGdHQUFxRjtBQUNyRixvSEFBd0c7QUFDeEcsMEdBQXFHO0FBQ3JHLDRFQUF1RTtBQUN2RSx3RkFBbUY7QUFDbkYsdURBQW1EO0FBQ25ELDZEQUF5RDtBQUN6RCx5RkFBb0Y7QUFDcEYsdUZBQWtGO0FBQ2xGLCtFQUEyRTtBQUszRSxRQUFRLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO0lBQ3JDLElBQUksT0FBOEIsQ0FBQztJQUNuQyxJQUFJLGdCQUEwQyxDQUFDO0lBQy9DLElBQUksa0JBQThDLENBQUM7SUFDbkQsSUFBSSxZQUFnRCxDQUFDO0lBQ3JELElBQUksYUFBNEIsQ0FBQztJQUNqQyxJQUFJLFdBQXVCLENBQUM7SUFFNUIsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2YsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDbEIsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDakIsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDZixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNqQixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNqQixVQUFVLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNyQixrQkFBa0IsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFD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QzdELFdBQVcsQ0FDWixDQUFDO1lBRUYsTUFBTSxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUUxQyxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxvQkFBb0IsQ0FDckQsdURBQXNCLEVBQ3RCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUN0RCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGNvcnJlc3BvbmRlbmNlXFxjb3JyZXNwb25kZW5jZS5zZXJ2aWNlLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVzdCwgVGVzdGluZ01vZHVsZSB9IGZyb20gJ0BuZXN0anMvdGVzdGluZyc7XHJcbmltcG9ydCB7IGdldFJlcG9zaXRvcnlUb2tlbiB9IGZyb20gJ0BuZXN0anMvdHlwZW9ybSc7XHJcbmltcG9ydCB7IERhdGFTb3VyY2UsIFJlcG9zaXRvcnkgfSBmcm9tICd0eXBlb3JtJztcclxuaW1wb3J0IHsgRm9yYmlkZGVuRXhjZXB0aW9uIH0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVNlcnZpY2UgfSBmcm9tICcuL2NvcnJlc3BvbmRlbmNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZSB9IGZyb20gJy4vZW50aXRpZXMvY29ycmVzcG9uZGVuY2UuZW50aXR5JztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VSZXZpc2lvbiB9IGZyb20gJy4vZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtcmV2aXNpb24uZW50aXR5JztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VUeXBlIH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS10eXBlLmVudGl0eSc7XHJcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlU3RhdHVzIH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS1zdGF0dXMuZW50aXR5JztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VSZWZlcmVuY2UgfSBmcm9tICcuL2VudGl0aWVzL2NvcnJlc3BvbmRlbmNlLXJlZmVyZW5jZS5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVRhZyB9IGZyb20gJy4vZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtdGFnLmVudGl0eSc7XHJcbmltcG9ydCB7IE9yZ2FuaXphdGlvbiB9IGZyb20gJy4uL29yZ2FuaXphdGlvbi9lbnRpdGllcy9vcmdhbml6YXRpb24uZW50aXR5JztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VSZWNpcGllbnQgfSBmcm9tICcuL2VudGl0aWVzL2NvcnJlc3BvbmRlbmNlLXJlY2lwaWVudC5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJldmlzaW9uQXR0YWNobWVudCB9IGZyb20gJy4vZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtcmV2aXNpb24tYXR0YWNobWVudC5lbnRpdHknO1xyXG5pbXBvcnQgeyBEb2N1bWVudE51bWJlcmluZ1NlcnZpY2UgfSBmcm9tICcuLi9kb2N1bWVudC1udW1iZXJpbmcvc2VydmljZXMvZG9jdW1lbnQtbnVtYmVyaW5nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBKc29uU2NoZW1hU2VydmljZSB9IGZyb20gJy4uL2pzb24tc2NoZW1hL2pzb24tc2NoZW1hLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBXb3JrZmxvd0VuZ2luZVNlcnZpY2UgfSBmcm9tICcuLi93b3JrZmxvdy1lbmdpbmUvd29ya2Zsb3ctZW5naW5lLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uL3VzZXIvdXNlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2VhcmNoU2VydmljZSB9IGZyb20gJy4uL3NlYXJjaC9zZWFyY2guc2VydmljZSc7XHJcbmltcG9ydCB7IEZpbGVTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9maWxlLXN0b3JhZ2UvZmlsZS1zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVdWlkUmVzb2x2ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uL3NlcnZpY2VzL3V1aWQtcmVzb2x2ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVcGRhdGVDb3JyZXNwb25kZW5jZUR0byB9IGZyb20gJy4vZHRvL3VwZGF0ZS1jb3JyZXNwb25kZW5jZS5kdG8nO1xyXG5pbXBvcnQgeyBDcmVhdGVDb3JyZXNwb25kZW5jZUR0byB9IGZyb20gJy4vZHRvL2NyZWF0ZS1jb3JyZXNwb25kZW5jZS5kdG8nO1xyXG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vdXNlci9lbnRpdGllcy91c2VyLmVudGl0eSc7XHJcblxyXG5kZXNjcmliZSgnQ29ycmVzcG9uZGVuY2VTZXJ2aWNlJywgKCkgPT4ge1xyXG4gIGxldCBzZXJ2aWNlOiBDb3JyZXNwb25kZW5jZVNlcnZpY2U7XHJcbiAgbGV0IG51bWJlcmluZ1NlcnZpY2U6IERvY3VtZW50TnVtYmVyaW5nU2VydmljZTtcclxuICBsZXQgY29ycmVzcG9uZGVuY2VSZXBvOiBSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlPjtcclxuICBsZXQgcmV2aXNpb25SZXBvOiBSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlUmV2aXNpb24+O1xyXG4gIGxldCB0ZXN0aW5nTW9kdWxlOiBUZXN0aW5nTW9kdWxlO1xyXG4gIGxldCBfZGF0YVNvdXJjZTogRGF0YVNvdXJjZTtcclxuXHJcbiAgY29uc3QgY3JlYXRlTW9ja1JlcG9zaXRvcnkgPSAoKSA9PiAoe1xyXG4gICAgZmluZDogamVzdC5mbigpLFxyXG4gICAgZmluZE9uZTogamVzdC5mbigpLFxyXG4gICAgY3JlYXRlOiBqZXN0LmZuKCksXHJcbiAgICBzYXZlOiBqZXN0LmZuKCksXHJcbiAgICB1cGRhdGU6IGplc3QuZm4oKSxcclxuICAgIGRlbGV0ZTogamVzdC5mbigpLFxyXG4gICAgc29mdERlbGV0ZTogamVzdC5mbigpLFxyXG4gICAgY3JlYXRlUXVlcnlCdWlsZGVyOiBqZXN0LmZuKCgpID0+ICh7XHJcbiAgICAgIGxlZnRKb2luQW5kU2VsZWN0OiBqZXN0LmZuKCkubW9ja1JldHVyblRoaXMoKSxcclxuICAgICAgd2hlcmU6IGplc3QuZm4oKS5tb2NrUmV0dXJuVGhpcygpLFxyXG4gICAgICBhbmRXaGVyZTogamVzdC5mbigpLm1vY2tSZXR1cm5UaGlzKCksXHJcbiAgICAgIG9yZGVyQnk6IGplc3QuZm4oKS5tb2NrUmV0dXJuVGhpcygpLFxyXG4gICAgICBza2lwOiBqZXN0LmZuKCkubW9ja1JldHVyblRoaXMoKSxcclxuICAgICAgdGFrZTogamVzdC5mbigpLm1vY2tSZXR1cm5UaGlzKCksXHJcbiAgICAgIGdldE9uZTogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKG51bGwpLFxyXG4gICAgICBnZXRNYW55OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoW10pLFxyXG4gICAgICBnZXRNYW55QW5kQ291bnQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShbW10sIDBdKSxcclxuICAgIH0pKSxcclxuICB9KTtcclxuXHJcbiAgY29uc3QgbW9ja0RhdGFTb3VyY2UgPSB7XHJcbiAgICBjcmVhdGVRdWVyeVJ1bm5lcjogamVzdC5mbigoKSA9PiAoe1xyXG4gICAgICBjb25uZWN0OiBqZXN0LmZuKCksXHJcbiAgICAgIHN0YXJ0VHJhbnNhY3Rpb246IGplc3QuZm4oKSxcclxuICAgICAgY29tbWl0VHJhbnNhY3Rpb246IGplc3QuZm4oKSxcclxuICAgICAgcm9sbGJhY2tUcmFuc2FjdGlvbjogamVzdC5mbigpLFxyXG4gICAgICByZWxlYXNlOiBqZXN0LmZuKCksXHJcbiAgICAgIG1hbmFnZXI6IHtcclxuICAgICAgICBjcmVhdGU6IGplc3QuZm4oKSxcclxuICAgICAgICBzYXZlOiBqZXN0LmZuKCksXHJcbiAgICAgICAgZmluZE9uZTogamVzdC5mbigpLFxyXG4gICAgICB9LFxyXG4gICAgfSkpLFxyXG4gICAgZ2V0UmVwb3NpdG9yeTogamVzdC5mbigoKSA9PiBjcmVhdGVNb2NrUmVwb3NpdG9yeSgpKSxcclxuICAgIG1hbmFnZXI6IHtcclxuICAgICAgZmluZE9uZTogamVzdC5mbigpLFxyXG4gICAgfSxcclxuICB9O1xyXG5cclxuICBiZWZvcmVFYWNoKGFzeW5jICgpID0+IHtcclxuICAgIHRlc3RpbmdNb2R1bGUgPSBhd2FpdCBUZXN0LmNyZWF0ZVRlc3RpbmdNb2R1bGUoe1xyXG4gICAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICBDb3JyZXNwb25kZW5jZVNlcnZpY2UsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlKSxcclxuICAgICAgICAgIHVzZVZhbHVlOiBjcmVhdGVNb2NrUmVwb3NpdG9yeSgpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlUmV2aXNpb24pLFxyXG4gICAgICAgICAgdXNlVmFsdWU6IGNyZWF0ZU1vY2tSZXBvc2l0b3J5KCksXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm92aWRlOiBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VUeXBlKSxcclxuICAgICAgICAgIHVzZVZhbHVlOiBjcmVhdGVNb2NrUmVwb3NpdG9yeSgpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlU3RhdHVzKSxcclxuICAgICAgICAgIHVzZVZhbHVlOiBjcmVhdGVNb2NrUmVwb3NpdG9yeSgpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlUmVmZXJlbmNlKSxcclxuICAgICAgICAgIHVzZVZhbHVlOiBjcmVhdGVNb2NrUmVwb3NpdG9yeSgpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlVGFnKSxcclxuICAgICAgICAgIHVzZVZhbHVlOiBjcmVhdGVNb2NrUmVwb3NpdG9yeSgpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogZ2V0UmVwb3NpdG9yeVRva2VuKE9yZ2FuaXphdGlvbiksXHJcbiAgICAgICAgICB1c2VWYWx1ZTogY3JlYXRlTW9ja1JlcG9zaXRvcnkoKSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHByb3ZpZGU6IGdldFJlcG9zaXRvcnlUb2tlbihDb3JyZXNwb25kZW5jZVJlY2lwaWVudCksXHJcbiAgICAgICAgICB1c2VWYWx1ZTogY3JlYXRlTW9ja1JlcG9zaXRvcnkoKSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHByb3ZpZGU6IERvY3VtZW50TnVtYmVyaW5nU2VydmljZSxcclxuICAgICAgICAgIHVzZVZhbHVlOiB7XHJcbiAgICAgICAgICAgIGdlbmVyYXRlTmV4dE51bWJlcjogamVzdC5mbigpLFxyXG4gICAgICAgICAgICB1cGRhdGVOdW1iZXJGb3JEcmFmdDogamVzdC5mbigpLFxyXG4gICAgICAgICAgICBwcmV2aWV3TmV4dE51bWJlcjogamVzdC5mbigpLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHByb3ZpZGU6IEpzb25TY2hlbWFTZXJ2aWNlLFxyXG4gICAgICAgICAgdXNlVmFsdWU6IHsgdmFsaWRhdGU6IGplc3QuZm4oKSB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogV29ya2Zsb3dFbmdpbmVTZXJ2aWNlLFxyXG4gICAgICAgICAgdXNlVmFsdWU6IHsgY3JlYXRlSW5zdGFuY2U6IGplc3QuZm4oKSB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogVXNlclNlcnZpY2UsXHJcbiAgICAgICAgICB1c2VWYWx1ZToge1xyXG4gICAgICAgICAgICBmaW5kT25lOiBqZXN0LmZuKCksXHJcbiAgICAgICAgICAgIGdldFVzZXJQZXJtaXNzaW9uczogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKFtdKSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm92aWRlOiBEYXRhU291cmNlLFxyXG4gICAgICAgICAgdXNlVmFsdWU6IG1vY2tEYXRhU291cmNlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogU2VhcmNoU2VydmljZSxcclxuICAgICAgICAgIHVzZVZhbHVlOiB7IGluZGV4RG9jdW1lbnQ6IGplc3QuZm4oKSB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogRmlsZVN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgICAgICAgdXNlVmFsdWU6IHsgY29tbWl0OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoW10pIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm92aWRlOiBVdWlkUmVzb2x2ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgdXNlVmFsdWU6IHtcclxuICAgICAgICAgICAgcmVzb2x2ZVByb2plY3RJZDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKDEpLFxyXG4gICAgICAgICAgICByZXNvbHZlT3JnYW5pemF0aW9uSWQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSgxKSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm92aWRlOiBOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgICAgICAgdXNlVmFsdWU6IHsgc2VuZDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZCkgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHByb3ZpZGU6IGdldFJlcG9zaXRvcnlUb2tlbihDb3JyZXNwb25kZW5jZVJldmlzaW9uQXR0YWNobWVudCksXHJcbiAgICAgICAgICB1c2VWYWx1ZTogY3JlYXRlTW9ja1JlcG9zaXRvcnkoKSxcclxuICAgICAgICB9LFxyXG4gICAgICBdLFxyXG4gICAgfSkuY29tcGlsZSgpO1xyXG5cclxuICAgIHNlcnZpY2UgPSB0ZXN0aW5nTW9kdWxlLmdldDxDb3JyZXNwb25kZW5jZVNlcnZpY2U+KENvcnJlc3BvbmRlbmNlU2VydmljZSk7XHJcbiAgICBudW1iZXJpbmdTZXJ2aWNlID0gdGVzdGluZ01vZHVsZS5nZXQ8RG9jdW1lbnROdW1iZXJpbmdTZXJ2aWNlPihcclxuICAgICAgRG9jdW1lbnROdW1iZXJpbmdTZXJ2aWNlXHJcbiAgICApO1xyXG4gICAgY29ycmVzcG9uZGVuY2VSZXBvID0gdGVzdGluZ01vZHVsZS5nZXQ8UmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZT4+KFxyXG4gICAgICBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2UpXHJcbiAgICApO1xyXG4gICAgcmV2aXNpb25SZXBvID0gdGVzdGluZ01vZHVsZS5nZXQ8UmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZVJldmlzaW9uPj4oXHJcbiAgICAgIGdldFJlcG9zaXRvcnlUb2tlbihDb3JyZXNwb25kZW5jZVJldmlzaW9uKVxyXG4gICAgKTtcclxuICAgIF9kYXRhU291cmNlID0gdGVzdGluZ01vZHVsZS5nZXQ8RGF0YVNvdXJjZT4oRGF0YVNvdXJjZSk7XHJcbiAgfSk7XHJcblxyXG4gIGl0KCdzaG91bGQgYmUgZGVmaW5lZCcsICgpID0+IHtcclxuICAgIGV4cGVjdChzZXJ2aWNlKS50b0JlRGVmaW5lZCgpO1xyXG4gIH0pO1xyXG5cclxuICBkZXNjcmliZSgndXBkYXRlJywgKCkgPT4ge1xyXG4gICAgaXQoJ3Nob3VsZCBhbGxvdyBub24tZHJhZnQgdXBkYXRlIGZvciBvcmctYWRtaW4rIHBlcm1pc3Npb25zJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBtb2NrVXNlciA9IHtcclxuICAgICAgICB1c2VyX2lkOiAxLFxyXG4gICAgICAgIHByaW1hcnlPcmdhbml6YXRpb25JZDogMTAsXHJcbiAgICAgIH0gYXMgdW5rbm93biBhcyBVc2VyO1xyXG4gICAgICBjb25zdCBtb2NrUmV2aXNpb24gPSB7XHJcbiAgICAgICAgaWQ6IDEwMCxcclxuICAgICAgICBjb3JyZXNwb25kZW5jZUlkOiAxLFxyXG4gICAgICAgIGlzQ3VycmVudDogdHJ1ZSxcclxuICAgICAgICBzdGF0dXNJZDogMjMsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBqZXN0XHJcbiAgICAgICAgLnNweU9uKHJldmlzaW9uUmVwbywgJ2ZpbmRPbmUnKVxyXG4gICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZShtb2NrUmV2aXNpb24gYXMgdW5rbm93biBhcyBDb3JyZXNwb25kZW5jZVJldmlzaW9uKTtcclxuXHJcbiAgICAgIGNvbnN0IHN0YXR1c1JlcG8gPSB0ZXN0aW5nTW9kdWxlLmdldDxSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlU3RhdHVzPj4oXHJcbiAgICAgICAgZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlU3RhdHVzKVxyXG4gICAgICApO1xyXG4gICAgICAoc3RhdHVzUmVwby5maW5kT25lIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoe1xyXG4gICAgICAgIGlkOiAyMyxcclxuICAgICAgICBzdGF0dXNDb2RlOiAnU1VCT1dOJyxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCB1c2VyU2VydmljZSA9IHRlc3RpbmdNb2R1bGUuZ2V0PFVzZXJTZXJ2aWNlPihVc2VyU2VydmljZSk7XHJcbiAgICAgICh1c2VyU2VydmljZS5nZXRVc2VyUGVybWlzc2lvbnMgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZShbXHJcbiAgICAgICAgJ2NvcnJlc3BvbmRlbmNlLmNhbmNlbCcsXHJcbiAgICAgIF0pO1xyXG5cclxuICAgICAgamVzdC5zcHlPbihjb3JyZXNwb25kZW5jZVJlcG8sICdmaW5kT25lJykubW9ja1Jlc29sdmVkVmFsdWUoe1xyXG4gICAgICAgIGlkOiAxLFxyXG4gICAgICAgIHB1YmxpY0lkOiAnY29yci11dWlkLTEnLFxyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlTnVtYmVyOiAnQ09SUi0wMDEnLFxyXG4gICAgICAgIHByb2plY3RJZDogMSxcclxuICAgICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCksXHJcbiAgICAgICAgcmV2aXNpb25zOiBbXSxcclxuICAgICAgfSBhcyB1bmtub3duIGFzIENvcnJlc3BvbmRlbmNlKTtcclxuXHJcbiAgICAgIGF3YWl0IGV4cGVjdChcclxuICAgICAgICBzZXJ2aWNlLnVwZGF0ZSgxLCB7IHN1YmplY3Q6ICdVcGRhdGVkIFN1YmplY3QnIH0sIG1vY2tVc2VyKVxyXG4gICAgICApLnJlc29sdmVzLnRvQmVEZWZpbmVkKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnc2hvdWxkIHJlamVjdCBub24tZHJhZnQgdXBkYXRlIGZvciBub24tYWRtaW4gcGVybWlzc2lvbnMnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1vY2tVc2VyID0ge1xyXG4gICAgICAgIHVzZXJfaWQ6IDIsXHJcbiAgICAgICAgcHJpbWFyeU9yZ2FuaXphdGlvbklkOiAxMCxcclxuICAgICAgfSBhcyB1bmtub3duIGFzIFVzZXI7XHJcbiAgICAgIGNvbnN0IG1vY2tSZXZpc2lvbiA9IHtcclxuICAgICAgICBpZDogMTAxLFxyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlSWQ6IDIsXHJcbiAgICAgICAgaXNDdXJyZW50OiB0cnVlLFxyXG4gICAgICAgIHN0YXR1c0lkOiAyMyxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGplc3RcclxuICAgICAgICAuc3B5T24ocmV2aXNpb25SZXBvLCAnZmluZE9uZScpXHJcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tSZXZpc2lvbiBhcyB1bmtub3duIGFzIENvcnJlc3BvbmRlbmNlUmV2aXNpb24pO1xyXG5cclxuICAgICAgY29uc3Qgc3RhdHVzUmVwbyA9IHRlc3RpbmdNb2R1bGUuZ2V0PFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VTdGF0dXM+PihcclxuICAgICAgICBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VTdGF0dXMpXHJcbiAgICAgICk7XHJcbiAgICAgIChzdGF0dXNSZXBvLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgaWQ6IDIzLFxyXG4gICAgICAgIHN0YXR1c0NvZGU6ICdTVUJPV04nLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IHVzZXJTZXJ2aWNlID0gdGVzdGluZ01vZHVsZS5nZXQ8VXNlclNlcnZpY2U+KFVzZXJTZXJ2aWNlKTtcclxuICAgICAgKHVzZXJTZXJ2aWNlLmdldFVzZXJQZXJtaXNzaW9ucyBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKFtcclxuICAgICAgICAnY29ycmVzcG9uZGVuY2UuZWRpdCcsXHJcbiAgICAgIF0pO1xyXG5cclxuICAgICAgYXdhaXQgZXhwZWN0KFxyXG4gICAgICAgIHNlcnZpY2UudXBkYXRlKDIsIHsgc3ViamVjdDogJ1Nob3VsZCBGYWlsJyB9LCBtb2NrVXNlcilcclxuICAgICAgKS5yZWplY3RzLnRvVGhyb3coRm9yYmlkZGVuRXhjZXB0aW9uKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdzaG91bGQgTk9UIHJlZ2VuZXJhdGUgbnVtYmVyIGlmIGNyaXRpY2FsIGZpZWxkcyB1bmNoYW5nZWQnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1vY2tVc2VyID0geyBpZDogMSwgcHJpbWFyeU9yZ2FuaXphdGlvbklkOiAxMCB9IGFzIHVua25vd24gYXMgVXNlcjtcclxuICAgICAgY29uc3QgbW9ja1JldmlzaW9uID0ge1xyXG4gICAgICAgIGlkOiAxMDAsXHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VJZDogMSxcclxuICAgICAgICBpc0N1cnJlbnQ6IHRydWUsXHJcbiAgICAgICAgc3RhdHVzSWQ6IDUsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBqZXN0XHJcbiAgICAgICAgLnNweU9uKHJldmlzaW9uUmVwbywgJ2ZpbmRPbmUnKVxyXG4gICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZShtb2NrUmV2aXNpb24gYXMgdW5rbm93biBhcyBDb3JyZXNwb25kZW5jZVJldmlzaW9uKTtcclxuXHJcbiAgICAgIGNvbnN0IG1vY2tDb3JyID0ge1xyXG4gICAgICAgIGlkOiAxLFxyXG4gICAgICAgIHByb2plY3RJZDogMSxcclxuICAgICAgICBjb3JyZXNwb25kZW5jZVR5cGVJZDogMixcclxuICAgICAgICBkaXNjaXBsaW5lSWQ6IDMsXHJcbiAgICAgICAgb3JpZ2luYXRvcklkOiAxMCxcclxuICAgICAgICBjb3JyZXNwb25kZW5jZU51bWJlcjogJ09MRC1OVU0nLFxyXG4gICAgICAgIHJlY2lwaWVudHM6IFt7IHJlY2lwaWVudFR5cGU6ICdUTycsIHJlY2lwaWVudE9yZ2FuaXphdGlvbklkOiA5OSB9XSxcclxuICAgICAgfTtcclxuICAgICAgamVzdFxyXG4gICAgICAgIC5zcHlPbihjb3JyZXNwb25kZW5jZVJlcG8sICdmaW5kT25lJylcclxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWUobW9ja0NvcnIgYXMgdW5rbm93biBhcyBDb3JyZXNwb25kZW5jZSk7XHJcblxyXG4gICAgICBjb25zdCB1cGRhdGVEdG86IFVwZGF0ZUNvcnJlc3BvbmRlbmNlRHRvID0ge1xyXG4gICAgICAgIHByb2plY3RJZDogMSxcclxuICAgICAgICBkaXNjaXBsaW5lSWQ6IDMsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzZXJ2aWNlLnVwZGF0ZSgxLCB1cGRhdGVEdG8sIG1vY2tVc2VyKTtcclxuXHJcbiAgICAgIGV4cGVjdChcclxuICAgICAgICBudW1iZXJpbmdTZXJ2aWNlLnVwZGF0ZU51bWJlckZvckRyYWZ0IGFzIGplc3QuTW9ja1xyXG4gICAgICApLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnc2hvdWxkIHJlZ2VuZXJhdGUgbnVtYmVyIGlmIFByb2plY3QgSUQgY2hhbmdlcycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgbW9ja1VzZXIgPSB7IGlkOiAxLCBwcmltYXJ5T3JnYW5pemF0aW9uSWQ6IDEwIH0gYXMgdW5rbm93biBhcyBVc2VyO1xyXG4gICAgICBjb25zdCBtb2NrUmV2aXNpb24gPSB7XHJcbiAgICAgICAgaWQ6IDEwMCxcclxuICAgICAgICBjb3JyZXNwb25kZW5jZUlkOiAxLFxyXG4gICAgICAgIGlzQ3VycmVudDogdHJ1ZSxcclxuICAgICAgICBzdGF0dXNJZDogNSxcclxuICAgICAgfTtcclxuICAgICAgamVzdFxyXG4gICAgICAgIC5zcHlPbihyZXZpc2lvblJlcG8sICdmaW5kT25lJylcclxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWUobW9ja1JldmlzaW9uIGFzIHVua25vd24gYXMgQ29ycmVzcG9uZGVuY2VSZXZpc2lvbik7XHJcblxyXG4gICAgICBjb25zdCBtb2NrQ29yciA9IHtcclxuICAgICAgICBpZDogMSxcclxuICAgICAgICBwcm9qZWN0SWQ6IDEsXHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VUeXBlSWQ6IDIsXHJcbiAgICAgICAgZGlzY2lwbGluZUlkOiAzLFxyXG4gICAgICAgIG9yaWdpbmF0b3JJZDogMTAsXHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VOdW1iZXI6ICdPTEQtTlVNJyxcclxuICAgICAgICByZWNpcGllbnRzOiBbeyByZWNpcGllbnRUeXBlOiAnVE8nLCByZWNpcGllbnRPcmdhbml6YXRpb25JZDogOTkgfV0sXHJcbiAgICAgIH07XHJcbiAgICAgIGplc3RcclxuICAgICAgICAuc3B5T24oY29ycmVzcG9uZGVuY2VSZXBvLCAnZmluZE9uZScpXHJcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tDb3JyIGFzIHVua25vd24gYXMgQ29ycmVzcG9uZGVuY2UpO1xyXG5cclxuICAgICAgY29uc3QgdXBkYXRlRHRvOiBVcGRhdGVDb3JyZXNwb25kZW5jZUR0byA9IHtcclxuICAgICAgICBwcm9qZWN0SWQ6IDIsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCB1dWlkUmVzb2x2ZXIgPVxyXG4gICAgICAgIHRlc3RpbmdNb2R1bGUuZ2V0PFV1aWRSZXNvbHZlclNlcnZpY2U+KFV1aWRSZXNvbHZlclNlcnZpY2UpO1xyXG4gICAgICAodXVpZFJlc29sdmVyLnJlc29sdmVQcm9qZWN0SWQgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSgyKTtcclxuXHJcbiAgICAgIGF3YWl0IHNlcnZpY2UudXBkYXRlKDEsIHVwZGF0ZUR0bywgbW9ja1VzZXIpO1xyXG5cclxuICAgICAgZXhwZWN0KFxyXG4gICAgICAgIG51bWJlcmluZ1NlcnZpY2UudXBkYXRlTnVtYmVyRm9yRHJhZnQgYXMgamVzdC5Nb2NrXHJcbiAgICAgICkudG9IYXZlQmVlbkNhbGxlZCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ3Nob3VsZCByZWdlbmVyYXRlIG51bWJlciBpZiBEb2N1bWVudCBUeXBlIGNoYW5nZXMnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1vY2tVc2VyID0geyBpZDogMSwgcHJpbWFyeU9yZ2FuaXphdGlvbklkOiAxMCB9IGFzIHVua25vd24gYXMgVXNlcjtcclxuICAgICAgY29uc3QgbW9ja1JldmlzaW9uID0ge1xyXG4gICAgICAgIGlkOiAxMDAsXHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VJZDogMSxcclxuICAgICAgICBpc0N1cnJlbnQ6IHRydWUsXHJcbiAgICAgICAgc3RhdHVzSWQ6IDUsXHJcbiAgICAgIH07XHJcbiAgICAgIGplc3RcclxuICAgICAgICAuc3B5T24ocmV2aXNpb25SZXBvLCAnZmluZE9uZScpXHJcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tSZXZpc2lvbiBhcyB1bmtub3duIGFzIENvcnJlc3BvbmRlbmNlUmV2aXNpb24pO1xyXG5cclxuICAgICAgY29uc3QgbW9ja0NvcnIgPSB7XHJcbiAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgcHJvamVjdElkOiAxLFxyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlVHlwZUlkOiAyLFxyXG4gICAgICAgIGRpc2NpcGxpbmVJZDogMyxcclxuICAgICAgICBvcmlnaW5hdG9ySWQ6IDEwLFxyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlTnVtYmVyOiAnT0xELU5VTScsXHJcbiAgICAgICAgcmVjaXBpZW50czogW3sgcmVjaXBpZW50VHlwZTogJ1RPJywgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQ6IDk5IH1dLFxyXG4gICAgICB9O1xyXG4gICAgICBqZXN0XHJcbiAgICAgICAgLnNweU9uKGNvcnJlc3BvbmRlbmNlUmVwbywgJ2ZpbmRPbmUnKVxyXG4gICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZShtb2NrQ29yciBhcyB1bmtub3duIGFzIENvcnJlc3BvbmRlbmNlKTtcclxuXHJcbiAgICAgIGNvbnN0IHVwZGF0ZUR0bzogVXBkYXRlQ29ycmVzcG9uZGVuY2VEdG8gPSB7XHJcbiAgICAgICAgdHlwZUlkOiA5OTksXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCB0eXBlUmVwbyA9IHRlc3RpbmdNb2R1bGUuZ2V0PFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VUeXBlPj4oXHJcbiAgICAgICAgZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlVHlwZSlcclxuICAgICAgKTtcclxuICAgICAgKHR5cGVSZXBvLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgaWQ6IDk5OSxcclxuICAgICAgICB0eXBlQ29kZTogJ05FVy1UWVBFJyxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBhd2FpdCBzZXJ2aWNlLnVwZGF0ZSgxLCB1cGRhdGVEdG8sIG1vY2tVc2VyKTtcclxuXHJcbiAgICAgIGV4cGVjdChcclxuICAgICAgICBudW1iZXJpbmdTZXJ2aWNlLnVwZGF0ZU51bWJlckZvckRyYWZ0IGFzIGplc3QuTW9ja1xyXG4gICAgICApLnRvSGF2ZUJlZW5DYWxsZWQoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdzaG91bGQgcmVnZW5lcmF0ZSBudW1iZXIgaWYgUmVjaXBpZW50IE9yZ2FuaXphdGlvbiBjaGFuZ2VzJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBtb2NrVXNlciA9IHsgaWQ6IDEsIHByaW1hcnlPcmdhbml6YXRpb25JZDogMTAgfSBhcyB1bmtub3duIGFzIFVzZXI7XHJcbiAgICAgIGNvbnN0IG1vY2tSZXZpc2lvbiA9IHtcclxuICAgICAgICBpZDogMTAwLFxyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlSWQ6IDEsXHJcbiAgICAgICAgaXNDdXJyZW50OiB0cnVlLFxyXG4gICAgICAgIHN0YXR1c0lkOiA1LFxyXG4gICAgICB9O1xyXG4gICAgICBqZXN0XHJcbiAgICAgICAgLnNweU9uKHJldmlzaW9uUmVwbywgJ2ZpbmRPbmUnKVxyXG4gICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZShtb2NrUmV2aXNpb24gYXMgdW5rbm93biBhcyBDb3JyZXNwb25kZW5jZVJldmlzaW9uKTtcclxuXHJcbiAgICAgIGNvbnN0IG1vY2tDb3JyID0ge1xyXG4gICAgICAgIGlkOiAxLFxyXG4gICAgICAgIHByb2plY3RJZDogMSxcclxuICAgICAgICBjb3JyZXNwb25kZW5jZVR5cGVJZDogMixcclxuICAgICAgICBkaXNjaXBsaW5lSWQ6IDMsXHJcbiAgICAgICAgb3JpZ2luYXRvcklkOiAxMCxcclxuICAgICAgICBjb3JyZXNwb25kZW5jZU51bWJlcjogJ09MRC1OVU0nLFxyXG4gICAgICAgIHJlY2lwaWVudHM6IFt7IHJlY2lwaWVudFR5cGU6ICdUTycsIHJlY2lwaWVudE9yZ2FuaXphdGlvbklkOiA5OSB9XSxcclxuICAgICAgfTtcclxuICAgICAgamVzdFxyXG4gICAgICAgIC5zcHlPbihjb3JyZXNwb25kZW5jZVJlcG8sICdmaW5kT25lJylcclxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWUobW9ja0NvcnIgYXMgdW5rbm93biBhcyBDb3JyZXNwb25kZW5jZSk7XHJcblxyXG4gICAgICAvLyBBY2Nlc3MgRGF0YVNvdXJjZSBtYW5hZ2VyIGZvciBtb2NraW5nXHJcbiAgICAgIG1vY2tEYXRhU291cmNlLm1hbmFnZXIuZmluZE9uZS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgaWQ6IDg4LFxyXG4gICAgICAgIG9yZ2FuaXphdGlvbkNvZGU6ICdORVctT1JHJyxcclxuICAgICAgfSBhcyB1bmtub3duIGFzIE9yZ2FuaXphdGlvbik7XHJcblxyXG4gICAgICBjb25zdCB1cGRhdGVEdG86IFVwZGF0ZUNvcnJlc3BvbmRlbmNlRHRvID0ge1xyXG4gICAgICAgIHJlY2lwaWVudHM6IFt7IHR5cGU6ICdUTycsIG9yZ2FuaXphdGlvbklkOiA4OCB9XSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGF3YWl0IHNlcnZpY2UudXBkYXRlKDEsIHVwZGF0ZUR0bywgbW9ja1VzZXIpO1xyXG5cclxuICAgICAgZXhwZWN0KFxyXG4gICAgICAgIG51bWJlcmluZ1NlcnZpY2UudXBkYXRlTnVtYmVyRm9yRHJhZnQgYXMgamVzdC5Nb2NrXHJcbiAgICAgICkudG9IYXZlQmVlbkNhbGxlZCgpO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcblxyXG4gIGRlc2NyaWJlKCdjcmVhdGUnLCAoKSA9PiB7XHJcbiAgICBpdCgnc2hvdWxkIGFsbG93IHN5c3RlbS5tYW5hZ2VfYWxsIHVzZXIgd2l0aG91dCBwcmltYXJ5T3JnYW5pemF0aW9uSWQgd2hlbiBvcmlnaW5hdG9ySWQgaXMgcHJvdmlkZWQnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1vY2tVc2VyID0ge1xyXG4gICAgICAgIHVzZXJfaWQ6IDEsXHJcbiAgICAgICAgcHJpbWFyeU9yZ2FuaXphdGlvbklkOiBudWxsLFxyXG4gICAgICB9IGFzIHVua25vd24gYXMgVXNlcjtcclxuXHJcbiAgICAgIGNvbnN0IGNyZWF0ZUR0bzogQ3JlYXRlQ29ycmVzcG9uZGVuY2VEdG8gPSB7XHJcbiAgICAgICAgcHJvamVjdElkOiAncHJvamVjdC11dWlkJyxcclxuICAgICAgICB0eXBlSWQ6IDEsXHJcbiAgICAgICAgc3ViamVjdDogJ1Rlc3QgU3ViamVjdCcsXHJcbiAgICAgICAgb3JpZ2luYXRvcklkOiAnb3JpZ2luYXRvci11dWlkJyxcclxuICAgICAgICByZWNpcGllbnRzOiBbeyBvcmdhbml6YXRpb25JZDogJ3JlY2lwaWVudC11dWlkJywgdHlwZTogJ1RPJyB9XSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHVzZXJTZXJ2aWNlID0gdGVzdGluZ01vZHVsZS5nZXQ8VXNlclNlcnZpY2U+KFVzZXJTZXJ2aWNlKTtcclxuICAgICAgY29uc3QgdHlwZVJlcG8gPSB0ZXN0aW5nTW9kdWxlLmdldDxSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlVHlwZT4+KFxyXG4gICAgICAgIGdldFJlcG9zaXRvcnlUb2tlbihDb3JyZXNwb25kZW5jZVR5cGUpXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IHN0YXR1c1JlcG8gPSB0ZXN0aW5nTW9kdWxlLmdldDxSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlU3RhdHVzPj4oXHJcbiAgICAgICAgZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlU3RhdHVzKVxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCB1dWlkUmVzb2x2ZXIgPVxyXG4gICAgICAgIHRlc3RpbmdNb2R1bGUuZ2V0PFV1aWRSZXNvbHZlclNlcnZpY2U+KFV1aWRSZXNvbHZlclNlcnZpY2UpO1xyXG5cclxuICAgICAgKHVzZXJTZXJ2aWNlLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgdXNlcl9pZDogMSxcclxuICAgICAgICBwcmltYXJ5T3JnYW5pemF0aW9uSWQ6IG51bGwsXHJcbiAgICAgIH0pO1xyXG4gICAgICAodXNlclNlcnZpY2UuZ2V0VXNlclBlcm1pc3Npb25zIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoW1xyXG4gICAgICAgICdzeXN0ZW0ubWFuYWdlX2FsbCcsXHJcbiAgICAgIF0pO1xyXG5cclxuICAgICAgKHV1aWRSZXNvbHZlci5yZXNvbHZlUHJvamVjdElkIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoMTAwKTtcclxuICAgICAgKHV1aWRSZXNvbHZlci5yZXNvbHZlT3JnYW5pemF0aW9uSWQgYXMgamVzdC5Nb2NrKS5tb2NrSW1wbGVtZW50YXRpb24oXHJcbiAgICAgICAgKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJ29yaWdpbmF0b3ItdXVpZCcpIHJldHVybiAxMDtcclxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJ3JlY2lwaWVudC11dWlkJykgcmV0dXJuIDIwO1xyXG4gICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG5cclxuICAgICAgKHR5cGVSZXBvLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgdHlwZUNvZGU6ICdMVFInLFxyXG4gICAgICB9KTtcclxuICAgICAgKHN0YXR1c1JlcG8uZmluZE9uZSBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHtcclxuICAgICAgICBpZDogMSxcclxuICAgICAgICBzdGF0dXNDb2RlOiAnRFJBRlQnLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIChudW1iZXJpbmdTZXJ2aWNlLmdlbmVyYXRlTmV4dE51bWJlciBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHtcclxuICAgICAgICBudW1iZXI6ICdET0MtMDAxJyxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBtb2NrRGF0YVNvdXJjZS5tYW5hZ2VyLmZpbmRPbmVcclxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHsgaWQ6IDEwLCBvcmdhbml6YXRpb25Db2RlOiAnT1JHJyB9KVxyXG4gICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBpZDogMjAsIG9yZ2FuaXphdGlvbkNvZGU6ICdSRUMnIH0pO1xyXG5cclxuICAgICAgY29uc3QgcXVlcnlSdW5uZXIgPSB7XHJcbiAgICAgICAgY29ubmVjdDogamVzdC5mbigpLFxyXG4gICAgICAgIHN0YXJ0VHJhbnNhY3Rpb246IGplc3QuZm4oKSxcclxuICAgICAgICBjb21taXRUcmFuc2FjdGlvbjogamVzdC5mbigpLFxyXG4gICAgICAgIHJvbGxiYWNrVHJhbnNhY3Rpb246IGplc3QuZm4oKSxcclxuICAgICAgICByZWxlYXNlOiBqZXN0LmZuKCksXHJcbiAgICAgICAgbWFuYWdlcjoge1xyXG4gICAgICAgICAgY3JlYXRlOiBqZXN0LmZuKFxyXG4gICAgICAgICAgICAoX2VudGl0eTogdW5rbm93biwgcGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHBheWxvYWRcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICBzYXZlOiBqZXN0XHJcbiAgICAgICAgICAgIC5mbigpXHJcbiAgICAgICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBpZDogOTk5LCBwdWJsaWNJZDogJ2NvcnItdXVpZCcgfSlcclxuICAgICAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IGlkOiAxMDAwIH0pXHJcbiAgICAgICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoW10pLFxyXG4gICAgICAgICAgZmluZE9uZTogamVzdC5mbigpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICAobW9ja0RhdGFTb3VyY2UuY3JlYXRlUXVlcnlSdW5uZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmV0dXJuVmFsdWUoXHJcbiAgICAgICAgcXVlcnlSdW5uZXJcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGF3YWl0IHNlcnZpY2UuY3JlYXRlKGNyZWF0ZUR0bywgbW9ja1VzZXIpO1xyXG5cclxuICAgICAgZXhwZWN0KHF1ZXJ5UnVubmVyLm1hbmFnZXIuY3JlYXRlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcclxuICAgICAgICBDb3JyZXNwb25kZW5jZSxcclxuICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IG9yaWdpbmF0b3JJZDogMTAgfSlcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdzaG91bGQgc2V0IHJldmlzaW9uTGFiZWwgdG8gXCJBXCIgZm9yIFJGQSB0eXBlJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBtb2NrVXNlciA9IHtcclxuICAgICAgICB1c2VyX2lkOiAxLFxyXG4gICAgICAgIHByaW1hcnlPcmdhbml6YXRpb25JZDogMTAsXHJcbiAgICAgIH0gYXMgdW5rbm93biBhcyBVc2VyO1xyXG5cclxuICAgICAgY29uc3QgY3JlYXRlRHRvOiBDcmVhdGVDb3JyZXNwb25kZW5jZUR0byA9IHtcclxuICAgICAgICBwcm9qZWN0SWQ6ICdwcm9qZWN0LXV1aWQnLFxyXG4gICAgICAgIHR5cGVJZDogMSxcclxuICAgICAgICBzdWJqZWN0OiAnVGVzdCBTdWJqZWN0JyxcclxuICAgICAgICByZWNpcGllbnRzOiBbeyBvcmdhbml6YXRpb25JZDogJ3JlY2lwaWVudC11dWlkJywgdHlwZTogJ1RPJyB9XSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHR5cGVSZXBvID0gdGVzdGluZ01vZHVsZS5nZXQ8UmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZVR5cGU+PihcclxuICAgICAgICBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VUeXBlKVxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBzdGF0dXNSZXBvID0gdGVzdGluZ01vZHVsZS5nZXQ8UmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZVN0YXR1cz4+KFxyXG4gICAgICAgIGdldFJlcG9zaXRvcnlUb2tlbihDb3JyZXNwb25kZW5jZVN0YXR1cylcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgdXVpZFJlc29sdmVyID1cclxuICAgICAgICB0ZXN0aW5nTW9kdWxlLmdldDxVdWlkUmVzb2x2ZXJTZXJ2aWNlPihVdWlkUmVzb2x2ZXJTZXJ2aWNlKTtcclxuXHJcbiAgICAgICh1dWlkUmVzb2x2ZXIucmVzb2x2ZVByb2plY3RJZCBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKDEwMCk7XHJcbiAgICAgICh1dWlkUmVzb2x2ZXIucmVzb2x2ZU9yZ2FuaXphdGlvbklkIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoMjApO1xyXG5cclxuICAgICAgKHR5cGVSZXBvLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgdHlwZUNvZGU6ICdSRkEnLFxyXG4gICAgICB9KTtcclxuICAgICAgKHN0YXR1c1JlcG8uZmluZE9uZSBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHtcclxuICAgICAgICBpZDogMSxcclxuICAgICAgICBzdGF0dXNDb2RlOiAnRFJBRlQnLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIChudW1iZXJpbmdTZXJ2aWNlLmdlbmVyYXRlTmV4dE51bWJlciBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHtcclxuICAgICAgICBudW1iZXI6ICdET0MtMDAxJyxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBtb2NrRGF0YVNvdXJjZS5tYW5hZ2VyLmZpbmRPbmVcclxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHsgaWQ6IDEwLCBvcmdhbml6YXRpb25Db2RlOiAnT1JHJyB9KVxyXG4gICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBpZDogMjAsIG9yZ2FuaXphdGlvbkNvZGU6ICdSRUMnIH0pO1xyXG5cclxuICAgICAgY29uc3QgcXVlcnlSdW5uZXIgPSB7XHJcbiAgICAgICAgY29ubmVjdDogamVzdC5mbigpLFxyXG4gICAgICAgIHN0YXJ0VHJhbnNhY3Rpb246IGplc3QuZm4oKSxcclxuICAgICAgICBjb21taXRUcmFuc2FjdGlvbjogamVzdC5mbigpLFxyXG4gICAgICAgIHJvbGxiYWNrVHJhbnNhY3Rpb246IGplc3QuZm4oKSxcclxuICAgICAgICByZWxlYXNlOiBqZXN0LmZuKCksXHJcbiAgICAgICAgbWFuYWdlcjoge1xyXG4gICAgICAgICAgY3JlYXRlOiBqZXN0LmZuKFxyXG4gICAgICAgICAgICAoX2VudGl0eTogdW5rbm93biwgcGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHBheWxvYWRcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICBzYXZlOiBqZXN0XHJcbiAgICAgICAgICAgIC5mbigpXHJcbiAgICAgICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBpZDogOTk5LCBwdWJsaWNJZDogJ2NvcnItdXVpZCcgfSlcclxuICAgICAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IGlkOiAxMDAwIH0pXHJcbiAgICAgICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoW10pLFxyXG4gICAgICAgICAgZmluZE9uZTogamVzdC5mbigpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICAobW9ja0RhdGFTb3VyY2UuY3JlYXRlUXVlcnlSdW5uZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmV0dXJuVmFsdWUoXHJcbiAgICAgICAgcXVlcnlSdW5uZXJcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGF3YWl0IHNlcnZpY2UuY3JlYXRlKGNyZWF0ZUR0bywgbW9ja1VzZXIpO1xyXG5cclxuICAgICAgZXhwZWN0KHF1ZXJ5UnVubmVyLm1hbmFnZXIuY3JlYXRlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcclxuICAgICAgICBDb3JyZXNwb25kZW5jZVJldmlzaW9uLFxyXG4gICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgcmV2aXNpb25MYWJlbDogJ0EnIH0pXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnc2hvdWxkIHNldCByZXZpc2lvbkxhYmVsIHRvIFwiQVwiIGZvciBSRkkgdHlwZScsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgbW9ja1VzZXIgPSB7XHJcbiAgICAgICAgdXNlcl9pZDogMSxcclxuICAgICAgICBwcmltYXJ5T3JnYW5pemF0aW9uSWQ6IDEwLFxyXG4gICAgICB9IGFzIHVua25vd24gYXMgVXNlcjtcclxuXHJcbiAgICAgIGNvbnN0IGNyZWF0ZUR0bzogQ3JlYXRlQ29ycmVzcG9uZGVuY2VEdG8gPSB7XHJcbiAgICAgICAgcHJvamVjdElkOiAncHJvamVjdC11dWlkJyxcclxuICAgICAgICB0eXBlSWQ6IDEsXHJcbiAgICAgICAgc3ViamVjdDogJ1Rlc3QgU3ViamVjdCcsXHJcbiAgICAgICAgcmVjaXBpZW50czogW3sgb3JnYW5pemF0aW9uSWQ6ICdyZWNpcGllbnQtdXVpZCcsIHR5cGU6ICdUTycgfV0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCB0eXBlUmVwbyA9IHRlc3RpbmdNb2R1bGUuZ2V0PFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VUeXBlPj4oXHJcbiAgICAgICAgZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlVHlwZSlcclxuICAgICAgKTtcclxuICAgICAgY29uc3Qgc3RhdHVzUmVwbyA9IHRlc3RpbmdNb2R1bGUuZ2V0PFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VTdGF0dXM+PihcclxuICAgICAgICBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VTdGF0dXMpXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IHV1aWRSZXNvbHZlciA9XHJcbiAgICAgICAgdGVzdGluZ01vZHVsZS5nZXQ8VXVpZFJlc29sdmVyU2VydmljZT4oVXVpZFJlc29sdmVyU2VydmljZSk7XHJcblxyXG4gICAgICAodXVpZFJlc29sdmVyLnJlc29sdmVQcm9qZWN0SWQgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSgxMDApO1xyXG4gICAgICAodXVpZFJlc29sdmVyLnJlc29sdmVPcmdhbml6YXRpb25JZCBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKDIwKTtcclxuXHJcbiAgICAgICh0eXBlUmVwby5maW5kT25lIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoe1xyXG4gICAgICAgIGlkOiAxLFxyXG4gICAgICAgIHR5cGVDb2RlOiAnUkZJJyxcclxuICAgICAgfSk7XHJcbiAgICAgIChzdGF0dXNSZXBvLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgc3RhdHVzQ29kZTogJ0RSQUZUJyxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAobnVtYmVyaW5nU2VydmljZS5nZW5lcmF0ZU5leHROdW1iZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgbnVtYmVyOiAnRE9DLTAwMScsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgbW9ja0RhdGFTb3VyY2UubWFuYWdlci5maW5kT25lXHJcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IGlkOiAxMCwgb3JnYW5pemF0aW9uQ29kZTogJ09SRycgfSlcclxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHsgaWQ6IDIwLCBvcmdhbml6YXRpb25Db2RlOiAnUkVDJyB9KTtcclxuXHJcbiAgICAgIGNvbnN0IHF1ZXJ5UnVubmVyID0ge1xyXG4gICAgICAgIGNvbm5lY3Q6IGplc3QuZm4oKSxcclxuICAgICAgICBzdGFydFRyYW5zYWN0aW9uOiBqZXN0LmZuKCksXHJcbiAgICAgICAgY29tbWl0VHJhbnNhY3Rpb246IGplc3QuZm4oKSxcclxuICAgICAgICByb2xsYmFja1RyYW5zYWN0aW9uOiBqZXN0LmZuKCksXHJcbiAgICAgICAgcmVsZWFzZTogamVzdC5mbigpLFxyXG4gICAgICAgIG1hbmFnZXI6IHtcclxuICAgICAgICAgIGNyZWF0ZTogamVzdC5mbihcclxuICAgICAgICAgICAgKF9lbnRpdHk6IHVua25vd24sIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBwYXlsb2FkXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICAgc2F2ZTogamVzdFxyXG4gICAgICAgICAgICAuZm4oKVxyXG4gICAgICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHsgaWQ6IDk5OSwgcHVibGljSWQ6ICdjb3JyLXV1aWQnIH0pXHJcbiAgICAgICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBpZDogMTAwMCB9KVxyXG4gICAgICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKFtdKSxcclxuICAgICAgICAgIGZpbmRPbmU6IGplc3QuZm4oKSxcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgKG1vY2tEYXRhU291cmNlLmNyZWF0ZVF1ZXJ5UnVubmVyIGFzIGplc3QuTW9jaykubW9ja1JldHVyblZhbHVlKFxyXG4gICAgICAgIHF1ZXJ5UnVubmVyXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBhd2FpdCBzZXJ2aWNlLmNyZWF0ZShjcmVhdGVEdG8sIG1vY2tVc2VyKTtcclxuXHJcbiAgICAgIGV4cGVjdChxdWVyeVJ1bm5lci5tYW5hZ2VyLmNyZWF0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgQ29ycmVzcG9uZGVuY2VSZXZpc2lvbixcclxuICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IHJldmlzaW9uTGFiZWw6ICdBJyB9KVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ3Nob3VsZCBzZXQgcmV2aXNpb25MYWJlbCB0byBudWxsIGZvciBMRVRURVIgdHlwZScsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgbW9ja1VzZXIgPSB7XHJcbiAgICAgICAgdXNlcl9pZDogMSxcclxuICAgICAgICBwcmltYXJ5T3JnYW5pemF0aW9uSWQ6IDEwLFxyXG4gICAgICB9IGFzIHVua25vd24gYXMgVXNlcjtcclxuXHJcbiAgICAgIGNvbnN0IGNyZWF0ZUR0bzogQ3JlYXRlQ29ycmVzcG9uZGVuY2VEdG8gPSB7XHJcbiAgICAgICAgcHJvamVjdElkOiAncHJvamVjdC11dWlkJyxcclxuICAgICAgICB0eXBlSWQ6IDEsXHJcbiAgICAgICAgc3ViamVjdDogJ1Rlc3QgU3ViamVjdCcsXHJcbiAgICAgICAgcmVjaXBpZW50czogW3sgb3JnYW5pemF0aW9uSWQ6ICdyZWNpcGllbnQtdXVpZCcsIHR5cGU6ICdUTycgfV0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCB0eXBlUmVwbyA9IHRlc3RpbmdNb2R1bGUuZ2V0PFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VUeXBlPj4oXHJcbiAgICAgICAgZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlVHlwZSlcclxuICAgICAgKTtcclxuICAgICAgY29uc3Qgc3RhdHVzUmVwbyA9IHRlc3RpbmdNb2R1bGUuZ2V0PFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VTdGF0dXM+PihcclxuICAgICAgICBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VTdGF0dXMpXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IHV1aWRSZXNvbHZlciA9XHJcbiAgICAgICAgdGVzdGluZ01vZHVsZS5nZXQ8VXVpZFJlc29sdmVyU2VydmljZT4oVXVpZFJlc29sdmVyU2VydmljZSk7XHJcblxyXG4gICAgICAodXVpZFJlc29sdmVyLnJlc29sdmVQcm9qZWN0SWQgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSgxMDApO1xyXG4gICAgICAodXVpZFJlc29sdmVyLnJlc29sdmVPcmdhbml6YXRpb25JZCBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKDIwKTtcclxuXHJcbiAgICAgICh0eXBlUmVwby5maW5kT25lIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoe1xyXG4gICAgICAgIGlkOiAxLFxyXG4gICAgICAgIHR5cGVDb2RlOiAnTEVUVEVSJyxcclxuICAgICAgfSk7XHJcbiAgICAgIChzdGF0dXNSZXBvLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgc3RhdHVzQ29kZTogJ0RSQUZUJyxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAobnVtYmVyaW5nU2VydmljZS5nZW5lcmF0ZU5leHROdW1iZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgbnVtYmVyOiAnRE9DLTAwMScsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgbW9ja0RhdGFTb3VyY2UubWFuYWdlci5maW5kT25lXHJcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IGlkOiAxMCwgb3JnYW5pemF0aW9uQ29kZTogJ09SRycgfSlcclxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHsgaWQ6IDIwLCBvcmdhbml6YXRpb25Db2RlOiAnUkVDJyB9KTtcclxuXHJcbiAgICAgIGNvbnN0IHF1ZXJ5UnVubmVyID0ge1xyXG4gICAgICAgIGNvbm5lY3Q6IGplc3QuZm4oKSxcclxuICAgICAgICBzdGFydFRyYW5zYWN0aW9uOiBqZXN0LmZuKCksXHJcbiAgICAgICAgY29tbWl0VHJhbnNhY3Rpb246IGplc3QuZm4oKSxcclxuICAgICAgICByb2xsYmFja1RyYW5zYWN0aW9uOiBqZXN0LmZuKCksXHJcbiAgICAgICAgcmVsZWFzZTogamVzdC5mbigpLFxyXG4gICAgICAgIG1hbmFnZXI6IHtcclxuICAgICAgICAgIGNyZWF0ZTogamVzdC5mbihcclxuICAgICAgICAgICAgKF9lbnRpdHk6IHVua25vd24sIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBwYXlsb2FkXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICAgc2F2ZTogamVzdFxyXG4gICAgICAgICAgICAuZm4oKVxyXG4gICAgICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHsgaWQ6IDk5OSwgcHVibGljSWQ6ICdjb3JyLXV1aWQnIH0pXHJcbiAgICAgICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBpZDogMTAwMCB9KVxyXG4gICAgICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKFtdKSxcclxuICAgICAgICAgIGZpbmRPbmU6IGplc3QuZm4oKSxcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgKG1vY2tEYXRhU291cmNlLmNyZWF0ZVF1ZXJ5UnVubmVyIGFzIGplc3QuTW9jaykubW9ja1JldHVyblZhbHVlKFxyXG4gICAgICAgIHF1ZXJ5UnVubmVyXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBhd2FpdCBzZXJ2aWNlLmNyZWF0ZShjcmVhdGVEdG8sIG1vY2tVc2VyKTtcclxuXHJcbiAgICAgIGV4cGVjdChxdWVyeVJ1bm5lci5tYW5hZ2VyLmNyZWF0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgQ29ycmVzcG9uZGVuY2VSZXZpc2lvbixcclxuICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IHJldmlzaW9uTGFiZWw6IHVuZGVmaW5lZCB9KVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ3Nob3VsZCBzZXQgcmV2aXNpb25MYWJlbCB0byB1bmRlZmluZWQgZm9yIE1FTU8gdHlwZScsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgbW9ja1VzZXIgPSB7XHJcbiAgICAgICAgdXNlcl9pZDogMSxcclxuICAgICAgICBwcmltYXJ5T3JnYW5pemF0aW9uSWQ6IDEwLFxyXG4gICAgICB9IGFzIHVua25vd24gYXMgVXNlcjtcclxuXHJcbiAgICAgIGNvbnN0IGNyZWF0ZUR0bzogQ3JlYXRlQ29ycmVzcG9uZGVuY2VEdG8gPSB7XHJcbiAgICAgICAgcHJvamVjdElkOiAncHJvamVjdC11dWlkJyxcclxuICAgICAgICB0eXBlSWQ6IDEsXHJcbiAgICAgICAgc3ViamVjdDogJ1Rlc3QgU3ViamVjdCcsXHJcbiAgICAgICAgcmVjaXBpZW50czogW3sgb3JnYW5pemF0aW9uSWQ6ICdyZWNpcGllbnQtdXVpZCcsIHR5cGU6ICdUTycgfV0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCB0eXBlUmVwbyA9IHRlc3RpbmdNb2R1bGUuZ2V0PFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VUeXBlPj4oXHJcbiAgICAgICAgZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlVHlwZSlcclxuICAgICAgKTtcclxuICAgICAgY29uc3Qgc3RhdHVzUmVwbyA9IHRlc3RpbmdNb2R1bGUuZ2V0PFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VTdGF0dXM+PihcclxuICAgICAgICBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VTdGF0dXMpXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IHV1aWRSZXNvbHZlciA9XHJcbiAgICAgICAgdGVzdGluZ01vZHVsZS5nZXQ8VXVpZFJlc29sdmVyU2VydmljZT4oVXVpZFJlc29sdmVyU2VydmljZSk7XHJcblxyXG4gICAgICAodXVpZFJlc29sdmVyLnJlc29sdmVQcm9qZWN0SWQgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSgxMDApO1xyXG4gICAgICAodXVpZFJlc29sdmVyLnJlc29sdmVPcmdhbml6YXRpb25JZCBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKDIwKTtcclxuXHJcbiAgICAgICh0eXBlUmVwby5maW5kT25lIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoe1xyXG4gICAgICAgIGlkOiAxLFxyXG4gICAgICAgIHR5cGVDb2RlOiAnTUVNTycsXHJcbiAgICAgIH0pO1xyXG4gICAgICAoc3RhdHVzUmVwby5maW5kT25lIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoe1xyXG4gICAgICAgIGlkOiAxLFxyXG4gICAgICAgIHN0YXR1c0NvZGU6ICdEUkFGVCcsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgKG51bWJlcmluZ1NlcnZpY2UuZ2VuZXJhdGVOZXh0TnVtYmVyIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoe1xyXG4gICAgICAgIG51bWJlcjogJ0RPQy0wMDEnLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIG1vY2tEYXRhU291cmNlLm1hbmFnZXIuZmluZE9uZVxyXG4gICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBpZDogMTAsIG9yZ2FuaXphdGlvbkNvZGU6ICdPUkcnIH0pXHJcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IGlkOiAyMCwgb3JnYW5pemF0aW9uQ29kZTogJ1JFQycgfSk7XHJcblxyXG4gICAgICBjb25zdCBxdWVyeVJ1bm5lciA9IHtcclxuICAgICAgICBjb25uZWN0OiBqZXN0LmZuKCksXHJcbiAgICAgICAgc3RhcnRUcmFuc2FjdGlvbjogamVzdC5mbigpLFxyXG4gICAgICAgIGNvbW1pdFRyYW5zYWN0aW9uOiBqZXN0LmZuKCksXHJcbiAgICAgICAgcm9sbGJhY2tUcmFuc2FjdGlvbjogamVzdC5mbigpLFxyXG4gICAgICAgIHJlbGVhc2U6IGplc3QuZm4oKSxcclxuICAgICAgICBtYW5hZ2VyOiB7XHJcbiAgICAgICAgICBjcmVhdGU6IGplc3QuZm4oXHJcbiAgICAgICAgICAgIChfZW50aXR5OiB1bmtub3duLCBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gcGF5bG9hZFxyXG4gICAgICAgICAgKSxcclxuICAgICAgICAgIHNhdmU6IGplc3RcclxuICAgICAgICAgICAgLmZuKClcclxuICAgICAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IGlkOiA5OTksIHB1YmxpY0lkOiAnY29yci11dWlkJyB9KVxyXG4gICAgICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHsgaWQ6IDEwMDAgfSlcclxuICAgICAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZShbXSksXHJcbiAgICAgICAgICBmaW5kT25lOiBqZXN0LmZuKCksXHJcbiAgICAgICAgfSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIChtb2NrRGF0YVNvdXJjZS5jcmVhdGVRdWVyeVJ1bm5lciBhcyBqZXN0Lk1vY2spLm1vY2tSZXR1cm5WYWx1ZShcclxuICAgICAgICBxdWVyeVJ1bm5lclxyXG4gICAgICApO1xyXG5cclxuICAgICAgYXdhaXQgc2VydmljZS5jcmVhdGUoY3JlYXRlRHRvLCBtb2NrVXNlcik7XHJcblxyXG4gICAgICBleHBlY3QocXVlcnlSdW5uZXIubWFuYWdlci5jcmVhdGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxyXG4gICAgICAgIENvcnJlc3BvbmRlbmNlUmV2aXNpb24sXHJcbiAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyByZXZpc2lvbkxhYmVsOiB1bmRlZmluZWQgfSlcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59KTtcclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/73/correspondenceservicespec_734bdcab2dfb6efde612c0805c2de895.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/73/correspondenceservicespec_734bdcab2dfb6efde612c0805c2de895.map new file mode 100644 index 0000000..b9c6331 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/73/correspondenceservicespec_734bdcab2dfb6efde612c0805c2de895.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.service.spec.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.service.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\r\nimport { getRepositoryToken } from '@nestjs/typeorm';\r\nimport { DataSource, Repository } from 'typeorm';\r\nimport { ForbiddenException } from '@nestjs/common';\r\nimport { CorrespondenceService } from './correspondence.service';\r\nimport { Correspondence } from './entities/correspondence.entity';\r\nimport { CorrespondenceRevision } from './entities/correspondence-revision.entity';\r\nimport { CorrespondenceType } from './entities/correspondence-type.entity';\r\nimport { CorrespondenceStatus } from './entities/correspondence-status.entity';\r\nimport { CorrespondenceReference } from './entities/correspondence-reference.entity';\r\nimport { CorrespondenceTag } from './entities/correspondence-tag.entity';\r\nimport { Organization } from '../organization/entities/organization.entity';\r\nimport { CorrespondenceRecipient } from './entities/correspondence-recipient.entity';\r\nimport { CorrespondenceRevisionAttachment } from './entities/correspondence-revision-attachment.entity';\r\nimport { DocumentNumberingService } from '../document-numbering/services/document-numbering.service';\r\nimport { JsonSchemaService } from '../json-schema/json-schema.service';\r\nimport { WorkflowEngineService } from '../workflow-engine/workflow-engine.service';\r\nimport { UserService } from '../user/user.service';\r\nimport { SearchService } from '../search/search.service';\r\nimport { FileStorageService } from '../../common/file-storage/file-storage.service';\r\nimport { UuidResolverService } from '../../common/services/uuid-resolver.service';\r\nimport { NotificationService } from '../notification/notification.service';\r\nimport { UpdateCorrespondenceDto } from './dto/update-correspondence.dto';\r\nimport { CreateCorrespondenceDto } from './dto/create-correspondence.dto';\r\nimport { User } from '../user/entities/user.entity';\r\n\r\ndescribe('CorrespondenceService', () => {\r\n let service: CorrespondenceService;\r\n let numberingService: DocumentNumberingService;\r\n let correspondenceRepo: Repository;\r\n let revisionRepo: Repository;\r\n let testingModule: TestingModule;\r\n let _dataSource: DataSource;\r\n\r\n const createMockRepository = () => ({\r\n find: jest.fn(),\r\n findOne: jest.fn(),\r\n create: jest.fn(),\r\n save: jest.fn(),\r\n update: jest.fn(),\r\n delete: jest.fn(),\r\n softDelete: jest.fn(),\r\n createQueryBuilder: jest.fn(() => ({\r\n leftJoinAndSelect: jest.fn().mockReturnThis(),\r\n where: jest.fn().mockReturnThis(),\r\n andWhere: jest.fn().mockReturnThis(),\r\n orderBy: jest.fn().mockReturnThis(),\r\n skip: jest.fn().mockReturnThis(),\r\n take: jest.fn().mockReturnThis(),\r\n getOne: jest.fn().mockResolvedValue(null),\r\n getMany: jest.fn().mockResolvedValue([]),\r\n getManyAndCount: jest.fn().mockResolvedValue([[], 0]),\r\n })),\r\n });\r\n\r\n const mockDataSource = {\r\n createQueryRunner: jest.fn(() => ({\r\n connect: jest.fn(),\r\n startTransaction: jest.fn(),\r\n commitTransaction: jest.fn(),\r\n rollbackTransaction: jest.fn(),\r\n release: jest.fn(),\r\n manager: {\r\n create: jest.fn(),\r\n save: jest.fn(),\r\n findOne: jest.fn(),\r\n },\r\n })),\r\n getRepository: jest.fn(() => createMockRepository()),\r\n manager: {\r\n findOne: jest.fn(),\r\n },\r\n };\r\n\r\n beforeEach(async () => {\r\n testingModule = await Test.createTestingModule({\r\n providers: [\r\n CorrespondenceService,\r\n {\r\n provide: getRepositoryToken(Correspondence),\r\n useValue: createMockRepository(),\r\n },\r\n {\r\n provide: getRepositoryToken(CorrespondenceRevision),\r\n useValue: createMockRepository(),\r\n },\r\n {\r\n provide: getRepositoryToken(CorrespondenceType),\r\n useValue: createMockRepository(),\r\n },\r\n {\r\n provide: getRepositoryToken(CorrespondenceStatus),\r\n useValue: createMockRepository(),\r\n },\r\n {\r\n provide: getRepositoryToken(CorrespondenceReference),\r\n useValue: createMockRepository(),\r\n },\r\n {\r\n provide: getRepositoryToken(CorrespondenceTag),\r\n useValue: createMockRepository(),\r\n },\r\n {\r\n provide: getRepositoryToken(Organization),\r\n useValue: createMockRepository(),\r\n },\r\n {\r\n provide: getRepositoryToken(CorrespondenceRecipient),\r\n useValue: createMockRepository(),\r\n },\r\n {\r\n provide: DocumentNumberingService,\r\n useValue: {\r\n generateNextNumber: jest.fn(),\r\n updateNumberForDraft: jest.fn(),\r\n previewNextNumber: jest.fn(),\r\n },\r\n },\r\n {\r\n provide: JsonSchemaService,\r\n useValue: { validate: jest.fn() },\r\n },\r\n {\r\n provide: WorkflowEngineService,\r\n useValue: { createInstance: jest.fn() },\r\n },\r\n {\r\n provide: UserService,\r\n useValue: {\r\n findOne: jest.fn(),\r\n getUserPermissions: jest.fn().mockResolvedValue([]),\r\n },\r\n },\r\n {\r\n provide: DataSource,\r\n useValue: mockDataSource,\r\n },\r\n {\r\n provide: SearchService,\r\n useValue: { indexDocument: jest.fn() },\r\n },\r\n {\r\n provide: FileStorageService,\r\n useValue: { commit: jest.fn().mockResolvedValue([]) },\r\n },\r\n {\r\n provide: UuidResolverService,\r\n useValue: {\r\n resolveProjectId: jest.fn().mockResolvedValue(1),\r\n resolveOrganizationId: jest.fn().mockResolvedValue(1),\r\n },\r\n },\r\n {\r\n provide: NotificationService,\r\n useValue: { send: jest.fn().mockResolvedValue(undefined) },\r\n },\r\n {\r\n provide: getRepositoryToken(CorrespondenceRevisionAttachment),\r\n useValue: createMockRepository(),\r\n },\r\n ],\r\n }).compile();\r\n\r\n service = testingModule.get(CorrespondenceService);\r\n numberingService = testingModule.get(\r\n DocumentNumberingService\r\n );\r\n correspondenceRepo = testingModule.get>(\r\n getRepositoryToken(Correspondence)\r\n );\r\n revisionRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceRevision)\r\n );\r\n _dataSource = testingModule.get(DataSource);\r\n });\r\n\r\n it('should be defined', () => {\r\n expect(service).toBeDefined();\r\n });\r\n\r\n describe('update', () => {\r\n it('should allow non-draft update for org-admin+ permissions', async () => {\r\n const mockUser = {\r\n user_id: 1,\r\n primaryOrganizationId: 10,\r\n } as unknown as User;\r\n const mockRevision = {\r\n id: 100,\r\n correspondenceId: 1,\r\n isCurrent: true,\r\n statusId: 23,\r\n };\r\n\r\n jest\r\n .spyOn(revisionRepo, 'findOne')\r\n .mockResolvedValue(mockRevision as unknown as CorrespondenceRevision);\r\n\r\n const statusRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceStatus)\r\n );\r\n (statusRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 23,\r\n statusCode: 'SUBOWN',\r\n });\r\n\r\n const userService = testingModule.get(UserService);\r\n (userService.getUserPermissions as jest.Mock).mockResolvedValue([\r\n 'correspondence.cancel',\r\n ]);\r\n\r\n jest.spyOn(correspondenceRepo, 'findOne').mockResolvedValue({\r\n id: 1,\r\n publicId: 'corr-uuid-1',\r\n correspondenceNumber: 'CORR-001',\r\n projectId: 1,\r\n createdAt: new Date(),\r\n revisions: [],\r\n } as unknown as Correspondence);\r\n\r\n await expect(\r\n service.update(1, { subject: 'Updated Subject' }, mockUser)\r\n ).resolves.toBeDefined();\r\n });\r\n\r\n it('should reject non-draft update for non-admin permissions', async () => {\r\n const mockUser = {\r\n user_id: 2,\r\n primaryOrganizationId: 10,\r\n } as unknown as User;\r\n const mockRevision = {\r\n id: 101,\r\n correspondenceId: 2,\r\n isCurrent: true,\r\n statusId: 23,\r\n };\r\n\r\n jest\r\n .spyOn(revisionRepo, 'findOne')\r\n .mockResolvedValue(mockRevision as unknown as CorrespondenceRevision);\r\n\r\n const statusRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceStatus)\r\n );\r\n (statusRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 23,\r\n statusCode: 'SUBOWN',\r\n });\r\n\r\n const userService = testingModule.get(UserService);\r\n (userService.getUserPermissions as jest.Mock).mockResolvedValue([\r\n 'correspondence.edit',\r\n ]);\r\n\r\n await expect(\r\n service.update(2, { subject: 'Should Fail' }, mockUser)\r\n ).rejects.toThrow(ForbiddenException);\r\n });\r\n\r\n it('should NOT regenerate number if critical fields unchanged', async () => {\r\n const mockUser = { id: 1, primaryOrganizationId: 10 } as unknown as User;\r\n const mockRevision = {\r\n id: 100,\r\n correspondenceId: 1,\r\n isCurrent: true,\r\n statusId: 5,\r\n };\r\n\r\n jest\r\n .spyOn(revisionRepo, 'findOne')\r\n .mockResolvedValue(mockRevision as unknown as CorrespondenceRevision);\r\n\r\n const mockCorr = {\r\n id: 1,\r\n projectId: 1,\r\n correspondenceTypeId: 2,\r\n disciplineId: 3,\r\n originatorId: 10,\r\n correspondenceNumber: 'OLD-NUM',\r\n recipients: [{ recipientType: 'TO', recipientOrganizationId: 99 }],\r\n };\r\n jest\r\n .spyOn(correspondenceRepo, 'findOne')\r\n .mockResolvedValue(mockCorr as unknown as Correspondence);\r\n\r\n const updateDto: UpdateCorrespondenceDto = {\r\n projectId: 1,\r\n disciplineId: 3,\r\n };\r\n\r\n await service.update(1, updateDto, mockUser);\r\n\r\n expect(\r\n numberingService.updateNumberForDraft as jest.Mock\r\n ).not.toHaveBeenCalled();\r\n });\r\n\r\n it('should regenerate number if Project ID changes', async () => {\r\n const mockUser = { id: 1, primaryOrganizationId: 10 } as unknown as User;\r\n const mockRevision = {\r\n id: 100,\r\n correspondenceId: 1,\r\n isCurrent: true,\r\n statusId: 5,\r\n };\r\n jest\r\n .spyOn(revisionRepo, 'findOne')\r\n .mockResolvedValue(mockRevision as unknown as CorrespondenceRevision);\r\n\r\n const mockCorr = {\r\n id: 1,\r\n projectId: 1,\r\n correspondenceTypeId: 2,\r\n disciplineId: 3,\r\n originatorId: 10,\r\n correspondenceNumber: 'OLD-NUM',\r\n recipients: [{ recipientType: 'TO', recipientOrganizationId: 99 }],\r\n };\r\n jest\r\n .spyOn(correspondenceRepo, 'findOne')\r\n .mockResolvedValue(mockCorr as unknown as Correspondence);\r\n\r\n const updateDto: UpdateCorrespondenceDto = {\r\n projectId: 2,\r\n };\r\n\r\n const uuidResolver =\r\n testingModule.get(UuidResolverService);\r\n (uuidResolver.resolveProjectId as jest.Mock).mockResolvedValue(2);\r\n\r\n await service.update(1, updateDto, mockUser);\r\n\r\n expect(\r\n numberingService.updateNumberForDraft as jest.Mock\r\n ).toHaveBeenCalled();\r\n });\r\n\r\n it('should regenerate number if Document Type changes', async () => {\r\n const mockUser = { id: 1, primaryOrganizationId: 10 } as unknown as User;\r\n const mockRevision = {\r\n id: 100,\r\n correspondenceId: 1,\r\n isCurrent: true,\r\n statusId: 5,\r\n };\r\n jest\r\n .spyOn(revisionRepo, 'findOne')\r\n .mockResolvedValue(mockRevision as unknown as CorrespondenceRevision);\r\n\r\n const mockCorr = {\r\n id: 1,\r\n projectId: 1,\r\n correspondenceTypeId: 2,\r\n disciplineId: 3,\r\n originatorId: 10,\r\n correspondenceNumber: 'OLD-NUM',\r\n recipients: [{ recipientType: 'TO', recipientOrganizationId: 99 }],\r\n };\r\n jest\r\n .spyOn(correspondenceRepo, 'findOne')\r\n .mockResolvedValue(mockCorr as unknown as Correspondence);\r\n\r\n const updateDto: UpdateCorrespondenceDto = {\r\n typeId: 999,\r\n };\r\n\r\n const typeRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceType)\r\n );\r\n (typeRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 999,\r\n typeCode: 'NEW-TYPE',\r\n });\r\n\r\n await service.update(1, updateDto, mockUser);\r\n\r\n expect(\r\n numberingService.updateNumberForDraft as jest.Mock\r\n ).toHaveBeenCalled();\r\n });\r\n\r\n it('should regenerate number if Recipient Organization changes', async () => {\r\n const mockUser = { id: 1, primaryOrganizationId: 10 } as unknown as User;\r\n const mockRevision = {\r\n id: 100,\r\n correspondenceId: 1,\r\n isCurrent: true,\r\n statusId: 5,\r\n };\r\n jest\r\n .spyOn(revisionRepo, 'findOne')\r\n .mockResolvedValue(mockRevision as unknown as CorrespondenceRevision);\r\n\r\n const mockCorr = {\r\n id: 1,\r\n projectId: 1,\r\n correspondenceTypeId: 2,\r\n disciplineId: 3,\r\n originatorId: 10,\r\n correspondenceNumber: 'OLD-NUM',\r\n recipients: [{ recipientType: 'TO', recipientOrganizationId: 99 }],\r\n };\r\n jest\r\n .spyOn(correspondenceRepo, 'findOne')\r\n .mockResolvedValue(mockCorr as unknown as Correspondence);\r\n\r\n // Access DataSource manager for mocking\r\n mockDataSource.manager.findOne.mockResolvedValue({\r\n id: 88,\r\n organizationCode: 'NEW-ORG',\r\n } as unknown as Organization);\r\n\r\n const updateDto: UpdateCorrespondenceDto = {\r\n recipients: [{ type: 'TO', organizationId: 88 }],\r\n };\r\n\r\n await service.update(1, updateDto, mockUser);\r\n\r\n expect(\r\n numberingService.updateNumberForDraft as jest.Mock\r\n ).toHaveBeenCalled();\r\n });\r\n });\r\n\r\n describe('create', () => {\r\n it('should allow system.manage_all user without primaryOrganizationId when originatorId is provided', async () => {\r\n const mockUser = {\r\n user_id: 1,\r\n primaryOrganizationId: null,\r\n } as unknown as User;\r\n\r\n const createDto: CreateCorrespondenceDto = {\r\n projectId: 'project-uuid',\r\n typeId: 1,\r\n subject: 'Test Subject',\r\n originatorId: 'originator-uuid',\r\n recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }],\r\n };\r\n\r\n const userService = testingModule.get(UserService);\r\n const typeRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceType)\r\n );\r\n const statusRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceStatus)\r\n );\r\n const uuidResolver =\r\n testingModule.get(UuidResolverService);\r\n\r\n (userService.findOne as jest.Mock).mockResolvedValue({\r\n user_id: 1,\r\n primaryOrganizationId: null,\r\n });\r\n (userService.getUserPermissions as jest.Mock).mockResolvedValue([\r\n 'system.manage_all',\r\n ]);\r\n\r\n (uuidResolver.resolveProjectId as jest.Mock).mockResolvedValue(100);\r\n (uuidResolver.resolveOrganizationId as jest.Mock).mockImplementation(\r\n (value: number | string) => {\r\n if (value === 'originator-uuid') return 10;\r\n if (value === 'recipient-uuid') return 20;\r\n return 0;\r\n }\r\n );\r\n\r\n (typeRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n typeCode: 'LTR',\r\n });\r\n (statusRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n statusCode: 'DRAFT',\r\n });\r\n\r\n (numberingService.generateNextNumber as jest.Mock).mockResolvedValue({\r\n number: 'DOC-001',\r\n });\r\n\r\n mockDataSource.manager.findOne\r\n .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' })\r\n .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' });\r\n\r\n const queryRunner = {\r\n connect: jest.fn(),\r\n startTransaction: jest.fn(),\r\n commitTransaction: jest.fn(),\r\n rollbackTransaction: jest.fn(),\r\n release: jest.fn(),\r\n manager: {\r\n create: jest.fn(\r\n (_entity: unknown, payload: Record) => payload\r\n ),\r\n save: jest\r\n .fn()\r\n .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' })\r\n .mockResolvedValueOnce({ id: 1000 })\r\n .mockResolvedValueOnce([]),\r\n findOne: jest.fn(),\r\n },\r\n };\r\n\r\n (mockDataSource.createQueryRunner as jest.Mock).mockReturnValue(\r\n queryRunner\r\n );\r\n\r\n await service.create(createDto, mockUser);\r\n\r\n expect(queryRunner.manager.create).toHaveBeenCalledWith(\r\n Correspondence,\r\n expect.objectContaining({ originatorId: 10 })\r\n );\r\n });\r\n\r\n it('should set revisionLabel to \"A\" for RFA type', async () => {\r\n const mockUser = {\r\n user_id: 1,\r\n primaryOrganizationId: 10,\r\n } as unknown as User;\r\n\r\n const createDto: CreateCorrespondenceDto = {\r\n projectId: 'project-uuid',\r\n typeId: 1,\r\n subject: 'Test Subject',\r\n recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }],\r\n };\r\n\r\n const typeRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceType)\r\n );\r\n const statusRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceStatus)\r\n );\r\n const uuidResolver =\r\n testingModule.get(UuidResolverService);\r\n\r\n (uuidResolver.resolveProjectId as jest.Mock).mockResolvedValue(100);\r\n (uuidResolver.resolveOrganizationId as jest.Mock).mockResolvedValue(20);\r\n\r\n (typeRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n typeCode: 'RFA',\r\n });\r\n (statusRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n statusCode: 'DRAFT',\r\n });\r\n\r\n (numberingService.generateNextNumber as jest.Mock).mockResolvedValue({\r\n number: 'DOC-001',\r\n });\r\n\r\n mockDataSource.manager.findOne\r\n .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' })\r\n .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' });\r\n\r\n const queryRunner = {\r\n connect: jest.fn(),\r\n startTransaction: jest.fn(),\r\n commitTransaction: jest.fn(),\r\n rollbackTransaction: jest.fn(),\r\n release: jest.fn(),\r\n manager: {\r\n create: jest.fn(\r\n (_entity: unknown, payload: Record) => payload\r\n ),\r\n save: jest\r\n .fn()\r\n .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' })\r\n .mockResolvedValueOnce({ id: 1000 })\r\n .mockResolvedValueOnce([]),\r\n findOne: jest.fn(),\r\n },\r\n };\r\n\r\n (mockDataSource.createQueryRunner as jest.Mock).mockReturnValue(\r\n queryRunner\r\n );\r\n\r\n await service.create(createDto, mockUser);\r\n\r\n expect(queryRunner.manager.create).toHaveBeenCalledWith(\r\n CorrespondenceRevision,\r\n expect.objectContaining({ revisionLabel: 'A' })\r\n );\r\n });\r\n\r\n it('should set revisionLabel to \"A\" for RFI type', async () => {\r\n const mockUser = {\r\n user_id: 1,\r\n primaryOrganizationId: 10,\r\n } as unknown as User;\r\n\r\n const createDto: CreateCorrespondenceDto = {\r\n projectId: 'project-uuid',\r\n typeId: 1,\r\n subject: 'Test Subject',\r\n recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }],\r\n };\r\n\r\n const typeRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceType)\r\n );\r\n const statusRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceStatus)\r\n );\r\n const uuidResolver =\r\n testingModule.get(UuidResolverService);\r\n\r\n (uuidResolver.resolveProjectId as jest.Mock).mockResolvedValue(100);\r\n (uuidResolver.resolveOrganizationId as jest.Mock).mockResolvedValue(20);\r\n\r\n (typeRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n typeCode: 'RFI',\r\n });\r\n (statusRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n statusCode: 'DRAFT',\r\n });\r\n\r\n (numberingService.generateNextNumber as jest.Mock).mockResolvedValue({\r\n number: 'DOC-001',\r\n });\r\n\r\n mockDataSource.manager.findOne\r\n .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' })\r\n .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' });\r\n\r\n const queryRunner = {\r\n connect: jest.fn(),\r\n startTransaction: jest.fn(),\r\n commitTransaction: jest.fn(),\r\n rollbackTransaction: jest.fn(),\r\n release: jest.fn(),\r\n manager: {\r\n create: jest.fn(\r\n (_entity: unknown, payload: Record) => payload\r\n ),\r\n save: jest\r\n .fn()\r\n .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' })\r\n .mockResolvedValueOnce({ id: 1000 })\r\n .mockResolvedValueOnce([]),\r\n findOne: jest.fn(),\r\n },\r\n };\r\n\r\n (mockDataSource.createQueryRunner as jest.Mock).mockReturnValue(\r\n queryRunner\r\n );\r\n\r\n await service.create(createDto, mockUser);\r\n\r\n expect(queryRunner.manager.create).toHaveBeenCalledWith(\r\n CorrespondenceRevision,\r\n expect.objectContaining({ revisionLabel: 'A' })\r\n );\r\n });\r\n\r\n it('should set revisionLabel to null for LETTER type', async () => {\r\n const mockUser = {\r\n user_id: 1,\r\n primaryOrganizationId: 10,\r\n } as unknown as User;\r\n\r\n const createDto: CreateCorrespondenceDto = {\r\n projectId: 'project-uuid',\r\n typeId: 1,\r\n subject: 'Test Subject',\r\n recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }],\r\n };\r\n\r\n const typeRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceType)\r\n );\r\n const statusRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceStatus)\r\n );\r\n const uuidResolver =\r\n testingModule.get(UuidResolverService);\r\n\r\n (uuidResolver.resolveProjectId as jest.Mock).mockResolvedValue(100);\r\n (uuidResolver.resolveOrganizationId as jest.Mock).mockResolvedValue(20);\r\n\r\n (typeRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n typeCode: 'LETTER',\r\n });\r\n (statusRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n statusCode: 'DRAFT',\r\n });\r\n\r\n (numberingService.generateNextNumber as jest.Mock).mockResolvedValue({\r\n number: 'DOC-001',\r\n });\r\n\r\n mockDataSource.manager.findOne\r\n .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' })\r\n .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' });\r\n\r\n const queryRunner = {\r\n connect: jest.fn(),\r\n startTransaction: jest.fn(),\r\n commitTransaction: jest.fn(),\r\n rollbackTransaction: jest.fn(),\r\n release: jest.fn(),\r\n manager: {\r\n create: jest.fn(\r\n (_entity: unknown, payload: Record) => payload\r\n ),\r\n save: jest\r\n .fn()\r\n .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' })\r\n .mockResolvedValueOnce({ id: 1000 })\r\n .mockResolvedValueOnce([]),\r\n findOne: jest.fn(),\r\n },\r\n };\r\n\r\n (mockDataSource.createQueryRunner as jest.Mock).mockReturnValue(\r\n queryRunner\r\n );\r\n\r\n await service.create(createDto, mockUser);\r\n\r\n expect(queryRunner.manager.create).toHaveBeenCalledWith(\r\n CorrespondenceRevision,\r\n expect.objectContaining({ revisionLabel: undefined })\r\n );\r\n });\r\n\r\n it('should set revisionLabel to undefined for MEMO type', async () => {\r\n const mockUser = {\r\n user_id: 1,\r\n primaryOrganizationId: 10,\r\n } as unknown as User;\r\n\r\n const createDto: CreateCorrespondenceDto = {\r\n projectId: 'project-uuid',\r\n typeId: 1,\r\n subject: 'Test Subject',\r\n recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }],\r\n };\r\n\r\n const typeRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceType)\r\n );\r\n const statusRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceStatus)\r\n );\r\n const uuidResolver =\r\n testingModule.get(UuidResolverService);\r\n\r\n (uuidResolver.resolveProjectId as jest.Mock).mockResolvedValue(100);\r\n (uuidResolver.resolveOrganizationId as jest.Mock).mockResolvedValue(20);\r\n\r\n (typeRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n typeCode: 'MEMO',\r\n });\r\n (statusRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n statusCode: 'DRAFT',\r\n });\r\n\r\n (numberingService.generateNextNumber as jest.Mock).mockResolvedValue({\r\n number: 'DOC-001',\r\n });\r\n\r\n mockDataSource.manager.findOne\r\n .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' })\r\n .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' });\r\n\r\n const queryRunner = {\r\n connect: jest.fn(),\r\n startTransaction: jest.fn(),\r\n commitTransaction: jest.fn(),\r\n rollbackTransaction: jest.fn(),\r\n release: jest.fn(),\r\n manager: {\r\n create: jest.fn(\r\n (_entity: unknown, payload: Record) => payload\r\n ),\r\n save: jest\r\n .fn()\r\n .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' })\r\n .mockResolvedValueOnce({ id: 1000 })\r\n .mockResolvedValueOnce([]),\r\n findOne: jest.fn(),\r\n },\r\n };\r\n\r\n (mockDataSource.createQueryRunner as jest.Mock).mockReturnValue(\r\n queryRunner\r\n );\r\n\r\n await service.create(createDto, mockUser);\r\n\r\n expect(queryRunner.manager.create).toHaveBeenCalledWith(\r\n CorrespondenceRevision,\r\n expect.objectContaining({ revisionLabel: undefined })\r\n );\r\n });\r\n });\r\n});\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/74/shopdrawingrevisionentity_748fcda51980c012ec6452aab8313bfa b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/74/shopdrawingrevisionentity_748fcda51980c012ec6452aab8313bfa new file mode 100644 index 0000000..7a20fb4 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/74/shopdrawingrevisionentity_748fcda51980c012ec6452aab8313bfa @@ -0,0 +1,127 @@ +d0160eb46eefc40be7ec59f301171280 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ShopDrawingRevision = void 0; +const typeorm_1 = require("typeorm"); +const shop_drawing_entity_1 = require("./shop-drawing.entity"); +const contract_drawing_entity_1 = require("./contract-drawing.entity"); +const attachment_entity_1 = require("../../../common/file-storage/entities/attachment.entity"); +const user_entity_1 = require("../../user/entities/user.entity"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const class_transformer_1 = require("class-transformer"); +let ShopDrawingRevision = class ShopDrawingRevision extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.ShopDrawingRevision = ShopDrawingRevision; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], ShopDrawingRevision.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'shop_drawing_id' }), + __metadata("design:type", Number) +], ShopDrawingRevision.prototype, "shopDrawingId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'revision_number' }), + __metadata("design:type", Number) +], ShopDrawingRevision.prototype, "revisionNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'title', length: 255 }), + __metadata("design:type", String) +], ShopDrawingRevision.prototype, "title", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'legacy_drawing_number', length: 100, nullable: true }), + __metadata("design:type", String) +], ShopDrawingRevision.prototype, "legacyDrawingNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'revision_label', length: 10, nullable: true }), + __metadata("design:type", String) +], ShopDrawingRevision.prototype, "revisionLabel", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'revision_date', type: 'date', nullable: true }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], ShopDrawingRevision.prototype, "revisionDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], ShopDrawingRevision.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], ShopDrawingRevision.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'is_current', + type: 'boolean', + nullable: true, + default: null, + }), + __metadata("design:type", Object) +], ShopDrawingRevision.prototype, "isCurrent", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'created_by', nullable: true }), + __metadata("design:type", Number) +], ShopDrawingRevision.prototype, "createdBy", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'updated_by', nullable: true }), + __metadata("design:type", Number) +], ShopDrawingRevision.prototype, "updatedBy", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => shop_drawing_entity_1.ShopDrawing, (shopDrawing) => shopDrawing.revisions, { + onDelete: 'CASCADE', + }), + (0, typeorm_1.JoinColumn)({ name: 'shop_drawing_id' }), + __metadata("design:type", typeof (_c = typeof shop_drawing_entity_1.ShopDrawing !== "undefined" && shop_drawing_entity_1.ShopDrawing) === "function" ? _c : Object) +], ShopDrawingRevision.prototype, "shopDrawing", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'created_by' }), + __metadata("design:type", typeof (_d = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _d : Object) +], ShopDrawingRevision.prototype, "creator", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'updated_by' }), + __metadata("design:type", typeof (_e = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _e : Object) +], ShopDrawingRevision.prototype, "updater", void 0); +__decorate([ + (0, typeorm_1.ManyToMany)(() => contract_drawing_entity_1.ContractDrawing), + (0, typeorm_1.JoinTable)({ + name: 'shop_drawing_revision_contract_refs', + joinColumn: { + name: 'shop_drawing_revision_id', + referencedColumnName: 'id', + }, + inverseJoinColumn: { + name: 'contract_drawing_id', + referencedColumnName: 'id', + }, + }), + __metadata("design:type", Array) +], ShopDrawingRevision.prototype, "contractDrawings", void 0); +__decorate([ + (0, typeorm_1.ManyToMany)(() => attachment_entity_1.Attachment), + (0, typeorm_1.JoinTable)({ + name: 'shop_drawing_revision_attachments', + joinColumn: { + name: 'shop_drawing_revision_id', + referencedColumnName: 'id', + }, + inverseJoinColumn: { name: 'attachment_id', referencedColumnName: 'id' }, + }), + __metadata("design:type", Array) +], ShopDrawingRevision.prototype, "attachments", void 0); +exports.ShopDrawingRevision = ShopDrawingRevision = __decorate([ + (0, typeorm_1.Entity)('shop_drawing_revisions'), + (0, typeorm_1.Unique)(['shopDrawingId', 'isCurrent']) +], ShopDrawingRevision); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXHNob3AtZHJhd2luZy1yZXZpc2lvbi5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFDQVVpQjtBQUNqQiwrREFBb0Q7QUFDcEQsdUVBQTREO0FBQzVELCtGQUFxRjtBQUNyRixpRUFBdUQ7QUFDdkQsZ0ZBQTJFO0FBQzNFLHlEQUE0QztBQUlyQyxJQUFNLG1CQUFtQixHQUF6QixNQUFNLG1CQUFvQixTQUFRLGlDQUFjO0NBb0Z0RCxDQUFBO0FBcEZZLGtEQUFtQjtBQUc5QjtJQUZDLElBQUEsZ0NBQXNCLEdBQUU7SUFDeEIsSUFBQSwyQkFBTyxHQUFFOzsrQ0FDRTtBQUdaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUM7OzBEQUNiO0FBR3ZCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUM7OzJEQUNaO0FBR3hCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7O2tEQUN4QjtBQUdmO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOztnRUFDMUM7QUFHN0I7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7OzBEQUN4QztBQUd2QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7a0RBQ2pELElBQUksb0JBQUosSUFBSTt5REFBQztBQUdwQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzt3REFDcEI7QUFHckI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7c0RBQUM7QUFRakI7SUFOQyxJQUFBLGdCQUFNLEVBQUM7UUFDTixJQUFJLEVBQUUsWUFBWTtRQUNsQixJQUFJLEVBQUUsU0FBUztRQUNmLFFBQVEsRUFBRSxJQUFJO1FBQ2QsT0FBTyxFQUFFLElBQUk7S0FDZCxDQUFDOztzREFDeUI7QUFHM0I7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7c0RBQzVCO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O3NEQUM1QjtBQU9uQjtJQUpDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxpQ0FBVyxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFO1FBQ3BFLFFBQVEsRUFBRSxTQUFTO0tBQ3BCLENBQUM7SUFDRCxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztrREFDMUIsaUNBQVcsb0JBQVgsaUNBQVc7d0RBQUM7QUFJMUI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsa0JBQUksQ0FBQztJQUNyQixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLGtCQUFJLG9CQUFKLGtCQUFJO29EQUFDO0FBSWY7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsa0JBQUksQ0FBQztJQUNyQixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLGtCQUFJLG9CQUFKLGtCQUFJO29EQUFDO0FBZWY7SUFaQyxJQUFBLG9CQUFVLEVBQUMsR0FBRyxFQUFFLENBQUMseUNBQWUsQ0FBQztJQUNqQyxJQUFBLG1CQUFTLEVBQUM7UUFDVCxJQUFJLEVBQUUscUNBQXFDO1FBQzNDLFVBQVUsRUFBRTtZQUNWLElBQUksRUFBRSwwQkFBMEI7WUFDaEMsb0JBQW9CLEVBQUUsSUFBSTtTQUMzQjtRQUNELGlCQUFpQixFQUFFO1lBQ2pCLElBQUksRUFBRSxxQkFBcUI7WUFDM0Isb0JBQW9CLEVBQUUsSUFBSTtTQUMzQjtLQUNGLENBQUM7OzZEQUNtQztBQVlyQztJQVRDLElBQUEsb0JBQVUsRUFBQyxHQUFHLEVBQUUsQ0FBQyw4QkFBVSxDQUFDO0lBQzVCLElBQUEsbUJBQVMsRUFBQztRQUNULElBQUksRUFBRSxtQ0FBbUM7UUFDekMsVUFBVSxFQUFFO1lBQ1YsSUFBSSxFQUFFLDBCQUEwQjtZQUNoQyxvQkFBb0IsRUFBRSxJQUFJO1NBQzNCO1FBQ0QsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLElBQUksRUFBRTtLQUN6RSxDQUFDOzt3REFDeUI7OEJBbkZoQixtQkFBbUI7SUFGL0IsSUFBQSxnQkFBTSxFQUFDLHdCQUF3QixDQUFDO0lBQ2hDLElBQUEsZ0JBQU0sRUFBQyxDQUFDLGVBQWUsRUFBRSxXQUFXLENBQUMsQ0FBQztHQUMxQixtQkFBbUIsQ0FvRi9CIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGRyYXdpbmdcXGVudGl0aWVzXFxzaG9wLWRyYXdpbmctcmV2aXNpb24uZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVudGl0eSxcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbiAgQ29sdW1uLFxuICBDcmVhdGVEYXRlQ29sdW1uLFxuICBNYW55VG9PbmUsXG4gIEpvaW5Db2x1bW4sXG4gIE1hbnlUb01hbnksXG4gIEpvaW5UYWJsZSxcbiAgVW5pcXVlLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFNob3BEcmF3aW5nIH0gZnJvbSAnLi9zaG9wLWRyYXdpbmcuZW50aXR5JztcbmltcG9ydCB7IENvbnRyYWN0RHJhd2luZyB9IGZyb20gJy4vY29udHJhY3QtZHJhd2luZy5lbnRpdHknO1xuaW1wb3J0IHsgQXR0YWNobWVudCB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9maWxlLXN0b3JhZ2UvZW50aXRpZXMvYXR0YWNobWVudC5lbnRpdHknO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL3VzZXIvZW50aXRpZXMvdXNlci5lbnRpdHknO1xuaW1wb3J0IHsgVXVpZEJhc2VFbnRpdHkgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZW50aXRpZXMvdXVpZC1iYXNlLmVudGl0eSc7XG5pbXBvcnQgeyBFeGNsdWRlIH0gZnJvbSAnY2xhc3MtdHJhbnNmb3JtZXInO1xuXG5ARW50aXR5KCdzaG9wX2RyYXdpbmdfcmV2aXNpb25zJylcbkBVbmlxdWUoWydzaG9wRHJhd2luZ0lkJywgJ2lzQ3VycmVudCddKVxuZXhwb3J0IGNsYXNzIFNob3BEcmF3aW5nUmV2aXNpb24gZXh0ZW5kcyBVdWlkQmFzZUVudGl0eSB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKClcbiAgQEV4Y2x1ZGUoKVxuICBpZCE6IG51bWJlcjsgLy8g4LmA4LiV4Li04LihICFcblxuICBAQ29sdW1uKHsgbmFtZTogJ3Nob3BfZHJhd2luZ19pZCcgfSlcbiAgc2hvcERyYXdpbmdJZCE6IG51bWJlcjsgLy8g4LmA4LiV4Li04LihICFcblxuICBAQ29sdW1uKHsgbmFtZTogJ3JldmlzaW9uX251bWJlcicgfSlcbiAgcmV2aXNpb25OdW1iZXIhOiBudW1iZXI7IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQENvbHVtbih7IG5hbWU6ICd0aXRsZScsIGxlbmd0aDogMjU1IH0pXG4gIHRpdGxlITogc3RyaW5nOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBDb2x1bW4oeyBuYW1lOiAnbGVnYWN5X2RyYXdpbmdfbnVtYmVyJywgbGVuZ3RoOiAxMDAsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGxlZ2FjeURyYXdpbmdOdW1iZXI/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdyZXZpc2lvbl9sYWJlbCcsIGxlbmd0aDogMTAsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHJldmlzaW9uTGFiZWw/OiBzdHJpbmc7IC8vIG51bGxhYmxlIOC5g+C4iuC5iSA/XG5cbiAgQENvbHVtbih7IG5hbWU6ICdyZXZpc2lvbl9kYXRlJywgdHlwZTogJ2RhdGUnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICByZXZpc2lvbkRhdGU/OiBEYXRlOyAvLyBudWxsYWJsZSDguYPguIrguYkgP1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndGV4dCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nOyAvLyBudWxsYWJsZSDguYPguIrguYkgP1xuXG4gIEBDcmVhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXG4gIGNyZWF0ZWRBdCE6IERhdGU7IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQENvbHVtbih7XG4gICAgbmFtZTogJ2lzX2N1cnJlbnQnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICBkZWZhdWx0OiBudWxsLFxuICB9KVxuICBpc0N1cnJlbnQ/OiBib29sZWFuIHwgbnVsbDtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYnknLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBjcmVhdGVkQnk/OiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2J5JywgbnVsbGFibGU6IHRydWUgfSlcbiAgdXBkYXRlZEJ5PzogbnVtYmVyO1xuXG4gIC8vIFJlbGF0aW9uc1xuICBATWFueVRvT25lKCgpID0+IFNob3BEcmF3aW5nLCAoc2hvcERyYXdpbmcpID0+IHNob3BEcmF3aW5nLnJldmlzaW9ucywge1xuICAgIG9uRGVsZXRlOiAnQ0FTQ0FERScsXG4gIH0pXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3Nob3BfZHJhd2luZ19pZCcgfSlcbiAgc2hvcERyYXdpbmchOiBTaG9wRHJhd2luZzsgLy8g4LmA4LiV4Li04LihICFcblxuICBATWFueVRvT25lKCgpID0+IFVzZXIpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYnknIH0pXG4gIGNyZWF0b3I/OiBVc2VyO1xuXG4gIEBNYW55VG9PbmUoKCkgPT4gVXNlcilcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAndXBkYXRlZF9ieScgfSlcbiAgdXBkYXRlcj86IFVzZXI7XG5cbiAgLy8gUmVmZXJlbmNlcyB0byBDb250cmFjdCBEcmF3aW5ncyAoTTpOKVxuICBATWFueVRvTWFueSgoKSA9PiBDb250cmFjdERyYXdpbmcpXG4gIEBKb2luVGFibGUoe1xuICAgIG5hbWU6ICdzaG9wX2RyYXdpbmdfcmV2aXNpb25fY29udHJhY3RfcmVmcycsXG4gICAgam9pbkNvbHVtbjoge1xuICAgICAgbmFtZTogJ3Nob3BfZHJhd2luZ19yZXZpc2lvbl9pZCcsXG4gICAgICByZWZlcmVuY2VkQ29sdW1uTmFtZTogJ2lkJyxcbiAgICB9LFxuICAgIGludmVyc2VKb2luQ29sdW1uOiB7XG4gICAgICBuYW1lOiAnY29udHJhY3RfZHJhd2luZ19pZCcsXG4gICAgICByZWZlcmVuY2VkQ29sdW1uTmFtZTogJ2lkJyxcbiAgICB9LFxuICB9KVxuICBjb250cmFjdERyYXdpbmdzITogQ29udHJhY3REcmF3aW5nW107IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgLy8gQXR0YWNobWVudHMgKE06TilcbiAgQE1hbnlUb01hbnkoKCkgPT4gQXR0YWNobWVudClcbiAgQEpvaW5UYWJsZSh7XG4gICAgbmFtZTogJ3Nob3BfZHJhd2luZ19yZXZpc2lvbl9hdHRhY2htZW50cycsXG4gICAgam9pbkNvbHVtbjoge1xuICAgICAgbmFtZTogJ3Nob3BfZHJhd2luZ19yZXZpc2lvbl9pZCcsXG4gICAgICByZWZlcmVuY2VkQ29sdW1uTmFtZTogJ2lkJyxcbiAgICB9LFxuICAgIGludmVyc2VKb2luQ29sdW1uOiB7IG5hbWU6ICdhdHRhY2htZW50X2lkJywgcmVmZXJlbmNlZENvbHVtbk5hbWU6ICdpZCcgfSxcbiAgfSlcbiAgYXR0YWNobWVudHMhOiBBdHRhY2htZW50W107IC8vIOC5gOC4leC4tOC4oSAhICjguJXguLHguKfguJfguLXguYggZXJyb3IpXG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/74/shopdrawingrevisionentity_748fcda51980c012ec6452aab8313bfa.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/74/shopdrawingrevisionentity_748fcda51980c012ec6452aab8313bfa.map new file mode 100644 index 0000000..1238784 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/74/shopdrawingrevisionentity_748fcda51980c012ec6452aab8313bfa.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\shop-drawing-revision.entity.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\shop-drawing-revision.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n ManyToOne,\n JoinColumn,\n ManyToMany,\n JoinTable,\n Unique,\n} from 'typeorm';\nimport { ShopDrawing } from './shop-drawing.entity';\nimport { ContractDrawing } from './contract-drawing.entity';\nimport { Attachment } from '../../../common/file-storage/entities/attachment.entity';\nimport { User } from '../../user/entities/user.entity';\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\nimport { Exclude } from 'class-transformer';\n\n@Entity('shop_drawing_revisions')\n@Unique(['shopDrawingId', 'isCurrent'])\nexport class ShopDrawingRevision extends UuidBaseEntity {\n @PrimaryGeneratedColumn()\n @Exclude()\n id!: number; // เติม !\n\n @Column({ name: 'shop_drawing_id' })\n shopDrawingId!: number; // เติม !\n\n @Column({ name: 'revision_number' })\n revisionNumber!: number; // เติม !\n\n @Column({ name: 'title', length: 255 })\n title!: string; // เติม !\n\n @Column({ name: 'legacy_drawing_number', length: 100, nullable: true })\n legacyDrawingNumber?: string;\n\n @Column({ name: 'revision_label', length: 10, nullable: true })\n revisionLabel?: string; // nullable ใช้ ?\n\n @Column({ name: 'revision_date', type: 'date', nullable: true })\n revisionDate?: Date; // nullable ใช้ ?\n\n @Column({ type: 'text', nullable: true })\n description?: string; // nullable ใช้ ?\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date; // เติม !\n\n @Column({\n name: 'is_current',\n type: 'boolean',\n nullable: true,\n default: null,\n })\n isCurrent?: boolean | null;\n\n @Column({ name: 'created_by', nullable: true })\n createdBy?: number;\n\n @Column({ name: 'updated_by', nullable: true })\n updatedBy?: number;\n\n // Relations\n @ManyToOne(() => ShopDrawing, (shopDrawing) => shopDrawing.revisions, {\n onDelete: 'CASCADE',\n })\n @JoinColumn({ name: 'shop_drawing_id' })\n shopDrawing!: ShopDrawing; // เติม !\n\n @ManyToOne(() => User)\n @JoinColumn({ name: 'created_by' })\n creator?: User;\n\n @ManyToOne(() => User)\n @JoinColumn({ name: 'updated_by' })\n updater?: User;\n\n // References to Contract Drawings (M:N)\n @ManyToMany(() => ContractDrawing)\n @JoinTable({\n name: 'shop_drawing_revision_contract_refs',\n joinColumn: {\n name: 'shop_drawing_revision_id',\n referencedColumnName: 'id',\n },\n inverseJoinColumn: {\n name: 'contract_drawing_id',\n referencedColumnName: 'id',\n },\n })\n contractDrawings!: ContractDrawing[]; // เติม !\n\n // Attachments (M:N)\n @ManyToMany(() => Attachment)\n @JoinTable({\n name: 'shop_drawing_revision_attachments',\n joinColumn: {\n name: 'shop_drawing_revision_id',\n referencedColumnName: 'id',\n },\n inverseJoinColumn: { name: 'attachment_id', referencedColumnName: 'id' },\n })\n attachments!: Attachment[]; // เติม ! (ตัวที่ error)\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/75/currentuserdecorator_756d861fb3fbfe77d847637987836a6d b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/75/currentuserdecorator_756d861fb3fbfe77d847637987836a6d new file mode 100644 index 0000000..e317900 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/75/currentuserdecorator_756d861fb3fbfe77d847637987836a6d @@ -0,0 +1,19 @@ +35b8e07bce844098e15d4509e8b81f88 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CurrentUser = void 0; +const common_1 = require("@nestjs/common"); +/** + * Decorator สำหรับดึงข้อมูล User ปัจจุบันจาก Request Object + * ใช้คู่กับ JwtAuthGuard + * + * ตัวอย่างการใช้: + * @Get() + * findAll(@CurrentUser() user: User) { ... } + */ +exports.CurrentUser = (0, common_1.createParamDecorator)((data, ctx) => { + const request = ctx.switchToHttp().getRequest(); + // request.user ถูก set โดย Passport/JwtStrategy + return request.user; +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxkZWNvcmF0b3JzXFxjdXJyZW50LXVzZXIuZGVjb3JhdG9yLnRzIiwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF3RTtBQUd4RTs7Ozs7OztHQU9HO0FBQ1UsUUFBQSxXQUFXLEdBQUcsSUFBQSw2QkFBb0IsRUFDN0MsQ0FBQyxJQUFhLEVBQUUsR0FBcUIsRUFBRSxFQUFFO0lBQ3ZDLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxVQUFVLEVBQW1CLENBQUM7SUFDakUsZ0RBQWdEO0lBQ2hELE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQztBQUN0QixDQUFDLENBQ0YsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxjb21tb25cXGRlY29yYXRvcnNcXGN1cnJlbnQtdXNlci5kZWNvcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlUGFyYW1EZWNvcmF0b3IsIEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vLi4vbW9kdWxlcy91c2VyL2VudGl0aWVzL3VzZXIuZW50aXR5JztcblxuLyoqXG4gKiBEZWNvcmF0b3Ig4Liq4Liz4Lir4Lij4Lix4Lia4LiU4Li24LiH4LiC4LmJ4Lit4Lih4Li54LilIFVzZXIg4Lib4Lix4LiI4LiI4Li44Lia4Lix4LiZ4LiI4Liy4LiBIFJlcXVlc3QgT2JqZWN0XG4gKiDguYPguIrguYnguITguLnguYjguIHguLHguJogSnd0QXV0aEd1YXJkXG4gKlxuICog4LiV4Lix4Lin4Lit4Lii4LmI4Liy4LiH4LiB4Liy4Lij4LmD4LiK4LmJOlxuICogQEdldCgpXG4gKiBmaW5kQWxsKEBDdXJyZW50VXNlcigpIHVzZXI6IFVzZXIpIHsgLi4uIH1cbiAqL1xuZXhwb3J0IGNvbnN0IEN1cnJlbnRVc2VyID0gY3JlYXRlUGFyYW1EZWNvcmF0b3IoXG4gIChkYXRhOiB1bmtub3duLCBjdHg6IEV4ZWN1dGlvbkNvbnRleHQpID0+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gY3R4LnN3aXRjaFRvSHR0cCgpLmdldFJlcXVlc3Q8eyB1c2VyPzogVXNlciB9PigpO1xuICAgIC8vIHJlcXVlc3QudXNlciDguJbguLnguIEgc2V0IOC5guC4lOC4oiBQYXNzcG9ydC9Kd3RTdHJhdGVneVxuICAgIHJldHVybiByZXF1ZXN0LnVzZXI7XG4gIH1cbik7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/75/currentuserdecorator_756d861fb3fbfe77d847637987836a6d.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/75/currentuserdecorator_756d861fb3fbfe77d847637987836a6d.map new file mode 100644 index 0000000..320635c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/75/currentuserdecorator_756d861fb3fbfe77d847637987836a6d.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\decorators\\current-user.decorator.ts","mappings":";;;AAAA,2CAAwE;AAGxE;;;;;;;GAOG;AACU,QAAA,WAAW,GAAG,IAAA,6BAAoB,EAC7C,CAAC,IAAa,EAAE,GAAqB,EAAE,EAAE;IACvC,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,UAAU,EAAmB,CAAC;IACjE,gDAAgD;IAChD,OAAO,OAAO,CAAC,IAAI,CAAC;AACtB,CAAC,CACF,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\decorators\\current-user.decorator.ts"],"sourcesContent":["import { createParamDecorator, ExecutionContext } from '@nestjs/common';\nimport { User } from '../../modules/user/entities/user.entity';\n\n/**\n * Decorator สำหรับดึงข้อมูล User ปัจจุบันจาก Request Object\n * ใช้คู่กับ JwtAuthGuard\n *\n * ตัวอย่างการใช้:\n * @Get()\n * findAll(@CurrentUser() user: User) { ... }\n */\nexport const CurrentUser = createParamDecorator(\n (data: unknown, ctx: ExecutionContext) => {\n const request = ctx.switchToHttp().getRequest<{ user?: User }>();\n // request.user ถูก set โดย Passport/JwtStrategy\n return request.user;\n }\n);\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/75/parseuuidpipe_75a9802dc98f15e3303d636e3033592a b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/75/parseuuidpipe_75a9802dc98f15e3303d636e3033592a new file mode 100644 index 0000000..455e44f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/75/parseuuidpipe_75a9802dc98f15e3303d636e3033592a @@ -0,0 +1,33 @@ +c1ad1847c806f3f056d0137b3a0ec189 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ParseUuidPipe = void 0; +const common_1 = require("@nestjs/common"); +const uuid_1 = require("uuid"); +/** + * Validates that a route parameter is a valid UUID string. + * Accepts any UUID version (v1 from DB DEFAULT, v7 from app generation). + * + * Usage: @Param('uuid', ParseUuidPipe) uuid: string + * + * @see ADR-019 Hybrid Identifier Strategy + */ +let ParseUuidPipe = class ParseUuidPipe { + transform(value) { + if (!(0, uuid_1.validate)(value)) { + throw new common_1.BadRequestException(`Invalid UUID format: ${value}`); + } + return value.toLowerCase(); + } +}; +exports.ParseUuidPipe = ParseUuidPipe; +exports.ParseUuidPipe = ParseUuidPipe = __decorate([ + (0, common_1.Injectable)() +], ParseUuidPipe); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxwaXBlc1xccGFyc2UtdXVpZC5waXBlLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLDJDQUFnRjtBQUNoRiwrQkFBZ0Q7QUFFaEQ7Ozs7Ozs7R0FPRztBQUVJLElBQU0sYUFBYSxHQUFuQixNQUFNLGFBQWE7SUFDeEIsU0FBUyxDQUFDLEtBQWE7UUFDckIsSUFBSSxDQUFDLElBQUEsZUFBWSxFQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLDRCQUFtQixDQUFDLHdCQUF3QixLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM3QixDQUFDO0NBQ0YsQ0FBQTtBQVBZLHNDQUFhO3dCQUFiLGFBQWE7SUFEekIsSUFBQSxtQkFBVSxHQUFFO0dBQ0EsYUFBYSxDQU96QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxjb21tb25cXHBpcGVzXFxwYXJzZS11dWlkLnBpcGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZVRyYW5zZm9ybSwgSW5qZWN0YWJsZSwgQmFkUmVxdWVzdEV4Y2VwdGlvbiB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcbmltcG9ydCB7IHZhbGlkYXRlIGFzIHV1aWRWYWxpZGF0ZSB9IGZyb20gJ3V1aWQnO1xuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGF0IGEgcm91dGUgcGFyYW1ldGVyIGlzIGEgdmFsaWQgVVVJRCBzdHJpbmcuXG4gKiBBY2NlcHRzIGFueSBVVUlEIHZlcnNpb24gKHYxIGZyb20gREIgREVGQVVMVCwgdjcgZnJvbSBhcHAgZ2VuZXJhdGlvbikuXG4gKlxuICogVXNhZ2U6IEBQYXJhbSgndXVpZCcsIFBhcnNlVXVpZFBpcGUpIHV1aWQ6IHN0cmluZ1xuICpcbiAqIEBzZWUgQURSLTAxOSBIeWJyaWQgSWRlbnRpZmllciBTdHJhdGVneVxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUGFyc2VVdWlkUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm08c3RyaW5nPiB7XG4gIHRyYW5zZm9ybSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXV1aWRWYWxpZGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKGBJbnZhbGlkIFVVSUQgZm9ybWF0OiAke3ZhbHVlfWApO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgfVxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/75/parseuuidpipe_75a9802dc98f15e3303d636e3033592a.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/75/parseuuidpipe_75a9802dc98f15e3303d636e3033592a.map new file mode 100644 index 0000000..11d8858 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/75/parseuuidpipe_75a9802dc98f15e3303d636e3033592a.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\pipes\\parse-uuid.pipe.ts","mappings":";;;;;;;;;AAAA,2CAAgF;AAChF,+BAAgD;AAEhD;;;;;;;GAOG;AAEI,IAAM,aAAa,GAAnB,MAAM,aAAa;IACxB,SAAS,CAAC,KAAa;QACrB,IAAI,CAAC,IAAA,eAAY,EAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,4BAAmB,CAAC,wBAAwB,KAAK,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;CACF,CAAA;AAPY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;GACA,aAAa,CAOzB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\pipes\\parse-uuid.pipe.ts"],"sourcesContent":["import { PipeTransform, Injectable, BadRequestException } from '@nestjs/common';\nimport { validate as uuidValidate } from 'uuid';\n\n/**\n * Validates that a route parameter is a valid UUID string.\n * Accepts any UUID version (v1 from DB DEFAULT, v7 from app generation).\n *\n * Usage: @Param('uuid', ParseUuidPipe) uuid: string\n *\n * @see ADR-019 Hybrid Identifier Strategy\n */\n@Injectable()\nexport class ParseUuidPipe implements PipeTransform {\n transform(value: string): string {\n if (!uuidValidate(value)) {\n throw new BadRequestException(`Invalid UUID format: ${value}`);\n }\n return value.toLowerCase();\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/76/correspondencereferenceentity_767d26e42d0dcded199e02d8cfeed978 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/76/correspondencereferenceentity_767d26e42d0dcded199e02d8cfeed978 new file mode 100644 index 0000000..954025e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/76/correspondencereferenceentity_767d26e42d0dcded199e02d8cfeed978 @@ -0,0 +1,41 @@ +0d8856588afe476fde634f80c05f61ee +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceReference = void 0; +const typeorm_1 = require("typeorm"); +const correspondence_entity_1 = require("./correspondence.entity"); +let CorrespondenceReference = class CorrespondenceReference { +}; +exports.CorrespondenceReference = CorrespondenceReference; +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'src_correspondence_id' }), + __metadata("design:type", Number) +], CorrespondenceReference.prototype, "sourceId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'tgt_correspondence_id' }), + __metadata("design:type", Number) +], CorrespondenceReference.prototype, "targetId", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => correspondence_entity_1.Correspondence, { onDelete: 'CASCADE' }), + (0, typeorm_1.JoinColumn)({ name: 'src_correspondence_id' }), + __metadata("design:type", typeof (_a = typeof correspondence_entity_1.Correspondence !== "undefined" && correspondence_entity_1.Correspondence) === "function" ? _a : Object) +], CorrespondenceReference.prototype, "source", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => correspondence_entity_1.Correspondence, { onDelete: 'CASCADE' }), + (0, typeorm_1.JoinColumn)({ name: 'tgt_correspondence_id' }), + __metadata("design:type", typeof (_b = typeof correspondence_entity_1.Correspondence !== "undefined" && correspondence_entity_1.Correspondence) === "function" ? _b : Object) +], CorrespondenceReference.prototype, "target", void 0); +exports.CorrespondenceReference = CorrespondenceReference = __decorate([ + (0, typeorm_1.Entity)('correspondence_references') +], CorrespondenceReference); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGVudGl0aWVzXFxjb3JyZXNwb25kZW5jZS1yZWZlcmVuY2UuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBdUU7QUFDdkUsbUVBQXlEO0FBR2xELElBQU0sdUJBQXVCLEdBQTdCLE1BQU0sdUJBQXVCO0NBY25DLENBQUE7QUFkWSwwREFBdUI7QUFFbEM7SUFEQyxJQUFBLHVCQUFhLEVBQUMsRUFBRSxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQzs7eURBQy9CO0FBR2xCO0lBREMsSUFBQSx1QkFBYSxFQUFDLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLENBQUM7O3lEQUMvQjtBQUlsQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxzQ0FBYyxFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ3hELElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxDQUFDO2tEQUNyQyxzQ0FBYyxvQkFBZCxzQ0FBYzt1REFBQztBQUl4QjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxzQ0FBYyxFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ3hELElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxDQUFDO2tEQUNyQyxzQ0FBYyxvQkFBZCxzQ0FBYzt1REFBQztrQ0FiYix1QkFBdUI7SUFEbkMsSUFBQSxnQkFBTSxFQUFDLDJCQUEyQixDQUFDO0dBQ3ZCLHVCQUF1QixDQWNuQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxjb3JyZXNwb25kZW5jZVxcZW50aXRpZXNcXGNvcnJlc3BvbmRlbmNlLXJlZmVyZW5jZS5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5LCBQcmltYXJ5Q29sdW1uLCBNYW55VG9PbmUsIEpvaW5Db2x1bW4gfSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlIH0gZnJvbSAnLi9jb3JyZXNwb25kZW5jZS5lbnRpdHknO1xuXG5ARW50aXR5KCdjb3JyZXNwb25kZW5jZV9yZWZlcmVuY2VzJylcbmV4cG9ydCBjbGFzcyBDb3JyZXNwb25kZW5jZVJlZmVyZW5jZSB7XG4gIEBQcmltYXJ5Q29sdW1uKHsgbmFtZTogJ3NyY19jb3JyZXNwb25kZW5jZV9pZCcgfSlcbiAgc291cmNlSWQhOiBudW1iZXI7XG5cbiAgQFByaW1hcnlDb2x1bW4oeyBuYW1lOiAndGd0X2NvcnJlc3BvbmRlbmNlX2lkJyB9KVxuICB0YXJnZXRJZCE6IG51bWJlcjtcblxuICBATWFueVRvT25lKCgpID0+IENvcnJlc3BvbmRlbmNlLCB7IG9uRGVsZXRlOiAnQ0FTQ0FERScgfSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAnc3JjX2NvcnJlc3BvbmRlbmNlX2lkJyB9KVxuICBzb3VyY2U/OiBDb3JyZXNwb25kZW5jZTtcblxuICBATWFueVRvT25lKCgpID0+IENvcnJlc3BvbmRlbmNlLCB7IG9uRGVsZXRlOiAnQ0FTQ0FERScgfSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAndGd0X2NvcnJlc3BvbmRlbmNlX2lkJyB9KVxuICB0YXJnZXQ/OiBDb3JyZXNwb25kZW5jZTtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/76/correspondencereferenceentity_767d26e42d0dcded199e02d8cfeed978.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/76/correspondencereferenceentity_767d26e42d0dcded199e02d8cfeed978.map new file mode 100644 index 0000000..2444cbd --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/76/correspondencereferenceentity_767d26e42d0dcded199e02d8cfeed978.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-reference.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAAuE;AACvE,mEAAyD;AAGlD,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;CAcnC,CAAA;AAdY,0DAAuB;AAElC;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;;yDAC/B;AAGlB;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;;yDAC/B;AAIlB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,sCAAc,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACxD,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;kDACrC,sCAAc,oBAAd,sCAAc;uDAAC;AAIxB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,sCAAc,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACxD,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;kDACrC,sCAAc,oBAAd,sCAAc;uDAAC;kCAbb,uBAAuB;IADnC,IAAA,gBAAM,EAAC,2BAA2B,CAAC;GACvB,uBAAuB,CAcnC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-reference.entity.ts"],"sourcesContent":["import { Entity, PrimaryColumn, ManyToOne, JoinColumn } from 'typeorm';\nimport { Correspondence } from './correspondence.entity';\n\n@Entity('correspondence_references')\nexport class CorrespondenceReference {\n @PrimaryColumn({ name: 'src_correspondence_id' })\n sourceId!: number;\n\n @PrimaryColumn({ name: 'tgt_correspondence_id' })\n targetId!: number;\n\n @ManyToOne(() => Correspondence, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'src_correspondence_id' })\n source?: Correspondence;\n\n @ManyToOne(() => Correspondence, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'tgt_correspondence_id' })\n target?: Correspondence;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/76/metricsservice_769bcb0e914a7deb72901e32eaa4559a b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/76/metricsservice_769bcb0e914a7deb72901e32eaa4559a new file mode 100644 index 0000000..08c686c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/76/metricsservice_769bcb0e914a7deb72901e32eaa4559a @@ -0,0 +1,38 @@ +1e43b13634c8db19e29ee03167c1f1a1 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MetricsService = void 0; +const common_1 = require("@nestjs/common"); +const prom_client_1 = require("prom-client"); +const nestjs_prometheus_1 = require("@willsoto/nestjs-prometheus"); +let MetricsService = class MetricsService { + constructor(numbersGenerated, sequenceUtilization, lockWaitTime, lockFailures) { + this.numbersGenerated = numbersGenerated; + this.sequenceUtilization = sequenceUtilization; + this.lockWaitTime = lockWaitTime; + this.lockFailures = lockFailures; + } +}; +exports.MetricsService = MetricsService; +exports.MetricsService = MetricsService = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, nestjs_prometheus_1.InjectMetric)('numbering_sequences_total')), + __param(1, (0, nestjs_prometheus_1.InjectMetric)('numbering_sequence_utilization')), + __param(2, (0, nestjs_prometheus_1.InjectMetric)('numbering_lock_wait_seconds')), + __param(3, (0, nestjs_prometheus_1.InjectMetric)('numbering_lock_failures_total')), + __metadata("design:paramtypes", [typeof (_a = typeof prom_client_1.Counter !== "undefined" && prom_client_1.Counter) === "function" ? _a : Object, typeof (_b = typeof prom_client_1.Gauge !== "undefined" && prom_client_1.Gauge) === "function" ? _b : Object, typeof (_c = typeof prom_client_1.Histogram !== "undefined" && prom_client_1.Histogram) === "function" ? _c : Object, typeof (_d = typeof prom_client_1.Counter !== "undefined" && prom_client_1.Counter) === "function" ? _d : Object]) +], MetricsService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxzZXJ2aWNlc1xcbWV0cmljcy5zZXJ2aWNlLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNEM7QUFDNUMsNkNBQXdEO0FBQ3hELG1FQUEyRDtBQUdwRCxJQUFNLGNBQWMsR0FBcEIsTUFBTSxjQUFjO0lBQ3pCLFlBRVMsZ0JBQWlDLEVBRWpDLG1CQUFrQyxFQUVsQyxZQUErQixFQUUvQixZQUE2QjtRQU43QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWlCO1FBRWpDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBZTtRQUVsQyxpQkFBWSxHQUFaLFlBQVksQ0FBbUI7UUFFL0IsaUJBQVksR0FBWixZQUFZLENBQWlCO0lBQ25DLENBQUM7Q0FDTCxDQUFBO0FBWFksd0NBQWM7eUJBQWQsY0FBYztJQUQxQixJQUFBLG1CQUFVLEdBQUU7SUFHUixXQUFBLElBQUEsZ0NBQVksRUFBQywyQkFBMkIsQ0FBQyxDQUFBO0lBRXpDLFdBQUEsSUFBQSxnQ0FBWSxFQUFDLGdDQUFnQyxDQUFDLENBQUE7SUFFOUMsV0FBQSxJQUFBLGdDQUFZLEVBQUMsNkJBQTZCLENBQUMsQ0FBQTtJQUUzQyxXQUFBLElBQUEsZ0NBQVksRUFBQywrQkFBK0IsQ0FBQyxDQUFBO3lEQUxyQixxQkFBTyxvQkFBUCxxQkFBTyxvREFFSixtQkFBSyxvQkFBTCxtQkFBSyxvREFFWix1QkFBUyxvQkFBVCx1QkFBUyxvREFFVCxxQkFBTyxvQkFBUCxxQkFBTztHQVRuQixjQUFjLENBVzFCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGRvY3VtZW50LW51bWJlcmluZ1xcc2VydmljZXNcXG1ldHJpY3Muc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xyXG5pbXBvcnQgeyBDb3VudGVyLCBHYXVnZSwgSGlzdG9ncmFtIH0gZnJvbSAncHJvbS1jbGllbnQnO1xyXG5pbXBvcnQgeyBJbmplY3RNZXRyaWMgfSBmcm9tICdAd2lsbHNvdG8vbmVzdGpzLXByb21ldGhldXMnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTWV0cmljc1NlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdE1ldHJpYygnbnVtYmVyaW5nX3NlcXVlbmNlc190b3RhbCcpXHJcbiAgICBwdWJsaWMgbnVtYmVyc0dlbmVyYXRlZDogQ291bnRlcjxzdHJpbmc+LFxyXG4gICAgQEluamVjdE1ldHJpYygnbnVtYmVyaW5nX3NlcXVlbmNlX3V0aWxpemF0aW9uJylcclxuICAgIHB1YmxpYyBzZXF1ZW5jZVV0aWxpemF0aW9uOiBHYXVnZTxzdHJpbmc+LFxyXG4gICAgQEluamVjdE1ldHJpYygnbnVtYmVyaW5nX2xvY2tfd2FpdF9zZWNvbmRzJylcclxuICAgIHB1YmxpYyBsb2NrV2FpdFRpbWU6IEhpc3RvZ3JhbTxzdHJpbmc+LFxyXG4gICAgQEluamVjdE1ldHJpYygnbnVtYmVyaW5nX2xvY2tfZmFpbHVyZXNfdG90YWwnKVxyXG4gICAgcHVibGljIGxvY2tGYWlsdXJlczogQ291bnRlcjxzdHJpbmc+XHJcbiAgKSB7fVxyXG59XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/76/metricsservice_769bcb0e914a7deb72901e32eaa4559a.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/76/metricsservice_769bcb0e914a7deb72901e32eaa4559a.map new file mode 100644 index 0000000..5a004e5 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/76/metricsservice_769bcb0e914a7deb72901e32eaa4559a.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\metrics.service.ts","mappings":";;;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6CAAwD;AACxD,mEAA2D;AAGpD,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,YAES,gBAAiC,EAEjC,mBAAkC,EAElC,YAA+B,EAE/B,YAA6B;QAN7B,qBAAgB,GAAhB,gBAAgB,CAAiB;QAEjC,wBAAmB,GAAnB,mBAAmB,CAAe;QAElC,iBAAY,GAAZ,YAAY,CAAmB;QAE/B,iBAAY,GAAZ,YAAY,CAAiB;IACnC,CAAC;CACL,CAAA;AAXY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,gCAAY,EAAC,2BAA2B,CAAC,CAAA;IAEzC,WAAA,IAAA,gCAAY,EAAC,gCAAgC,CAAC,CAAA;IAE9C,WAAA,IAAA,gCAAY,EAAC,6BAA6B,CAAC,CAAA;IAE3C,WAAA,IAAA,gCAAY,EAAC,+BAA+B,CAAC,CAAA;yDALrB,qBAAO,oBAAP,qBAAO,oDAEJ,mBAAK,oBAAL,mBAAK,oDAEZ,uBAAS,oBAAT,uBAAS,oDAET,qBAAO,oBAAP,qBAAO;GATnB,cAAc,CAW1B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\metrics.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\r\nimport { Counter, Gauge, Histogram } from 'prom-client';\r\nimport { InjectMetric } from '@willsoto/nestjs-prometheus';\r\n\r\n@Injectable()\r\nexport class MetricsService {\r\n constructor(\r\n @InjectMetric('numbering_sequences_total')\r\n public numbersGenerated: Counter,\r\n @InjectMetric('numbering_sequence_utilization')\r\n public sequenceUtilization: Gauge,\r\n @InjectMetric('numbering_lock_wait_seconds')\r\n public lockWaitTime: Histogram,\r\n @InjectMetric('numbering_lock_failures_total')\r\n public lockFailures: Counter\r\n ) {}\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/76/version_76c977e478e6d783fbb7d8c7e0fe5b33 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/76/version_76c977e478e6d783fbb7d8c7e0fe5b33 new file mode 100644 index 0000000..65c0a38 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/76/version_76c977e478e6d783fbb7d8c7e0fe5b33 @@ -0,0 +1,12 @@ +3c2e75d9a9e2db245e432d0bf8d0c111 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const validate_js_1 = require("./validate.js"); +function version(uuid) { + if (!(0, validate_js_1.default)(uuid)) { + throw TypeError('Invalid UUID'); + } + return parseInt(uuid.slice(14, 15), 16); +} +exports.default = version; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdmVyc2lvbi5qcyIsIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7QUFDYixNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM5RCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDL0MsU0FBUyxPQUFPLENBQUMsSUFBSTtJQUNqQixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDcEMsTUFBTSxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFDRCxPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcbm9kZV9tb2R1bGVzXFwucG5wbVxcdXVpZEAxMS4xLjBcXG5vZGVfbW9kdWxlc1xcdXVpZFxcZGlzdFxcY2pzXFx2ZXJzaW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgdmFsaWRhdGVfanNfMSA9IHJlcXVpcmUoXCIuL3ZhbGlkYXRlLmpzXCIpO1xuZnVuY3Rpb24gdmVyc2lvbih1dWlkKSB7XG4gICAgaWYgKCEoMCwgdmFsaWRhdGVfanNfMS5kZWZhdWx0KSh1dWlkKSkge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ0ludmFsaWQgVVVJRCcpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VJbnQodXVpZC5zbGljZSgxNCwgMTUpLCAxNik7XG59XG5leHBvcnRzLmRlZmF1bHQgPSB2ZXJzaW9uO1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/76/version_76c977e478e6d783fbb7d8c7e0fe5b33.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/76/version_76c977e478e6d783fbb7d8c7e0fe5b33.map new file mode 100644 index 0000000..503d843 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/76/version_76c977e478e6d783fbb7d8c7e0fe5b33.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\version.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,MAAM,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAC/C,SAAS,OAAO,CAAC,IAAI;IACjB,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,SAAS,CAAC,cAAc,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\version.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst validate_js_1 = require(\"./validate.js\");\nfunction version(uuid) {\n if (!(0, validate_js_1.default)(uuid)) {\n throw TypeError('Invalid UUID');\n }\n return parseInt(uuid.slice(14, 15), 16);\n}\nexports.default = version;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/uuidbaseentity_7b3e9cd55ed540bfcd8af187ebbdd7de b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/uuidbaseentity_7b3e9cd55ed540bfcd8af187ebbdd7de new file mode 100644 index 0000000..b8f5e0d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/uuidbaseentity_7b3e9cd55ed540bfcd8af187ebbdd7de @@ -0,0 +1,50 @@ +dc5f6c85e35616e30dbbeb1175464884 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UuidBaseEntity = void 0; +const typeorm_1 = require("typeorm"); +const uuid_1 = require("uuid"); +/** + * Abstract base entity providing a UUID public identifier. + * + * Naming Convention (ADR-019 v1.8.1): + * - TypeScript Property: `publicId` — semantic name indicating this is the public-facing identifier + * - Database Column: `uuid` — MariaDB native UUID type (stored as BINARY(16)) + * + * This avoids confusion between the property name and the DB data type, + * while clearly indicating this is the ID exposed via API (not internal INT PK). + */ +class UuidBaseEntity { + generatePublicId() { + if (!this.publicId) { + this.publicId = (0, uuid_1.v7)(); + } + } +} +exports.UuidBaseEntity = UuidBaseEntity; +__decorate([ + (0, typeorm_1.Column)({ + type: 'uuid', + name: 'uuid', // DB column name (MariaDB native UUID type) + unique: true, + nullable: false, + comment: 'UUID Public Identifier (ADR-019)', + }), + __metadata("design:type", String) +], UuidBaseEntity.prototype, "publicId", void 0); +__decorate([ + (0, typeorm_1.BeforeInsert)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", void 0) +], UuidBaseEntity.prototype, "generatePublicId", null); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxlbnRpdGllc1xcdXVpZC1iYXNlLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBK0M7QUFDL0MsK0JBQW9DO0FBRXBDOzs7Ozs7Ozs7R0FTRztBQUNILE1BQXNCLGNBQWM7SUFXbEMsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUEsU0FBTSxHQUFFLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7Q0FDRjtBQWhCRCx3Q0FnQkM7QUFSQztJQVBDLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSxNQUFNO1FBQ1osSUFBSSxFQUFFLE1BQU0sRUFBRSw0Q0FBNEM7UUFDMUQsTUFBTSxFQUFFLElBQUk7UUFDWixRQUFRLEVBQUUsS0FBSztRQUNmLE9BQU8sRUFBRSxrQ0FBa0M7S0FDNUMsQ0FBQzs7Z0RBQ2dCO0FBR2xCO0lBREMsSUFBQSxzQkFBWSxHQUFFOzs7O3NEQUtkIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXGNvbW1vblxcZW50aXRpZXNcXHV1aWQtYmFzZS5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29sdW1uLCBCZWZvcmVJbnNlcnQgfSBmcm9tICd0eXBlb3JtJztcclxuaW1wb3J0IHsgdjcgYXMgdXVpZHY3IH0gZnJvbSAndXVpZCc7XHJcblxyXG4vKipcclxuICogQWJzdHJhY3QgYmFzZSBlbnRpdHkgcHJvdmlkaW5nIGEgVVVJRCBwdWJsaWMgaWRlbnRpZmllci5cclxuICpcclxuICogTmFtaW5nIENvbnZlbnRpb24gKEFEUi0wMTkgdjEuOC4xKTpcclxuICogLSBUeXBlU2NyaXB0IFByb3BlcnR5OiBgcHVibGljSWRgIOKAlCBzZW1hbnRpYyBuYW1lIGluZGljYXRpbmcgdGhpcyBpcyB0aGUgcHVibGljLWZhY2luZyBpZGVudGlmaWVyXHJcbiAqIC0gRGF0YWJhc2UgQ29sdW1uOiBgdXVpZGAg4oCUIE1hcmlhREIgbmF0aXZlIFVVSUQgdHlwZSAoc3RvcmVkIGFzIEJJTkFSWSgxNikpXHJcbiAqXHJcbiAqIFRoaXMgYXZvaWRzIGNvbmZ1c2lvbiBiZXR3ZWVuIHRoZSBwcm9wZXJ0eSBuYW1lIGFuZCB0aGUgREIgZGF0YSB0eXBlLFxyXG4gKiB3aGlsZSBjbGVhcmx5IGluZGljYXRpbmcgdGhpcyBpcyB0aGUgSUQgZXhwb3NlZCB2aWEgQVBJIChub3QgaW50ZXJuYWwgSU5UIFBLKS5cclxuICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBVdWlkQmFzZUVudGl0eSB7XHJcbiAgQENvbHVtbih7XHJcbiAgICB0eXBlOiAndXVpZCcsXHJcbiAgICBuYW1lOiAndXVpZCcsIC8vIERCIGNvbHVtbiBuYW1lIChNYXJpYURCIG5hdGl2ZSBVVUlEIHR5cGUpXHJcbiAgICB1bmlxdWU6IHRydWUsXHJcbiAgICBudWxsYWJsZTogZmFsc2UsXHJcbiAgICBjb21tZW50OiAnVVVJRCBQdWJsaWMgSWRlbnRpZmllciAoQURSLTAxOSknLFxyXG4gIH0pXHJcbiAgcHVibGljSWQhOiBzdHJpbmc7IC8vIFR5cGVTY3JpcHQgcHJvcGVydHkgbmFtZSDigJQgc2VtYW50aWMsIGF2b2lkcyB0eXBlIGNvbmZ1c2lvblxyXG5cclxuICBAQmVmb3JlSW5zZXJ0KClcclxuICBnZW5lcmF0ZVB1YmxpY0lkKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnB1YmxpY0lkKSB7XHJcbiAgICAgIHRoaXMucHVibGljSWQgPSB1dWlkdjcoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/uuidbaseentity_7b3e9cd55ed540bfcd8af187ebbdd7de.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/uuidbaseentity_7b3e9cd55ed540bfcd8af187ebbdd7de.map new file mode 100644 index 0000000..9909f08 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7b/uuidbaseentity_7b3e9cd55ed540bfcd8af187ebbdd7de.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\entities\\uuid-base.entity.ts","mappings":";;;;;;;;;;;;AAAA,qCAA+C;AAC/C,+BAAoC;AAEpC;;;;;;;;;GASG;AACH,MAAsB,cAAc;IAWlC,gBAAgB;QACd,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,IAAA,SAAM,GAAE,CAAC;QAC3B,CAAC;IACH,CAAC;CACF;AAhBD,wCAgBC;AARC;IAPC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,MAAM,EAAE,4CAA4C;QAC1D,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,kCAAkC;KAC5C,CAAC;;gDACgB;AAGlB;IADC,IAAA,sBAAY,GAAE;;;;sDAKd","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\entities\\uuid-base.entity.ts"],"sourcesContent":["import { Column, BeforeInsert } from 'typeorm';\r\nimport { v7 as uuidv7 } from 'uuid';\r\n\r\n/**\r\n * Abstract base entity providing a UUID public identifier.\r\n *\r\n * Naming Convention (ADR-019 v1.8.1):\r\n * - TypeScript Property: `publicId` — semantic name indicating this is the public-facing identifier\r\n * - Database Column: `uuid` — MariaDB native UUID type (stored as BINARY(16))\r\n *\r\n * This avoids confusion between the property name and the DB data type,\r\n * while clearly indicating this is the ID exposed via API (not internal INT PK).\r\n */\r\nexport abstract class UuidBaseEntity {\r\n @Column({\r\n type: 'uuid',\r\n name: 'uuid', // DB column name (MariaDB native UUID type)\r\n unique: true,\r\n nullable: false,\r\n comment: 'UUID Public Identifier (ADR-019)',\r\n })\r\n publicId!: string; // TypeScript property name — semantic, avoids type confusion\r\n\r\n @BeforeInsert()\r\n generatePublicId(): void {\r\n if (!this.publicId) {\r\n this.publicId = uuidv7();\r\n }\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7c/rfastatuscodeentity_7cb73d4ed6d16a9335aa5136ca0c6698 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7c/rfastatuscodeentity_7cb73d4ed6d16a9335aa5136ca0c6698 new file mode 100644 index 0000000..0193139 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7c/rfastatuscodeentity_7cb73d4ed6d16a9335aa5136ca0c6698 @@ -0,0 +1,45 @@ +a7dbd19c0168496ba551c2f58fe007d4 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RfaStatusCode = void 0; +const typeorm_1 = require("typeorm"); +let RfaStatusCode = class RfaStatusCode { +}; +exports.RfaStatusCode = RfaStatusCode; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], RfaStatusCode.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'status_code', length: 20, unique: true }), + __metadata("design:type", String) +], RfaStatusCode.prototype, "statusCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'status_name', length: 100 }), + __metadata("design:type", String) +], RfaStatusCode.prototype, "statusName", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], RfaStatusCode.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sort_order', default: 0 }), + __metadata("design:type", Number) +], RfaStatusCode.prototype, "sortOrder", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true }), + __metadata("design:type", Boolean) +], RfaStatusCode.prototype, "isActive", void 0); +exports.RfaStatusCode = RfaStatusCode = __decorate([ + (0, typeorm_1.Entity)('rfa_status_codes') +], RfaStatusCode); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccmZhXFxlbnRpdGllc1xccmZhLXN0YXR1cy1jb2RlLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBaUU7QUFHMUQsSUFBTSxhQUFhLEdBQW5CLE1BQU0sYUFBYTtDQWtCekIsQ0FBQTtBQWxCWSxzQ0FBYTtBQUV4QjtJQURDLElBQUEsZ0NBQXNCLEdBQUU7O3lDQUNiO0FBR1o7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDOztpREFDdEM7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7aURBQ3pCO0FBR3BCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O2tEQUNwQjtBQUdyQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDOztnREFDeEI7QUFHbkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7K0NBQzFCO3dCQWpCUixhQUFhO0lBRHpCLElBQUEsZ0JBQU0sRUFBQyxrQkFBa0IsQ0FBQztHQUNkLGFBQWEsQ0FrQnpCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXHJmYVxcZW50aXRpZXNcXHJmYS1zdGF0dXMtY29kZS5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5LCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLCBDb2x1bW4gfSBmcm9tICd0eXBlb3JtJztcblxuQEVudGl0eSgncmZhX3N0YXR1c19jb2RlcycpXG5leHBvcnQgY2xhc3MgUmZhU3RhdHVzQ29kZSB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKClcbiAgaWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdzdGF0dXNfY29kZScsIGxlbmd0aDogMjAsIHVuaXF1ZTogdHJ1ZSB9KVxuICBzdGF0dXNDb2RlITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnc3RhdHVzX25hbWUnLCBsZW5ndGg6IDEwMCB9KVxuICBzdGF0dXNOYW1lITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndGV4dCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnc29ydF9vcmRlcicsIGRlZmF1bHQ6IDAgfSlcbiAgc29ydE9yZGVyITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXNfYWN0aXZlJywgZGVmYXVsdDogdHJ1ZSB9KVxuICBpc0FjdGl2ZSE6IGJvb2xlYW47XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7c/rfastatuscodeentity_7cb73d4ed6d16a9335aa5136ca0c6698.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7c/rfastatuscodeentity_7cb73d4ed6d16a9335aa5136ca0c6698.map new file mode 100644 index 0000000..a2133bf --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7c/rfastatuscodeentity_7cb73d4ed6d16a9335aa5136ca0c6698.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-status-code.entity.ts","mappings":";;;;;;;;;;;;AAAA,qCAAiE;AAG1D,IAAM,aAAa,GAAnB,MAAM,aAAa;CAkBzB,CAAA;AAlBY,sCAAa;AAExB;IADC,IAAA,gCAAsB,GAAE;;yCACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;iDACtC;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;iDACzB;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kDACpB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;gDACxB;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;+CAC1B;wBAjBR,aAAa;IADzB,IAAA,gBAAM,EAAC,kBAAkB,CAAC;GACd,aAAa,CAkBzB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-status-code.entity.ts"],"sourcesContent":["import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';\n\n@Entity('rfa_status_codes')\nexport class RfaStatusCode {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'status_code', length: 20, unique: true })\n statusCode!: string;\n\n @Column({ name: 'status_name', length: 100 })\n statusName!: string;\n\n @Column({ type: 'text', nullable: true })\n description?: string;\n\n @Column({ name: 'sort_order', default: 0 })\n sortOrder!: number;\n\n @Column({ name: 'is_active', default: true })\n isActive!: boolean;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7c/virtualcolumnservice_7c27b269e64ebb1a10a212d78f62babf b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7c/virtualcolumnservice_7c27b269e64ebb1a10a212d78f62babf new file mode 100644 index 0000000..103b938 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7c/virtualcolumnservice_7c27b269e64ebb1a10a212d78f62babf @@ -0,0 +1,133 @@ +d6ef7e254993d7b4929678c51729d095 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var VirtualColumnService_1; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.VirtualColumnService = void 0; +// File: src/modules/json-schema/services/virtual-column.service.ts +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("typeorm"); +let VirtualColumnService = VirtualColumnService_1 = class VirtualColumnService { + constructor(dataSource) { + this.dataSource = dataSource; + this.logger = new common_1.Logger(VirtualColumnService_1.name); + } + /** + * สร้าง/อัปเดต Virtual Columns และ Index บน Database จริง + */ + async setupVirtualColumns(tableName, configs) { + if (!configs || configs.length === 0) + return; + // ใช้ QueryRunner เพื่อให้จัดการ Transaction หรือ Connection ได้ละเอียด + const queryRunner = this.dataSource.createQueryRunner(); + await queryRunner.connect(); + try { + this.logger.log(`Start setting up virtual columns for table '${tableName}'...`); + // 1. ตรวจสอบว่าตารางมีอยู่จริงไหม + const tableExists = await queryRunner.hasTable(tableName); + if (!tableExists) { + this.logger.warn(`Table '${tableName}' not found. Skipping virtual columns.`); + return; + } + for (const config of configs) { + await this.ensureVirtualColumn(queryRunner, tableName, config); + if (config.indexType) { + await this.ensureIndex(queryRunner, tableName, config); + } + } + this.logger.log(`Finished setting up virtual columns for '${tableName}'.`); + } + catch (err) { + this.logger.error(`Failed to setup virtual columns: ${err instanceof Error ? err.message : String(err)}`, err instanceof Error ? err.stack : undefined); + throw err; + } + finally { + await queryRunner.release(); + } + } + /** + * สร้าง Column ถ้ายังไม่มี + */ + async ensureVirtualColumn(queryRunner, tableName, config) { + const hasColumn = await queryRunner.hasColumn(tableName, config.columnName); + if (!hasColumn) { + const sql = this.generateAddColumnSql(tableName, config); + this.logger.log(`Executing: ${sql}`); + await queryRunner.query(sql); + } + else { + // TODO: (Advance) ถ้ามี Column แล้ว แต่ Definition เปลี่ยน อาจต้อง ALTER MODIFY + this.logger.debug(`Column '${config.columnName}' already exists in '${tableName}'.`); + } + } + /** + * สร้าง Index ถ้ายังไม่มี + */ + async ensureIndex(queryRunner, tableName, config) { + const indexName = `idx_${tableName}_${config.columnName}`; + // ตรวจสอบว่า Index มีอยู่จริงไหม (Query จาก information_schema เพื่อความชัวร์) + const checkIndexSql = ` + SELECT COUNT(1) as count + FROM information_schema.STATISTICS + WHERE table_schema = DATABASE() + AND table_name = ? + AND index_name = ? + `; + const result = (await queryRunner.query(checkIndexSql, [ + tableName, + indexName, + ])); + if (result[0]?.count === 0) { + const sql = `CREATE ${config.indexType === 'UNIQUE' ? 'UNIQUE' : ''} INDEX ${indexName} ON ${tableName} (${config.columnName})`; + this.logger.log(`Creating Index: ${sql}`); + await queryRunner.query(sql); + } + } + /** + * Generate SQL สำหรับ MariaDB 10.11 Virtual Column + * Syntax: ADD COLUMN name type GENERATED ALWAYS AS (expr) VIRTUAL + */ + generateAddColumnSql(tableName, config) { + const dbType = this.mapDataTypeToSql(config.dataType); + // JSON_UNQUOTE(JSON_EXTRACT(details, '$.path')) + // ใช้ 'details' เป็นชื่อ column JSON หลัก (ต้องตรงกับ Database Schema ที่ออกแบบไว้) + const expression = `JSON_UNQUOTE(JSON_EXTRACT(details, '${config.jsonPath}'))`; + // Handle Type Casting inside expression if needed, + // but usually MariaDB handles string return from JSON_EXTRACT. + // For INT/DATE, virtual column type definition enforces it. + return `ALTER TABLE ${tableName} ADD COLUMN ${config.columnName} ${dbType} GENERATED ALWAYS AS (${expression}) VIRTUAL`; + } + mapDataTypeToSql(type) { + switch (type) { + case 'INT': + return 'INT'; + case 'VARCHAR': + return 'VARCHAR(255)'; + case 'BOOLEAN': + return 'TINYINT(1)'; + case 'DATE': + return 'DATE'; + case 'DATETIME': + return 'DATETIME'; + case 'DECIMAL': + return 'DECIMAL(10,2)'; + default: + return 'VARCHAR(255)'; + } + } +}; +exports.VirtualColumnService = VirtualColumnService; +exports.VirtualColumnService = VirtualColumnService = VirtualColumnService_1 = __decorate([ + (0, common_1.Injectable)(), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_1.DataSource !== "undefined" && typeorm_1.DataSource) === "function" ? _a : Object]) +], VirtualColumnService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcanNvbi1zY2hlbWFcXHNlcnZpY2VzXFx2aXJ0dWFsLWNvbHVtbi5zZXJ2aWNlLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbUVBQW1FO0FBQ25FLDJDQUFvRDtBQUNwRCxxQ0FBa0Q7QUFJM0MsSUFBTSxvQkFBb0IsNEJBQTFCLE1BQU0sb0JBQW9CO0lBRy9CLFlBQTZCLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFGbEMsV0FBTSxHQUFHLElBQUksZUFBTSxDQUFDLHNCQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBRVYsQ0FBQztJQUV2RDs7T0FFRztJQUNILEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxTQUFpQixFQUFFLE9BQThCO1FBQ3pFLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTztRQUU3Qyx3RUFBd0U7UUFDeEUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3hELE1BQU0sV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRTVCLElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNiLCtDQUErQyxTQUFTLE1BQU0sQ0FDL0QsQ0FBQztZQUVGLGtDQUFrQztZQUNsQyxNQUFNLFdBQVcsR0FBRyxNQUFNLFdBQVcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDZCxVQUFVLFNBQVMsd0NBQXdDLENBQzVELENBQUM7Z0JBQ0YsT0FBTztZQUNULENBQUM7WUFFRCxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUM3QixNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUUvRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDckIsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3pELENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQ2IsNENBQTRDLFNBQVMsSUFBSSxDQUMxRCxDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sR0FBWSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2Ysb0NBQW9DLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUN0RixHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQzdDLENBQUM7WUFDRixNQUFNLEdBQUcsQ0FBQztRQUNaLENBQUM7Z0JBQVMsQ0FBQztZQUNULE1BQU0sV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsbUJBQW1CLENBQy9CLFdBQXdCLEVBQ3hCLFNBQWlCLEVBQ2pCLE1BQTJCO1FBRTNCLE1BQU0sU0FBUyxHQUFHLE1BQU0sV0FBVyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTVFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ3JDLE1BQU0sV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixDQUFDO2FBQU0sQ0FBQztZQUNOLGdGQUFnRjtZQUNoRixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZixXQUFXLE1BQU0sQ0FBQyxVQUFVLHdCQUF3QixTQUFTLElBQUksQ0FDbEUsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsV0FBVyxDQUN2QixXQUF3QixFQUN4QixTQUFpQixFQUNqQixNQUEyQjtRQUUzQixNQUFNLFNBQVMsR0FBRyxPQUFPLFNBQVMsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFMUQsK0VBQStFO1FBQy9FLE1BQU0sYUFBYSxHQUFHOzs7Ozs7S0FNckIsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLENBQUMsTUFBTSxXQUFXLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRTtZQUNyRCxTQUFTO1lBQ1QsU0FBUztTQUNWLENBQUMsQ0FBd0IsQ0FBQztRQUUzQixJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0IsTUFBTSxHQUFHLEdBQUcsVUFBVSxNQUFNLENBQUMsU0FBUyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsU0FBUyxPQUFPLFNBQVMsS0FBSyxNQUFNLENBQUMsVUFBVSxHQUFHLENBQUM7WUFDaEksSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDMUMsTUFBTSxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssb0JBQW9CLENBQzFCLFNBQWlCLEVBQ2pCLE1BQTJCO1FBRTNCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEQsZ0RBQWdEO1FBQ2hELG9GQUFvRjtRQUNwRixNQUFNLFVBQVUsR0FBRyx1Q0FBdUMsTUFBTSxDQUFDLFFBQVEsS0FBSyxDQUFDO1FBRS9FLG1EQUFtRDtRQUNuRCwrREFBK0Q7UUFDL0QsNERBQTREO1FBRTVELE9BQU8sZUFBZSxTQUFTLGVBQWUsTUFBTSxDQUFDLFVBQVUsSUFBSSxNQUFNLHlCQUF5QixVQUFVLFdBQVcsQ0FBQztJQUMxSCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsSUFBWTtRQUNuQyxRQUFRLElBQUksRUFBRSxDQUFDO1lBQ2IsS0FBSyxLQUFLO2dCQUNSLE9BQU8sS0FBSyxDQUFDO1lBQ2YsS0FBSyxTQUFTO2dCQUNaLE9BQU8sY0FBYyxDQUFDO1lBQ3hCLEtBQUssU0FBUztnQkFDWixPQUFPLFlBQVksQ0FBQztZQUN0QixLQUFLLE1BQU07Z0JBQ1QsT0FBTyxNQUFNLENBQUM7WUFDaEIsS0FBSyxVQUFVO2dCQUNiLE9BQU8sVUFBVSxDQUFDO1lBQ3BCLEtBQUssU0FBUztnQkFDWixPQUFPLGVBQWUsQ0FBQztZQUN6QjtnQkFDRSxPQUFPLGNBQWMsQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztDQUNGLENBQUE7QUE3SVksb0RBQW9COytCQUFwQixvQkFBb0I7SUFEaEMsSUFBQSxtQkFBVSxHQUFFO3lEQUk4QixvQkFBVSxvQkFBVixvQkFBVTtHQUh4QyxvQkFBb0IsQ0E2SWhDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGpzb24tc2NoZW1hXFxzZXJ2aWNlc1xcdmlydHVhbC1jb2x1bW4uc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGaWxlOiBzcmMvbW9kdWxlcy9qc29uLXNjaGVtYS9zZXJ2aWNlcy92aXJ0dWFsLWNvbHVtbi5zZXJ2aWNlLnRzXHJcbmltcG9ydCB7IEluamVjdGFibGUsIExvZ2dlciB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcclxuaW1wb3J0IHsgRGF0YVNvdXJjZSwgUXVlcnlSdW5uZXIgfSBmcm9tICd0eXBlb3JtJztcclxuaW1wb3J0IHsgVmlydHVhbENvbHVtbkNvbmZpZyB9IGZyb20gJy4uL2VudGl0aWVzL2pzb24tc2NoZW1hLmVudGl0eSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBWaXJ0dWFsQ29sdW1uU2VydmljZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKFZpcnR1YWxDb2x1bW5TZXJ2aWNlLm5hbWUpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGRhdGFTb3VyY2U6IERhdGFTb3VyY2UpIHt9XHJcblxyXG4gIC8qKlxyXG4gICAqIOC4quC4o+C5ieC4suC4hy/guK3guLHguJvguYDguJTguJUgVmlydHVhbCBDb2x1bW5zIOC5geC4peC4sCBJbmRleCDguJrguJkgRGF0YWJhc2Ug4LiI4Lij4Li04LiHXHJcbiAgICovXHJcbiAgYXN5bmMgc2V0dXBWaXJ0dWFsQ29sdW1ucyh0YWJsZU5hbWU6IHN0cmluZywgY29uZmlnczogVmlydHVhbENvbHVtbkNvbmZpZ1tdKSB7XHJcbiAgICBpZiAoIWNvbmZpZ3MgfHwgY29uZmlncy5sZW5ndGggPT09IDApIHJldHVybjtcclxuXHJcbiAgICAvLyDguYPguIrguYkgUXVlcnlSdW5uZXIg4LmA4Lie4Li34LmI4Lit4LmD4Lir4LmJ4LiI4Lix4LiU4LiB4Liy4LijIFRyYW5zYWN0aW9uIOC4q+C4o+C4t+C4rSBDb25uZWN0aW9uIOC5hOC4lOC5ieC4peC4sOC5gOC4reC4teC4ouC4lFxyXG4gICAgY29uc3QgcXVlcnlSdW5uZXIgPSB0aGlzLmRhdGFTb3VyY2UuY3JlYXRlUXVlcnlSdW5uZXIoKTtcclxuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbm5lY3QoKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmxvZ2dlci5sb2coXHJcbiAgICAgICAgYFN0YXJ0IHNldHRpbmcgdXAgdmlydHVhbCBjb2x1bW5zIGZvciB0YWJsZSAnJHt0YWJsZU5hbWV9Jy4uLmBcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIDEuIOC4leC4o+C4p+C4iOC4quC4reC4muC4p+C5iOC4suC4leC4suC4o+C4suC4h+C4oeC4teC4reC4ouC4ueC5iOC4iOC4o+C4tOC4h+C5hOC4q+C4oVxyXG4gICAgICBjb25zdCB0YWJsZUV4aXN0cyA9IGF3YWl0IHF1ZXJ5UnVubmVyLmhhc1RhYmxlKHRhYmxlTmFtZSk7XHJcbiAgICAgIGlmICghdGFibGVFeGlzdHMpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxyXG4gICAgICAgICAgYFRhYmxlICcke3RhYmxlTmFtZX0nIG5vdCBmb3VuZC4gU2tpcHBpbmcgdmlydHVhbCBjb2x1bW5zLmBcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgY29uZmlncykge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlVmlydHVhbENvbHVtbihxdWVyeVJ1bm5lciwgdGFibGVOYW1lLCBjb25maWcpO1xyXG5cclxuICAgICAgICBpZiAoY29uZmlnLmluZGV4VHlwZSkge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVJbmRleChxdWVyeVJ1bm5lciwgdGFibGVOYW1lLCBjb25maWcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5sb2dnZXIubG9nKFxyXG4gICAgICAgIGBGaW5pc2hlZCBzZXR0aW5nIHVwIHZpcnR1YWwgY29sdW1ucyBmb3IgJyR7dGFibGVOYW1lfScuYFxyXG4gICAgICApO1xyXG4gICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxyXG4gICAgICAgIGBGYWlsZWQgdG8gc2V0dXAgdmlydHVhbCBjb2x1bW5zOiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gLFxyXG4gICAgICAgIGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLnN0YWNrIDogdW5kZWZpbmVkXHJcbiAgICAgICk7XHJcbiAgICAgIHRocm93IGVycjtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJlbGVhc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOC4quC4o+C5ieC4suC4hyBDb2x1bW4g4LiW4LmJ4Liy4Lii4Lix4LiH4LmE4Lih4LmI4Lih4Li1XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVWaXJ0dWFsQ29sdW1uKFxyXG4gICAgcXVlcnlSdW5uZXI6IFF1ZXJ5UnVubmVyLFxyXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXHJcbiAgICBjb25maWc6IFZpcnR1YWxDb2x1bW5Db25maWdcclxuICApIHtcclxuICAgIGNvbnN0IGhhc0NvbHVtbiA9IGF3YWl0IHF1ZXJ5UnVubmVyLmhhc0NvbHVtbih0YWJsZU5hbWUsIGNvbmZpZy5jb2x1bW5OYW1lKTtcclxuXHJcbiAgICBpZiAoIWhhc0NvbHVtbikge1xyXG4gICAgICBjb25zdCBzcWwgPSB0aGlzLmdlbmVyYXRlQWRkQ29sdW1uU3FsKHRhYmxlTmFtZSwgY29uZmlnKTtcclxuICAgICAgdGhpcy5sb2dnZXIubG9nKGBFeGVjdXRpbmc6ICR7c3FsfWApO1xyXG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5xdWVyeShzcWwpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gVE9ETzogKEFkdmFuY2UpIOC4luC5ieC4suC4oeC4tSBDb2x1bW4g4LmB4Lil4LmJ4LinIOC5geC4leC5iCBEZWZpbml0aW9uIOC5gOC4m+C4peC4teC5iOC4ouC4mSDguK3guLLguIjguJXguYnguK3guIcgQUxURVIgTU9ESUZZXHJcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxyXG4gICAgICAgIGBDb2x1bW4gJyR7Y29uZmlnLmNvbHVtbk5hbWV9JyBhbHJlYWR5IGV4aXN0cyBpbiAnJHt0YWJsZU5hbWV9Jy5gXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDguKrguKPguYnguLLguIcgSW5kZXgg4LiW4LmJ4Liy4Lii4Lix4LiH4LmE4Lih4LmI4Lih4Li1XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVJbmRleChcclxuICAgIHF1ZXJ5UnVubmVyOiBRdWVyeVJ1bm5lcixcclxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxyXG4gICAgY29uZmlnOiBWaXJ0dWFsQ29sdW1uQ29uZmlnXHJcbiAgKSB7XHJcbiAgICBjb25zdCBpbmRleE5hbWUgPSBgaWR4XyR7dGFibGVOYW1lfV8ke2NvbmZpZy5jb2x1bW5OYW1lfWA7XHJcblxyXG4gICAgLy8g4LiV4Lij4Lin4LiI4Liq4Lit4Lia4Lin4LmI4LiyIEluZGV4IOC4oeC4teC4reC4ouC4ueC5iOC4iOC4o+C4tOC4h+C5hOC4q+C4oSAoUXVlcnkg4LiI4Liy4LiBIGluZm9ybWF0aW9uX3NjaGVtYSDguYDguJ7guLfguYjguK3guITguKfguLLguKHguIrguLHguKfguKPguYwpXHJcbiAgICBjb25zdCBjaGVja0luZGV4U3FsID0gYFxyXG4gICAgICBTRUxFQ1QgQ09VTlQoMSkgYXMgY291bnRcclxuICAgICAgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuU1RBVElTVElDU1xyXG4gICAgICBXSEVSRSB0YWJsZV9zY2hlbWEgPSBEQVRBQkFTRSgpXHJcbiAgICAgIEFORCB0YWJsZV9uYW1lID0gP1xyXG4gICAgICBBTkQgaW5kZXhfbmFtZSA9ID9cclxuICAgIGA7XHJcbiAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgcXVlcnlSdW5uZXIucXVlcnkoY2hlY2tJbmRleFNxbCwgW1xyXG4gICAgICB0YWJsZU5hbWUsXHJcbiAgICAgIGluZGV4TmFtZSxcclxuICAgIF0pKSBhcyB7IGNvdW50OiBudW1iZXIgfVtdO1xyXG5cclxuICAgIGlmIChyZXN1bHRbMF0/LmNvdW50ID09PSAwKSB7XHJcbiAgICAgIGNvbnN0IHNxbCA9IGBDUkVBVEUgJHtjb25maWcuaW5kZXhUeXBlID09PSAnVU5JUVVFJyA/ICdVTklRVUUnIDogJyd9IElOREVYICR7aW5kZXhOYW1lfSBPTiAke3RhYmxlTmFtZX0gKCR7Y29uZmlnLmNvbHVtbk5hbWV9KWA7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhgQ3JlYXRpbmcgSW5kZXg6ICR7c3FsfWApO1xyXG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5xdWVyeShzcWwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgU1FMIOC4quC4s+C4q+C4o+C4seC4miBNYXJpYURCIDEwLjExIFZpcnR1YWwgQ29sdW1uXHJcbiAgICogU3ludGF4OiBBREQgQ09MVU1OIG5hbWUgdHlwZSBHRU5FUkFURUQgQUxXQVlTIEFTIChleHByKSBWSVJUVUFMXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUFkZENvbHVtblNxbChcclxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxyXG4gICAgY29uZmlnOiBWaXJ0dWFsQ29sdW1uQ29uZmlnXHJcbiAgKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGRiVHlwZSA9IHRoaXMubWFwRGF0YVR5cGVUb1NxbChjb25maWcuZGF0YVR5cGUpO1xyXG4gICAgLy8gSlNPTl9VTlFVT1RFKEpTT05fRVhUUkFDVChkZXRhaWxzLCAnJC5wYXRoJykpXHJcbiAgICAvLyDguYPguIrguYkgJ2RldGFpbHMnIOC5gOC4m+C5h+C4meC4iuC4t+C5iOC4rSBjb2x1bW4gSlNPTiDguKvguKXguLHguIEgKOC4leC5ieC4reC4h+C4leC4o+C4h+C4geC4seC4miBEYXRhYmFzZSBTY2hlbWEg4LiX4Li14LmI4Lit4Lit4LiB4LmB4Lia4Lia4LmE4Lin4LmJKVxyXG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IGBKU09OX1VOUVVPVEUoSlNPTl9FWFRSQUNUKGRldGFpbHMsICcke2NvbmZpZy5qc29uUGF0aH0nKSlgO1xyXG5cclxuICAgIC8vIEhhbmRsZSBUeXBlIENhc3RpbmcgaW5zaWRlIGV4cHJlc3Npb24gaWYgbmVlZGVkLFxyXG4gICAgLy8gYnV0IHVzdWFsbHkgTWFyaWFEQiBoYW5kbGVzIHN0cmluZyByZXR1cm4gZnJvbSBKU09OX0VYVFJBQ1QuXHJcbiAgICAvLyBGb3IgSU5UL0RBVEUsIHZpcnR1YWwgY29sdW1uIHR5cGUgZGVmaW5pdGlvbiBlbmZvcmNlcyBpdC5cclxuXHJcbiAgICByZXR1cm4gYEFMVEVSIFRBQkxFICR7dGFibGVOYW1lfSBBREQgQ09MVU1OICR7Y29uZmlnLmNvbHVtbk5hbWV9ICR7ZGJUeXBlfSBHRU5FUkFURUQgQUxXQVlTIEFTICgke2V4cHJlc3Npb259KSBWSVJUVUFMYDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwRGF0YVR5cGVUb1NxbCh0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgJ0lOVCc6XHJcbiAgICAgICAgcmV0dXJuICdJTlQnO1xyXG4gICAgICBjYXNlICdWQVJDSEFSJzpcclxuICAgICAgICByZXR1cm4gJ1ZBUkNIQVIoMjU1KSc7XHJcbiAgICAgIGNhc2UgJ0JPT0xFQU4nOlxyXG4gICAgICAgIHJldHVybiAnVElOWUlOVCgxKSc7XHJcbiAgICAgIGNhc2UgJ0RBVEUnOlxyXG4gICAgICAgIHJldHVybiAnREFURSc7XHJcbiAgICAgIGNhc2UgJ0RBVEVUSU1FJzpcclxuICAgICAgICByZXR1cm4gJ0RBVEVUSU1FJztcclxuICAgICAgY2FzZSAnREVDSU1BTCc6XHJcbiAgICAgICAgcmV0dXJuICdERUNJTUFMKDEwLDIpJztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJ1ZBUkNIQVIoMjU1KSc7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7c/virtualcolumnservice_7c27b269e64ebb1a10a212d78f62babf.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7c/virtualcolumnservice_7c27b269e64ebb1a10a212d78f62babf.map new file mode 100644 index 0000000..2d70d02 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/7c/virtualcolumnservice_7c27b269e64ebb1a10a212d78f62babf.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\services\\virtual-column.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\services\\virtual-column.service.ts"],"sourcesContent":["// File: src/modules/json-schema/services/virtual-column.service.ts\r\nimport { Injectable, Logger } from '@nestjs/common';\r\nimport { DataSource, QueryRunner } from 'typeorm';\r\nimport { VirtualColumnConfig } from '../entities/json-schema.entity';\r\n\r\n@Injectable()\r\nexport class VirtualColumnService {\r\n private readonly logger = new Logger(VirtualColumnService.name);\r\n\r\n constructor(private readonly dataSource: DataSource) {}\r\n\r\n /**\r\n * สร้าง/อัปเดต Virtual Columns และ Index บน Database จริง\r\n */\r\n async setupVirtualColumns(tableName: string, configs: VirtualColumnConfig[]) {\r\n if (!configs || configs.length === 0) return;\r\n\r\n // ใช้ QueryRunner เพื่อให้จัดการ Transaction หรือ Connection ได้ละเอียด\r\n const queryRunner = this.dataSource.createQueryRunner();\r\n await queryRunner.connect();\r\n\r\n try {\r\n this.logger.log(\r\n `Start setting up virtual columns for table '${tableName}'...`\r\n );\r\n\r\n // 1. ตรวจสอบว่าตารางมีอยู่จริงไหม\r\n const tableExists = await queryRunner.hasTable(tableName);\r\n if (!tableExists) {\r\n this.logger.warn(\r\n `Table '${tableName}' not found. Skipping virtual columns.`\r\n );\r\n return;\r\n }\r\n\r\n for (const config of configs) {\r\n await this.ensureVirtualColumn(queryRunner, tableName, config);\r\n\r\n if (config.indexType) {\r\n await this.ensureIndex(queryRunner, tableName, config);\r\n }\r\n }\r\n\r\n this.logger.log(\r\n `Finished setting up virtual columns for '${tableName}'.`\r\n );\r\n } catch (err: unknown) {\r\n this.logger.error(\r\n `Failed to setup virtual columns: ${err instanceof Error ? err.message : String(err)}`,\r\n err instanceof Error ? err.stack : undefined\r\n );\r\n throw err;\r\n } finally {\r\n await queryRunner.release();\r\n }\r\n }\r\n\r\n /**\r\n * สร้าง Column ถ้ายังไม่มี\r\n */\r\n private async ensureVirtualColumn(\r\n queryRunner: QueryRunner,\r\n tableName: string,\r\n config: VirtualColumnConfig\r\n ) {\r\n const hasColumn = await queryRunner.hasColumn(tableName, config.columnName);\r\n\r\n if (!hasColumn) {\r\n const sql = this.generateAddColumnSql(tableName, config);\r\n this.logger.log(`Executing: ${sql}`);\r\n await queryRunner.query(sql);\r\n } else {\r\n // TODO: (Advance) ถ้ามี Column แล้ว แต่ Definition เปลี่ยน อาจต้อง ALTER MODIFY\r\n this.logger.debug(\r\n `Column '${config.columnName}' already exists in '${tableName}'.`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * สร้าง Index ถ้ายังไม่มี\r\n */\r\n private async ensureIndex(\r\n queryRunner: QueryRunner,\r\n tableName: string,\r\n config: VirtualColumnConfig\r\n ) {\r\n const indexName = `idx_${tableName}_${config.columnName}`;\r\n\r\n // ตรวจสอบว่า Index มีอยู่จริงไหม (Query จาก information_schema เพื่อความชัวร์)\r\n const checkIndexSql = `\r\n SELECT COUNT(1) as count\r\n FROM information_schema.STATISTICS\r\n WHERE table_schema = DATABASE()\r\n AND table_name = ?\r\n AND index_name = ?\r\n `;\r\n const result = (await queryRunner.query(checkIndexSql, [\r\n tableName,\r\n indexName,\r\n ])) as { count: number }[];\r\n\r\n if (result[0]?.count === 0) {\r\n const sql = `CREATE ${config.indexType === 'UNIQUE' ? 'UNIQUE' : ''} INDEX ${indexName} ON ${tableName} (${config.columnName})`;\r\n this.logger.log(`Creating Index: ${sql}`);\r\n await queryRunner.query(sql);\r\n }\r\n }\r\n\r\n /**\r\n * Generate SQL สำหรับ MariaDB 10.11 Virtual Column\r\n * Syntax: ADD COLUMN name type GENERATED ALWAYS AS (expr) VIRTUAL\r\n */\r\n private generateAddColumnSql(\r\n tableName: string,\r\n config: VirtualColumnConfig\r\n ): string {\r\n const dbType = this.mapDataTypeToSql(config.dataType);\r\n // JSON_UNQUOTE(JSON_EXTRACT(details, '$.path'))\r\n // ใช้ 'details' เป็นชื่อ column JSON หลัก (ต้องตรงกับ Database Schema ที่ออกแบบไว้)\r\n const expression = `JSON_UNQUOTE(JSON_EXTRACT(details, '${config.jsonPath}'))`;\r\n\r\n // Handle Type Casting inside expression if needed,\r\n // but usually MariaDB handles string return from JSON_EXTRACT.\r\n // For INT/DATE, virtual column type definition enforces it.\r\n\r\n return `ALTER TABLE ${tableName} ADD COLUMN ${config.columnName} ${dbType} GENERATED ALWAYS AS (${expression}) VIRTUAL`;\r\n }\r\n\r\n private mapDataTypeToSql(type: string): string {\r\n switch (type) {\r\n case 'INT':\r\n return 'INT';\r\n case 'VARCHAR':\r\n return 'VARCHAR(255)';\r\n case 'BOOLEAN':\r\n return 'TINYINT(1)';\r\n case 'DATE':\r\n return 'DATE';\r\n case 'DATETIME':\r\n return 'DATETIME';\r\n case 'DECIMAL':\r\n return 'DECIMAL(10,2)';\r\n default:\r\n return 'VARCHAR(255)';\r\n }\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/84/searchcorrespondencedto_84ed95e09c7a524e84c9d06242469288 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/84/searchcorrespondencedto_84ed95e09c7a524e84c9d06242469288 new file mode 100644 index 0000000..9829a67 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/84/searchcorrespondencedto_84ed95e09c7a524e84c9d06242469288 @@ -0,0 +1,82 @@ +1b6c53bd048a853e3011788c1eb23859 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SearchCorrespondenceDto = void 0; +const class_validator_1 = require("class-validator"); +const class_transformer_1 = require("class-transformer"); +const swagger_1 = require("@nestjs/swagger"); +class SearchCorrespondenceDto { +} +exports.SearchCorrespondenceDto = SearchCorrespondenceDto; +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Search term (Title or Document Number)', + }), + (0, class_validator_1.IsOptional)(), + (0, class_validator_1.IsString)(), + __metadata("design:type", String) +], SearchCorrespondenceDto.prototype, "search", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ description: 'Filter by Document Type ID' }), + (0, class_validator_1.IsOptional)(), + (0, class_transformer_1.Type)(() => Number), + (0, class_validator_1.IsInt)(), + __metadata("design:type", Number) +], SearchCorrespondenceDto.prototype, "typeId", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ description: 'Filter by Project ID' }), + (0, class_validator_1.IsOptional)(), + (0, class_transformer_1.Type)(() => Number), + (0, class_validator_1.IsInt)(), + __metadata("design:type", Number) +], SearchCorrespondenceDto.prototype, "projectId", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ description: 'Filter by Status ID' }), + (0, class_validator_1.IsOptional)(), + (0, class_transformer_1.Type)(() => Number), + (0, class_validator_1.IsInt)(), + __metadata("design:type", Number) +], SearchCorrespondenceDto.prototype, "statusId", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Filter by Status code (e.g. DRAFT, IN_REVIEW, APPROVED, CANCELLED)', + }), + (0, class_validator_1.IsOptional)(), + (0, class_validator_1.IsString)(), + __metadata("design:type", String) +], SearchCorrespondenceDto.prototype, "status", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Revision Filter: CURRENT (default), ALL, OLD', + }), + (0, class_validator_1.IsOptional)(), + (0, class_validator_1.IsString)(), + __metadata("design:type", String) +], SearchCorrespondenceDto.prototype, "revisionStatus", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ description: 'Page number (default 1)', default: 1 }), + (0, class_validator_1.IsOptional)(), + (0, class_transformer_1.Type)(() => Number), + (0, class_validator_1.IsInt)(), + __metadata("design:type", Number) +], SearchCorrespondenceDto.prototype, "page", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Items per page (default 10)', + default: 10, + }), + (0, class_validator_1.IsOptional)(), + (0, class_transformer_1.Type)(() => Number), + (0, class_validator_1.IsInt)(), + __metadata("design:type", Number) +], SearchCorrespondenceDto.prototype, "limit", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGR0b1xcc2VhcmNoLWNvcnJlc3BvbmRlbmNlLmR0by50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxxREFBOEQ7QUFDOUQseURBQXlDO0FBQ3pDLDZDQUFzRDtBQUV0RCxNQUFhLHVCQUF1QjtDQXVEbkM7QUF2REQsMERBdURDO0FBakRDO0lBTEMsSUFBQSw2QkFBbUIsRUFBQztRQUNuQixXQUFXLEVBQUUsd0NBQXdDO0tBQ3RELENBQUM7SUFDRCxJQUFBLDRCQUFVLEdBQUU7SUFDWixJQUFBLDBCQUFRLEdBQUU7O3VEQUNLO0FBTWhCO0lBSkMsSUFBQSw2QkFBbUIsRUFBQyxFQUFFLFdBQVcsRUFBRSw0QkFBNEIsRUFBRSxDQUFDO0lBQ2xFLElBQUEsNEJBQVUsR0FBRTtJQUNaLElBQUEsd0JBQUksRUFBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDbEIsSUFBQSx1QkFBSyxHQUFFOzt1REFDUTtBQU1oQjtJQUpDLElBQUEsNkJBQW1CLEVBQUMsRUFBRSxXQUFXLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztJQUM1RCxJQUFBLDRCQUFVLEdBQUU7SUFDWixJQUFBLHdCQUFJLEVBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDO0lBQ2xCLElBQUEsdUJBQUssR0FBRTs7MERBQ1c7QUFNbkI7SUFKQyxJQUFBLDZCQUFtQixFQUFDLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFLENBQUM7SUFDM0QsSUFBQSw0QkFBVSxHQUFFO0lBQ1osSUFBQSx3QkFBSSxFQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUNsQixJQUFBLHVCQUFLLEdBQUU7O3lEQUNVO0FBUWxCO0lBTkMsSUFBQSw2QkFBbUIsRUFBQztRQUNuQixXQUFXLEVBQ1Qsb0VBQW9FO0tBQ3ZFLENBQUM7SUFDRCxJQUFBLDRCQUFVLEdBQUU7SUFDWixJQUFBLDBCQUFRLEdBQUU7O3VEQUNLO0FBT2hCO0lBTEMsSUFBQSw2QkFBbUIsRUFBQztRQUNuQixXQUFXLEVBQUUsOENBQThDO0tBQzVELENBQUM7SUFDRCxJQUFBLDRCQUFVLEdBQUU7SUFDWixJQUFBLDBCQUFRLEdBQUU7OytEQUNnQztBQU0zQztJQUpDLElBQUEsNkJBQW1CLEVBQUMsRUFBRSxXQUFXLEVBQUUseUJBQXlCLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQzNFLElBQUEsNEJBQVUsR0FBRTtJQUNaLElBQUEsd0JBQUksRUFBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDbEIsSUFBQSx1QkFBSyxHQUFFOztxREFDTTtBQVNkO0lBUEMsSUFBQSw2QkFBbUIsRUFBQztRQUNuQixXQUFXLEVBQUUsNkJBQTZCO1FBQzFDLE9BQU8sRUFBRSxFQUFFO0tBQ1osQ0FBQztJQUNELElBQUEsNEJBQVUsR0FBRTtJQUNaLElBQUEsd0JBQUksRUFBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDbEIsSUFBQSx1QkFBSyxHQUFFOztzREFDTyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxjb3JyZXNwb25kZW5jZVxcZHRvXFxzZWFyY2gtY29ycmVzcG9uZGVuY2UuZHRvLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElzT3B0aW9uYWwsIElzU3RyaW5nLCBJc0ludCB9IGZyb20gJ2NsYXNzLXZhbGlkYXRvcic7XHJcbmltcG9ydCB7IFR5cGUgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XHJcbmltcG9ydCB7IEFwaVByb3BlcnR5T3B0aW9uYWwgfSBmcm9tICdAbmVzdGpzL3N3YWdnZXInO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNlYXJjaENvcnJlc3BvbmRlbmNlRHRvIHtcclxuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7XHJcbiAgICBkZXNjcmlwdGlvbjogJ1NlYXJjaCB0ZXJtIChUaXRsZSBvciBEb2N1bWVudCBOdW1iZXIpJyxcclxuICB9KVxyXG4gIEBJc09wdGlvbmFsKClcclxuICBASXNTdHJpbmcoKVxyXG4gIHNlYXJjaD86IHN0cmluZztcclxuXHJcbiAgQEFwaVByb3BlcnR5T3B0aW9uYWwoeyBkZXNjcmlwdGlvbjogJ0ZpbHRlciBieSBEb2N1bWVudCBUeXBlIElEJyB9KVxyXG4gIEBJc09wdGlvbmFsKClcclxuICBAVHlwZSgoKSA9PiBOdW1iZXIpXHJcbiAgQElzSW50KClcclxuICB0eXBlSWQ/OiBudW1iZXI7XHJcblxyXG4gIEBBcGlQcm9wZXJ0eU9wdGlvbmFsKHsgZGVzY3JpcHRpb246ICdGaWx0ZXIgYnkgUHJvamVjdCBJRCcgfSlcclxuICBASXNPcHRpb25hbCgpXHJcbiAgQFR5cGUoKCkgPT4gTnVtYmVyKVxyXG4gIEBJc0ludCgpXHJcbiAgcHJvamVjdElkPzogbnVtYmVyO1xyXG5cclxuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7IGRlc2NyaXB0aW9uOiAnRmlsdGVyIGJ5IFN0YXR1cyBJRCcgfSlcclxuICBASXNPcHRpb25hbCgpXHJcbiAgQFR5cGUoKCkgPT4gTnVtYmVyKVxyXG4gIEBJc0ludCgpXHJcbiAgc3RhdHVzSWQ/OiBudW1iZXI7XHJcblxyXG4gIEBBcGlQcm9wZXJ0eU9wdGlvbmFsKHtcclxuICAgIGRlc2NyaXB0aW9uOlxyXG4gICAgICAnRmlsdGVyIGJ5IFN0YXR1cyBjb2RlIChlLmcuIERSQUZULCBJTl9SRVZJRVcsIEFQUFJPVkVELCBDQU5DRUxMRUQpJyxcclxuICB9KVxyXG4gIEBJc09wdGlvbmFsKClcclxuICBASXNTdHJpbmcoKVxyXG4gIHN0YXR1cz86IHN0cmluZztcclxuXHJcbiAgQEFwaVByb3BlcnR5T3B0aW9uYWwoe1xyXG4gICAgZGVzY3JpcHRpb246ICdSZXZpc2lvbiBGaWx0ZXI6IENVUlJFTlQgKGRlZmF1bHQpLCBBTEwsIE9MRCcsXHJcbiAgfSlcclxuICBASXNPcHRpb25hbCgpXHJcbiAgQElzU3RyaW5nKClcclxuICByZXZpc2lvblN0YXR1cz86ICdDVVJSRU5UJyB8ICdBTEwnIHwgJ09MRCc7XHJcblxyXG4gIEBBcGlQcm9wZXJ0eU9wdGlvbmFsKHsgZGVzY3JpcHRpb246ICdQYWdlIG51bWJlciAoZGVmYXVsdCAxKScsIGRlZmF1bHQ6IDEgfSlcclxuICBASXNPcHRpb25hbCgpXHJcbiAgQFR5cGUoKCkgPT4gTnVtYmVyKVxyXG4gIEBJc0ludCgpXHJcbiAgcGFnZT86IG51bWJlcjtcclxuXHJcbiAgQEFwaVByb3BlcnR5T3B0aW9uYWwoe1xyXG4gICAgZGVzY3JpcHRpb246ICdJdGVtcyBwZXIgcGFnZSAoZGVmYXVsdCAxMCknLFxyXG4gICAgZGVmYXVsdDogMTAsXHJcbiAgfSlcclxuICBASXNPcHRpb25hbCgpXHJcbiAgQFR5cGUoKCkgPT4gTnVtYmVyKVxyXG4gIEBJc0ludCgpXHJcbiAgbGltaXQ/OiBudW1iZXI7XHJcbn1cclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/84/searchcorrespondencedto_84ed95e09c7a524e84c9d06242469288.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/84/searchcorrespondencedto_84ed95e09c7a524e84c9d06242469288.map new file mode 100644 index 0000000..eaac74d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/84/searchcorrespondencedto_84ed95e09c7a524e84c9d06242469288.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\search-correspondence.dto.ts","mappings":";;;;;;;;;;;;AAAA,qDAA8D;AAC9D,yDAAyC;AACzC,6CAAsD;AAEtD,MAAa,uBAAuB;CAuDnC;AAvDD,0DAuDC;AAjDC;IALC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,wCAAwC;KACtD,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;;uDACK;AAMhB;IAJC,IAAA,6BAAmB,EAAC,EAAE,WAAW,EAAE,4BAA4B,EAAE,CAAC;IAClE,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAClB,IAAA,uBAAK,GAAE;;uDACQ;AAMhB;IAJC,IAAA,6BAAmB,EAAC,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC;IAC5D,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAClB,IAAA,uBAAK,GAAE;;0DACW;AAMnB;IAJC,IAAA,6BAAmB,EAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC;IAC3D,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAClB,IAAA,uBAAK,GAAE;;yDACU;AAQlB;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EACT,oEAAoE;KACvE,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;;uDACK;AAOhB;IALC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,8CAA8C;KAC5D,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;;+DACgC;AAM3C;IAJC,IAAA,6BAAmB,EAAC,EAAE,WAAW,EAAE,yBAAyB,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAC3E,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAClB,IAAA,uBAAK,GAAE;;qDACM;AASd;IAPC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,6BAA6B;QAC1C,OAAO,EAAE,EAAE;KACZ,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAClB,IAAA,uBAAK,GAAE;;sDACO","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\search-correspondence.dto.ts"],"sourcesContent":["import { IsOptional, IsString, IsInt } from 'class-validator';\r\nimport { Type } from 'class-transformer';\r\nimport { ApiPropertyOptional } from '@nestjs/swagger';\r\n\r\nexport class SearchCorrespondenceDto {\r\n @ApiPropertyOptional({\r\n description: 'Search term (Title or Document Number)',\r\n })\r\n @IsOptional()\r\n @IsString()\r\n search?: string;\r\n\r\n @ApiPropertyOptional({ description: 'Filter by Document Type ID' })\r\n @IsOptional()\r\n @Type(() => Number)\r\n @IsInt()\r\n typeId?: number;\r\n\r\n @ApiPropertyOptional({ description: 'Filter by Project ID' })\r\n @IsOptional()\r\n @Type(() => Number)\r\n @IsInt()\r\n projectId?: number;\r\n\r\n @ApiPropertyOptional({ description: 'Filter by Status ID' })\r\n @IsOptional()\r\n @Type(() => Number)\r\n @IsInt()\r\n statusId?: number;\r\n\r\n @ApiPropertyOptional({\r\n description:\r\n 'Filter by Status code (e.g. DRAFT, IN_REVIEW, APPROVED, CANCELLED)',\r\n })\r\n @IsOptional()\r\n @IsString()\r\n status?: string;\r\n\r\n @ApiPropertyOptional({\r\n description: 'Revision Filter: CURRENT (default), ALL, OLD',\r\n })\r\n @IsOptional()\r\n @IsString()\r\n revisionStatus?: 'CURRENT' | 'ALL' | 'OLD';\r\n\r\n @ApiPropertyOptional({ description: 'Page number (default 1)', default: 1 })\r\n @IsOptional()\r\n @Type(() => Number)\r\n @IsInt()\r\n page?: number;\r\n\r\n @ApiPropertyOptional({\r\n description: 'Items per page (default 10)',\r\n default: 10,\r\n })\r\n @IsOptional()\r\n @Type(() => Number)\r\n @IsInt()\r\n limit?: number;\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/86/migrationqueuequerydto_86e92c67dbc40015462ab660eb32159d b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/86/migrationqueuequerydto_86e92c67dbc40015462ab660eb32159d new file mode 100644 index 0000000..a5ae0ff --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/86/migrationqueuequerydto_86e92c67dbc40015462ab660eb32159d @@ -0,0 +1,51 @@ +c3a0b818c9d362e4835a71c11bcd99b3 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MigrationQueueQueryDto = exports.PaginationDto = void 0; +const class_validator_1 = require("class-validator"); +const class_transformer_1 = require("class-transformer"); +const migration_review_queue_entity_1 = require("../entities/migration-review-queue.entity"); +const swagger_1 = require("@nestjs/swagger"); +class PaginationDto { + constructor() { + this.page = 1; + this.limit = 10; + } +} +exports.PaginationDto = PaginationDto; +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ default: 1 }), + (0, class_validator_1.IsOptional)(), + (0, class_transformer_1.Type)(() => Number), + (0, class_validator_1.IsInt)(), + (0, class_validator_1.Min)(1), + __metadata("design:type", Number) +], PaginationDto.prototype, "page", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ default: 10 }), + (0, class_validator_1.IsOptional)(), + (0, class_transformer_1.Type)(() => Number), + (0, class_validator_1.IsInt)(), + (0, class_validator_1.Min)(1), + __metadata("design:type", Number) +], PaginationDto.prototype, "limit", void 0); +class MigrationQueueQueryDto extends PaginationDto { +} +exports.MigrationQueueQueryDto = MigrationQueueQueryDto; +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ enum: migration_review_queue_entity_1.MigrationReviewStatus }), + (0, class_validator_1.IsOptional)(), + (0, class_validator_1.IsEnum)(migration_review_queue_entity_1.MigrationReviewStatus), + __metadata("design:type", typeof (_a = typeof migration_review_queue_entity_1.MigrationReviewStatus !== "undefined" && migration_review_queue_entity_1.MigrationReviewStatus) === "function" ? _a : Object) +], MigrationQueueQueryDto.prototype, "status", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxkdG9cXG1pZ3JhdGlvbi1xdWV1ZS1xdWVyeS5kdG8udHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFEQUFpRTtBQUNqRSx5REFBeUM7QUFDekMsNkZBQWtGO0FBQ2xGLDZDQUFzRDtBQUV0RCxNQUFhLGFBQWE7SUFBMUI7UUFNRSxTQUFJLEdBQVksQ0FBQyxDQUFDO1FBT2xCLFVBQUssR0FBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztDQUFBO0FBZEQsc0NBY0M7QUFSQztJQUxDLElBQUEsNkJBQW1CLEVBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDbkMsSUFBQSw0QkFBVSxHQUFFO0lBQ1osSUFBQSx3QkFBSSxFQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUNsQixJQUFBLHVCQUFLLEdBQUU7SUFDUCxJQUFBLHFCQUFHLEVBQUMsQ0FBQyxDQUFDOzsyQ0FDVztBQU9sQjtJQUxDLElBQUEsNkJBQW1CLEVBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDcEMsSUFBQSw0QkFBVSxHQUFFO0lBQ1osSUFBQSx3QkFBSSxFQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUNsQixJQUFBLHVCQUFLLEdBQUU7SUFDUCxJQUFBLHFCQUFHLEVBQUMsQ0FBQyxDQUFDOzs0Q0FDYTtBQUd0QixNQUFhLHNCQUF1QixTQUFRLGFBQWE7Q0FLeEQ7QUFMRCx3REFLQztBQURDO0lBSEMsSUFBQSw2QkFBbUIsRUFBQyxFQUFFLElBQUksRUFBRSxxREFBcUIsRUFBRSxDQUFDO0lBQ3BELElBQUEsNEJBQVUsR0FBRTtJQUNaLElBQUEsd0JBQU0sRUFBQyxxREFBcUIsQ0FBQztrREFDckIscURBQXFCLG9CQUFyQixxREFBcUI7c0RBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxkdG9cXG1pZ3JhdGlvbi1xdWV1ZS1xdWVyeS5kdG8udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSXNPcHRpb25hbCwgSXNFbnVtLCBJc0ludCwgTWluIH0gZnJvbSAnY2xhc3MtdmFsaWRhdG9yJztcbmltcG9ydCB7IFR5cGUgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XG5pbXBvcnQgeyBNaWdyYXRpb25SZXZpZXdTdGF0dXMgfSBmcm9tICcuLi9lbnRpdGllcy9taWdyYXRpb24tcmV2aWV3LXF1ZXVlLmVudGl0eSc7XG5pbXBvcnQgeyBBcGlQcm9wZXJ0eU9wdGlvbmFsIH0gZnJvbSAnQG5lc3Rqcy9zd2FnZ2VyJztcblxuZXhwb3J0IGNsYXNzIFBhZ2luYXRpb25EdG8ge1xuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7IGRlZmF1bHQ6IDEgfSlcbiAgQElzT3B0aW9uYWwoKVxuICBAVHlwZSgoKSA9PiBOdW1iZXIpXG4gIEBJc0ludCgpXG4gIEBNaW4oMSlcbiAgcGFnZT86IG51bWJlciA9IDE7XG5cbiAgQEFwaVByb3BlcnR5T3B0aW9uYWwoeyBkZWZhdWx0OiAxMCB9KVxuICBASXNPcHRpb25hbCgpXG4gIEBUeXBlKCgpID0+IE51bWJlcilcbiAgQElzSW50KClcbiAgQE1pbigxKVxuICBsaW1pdD86IG51bWJlciA9IDEwO1xufVxuXG5leHBvcnQgY2xhc3MgTWlncmF0aW9uUXVldWVRdWVyeUR0byBleHRlbmRzIFBhZ2luYXRpb25EdG8ge1xuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7IGVudW06IE1pZ3JhdGlvblJldmlld1N0YXR1cyB9KVxuICBASXNPcHRpb25hbCgpXG4gIEBJc0VudW0oTWlncmF0aW9uUmV2aWV3U3RhdHVzKVxuICBzdGF0dXM/OiBNaWdyYXRpb25SZXZpZXdTdGF0dXM7XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/86/migrationqueuequerydto_86e92c67dbc40015462ab660eb32159d.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/86/migrationqueuequerydto_86e92c67dbc40015462ab660eb32159d.map new file mode 100644 index 0000000..1d54842 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/86/migrationqueuequerydto_86e92c67dbc40015462ab660eb32159d.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\dto\\migration-queue-query.dto.ts","mappings":";;;;;;;;;;;;;AAAA,qDAAiE;AACjE,yDAAyC;AACzC,6FAAkF;AAClF,6CAAsD;AAEtD,MAAa,aAAa;IAA1B;QAME,SAAI,GAAY,CAAC,CAAC;QAOlB,UAAK,GAAY,EAAE,CAAC;IACtB,CAAC;CAAA;AAdD,sCAcC;AARC;IALC,IAAA,6BAAmB,EAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACnC,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAClB,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAG,EAAC,CAAC,CAAC;;2CACW;AAOlB;IALC,IAAA,6BAAmB,EAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACpC,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAClB,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAG,EAAC,CAAC,CAAC;;4CACa;AAGtB,MAAa,sBAAuB,SAAQ,aAAa;CAKxD;AALD,wDAKC;AADC;IAHC,IAAA,6BAAmB,EAAC,EAAE,IAAI,EAAE,qDAAqB,EAAE,CAAC;IACpD,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAM,EAAC,qDAAqB,CAAC;kDACrB,qDAAqB,oBAArB,qDAAqB;sDAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\dto\\migration-queue-query.dto.ts"],"sourcesContent":["import { IsOptional, IsEnum, IsInt, Min } from 'class-validator';\nimport { Type } from 'class-transformer';\nimport { MigrationReviewStatus } from '../entities/migration-review-queue.entity';\nimport { ApiPropertyOptional } from '@nestjs/swagger';\n\nexport class PaginationDto {\n @ApiPropertyOptional({ default: 1 })\n @IsOptional()\n @Type(() => Number)\n @IsInt()\n @Min(1)\n page?: number = 1;\n\n @ApiPropertyOptional({ default: 10 })\n @IsOptional()\n @Type(() => Number)\n @IsInt()\n @Min(1)\n limit?: number = 10;\n}\n\nexport class MigrationQueueQueryDto extends PaginationDto {\n @ApiPropertyOptional({ enum: MigrationReviewStatus })\n @IsOptional()\n @IsEnum(MigrationReviewStatus)\n status?: MigrationReviewStatus;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/89/auditservice_892193ffeea2f7f738d0560b8b65f546 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/89/auditservice_892193ffeea2f7f738d0560b8b65f546 new file mode 100644 index 0000000..b8f0fa5 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/89/auditservice_892193ffeea2f7f738d0560b8b65f546 @@ -0,0 +1,47 @@ +4bc0bb500816942a9c2d82eab1801e81 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var AuditService_1; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AuditService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const document_number_audit_entity_1 = require("../entities/document-number-audit.entity"); +let AuditService = AuditService_1 = class AuditService { + constructor(auditRepo) { + this.auditRepo = auditRepo; + this.logger = new common_1.Logger(AuditService_1.name); + } + async log(entry) { + try { + // Async save - do not await strictly if we want fire-and-forget, but for data integrity await is safer in critical flows + // For performance, we might offload to a queue, but direct save is safer for now. + const logEntry = this.auditRepo.create(entry); + await this.auditRepo.save(logEntry); + } + catch (error) { + this.logger.error('Failed to write audit log', error); + // Fail silent or throw? -> Fail silent to not crash the main flow, assuming log is secondary + } + } +}; +exports.AuditService = AuditService; +exports.AuditService = AuditService = AuditService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(document_number_audit_entity_1.DocumentNumberAudit)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object]) +], AuditService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxzZXJ2aWNlc1xcYXVkaXQuc2VydmljZS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUFvRDtBQUNwRCw2Q0FBbUQ7QUFDbkQscUNBQXFDO0FBQ3JDLDJGQUErRTtBQUd4RSxJQUFNLFlBQVksb0JBQWxCLE1BQU0sWUFBWTtJQUd2QixZQUVFLFNBQTJEO1FBQTFDLGNBQVMsR0FBVCxTQUFTLENBQWlDO1FBSjVDLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxjQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7SUFLckQsQ0FBQztJQUVKLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBbUM7UUFDM0MsSUFBSSxDQUFDO1lBQ0gseUhBQXlIO1lBQ3pILGtGQUFrRjtZQUNsRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdEQsNkZBQTZGO1FBQy9GLENBQUM7SUFDSCxDQUFDO0NBQ0YsQ0FBQTtBQW5CWSxvQ0FBWTt1QkFBWixZQUFZO0lBRHhCLElBQUEsbUJBQVUsR0FBRTtJQUtSLFdBQUEsSUFBQSwwQkFBZ0IsRUFBQyxrREFBbUIsQ0FBQyxDQUFBO3lEQUNWLG9CQUFVLG9CQUFWLG9CQUFVO0dBTDdCLFlBQVksQ0FtQnhCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGRvY3VtZW50LW51bWJlcmluZ1xcc2VydmljZXNcXGF1ZGl0LnNlcnZpY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTG9nZ2VyIH0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0UmVwb3NpdG9yeSB9IGZyb20gJ0BuZXN0anMvdHlwZW9ybSc7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBEb2N1bWVudE51bWJlckF1ZGl0IH0gZnJvbSAnLi4vZW50aXRpZXMvZG9jdW1lbnQtbnVtYmVyLWF1ZGl0LmVudGl0eSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBdWRpdFNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoQXVkaXRTZXJ2aWNlLm5hbWUpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3RSZXBvc2l0b3J5KERvY3VtZW50TnVtYmVyQXVkaXQpXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdWRpdFJlcG86IFJlcG9zaXRvcnk8RG9jdW1lbnROdW1iZXJBdWRpdD5cbiAgKSB7fVxuXG4gIGFzeW5jIGxvZyhlbnRyeTogUGFydGlhbDxEb2N1bWVudE51bWJlckF1ZGl0Pik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBBc3luYyBzYXZlIC0gZG8gbm90IGF3YWl0IHN0cmljdGx5IGlmIHdlIHdhbnQgZmlyZS1hbmQtZm9yZ2V0LCBidXQgZm9yIGRhdGEgaW50ZWdyaXR5IGF3YWl0IGlzIHNhZmVyIGluIGNyaXRpY2FsIGZsb3dzXG4gICAgICAvLyBGb3IgcGVyZm9ybWFuY2UsIHdlIG1pZ2h0IG9mZmxvYWQgdG8gYSBxdWV1ZSwgYnV0IGRpcmVjdCBzYXZlIGlzIHNhZmVyIGZvciBub3cuXG4gICAgICBjb25zdCBsb2dFbnRyeSA9IHRoaXMuYXVkaXRSZXBvLmNyZWF0ZShlbnRyeSk7XG4gICAgICBhd2FpdCB0aGlzLmF1ZGl0UmVwby5zYXZlKGxvZ0VudHJ5KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byB3cml0ZSBhdWRpdCBsb2cnLCBlcnJvcik7XG4gICAgICAvLyBGYWlsIHNpbGVudCBvciB0aHJvdz8gLT4gRmFpbCBzaWxlbnQgdG8gbm90IGNyYXNoIHRoZSBtYWluIGZsb3csIGFzc3VtaW5nIGxvZyBpcyBzZWNvbmRhcnlcbiAgICB9XG4gIH1cbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/89/auditservice_892193ffeea2f7f738d0560b8b65f546.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/89/auditservice_892193ffeea2f7f738d0560b8b65f546.map new file mode 100644 index 0000000..a0fe51b --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/89/auditservice_892193ffeea2f7f738d0560b8b65f546.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\audit.service.ts","mappings":";;;;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,6CAAmD;AACnD,qCAAqC;AACrC,2FAA+E;AAGxE,IAAM,YAAY,oBAAlB,MAAM,YAAY;IAGvB,YAEE,SAA2D;QAA1C,cAAS,GAAT,SAAS,CAAiC;QAJ5C,WAAM,GAAG,IAAI,eAAM,CAAC,cAAY,CAAC,IAAI,CAAC,CAAC;IAKrD,CAAC;IAEJ,KAAK,CAAC,GAAG,CAAC,KAAmC;QAC3C,IAAI,CAAC;YACH,yHAAyH;YACzH,kFAAkF;YAClF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YACtD,6FAA6F;QAC/F,CAAC;IACH,CAAC;CACF,CAAA;AAnBY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;IAKR,WAAA,IAAA,0BAAgB,EAAC,kDAAmB,CAAC,CAAA;yDACV,oBAAU,oBAAV,oBAAU;GAL7B,YAAY,CAmBxB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\audit.service.ts"],"sourcesContent":["import { Injectable, Logger } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { Repository } from 'typeorm';\nimport { DocumentNumberAudit } from '../entities/document-number-audit.entity';\n\n@Injectable()\nexport class AuditService {\n private readonly logger = new Logger(AuditService.name);\n\n constructor(\n @InjectRepository(DocumentNumberAudit)\n private readonly auditRepo: Repository\n ) {}\n\n async log(entry: Partial): Promise {\n try {\n // Async save - do not await strictly if we want fire-and-forget, but for data integrity await is safer in critical flows\n // For performance, we might offload to a queue, but direct save is safer for now.\n const logEntry = this.auditRepo.create(entry);\n await this.auditRepo.save(logEntry);\n } catch (error) {\n this.logger.error('Failed to write audit log', error);\n // Fail silent or throw? -> Fail silent to not crash the main flow, assuming log is secondary\n }\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8a/parse_8a4fbdc5fdee8d9d488883273b5da927 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8a/parse_8a4fbdc5fdee8d9d488883273b5da927 new file mode 100644 index 0000000..47e7a56 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8a/parse_8a4fbdc5fdee8d9d488883273b5da927 @@ -0,0 +1,13 @@ +cc16276d35ff8c1c7eafb178b6495c8d +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const validate_js_1 = require("./validate.js"); +function parse(uuid) { + if (!(0, validate_js_1.default)(uuid)) { + throw TypeError('Invalid UUID'); + } + let v; + return Uint8Array.of((v = parseInt(uuid.slice(0, 8), 16)) >>> 24, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff, (v = parseInt(uuid.slice(9, 13), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(14, 18), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(19, 23), 16)) >>> 8, v & 0xff, ((v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000) & 0xff, (v / 0x100000000) & 0xff, (v >>> 24) & 0xff, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff); +} +exports.default = parse; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xccGFyc2UuanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDO0FBQ2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUQsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQy9DLFNBQVMsS0FBSyxDQUFDLElBQUk7SUFDZixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDcEMsTUFBTSxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUNELElBQUksQ0FBQyxDQUFDO0lBQ04sT0FBTyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN6YixDQUFDO0FBQ0QsT0FBTyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xccGFyc2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCB2YWxpZGF0ZV9qc18xID0gcmVxdWlyZShcIi4vdmFsaWRhdGUuanNcIik7XG5mdW5jdGlvbiBwYXJzZSh1dWlkKSB7XG4gICAgaWYgKCEoMCwgdmFsaWRhdGVfanNfMS5kZWZhdWx0KSh1dWlkKSkge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ0ludmFsaWQgVVVJRCcpO1xuICAgIH1cbiAgICBsZXQgdjtcbiAgICByZXR1cm4gVWludDhBcnJheS5vZigodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMCwgOCksIDE2KSkgPj4+IDI0LCAodiA+Pj4gMTYpICYgMHhmZiwgKHYgPj4+IDgpICYgMHhmZiwgdiAmIDB4ZmYsICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSg5LCAxMyksIDE2KSkgPj4+IDgsIHYgJiAweGZmLCAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMTQsIDE4KSwgMTYpKSA+Pj4gOCwgdiAmIDB4ZmYsICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgxOSwgMjMpLCAxNikpID4+PiA4LCB2ICYgMHhmZiwgKCh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgyNCwgMzYpLCAxNikpIC8gMHgxMDAwMDAwMDAwMCkgJiAweGZmLCAodiAvIDB4MTAwMDAwMDAwKSAmIDB4ZmYsICh2ID4+PiAyNCkgJiAweGZmLCAodiA+Pj4gMTYpICYgMHhmZiwgKHYgPj4+IDgpICYgMHhmZiwgdiAmIDB4ZmYpO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gcGFyc2U7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8a/parse_8a4fbdc5fdee8d9d488883273b5da927.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8a/parse_8a4fbdc5fdee8d9d488883273b5da927.map new file mode 100644 index 0000000..17a3f81 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8a/parse_8a4fbdc5fdee8d9d488883273b5da927.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\parse.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,MAAM,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAC/C,SAAS,KAAK,CAAC,IAAI;IACf,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,SAAS,CAAC,cAAc,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,CAAC,CAAC;IACN,OAAO,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,aAAa,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;AACzb,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\parse.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst validate_js_1 = require(\"./validate.js\");\nfunction parse(uuid) {\n if (!(0, validate_js_1.default)(uuid)) {\n throw TypeError('Invalid UUID');\n }\n let v;\n return Uint8Array.of((v = parseInt(uuid.slice(0, 8), 16)) >>> 24, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff, (v = parseInt(uuid.slice(9, 13), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(14, 18), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(19, 23), 16)) >>> 8, v & 0xff, ((v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000) & 0xff, (v / 0x100000000) & 0xff, (v >>> 24) & 0xff, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff);\n}\nexports.default = parse;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8b/counterservice_8b1d27b6691bbd260fdee0af6ad9ca3f b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8b/counterservice_8b1d27b6691bbd260fdee0af6ad9ca3f new file mode 100644 index 0000000..f67f6d8 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8b/counterservice_8b1d27b6691bbd260fdee0af6ad9ca3f @@ -0,0 +1,159 @@ +31c5a48b378af366e14698210e75a5d7 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var CounterService_1; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CounterService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const document_number_counter_entity_1 = require("../entities/document-number-counter.entity"); +let CounterService = CounterService_1 = class CounterService { + constructor(counterRepo, dataSource) { + this.counterRepo = counterRepo; + this.dataSource = dataSource; + this.logger = new common_1.Logger(CounterService_1.name); + } + /** + * Increment counter and return next number + * Uses optimistic locking to prevent race conditions + */ + async incrementCounter(counterKey) { + const MAX_RETRIES = 3; + for (let attempt = 0; attempt < MAX_RETRIES; attempt++) { + try { + return await this.dataSource.transaction(async (manager) => { + // Find or create counter + let counter = await manager.findOne(document_number_counter_entity_1.DocumentNumberCounter, { + where: this.buildWhereClause(counterKey), + }); + if (!counter) { + counter = manager.create(document_number_counter_entity_1.DocumentNumberCounter, { + projectId: counterKey.projectId, + originatorId: counterKey.originatorOrganizationId, + recipientOrganizationId: counterKey.recipientOrganizationId, + correspondenceTypeId: counterKey.correspondenceTypeId, + subTypeId: counterKey.subTypeId, + rfaTypeId: counterKey.rfaTypeId, + disciplineId: counterKey.disciplineId, + resetScope: counterKey.resetScope, + lastNumber: 1, + version: 0, + }); + await manager.save(counter); + return 1; + } + // Increment with optimistic lock + const currentVersion = counter.version; + const nextNumber = counter.lastNumber + 1; + const result = await manager + .createQueryBuilder() + .update(document_number_counter_entity_1.DocumentNumberCounter) + .set({ + lastNumber: nextNumber, + version: () => 'version + 1', + }) + .where(this.buildWhereClause(counterKey)) + .andWhere('version = :version', { version: currentVersion }) + .execute(); + if (result.affected === 0) { + throw new common_1.ConflictException('Counter version conflict'); + } + return nextNumber; + }); + } + catch (error) { + if (error instanceof common_1.ConflictException && attempt < MAX_RETRIES - 1) { + this.logger.warn(`Version conflict on attempt ${attempt + 1}/${MAX_RETRIES}, retrying...`); + // Exponential backoff + await this.sleep(100 * Math.pow(2, attempt)); + continue; + } + throw error; + } + } + throw new common_1.ConflictException('เลขที่เอกสารถูกเปลี่ยน กรุณาลองใหม่'); + } + /** + * Get current counter value without incrementing + */ + async getCurrentCounter(counterKey) { + const counter = await this.counterRepo.findOne({ + where: this.buildWhereClause(counterKey), + }); + return counter?.lastNumber || 0; + } + buildWhereClause(key) { + return { + projectId: key.projectId, + originatorId: key.originatorOrganizationId, + recipientOrganizationId: key.recipientOrganizationId, + correspondenceTypeId: key.correspondenceTypeId, + subTypeId: key.subTypeId, + rfaTypeId: key.rfaTypeId, + disciplineId: key.disciplineId, + resetScope: key.resetScope, + }; + } + /** + * Force update counter value (Admin Override) + * WARNING: This bypasses optimistic locking checks slightly, but still increments version + */ + async forceUpdateCounter(counterKey, newValue) { + await this.dataSource.transaction(async (manager) => { + let counter = await manager.findOne(document_number_counter_entity_1.DocumentNumberCounter, { + where: this.buildWhereClause(counterKey), + }); + if (!counter) { + counter = manager.create(document_number_counter_entity_1.DocumentNumberCounter, { + projectId: counterKey.projectId, + originatorId: counterKey.originatorOrganizationId, + recipientOrganizationId: counterKey.recipientOrganizationId, + correspondenceTypeId: counterKey.correspondenceTypeId, + subTypeId: counterKey.subTypeId, + rfaTypeId: counterKey.rfaTypeId, + disciplineId: counterKey.disciplineId, + resetScope: counterKey.resetScope, + lastNumber: newValue, + version: 1, + }); + await manager.save(counter); + } + else { + // Force update regardless of version, but increment version + await manager + .createQueryBuilder() + .update(document_number_counter_entity_1.DocumentNumberCounter) + .set({ + lastNumber: newValue, + version: () => 'version + 1', + }) + .where(this.buildWhereClause(counterKey)) + .execute(); + } + }); + this.logger.log(`Counter force updated to ${newValue} for key: ${JSON.stringify(counterKey)}`); + } + sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); + } +}; +exports.CounterService = CounterService; +exports.CounterService = CounterService = CounterService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(document_number_counter_entity_1.DocumentNumberCounter)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object, typeof (_b = typeof typeorm_2.DataSource !== "undefined" && typeorm_2.DataSource) === "function" ? _b : Object]) +], CounterService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxzZXJ2aWNlc1xcY291bnRlci5zZXJ2aWNlLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXVFO0FBQ3ZFLDZDQUFtRDtBQUNuRCxxQ0FBaUQ7QUFDakQsK0ZBQW1GO0FBSTVFLElBQU0sY0FBYyxzQkFBcEIsTUFBTSxjQUFjO0lBR3pCLFlBRUUsV0FBc0QsRUFDOUMsVUFBc0I7UUFEdEIsZ0JBQVcsR0FBWCxXQUFXLENBQW1DO1FBQzlDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFMZixXQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsZ0JBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQU12RCxDQUFDO0lBRUo7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFVBQXlCO1FBQzlDLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQztRQUV0QixLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDdkQsSUFBSSxDQUFDO2dCQUNILE9BQU8sTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7b0JBQ3pELHlCQUF5QjtvQkFDekIsSUFBSSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLHNEQUFxQixFQUFFO3dCQUN6RCxLQUFLLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQztxQkFDekMsQ0FBQyxDQUFDO29CQUVILElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDYixPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxzREFBcUIsRUFBRTs0QkFDOUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTOzRCQUMvQixZQUFZLEVBQUUsVUFBVSxDQUFDLHdCQUF3Qjs0QkFDakQsdUJBQXVC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QztxQkFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUN4QyxPQUFPLEVBQUUsQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNiLDRCQUE0QixRQUFRLGFBQWEsSUFBSSxDQUFDLFNBQVMsQ0FDN0QsVUFBVSxDQUNYLEVBQUUsQ0FDSixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxFQUFVO1FBQ3RCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0NBQ0YsQ0FBQTtBQXhKWSx3Q0FBYzt5QkFBZCxjQUFjO0lBRDFCLElBQUEsbUJBQVUsR0FBRTtJQUtSLFdBQUEsSUFBQSwwQkFBZ0IsRUFBQyxzREFBcUIsQ0FBQyxDQUFBO3lEQUNuQixvQkFBVSxvQkFBVixvQkFBVSxvREFDWCxvQkFBVSxvQkFBVixvQkFBVTtHQU5yQixjQUFjLENBd0oxQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxkb2N1bWVudC1udW1iZXJpbmdcXHNlcnZpY2VzXFxjb3VudGVyLnNlcnZpY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgQ29uZmxpY3RFeGNlcHRpb24sIExvZ2dlciB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcbmltcG9ydCB7IEluamVjdFJlcG9zaXRvcnkgfSBmcm9tICdAbmVzdGpzL3R5cGVvcm0nO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSwgRGF0YVNvdXJjZSB9IGZyb20gJ3R5cGVvcm0nO1xuaW1wb3J0IHsgRG9jdW1lbnROdW1iZXJDb3VudGVyIH0gZnJvbSAnLi4vZW50aXRpZXMvZG9jdW1lbnQtbnVtYmVyLWNvdW50ZXIuZW50aXR5JztcbmltcG9ydCB7IENvdW50ZXJLZXlEdG8gfSBmcm9tICcuLi9kdG8vY291bnRlci1rZXkuZHRvJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENvdW50ZXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKENvdW50ZXJTZXJ2aWNlLm5hbWUpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3RSZXBvc2l0b3J5KERvY3VtZW50TnVtYmVyQ291bnRlcilcbiAgICBwcml2YXRlIGNvdW50ZXJSZXBvOiBSZXBvc2l0b3J5PERvY3VtZW50TnVtYmVyQ291bnRlcj4sXG4gICAgcHJpdmF0ZSBkYXRhU291cmNlOiBEYXRhU291cmNlXG4gICkge31cblxuICAvKipcbiAgICogSW5jcmVtZW50IGNvdW50ZXIgYW5kIHJldHVybiBuZXh0IG51bWJlclxuICAgKiBVc2VzIG9wdGltaXN0aWMgbG9ja2luZyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgKi9cbiAgYXN5bmMgaW5jcmVtZW50Q291bnRlcihjb3VudGVyS2V5OiBDb3VudGVyS2V5RHRvKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBNQVhfUkVUUklFUyA9IDM7XG5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IE1BWF9SRVRSSUVTOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmRhdGFTb3VyY2UudHJhbnNhY3Rpb24oYXN5bmMgKG1hbmFnZXIpID0+IHtcbiAgICAgICAgICAvLyBGaW5kIG9yIGNyZWF0ZSBjb3VudGVyXG4gICAgICAgICAgbGV0IGNvdW50ZXIgPSBhd2FpdCBtYW5hZ2VyLmZpbmRPbmUoRG9jdW1lbnROdW1iZXJDb3VudGVyLCB7XG4gICAgICAgICAgICB3aGVyZTogdGhpcy5idWlsZFdoZXJlQ2xhdXNlKGNvdW50ZXJLZXkpLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKCFjb3VudGVyKSB7XG4gICAgICAgICAgICBjb3VudGVyID0gbWFuYWdlci5jcmVhdGUoRG9jdW1lbnROdW1iZXJDb3VudGVyLCB7XG4gICAgICAgICAgICAgIHByb2plY3RJZDogY291bnRlcktleS5wcm9qZWN0SWQsXG4gICAgICAgICAgICAgIG9yaWdpbmF0b3JJZDogY291bnRlcktleS5vcmlnaW5hdG9yT3JnYW5pemF0aW9uSWQsXG4gICAgICAgICAgICAgIHJlY2lwaWVudE9yZ2FuaXphdGlvbklkOiBjb3VudGVyS2V5LnJlY2lwaWVudE9yZ2FuaXphdGlvbklkLFxuICAgICAgICAgICAgICBjb3JyZXNwb25kZW5jZVR5cGVJZDogY291bnRlcktleS5jb3JyZXNwb25kZW5jZVR5cGVJZCxcbiAgICAgICAgICAgICAgc3ViVHlwZUlkOiBjb3VudGVyS2V5LnN1YlR5cGVJZCxcbiAgICAgICAgICAgICAgcmZhVHlwZUlkOiBjb3VudGVyS2V5LnJmYVR5cGVJZCxcbiAgICAgICAgICAgICAgZGlzY2lwbGluZUlkOiBjb3VudGVyS2V5LmRpc2NpcGxpbmVJZCxcbiAgICAgICAgICAgICAgcmVzZXRTY29wZTogY291bnRlcktleS5yZXNldFNjb3BlLFxuICAgICAgICAgICAgICBsYXN0TnVtYmVyOiAxLFxuICAgICAgICAgICAgICB2ZXJzaW9uOiAwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhd2FpdCBtYW5hZ2VyLnNhdmUoY291bnRlcik7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJbmNyZW1lbnQgd2l0aCBvcHRpbWlzdGljIGxvY2tcbiAgICAgICAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IGNvdW50ZXIudmVyc2lvbjtcbiAgICAgICAgICBjb25zdCBuZXh0TnVtYmVyID0gY291bnRlci5sYXN0TnVtYmVyICsgMTtcblxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1hbmFnZXJcbiAgICAgICAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgICAgICAgLnVwZGF0ZShEb2N1bWVudE51bWJlckNvdW50ZXIpXG4gICAgICAgICAgICAuc2V0KHtcbiAgICAgICAgICAgICAgbGFzdE51bWJlcjogbmV4dE51bWJlcixcbiAgICAgICAgICAgICAgdmVyc2lvbjogKCkgPT4gJ3ZlcnNpb24gKyAxJyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAud2hlcmUodGhpcy5idWlsZFdoZXJlQ2xhdXNlKGNvdW50ZXJLZXkpKVxuICAgICAgICAgICAgLmFuZFdoZXJlKCd2ZXJzaW9uID0gOnZlcnNpb24nLCB7IHZlcnNpb246IGN1cnJlbnRWZXJzaW9uIH0pXG4gICAgICAgICAgICAuZXhlY3V0ZSgpO1xuXG4gICAgICAgICAgaWYgKHJlc3VsdC5hZmZlY3RlZCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZsaWN0RXhjZXB0aW9uKCdDb3VudGVyIHZlcnNpb24gY29uZmxpY3QnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbmV4dE51bWJlcjtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDb25mbGljdEV4Y2VwdGlvbiAmJiBhdHRlbXB0IDwgTUFYX1JFVFJJRVMgLSAxKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgIGBWZXJzaW9uIGNvbmZsaWN0IG9uIGF0dGVtcHQgJHthdHRlbXB0ICsgMX0vJHtNQVhfUkVUUklFU30sIHJldHJ5aW5nLi4uYFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gRXhwb25lbnRpYWwgYmFja29mZlxuICAgICAgICAgIGF3YWl0IHRoaXMuc2xlZXAoMTAwICogTWF0aC5wb3coMiwgYXR0ZW1wdCkpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBDb25mbGljdEV4Y2VwdGlvbign4LmA4Lil4LiC4LiX4Li14LmI4LmA4Lit4LiB4Liq4Liy4Lij4LiW4Li54LiB4LmA4Lib4Lil4Li14LmI4Lii4LiZIOC4geC4o+C4uOC4k+C4suC4peC4reC4h+C5g+C4q+C4oeC5iCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IGNvdW50ZXIgdmFsdWUgd2l0aG91dCBpbmNyZW1lbnRpbmdcbiAgICovXG4gIGFzeW5jIGdldEN1cnJlbnRDb3VudGVyKGNvdW50ZXJLZXk6IENvdW50ZXJLZXlEdG8pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IGNvdW50ZXIgPSBhd2FpdCB0aGlzLmNvdW50ZXJSZXBvLmZpbmRPbmUoe1xuICAgICAgd2hlcmU6IHRoaXMuYnVpbGRXaGVyZUNsYXVzZShjb3VudGVyS2V5KSxcbiAgICB9KTtcbiAgICByZXR1cm4gY291bnRlcj8ubGFzdE51bWJlciB8fCAwO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFdoZXJlQ2xhdXNlKGtleTogQ291bnRlcktleUR0bykge1xuICAgIHJldHVybiB7XG4gICAgICBwcm9qZWN0SWQ6IGtleS5wcm9qZWN0SWQsXG4gICAgICBvcmlnaW5hdG9ySWQ6IGtleS5vcmlnaW5hdG9yT3JnYW5pemF0aW9uSWQsXG4gICAgICByZWNpcGllbnRPcmdhbml6YXRpb25JZDoga2V5LnJlY2lwaWVudE9yZ2FuaXphdGlvbklkLFxuICAgICAgY29ycmVzcG9uZGVuY2VUeXBlSWQ6IGtleS5jb3JyZXNwb25kZW5jZVR5cGVJZCxcbiAgICAgIHN1YlR5cGVJZDoga2V5LnN1YlR5cGVJZCxcbiAgICAgIHJmYVR5cGVJZDoga2V5LnJmYVR5cGVJZCxcbiAgICAgIGRpc2NpcGxpbmVJZDoga2V5LmRpc2NpcGxpbmVJZCxcbiAgICAgIHJlc2V0U2NvcGU6IGtleS5yZXNldFNjb3BlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRm9yY2UgdXBkYXRlIGNvdW50ZXIgdmFsdWUgKEFkbWluIE92ZXJyaWRlKVxuICAgKiBXQVJOSU5HOiBUaGlzIGJ5cGFzc2VzIG9wdGltaXN0aWMgbG9ja2luZyBjaGVja3Mgc2xpZ2h0bHksIGJ1dCBzdGlsbCBpbmNyZW1lbnRzIHZlcnNpb25cbiAgICovXG4gIGFzeW5jIGZvcmNlVXBkYXRlQ291bnRlcihcbiAgICBjb3VudGVyS2V5OiBDb3VudGVyS2V5RHRvLFxuICAgIG5ld1ZhbHVlOiBudW1iZXJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kYXRhU291cmNlLnRyYW5zYWN0aW9uKGFzeW5jIChtYW5hZ2VyKSA9PiB7XG4gICAgICBsZXQgY291bnRlciA9IGF3YWl0IG1hbmFnZXIuZmluZE9uZShEb2N1bWVudE51bWJlckNvdW50ZXIsIHtcbiAgICAgICAgd2hlcmU6IHRoaXMuYnVpbGRXaGVyZUNsYXVzZShjb3VudGVyS2V5KSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIWNvdW50ZXIpIHtcbiAgICAgICAgY291bnRlciA9IG1hbmFnZXIuY3JlYXRlKERvY3VtZW50TnVtYmVyQ291bnRlciwge1xuICAgICAgICAgIHByb2plY3RJZDogY291bnRlcktleS5wcm9qZWN0SWQsXG4gICAgICAgICAgb3JpZ2luYXRvcklkOiBjb3VudGVyS2V5Lm9yaWdpbmF0b3JPcmdhbml6YXRpb25JZCxcbiAgICAgICAgICByZWNpcGllbnRPcmdhbml6YXRpb25JZDogY291bnRlcktleS5yZWNpcGllbnRPcmdhbml6YXRpb25JZCxcbiAgICAgICAgICBjb3JyZXNwb25kZW5jZVR5cGVJZDogY291bnRlcktleS5jb3JyZXNwb25kZW5jZVR5cGVJZCxcbiAgICAgICAgICBzdWJUeXBlSWQ6IGNvdW50ZXJLZXkuc3ViVHlwZUlkLFxuICAgICAgICAgIHJmYVR5cGVJZDogY291bnRlcktleS5yZmFUeXBlSWQsXG4gICAgICAgICAgZGlzY2lwbGluZUlkOiBjb3VudGVyS2V5LmRpc2NpcGxpbmVJZCxcbiAgICAgICAgICByZXNldFNjb3BlOiBjb3VudGVyS2V5LnJlc2V0U2NvcGUsXG4gICAgICAgICAgbGFzdE51bWJlcjogbmV3VmFsdWUsXG4gICAgICAgICAgdmVyc2lvbjogMSxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IG1hbmFnZXIuc2F2ZShjb3VudGVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvcmNlIHVwZGF0ZSByZWdhcmRsZXNzIG9mIHZlcnNpb24sIGJ1dCBpbmNyZW1lbnQgdmVyc2lvblxuICAgICAgICBhd2FpdCBtYW5hZ2VyXG4gICAgICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAgICAgLnVwZGF0ZShEb2N1bWVudE51bWJlckNvdW50ZXIpXG4gICAgICAgICAgLnNldCh7XG4gICAgICAgICAgICBsYXN0TnVtYmVyOiBuZXdWYWx1ZSxcbiAgICAgICAgICAgIHZlcnNpb246ICgpID0+ICd2ZXJzaW9uICsgMScsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAud2hlcmUodGhpcy5idWlsZFdoZXJlQ2xhdXNlKGNvdW50ZXJLZXkpKVxuICAgICAgICAgIC5leGVjdXRlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmxvZ2dlci5sb2coXG4gICAgICBgQ291bnRlciBmb3JjZSB1cGRhdGVkIHRvICR7bmV3VmFsdWV9IGZvciBrZXk6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGNvdW50ZXJLZXlcbiAgICAgICl9YFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbiAgfVxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8b/counterservice_8b1d27b6691bbd260fdee0af6ad9ca3f.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8b/counterservice_8b1d27b6691bbd260fdee0af6ad9ca3f.map new file mode 100644 index 0000000..bd8fb2c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8b/counterservice_8b1d27b6691bbd260fdee0af6ad9ca3f.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\counter.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\counter.service.ts"],"sourcesContent":["import { Injectable, ConflictException, Logger } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { Repository, DataSource } from 'typeorm';\nimport { DocumentNumberCounter } from '../entities/document-number-counter.entity';\nimport { CounterKeyDto } from '../dto/counter-key.dto';\n\n@Injectable()\nexport class CounterService {\n private readonly logger = new Logger(CounterService.name);\n\n constructor(\n @InjectRepository(DocumentNumberCounter)\n private counterRepo: Repository,\n private dataSource: DataSource\n ) {}\n\n /**\n * Increment counter and return next number\n * Uses optimistic locking to prevent race conditions\n */\n async incrementCounter(counterKey: CounterKeyDto): Promise {\n const MAX_RETRIES = 3;\n\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n try {\n return await this.dataSource.transaction(async (manager) => {\n // Find or create counter\n let counter = await manager.findOne(DocumentNumberCounter, {\n where: this.buildWhereClause(counterKey),\n });\n\n if (!counter) {\n counter = manager.create(DocumentNumberCounter, {\n projectId: counterKey.projectId,\n originatorId: counterKey.originatorOrganizationId,\n recipientOrganizationId: counterKey.recipientOrganizationId,\n correspondenceTypeId: counterKey.correspondenceTypeId,\n subTypeId: counterKey.subTypeId,\n rfaTypeId: counterKey.rfaTypeId,\n disciplineId: counterKey.disciplineId,\n resetScope: counterKey.resetScope,\n lastNumber: 1,\n version: 0,\n });\n await manager.save(counter);\n return 1;\n }\n\n // Increment with optimistic lock\n const currentVersion = counter.version;\n const nextNumber = counter.lastNumber + 1;\n\n const result = await manager\n .createQueryBuilder()\n .update(DocumentNumberCounter)\n .set({\n lastNumber: nextNumber,\n version: () => 'version + 1',\n })\n .where(this.buildWhereClause(counterKey))\n .andWhere('version = :version', { version: currentVersion })\n .execute();\n\n if (result.affected === 0) {\n throw new ConflictException('Counter version conflict');\n }\n\n return nextNumber;\n });\n } catch (error) {\n if (error instanceof ConflictException && attempt < MAX_RETRIES - 1) {\n this.logger.warn(\n `Version conflict on attempt ${attempt + 1}/${MAX_RETRIES}, retrying...`\n );\n // Exponential backoff\n await this.sleep(100 * Math.pow(2, attempt));\n continue;\n }\n throw error;\n }\n }\n\n throw new ConflictException('เลขที่เอกสารถูกเปลี่ยน กรุณาลองใหม่');\n }\n\n /**\n * Get current counter value without incrementing\n */\n async getCurrentCounter(counterKey: CounterKeyDto): Promise {\n const counter = await this.counterRepo.findOne({\n where: this.buildWhereClause(counterKey),\n });\n return counter?.lastNumber || 0;\n }\n\n private buildWhereClause(key: CounterKeyDto) {\n return {\n projectId: key.projectId,\n originatorId: key.originatorOrganizationId,\n recipientOrganizationId: key.recipientOrganizationId,\n correspondenceTypeId: key.correspondenceTypeId,\n subTypeId: key.subTypeId,\n rfaTypeId: key.rfaTypeId,\n disciplineId: key.disciplineId,\n resetScope: key.resetScope,\n };\n }\n\n /**\n * Force update counter value (Admin Override)\n * WARNING: This bypasses optimistic locking checks slightly, but still increments version\n */\n async forceUpdateCounter(\n counterKey: CounterKeyDto,\n newValue: number\n ): Promise {\n await this.dataSource.transaction(async (manager) => {\n let counter = await manager.findOne(DocumentNumberCounter, {\n where: this.buildWhereClause(counterKey),\n });\n\n if (!counter) {\n counter = manager.create(DocumentNumberCounter, {\n projectId: counterKey.projectId,\n originatorId: counterKey.originatorOrganizationId,\n recipientOrganizationId: counterKey.recipientOrganizationId,\n correspondenceTypeId: counterKey.correspondenceTypeId,\n subTypeId: counterKey.subTypeId,\n rfaTypeId: counterKey.rfaTypeId,\n disciplineId: counterKey.disciplineId,\n resetScope: counterKey.resetScope,\n lastNumber: newValue,\n version: 1,\n });\n await manager.save(counter);\n } else {\n // Force update regardless of version, but increment version\n await manager\n .createQueryBuilder()\n .update(DocumentNumberCounter)\n .set({\n lastNumber: newValue,\n version: () => 'version + 1',\n })\n .where(this.buildWhereClause(counterKey))\n .execute();\n }\n });\n\n this.logger.log(\n `Counter force updated to ${newValue} for key: ${JSON.stringify(\n counterKey\n )}`\n );\n }\n\n private sleep(ms: number): Promise {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8d/authservice_8d6ae9b98ba0de0c46e8600296cc75f9 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8d/authservice_8d6ae9b98ba0de0c46e8600296cc75f9 new file mode 100644 index 0000000..0d269da --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8d/authservice_8d6ae9b98ba0de0c46e8600296cc75f9 @@ -0,0 +1,313 @@ +e36b4ff05913198627db36beaf2960d5 +"use strict"; +// File: src/common/auth/auth.service.ts +// บันทึกการแก้ไข: +// 1. แก้ไข Type Mismatch ใน signAsync +// 2. แก้ไข validateUser ให้ดึง password_hash ออกมาด้วย (Fix HTTP 500: data and hash arguments required) +// 3. [P2-2] Implement Refresh Token storage & rotation +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var AuthService_1; +var _a, _b, _c, _d, _e; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AuthService = void 0; +const common_1 = require("@nestjs/common"); +const jwt_1 = require("@nestjs/jwt"); +const config_1 = require("@nestjs/config"); +const cache_manager_1 = require("@nestjs/cache-manager"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const bcrypt = __importStar(require("bcrypt")); +const crypto = __importStar(require("crypto")); +const user_service_1 = require("../../modules/user/user.service"); +const user_entity_1 = require("../../modules/user/entities/user.entity"); +const refresh_token_entity_1 = require("./entities/refresh-token.entity"); // [P2-2] +let AuthService = AuthService_1 = class AuthService { + constructor(userService, jwtService, configService, cacheManager, usersRepository, refreshTokenRepository) { + this.userService = userService; + this.jwtService = jwtService; + this.configService = configService; + this.cacheManager = cacheManager; + this.usersRepository = usersRepository; + this.refreshTokenRepository = refreshTokenRepository; + this.logger = new common_1.Logger(AuthService_1.name); + } + // 1. ตรวจสอบ Username/Password + async validateUser(username, pass) { + this.logger.log(`🔍 Checking login for: ${username}`); + const user = await this.usersRepository + .createQueryBuilder('user') + .addSelect('user.password') + .leftJoinAndSelect('user.assignments', 'assignments') + .leftJoinAndSelect('assignments.role', 'role') + .where('user.username = :username', { username }) + .getOne(); + if (!user) { + this.logger.warn('❌ User not found in database'); + return null; + } + // ตรวจสอบว่ามี user และมี password hash หรือไม่ + if (user && user.password && (await bcrypt.compare(pass, user.password))) { + // Logic: Map RBAC Roles to 'ADMIN' | 'DC' | 'User' for Frontend Compatibility + // Roles Table: 'Superadmin', 'Org Admin', 'Document Control', 'Editor', 'Viewer' + let derivedRole = 'User'; + if (user.assignments && user.assignments.length > 0) { + const roleNames = user.assignments + .map((a) => a.role?.roleName) + .filter(Boolean); + // Check for Admin privileges + if (roleNames.some((r) => r === 'Superadmin' || r === 'Org Admin')) { + derivedRole = 'ADMIN'; + } + // Check for Document Control privileges + else if (roleNames.some((r) => r === 'Document Control')) { + derivedRole = 'DC'; + } + } + const { password: _password, ...result } = user; + return { ...result, role: derivedRole }; + } + return null; + } + // 2. Login: สร้าง Access & Refresh Token และบันทึกลง DB + async login(user) { + const payload = { + username: user.username, + sub: user.user_id, + scope: 'Global', + }; + const isBot = user.username === 'migration_bot'; + const accessTokenExpiresIn = isBot + ? '100y' + : this.configService.get('JWT_EXPIRATION') || '15m'; + const accessToken = await this.jwtService.signAsync(payload, { + secret: this.configService.get('JWT_SECRET'), + expiresIn: accessTokenExpiresIn, + }); + const refreshTokenExpiresIn = isBot + ? '100y' + : this.configService.get('JWT_REFRESH_EXPIRATION') || '7d'; + const refreshToken = await this.jwtService.signAsync(payload, { + secret: this.configService.get('JWT_REFRESH_SECRET'), + expiresIn: refreshTokenExpiresIn, + }); + // [P2-2] Store Refresh Token in DB + await this.storeRefreshToken(user.user_id, refreshToken); + return { + access_token: accessToken, + refresh_token: refreshToken, + user: user, + }; + } + // [P2-2] Store Refresh Token Logic + async storeRefreshToken(userId, token) { + // Hash token before storing for security + const hash = crypto.createHash('sha256').update(token).digest('hex'); + const expiresInDays = 7; // Should match JWT_REFRESH_EXPIRATION + const expiresAt = new Date(); + expiresAt.setDate(expiresAt.getDate() + expiresInDays); + const refreshTokenEntity = this.refreshTokenRepository.create({ + userId, + tokenHash: hash, + expiresAt, + isRevoked: false, + }); + await this.refreshTokenRepository.save(refreshTokenEntity); + } + // 3. Register (สำหรับ Admin) + async register(userDto) { + const existingUser = await this.userService.findOneByUsername(userDto.username); + if (existingUser) { + throw new common_1.BadRequestException('Username already exists'); + } + const salt = await bcrypt.genSalt(); + const hashedPassword = await bcrypt.hash(userDto.password, salt); + return this.userService.create({ + ...userDto, + password: hashedPassword, + }); + } + // 4. Refresh Token: ตรวจสอบและออก Token ใหม่ (Rotation) + async refreshToken(userId, refreshToken) { + // Hash incoming token to match with DB + const hash = crypto.createHash('sha256').update(refreshToken).digest('hex'); + // Find token in DB + const storedToken = await this.refreshTokenRepository.findOne({ + where: { tokenHash: hash }, + }); + if (!storedToken) { + throw new common_1.UnauthorizedException('Invalid refresh token'); + } + if (storedToken.isRevoked) { + // [P2-2.1] Grace period for Token Rotation (30 seconds) + // ป้องกัน Race Condition เมื่อ Frontend ส่ง Refresh Request ซ้อนกันในชั่วพริบตา + const now = new Date(); + const revokedAt = new Date(storedToken.updatedAt); + const diffMs = now.getTime() - revokedAt.getTime(); + this.logger.debug(`[DEBUG-TOKEN] user=${userId}`); + this.logger.debug(`[DEBUG-TOKEN] now=${now.toISOString()}`); + this.logger.debug(`[DEBUG-TOKEN] updatedAt=${storedToken.updatedAt ? new Date(storedToken.updatedAt).toISOString() : 'NULL'}`); + this.logger.debug(`[DEBUG-TOKEN] diffMs=${diffMs}`); + this.logger.debug(`[DEBUG-TOKEN] replacedBy=${storedToken.replacedByToken ? 'YES(HASHED)' : 'NULL'}`); + if (diffMs <= 30000 && storedToken.replacedByToken) { + this.logger.warn(`Refresh token reuse detected within grace period (${diffMs}ms) for user ${userId}. Allowing another rotation.`); + // ไม่ต้อง revokeAllUserTokens และอนุญาตให้ทำงานต่อด้านล่างเพื่อออก Token ชุดใหม่ + } + else { + // Possible token theft! Invalidate all user tokens family + await this.revokeAllUserTokens(userId); + this.logger.error(`Refresh token revoked - Security alert for user ${userId}. All tokens invalidated.`); + throw new common_1.UnauthorizedException('Refresh token revoked - Security alert'); + } + } + if (storedToken.expiresAt < new Date()) { + throw new common_1.UnauthorizedException('Refresh token expired'); + } + // Valid token -> Rotate it + const user = await this.userService.findOne(userId); + if (!user) + throw new common_1.UnauthorizedException('User not found'); + const payload = { username: user.username, sub: user.user_id }; + // Generate NEW tokens + const newAccessToken = await this.jwtService.signAsync(payload, { + secret: this.configService.get('JWT_SECRET'), + expiresIn: (this.configService.get('JWT_EXPIRATION') || + '15m'), + }); + const newRefreshToken = await this.jwtService.signAsync(payload, { + secret: this.configService.get('JWT_REFRESH_SECRET'), + expiresIn: (this.configService.get('JWT_REFRESH_EXPIRATION') || + '7d'), + }); + // Revoke OLD token and point to NEW one + const newHash = crypto + .createHash('sha256') + .update(newRefreshToken) + .digest('hex'); + // [P2-2] Mark old token as revoked and rotated + storedToken.isRevoked = true; + storedToken.replacedByToken = newHash; + storedToken.updatedAt = new Date(); // Fallback: Manually update instead of relying solely on @UpdateDateColumn + await this.refreshTokenRepository.save(storedToken); + // Save NEW token + await this.storeRefreshToken(userId, newRefreshToken); + return { + access_token: newAccessToken, + refresh_token: newRefreshToken, + }; + } + // [P2-2] Helper: Revoke all tokens for a user (Security Measure) + async revokeAllUserTokens(userId) { + await this.refreshTokenRepository.update({ userId, isRevoked: false }, { isRevoked: true }); + } + // 5. Logout: Revoke current refresh token & Blacklist Access Token + async logout(userId, accessToken, refreshToken) { + // Blacklist Access Token + try { + const decoded = this.jwtService.decode(accessToken); + if (decoded && decoded.exp) { + const ttl = decoded.exp - Math.floor(Date.now() / 1000); + if (ttl > 0) { + await this.cacheManager.set(`blacklist:token:${accessToken}`, true, ttl * 1000); + } + } + } + catch { + // Ignore decoding error + } + // [P2-2] Revoke Refresh Token if provided + if (refreshToken) { + const hash = crypto + .createHash('sha256') + .update(refreshToken) + .digest('hex'); + await this.refreshTokenRepository.update({ tokenHash: hash }, { isRevoked: true }); + } + return { message: 'Logged out successfully' }; + } + // [New] Get Active Sessions + async getActiveSessions() { + // Only return tokens that are NOT revoked and NOT expired + const activeTokens = await this.refreshTokenRepository.find({ + where: { + isRevoked: false, + }, + relations: ['user'], // Ensure relations: ['user'] works if RefreshToken entity has relation + order: { createdAt: 'DESC' }, + }); + const now = new Date(); + // Filter expired tokens in memory if query builder is complex, or rely on where clause if possible. + // Filter expired tokens + return activeTokens + .filter((t) => new Date(t.expiresAt) > now) + .map((t) => ({ + id: t.tokenId.toString(), + userId: t.userId, + user: { + username: t.user?.username || 'Unknown', + firstName: t.user?.firstName || '', + lastName: t.user?.lastName || '', + }, + deviceName: 'Unknown Device', // Not stored in DB + ipAddress: 'Unknown IP', // Not stored in DB + lastActive: t.createdAt.toISOString(), // Best approximation + isCurrent: false, // Cannot determine isCurrent without current session context match + })); + } + // [New] Revoke Session by ID + async revokeSession(sessionId) { + return this.refreshTokenRepository.update({ tokenId: sessionId }, { isRevoked: true }); + } +}; +exports.AuthService = AuthService; +exports.AuthService = AuthService = AuthService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(3, (0, common_1.Inject)(cache_manager_1.CACHE_MANAGER)), + __param(4, (0, typeorm_1.InjectRepository)(user_entity_1.User)), + __param(5, (0, typeorm_1.InjectRepository)(refresh_token_entity_1.RefreshToken)), + __metadata("design:paramtypes", [typeof (_a = typeof user_service_1.UserService !== "undefined" && user_service_1.UserService) === "function" ? _a : Object, typeof (_b = typeof jwt_1.JwtService !== "undefined" && jwt_1.JwtService) === "function" ? _b : Object, typeof (_c = typeof config_1.ConfigService !== "undefined" && config_1.ConfigService) === "function" ? _c : Object, Object, typeof (_d = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _d : Object, typeof (_e = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _e : Object]) +], AuthService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxhdXRoXFxhdXRoLnNlcnZpY2UudHMiLCJtYXBwaW5ncyI6IjtBQUFBLHdDQUF3QztBQUN4QyxrQkFBa0I7QUFDbEIsc0NBQXNDO0FBQ3RDLHdHQUF3RztBQUN4Ryx1REFBdUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRXZELDJDQU13QjtBQUN4QixxQ0FBeUM7QUFDekMsMkNBQStDO0FBQy9DLHlEQUFzRDtBQUN0RCw2Q0FBbUQ7QUFDbkQscUNBQXFDO0FBRXJDLCtDQUFpQztBQUNqQywrQ0FBaUM7QUFHakMsa0VBQThEO0FBQzlELHlFQUErRDtBQUUvRCwwRUFBK0QsQ0FBQyxTQUFTO0FBR2xFLElBQU0sV0FBVyxtQkFBakIsTUFBTSxXQUFXO0lBR3RCLFlBQ1UsV0FBd0IsRUFDeEIsVUFBc0IsRUFDdEIsYUFBNEIsRUFDYixZQUEyQixFQUVsRCxlQUF5QyxFQUd6QyxzQkFBd0Q7UUFSaEQsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUNMLGlCQUFZLEdBQVosWUFBWSxDQUFPO1FBRTFDLG9CQUFlLEdBQWYsZUFBZSxDQUFrQjtRQUdqQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQTBCO1FBWHpDLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxhQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFZcEQsQ0FBQztJQUVKLCtCQUErQjtJQUMvQixLQUFLLENBQUMsWUFBWSxDQUFDLFFBQWdCLEVBQUUsSUFBWTtRQUMvQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN0RCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlO2FBQ3BDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQzthQUMxQixTQUFTLENBQUMsZUFB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QkFBVixnQkFBVSxvREFDUCxzQkFBYSxvQkFBYixzQkFBYSw0REFHWCxvQkFBVSxvQkFBVixvQkFBVSxvREFHSCxvQkFBVSxvQkFBVixvQkFBVTtHQVpqQyxXQUFXLENBb1R2QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxjb21tb25cXGF1dGhcXGF1dGguc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGaWxlOiBzcmMvY29tbW9uL2F1dGgvYXV0aC5zZXJ2aWNlLnRzXHJcbi8vIOC4muC4seC4meC4l+C4tuC4geC4geC4suC4o+C5geC4geC5ieC5hOC4gjpcclxuLy8gMS4g4LmB4LiB4LmJ4LmE4LiCIFR5cGUgTWlzbWF0Y2gg4LmD4LiZIHNpZ25Bc3luY1xyXG4vLyAyLiDguYHguIHguYnguYTguIIgdmFsaWRhdGVVc2VyIOC5g+C4q+C5ieC4lOC4tuC4hyBwYXNzd29yZF9oYXNoIOC4reC4reC4geC4oeC4suC4lOC5ieC4p+C4oiAoRml4IEhUVFAgNTAwOiBkYXRhIGFuZCBoYXNoIGFyZ3VtZW50cyByZXF1aXJlZClcclxuLy8gMy4gW1AyLTJdIEltcGxlbWVudCBSZWZyZXNoIFRva2VuIHN0b3JhZ2UgJiByb3RhdGlvblxyXG5cclxuaW1wb3J0IHtcclxuICBJbmplY3RhYmxlLFxyXG4gIFVuYXV0aG9yaXplZEV4Y2VwdGlvbixcclxuICBJbmplY3QsXHJcbiAgQmFkUmVxdWVzdEV4Y2VwdGlvbixcclxuICBMb2dnZXIsXHJcbn0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xyXG5pbXBvcnQgeyBKd3RTZXJ2aWNlIH0gZnJvbSAnQG5lc3Rqcy9qd3QnO1xyXG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnQG5lc3Rqcy9jb25maWcnO1xyXG5pbXBvcnQgeyBDQUNIRV9NQU5BR0VSIH0gZnJvbSAnQG5lc3Rqcy9jYWNoZS1tYW5hZ2VyJztcclxuaW1wb3J0IHsgSW5qZWN0UmVwb3NpdG9yeSB9IGZyb20gJ0BuZXN0anMvdHlwZW9ybSc7XHJcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tICd0eXBlb3JtJztcclxuaW1wb3J0IHR5cGUgeyBDYWNoZSB9IGZyb20gJ2NhY2hlLW1hbmFnZXInO1xyXG5pbXBvcnQgKiBhcyBiY3J5cHQgZnJvbSAnYmNyeXB0JztcclxuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0byc7XHJcbmltcG9ydCB0eXBlIHsgU3RyaW5nVmFsdWUgfSBmcm9tICdtcyc7XHJcblxyXG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uLy4uL21vZHVsZXMvdXNlci91c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vLi4vbW9kdWxlcy91c2VyL2VudGl0aWVzL3VzZXIuZW50aXR5JztcclxuaW1wb3J0IHsgUmVnaXN0ZXJEdG8gfSBmcm9tICcuL2R0by9yZWdpc3Rlci5kdG8nO1xyXG5pbXBvcnQgeyBSZWZyZXNoVG9rZW4gfSBmcm9tICcuL2VudGl0aWVzL3JlZnJlc2gtdG9rZW4uZW50aXR5JzsgLy8gW1AyLTJdXHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBBdXRoU2VydmljZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKEF1dGhTZXJ2aWNlLm5hbWUpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBqd3RTZXJ2aWNlOiBKd3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxyXG4gICAgQEluamVjdChDQUNIRV9NQU5BR0VSKSBwcml2YXRlIGNhY2hlTWFuYWdlcjogQ2FjaGUsXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShVc2VyKVxyXG4gICAgcHJpdmF0ZSB1c2Vyc1JlcG9zaXRvcnk6IFJlcG9zaXRvcnk8VXNlcj4sXHJcbiAgICAvLyBbUDItMl0gSW5qZWN0IFJlZnJlc2hUb2tlbiBSZXBvc2l0b3J5XHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShSZWZyZXNoVG9rZW4pXHJcbiAgICBwcml2YXRlIHJlZnJlc2hUb2tlblJlcG9zaXRvcnk6IFJlcG9zaXRvcnk8UmVmcmVzaFRva2VuPlxyXG4gICkge31cclxuXHJcbiAgLy8gMS4g4LiV4Lij4Lin4LiI4Liq4Lit4LiaIFVzZXJuYW1lL1Bhc3N3b3JkXHJcbiAgYXN5bmMgdmFsaWRhdGVVc2VyKHVzZXJuYW1lOiBzdHJpbmcsIHBhc3M6IHN0cmluZyk6IFByb21pc2U8VXNlciB8IG51bGw+IHtcclxuICAgIHRoaXMubG9nZ2VyLmxvZyhg8J+UjSBDaGVja2luZyBsb2dpbiBmb3I6ICR7dXNlcm5hbWV9YCk7XHJcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy51c2Vyc1JlcG9zaXRvcnlcclxuICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigndXNlcicpXHJcbiAgICAgIC5hZGRTZWxlY3QoJ3VzZXIucGFzc3dvcmQnKVxyXG4gICAgICAubGVmdEpvaW5BbmRTZWxlY3QoJ3VzZXIuYXNzaWdubWVudHMnLCAnYXNzaWdubWVudHMnKVxyXG4gICAgICAubGVmdEpvaW5BbmRTZWxlY3QoJ2Fzc2lnbm1lbnRzLnJvbGUnLCAncm9sZScpXHJcbiAgICAgIC53aGVyZSgndXNlci51c2VybmFtZSA9IDp1c2VybmFtZScsIHsgdXNlcm5hbWUgfSlcclxuICAgICAgLmdldE9uZSgpO1xyXG5cclxuICAgIGlmICghdXNlcikge1xyXG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCfinYwgVXNlciBub3QgZm91bmQgaW4gZGF0YWJhc2UnKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g4LiV4Lij4Lin4LiI4Liq4Lit4Lia4Lin4LmI4Liy4Lih4Li1IHVzZXIg4LmB4Lil4Liw4Lih4Li1IHBhc3N3b3JkIGhhc2gg4Lir4Lij4Li34Lit4LmE4Lih4LmIXHJcbiAgICBpZiAodXNlciAmJiB1c2VyLnBhc3N3b3JkICYmIChhd2FpdCBiY3J5cHQuY29tcGFyZShwYXNzLCB1c2VyLnBhc3N3b3JkKSkpIHtcclxuICAgICAgLy8gTG9naWM6IE1hcCBSQkFDIFJvbGVzIHRvICdBRE1JTicgfCAnREMnIHwgJ1VzZXInIGZvciBGcm9udGVuZCBDb21wYXRpYmlsaXR5XHJcbiAgICAgIC8vIFJvbGVzIFRhYmxlOiAnU3VwZXJhZG1pbicsICdPcmcgQWRtaW4nLCAnRG9jdW1lbnQgQ29udHJvbCcsICdFZGl0b3InLCAnVmlld2VyJ1xyXG5cclxuICAgICAgbGV0IGRlcml2ZWRSb2xlID0gJ1VzZXInO1xyXG4gICAgICBpZiAodXNlci5hc3NpZ25tZW50cyAmJiB1c2VyLmFzc2lnbm1lbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCByb2xlTmFtZXMgPSB1c2VyLmFzc2lnbm1lbnRzXHJcbiAgICAgICAgICAubWFwKChhKSA9PiBhLnJvbGU/LnJvbGVOYW1lKVxyXG4gICAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgZm9yIEFkbWluIHByaXZpbGVnZXNcclxuICAgICAgICBpZiAocm9sZU5hbWVzLnNvbWUoKHIpID0+IHIgPT09ICdTdXBlcmFkbWluJyB8fCByID09PSAnT3JnIEFkbWluJykpIHtcclxuICAgICAgICAgIGRlcml2ZWRSb2xlID0gJ0FETUlOJztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQ2hlY2sgZm9yIERvY3VtZW50IENvbnRyb2wgcHJpdmlsZWdlc1xyXG4gICAgICAgIGVsc2UgaWYgKHJvbGVOYW1lcy5zb21lKChyKSA9PiByID09PSAnRG9jdW1lbnQgQ29udHJvbCcpKSB7XHJcbiAgICAgICAgICBkZXJpdmVkUm9sZSA9ICdEQyc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHsgcGFzc3dvcmQ6IF9wYXNzd29yZCwgLi4ucmVzdWx0IH0gPSB1c2VyO1xyXG4gICAgICByZXR1cm4geyAuLi5yZXN1bHQsIHJvbGU6IGRlcml2ZWRSb2xlIH0gYXMgVXNlciAmIHsgcm9sZTogc3RyaW5nIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vIDIuIExvZ2luOiDguKrguKPguYnguLLguIcgQWNjZXNzICYgUmVmcmVzaCBUb2tlbiDguYHguKXguLDguJrguLHguJnguJfguLbguIHguKXguIcgREJcclxuICBhc3luYyBsb2dpbih1c2VyOiBVc2VyKSB7XHJcbiAgICBjb25zdCBwYXlsb2FkID0ge1xyXG4gICAgICB1c2VybmFtZTogdXNlci51c2VybmFtZSxcclxuICAgICAgc3ViOiB1c2VyLnVzZXJfaWQsXHJcbiAgICAgIHNjb3BlOiAnR2xvYmFsJyxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgaXNCb3QgPSB1c2VyLnVzZXJuYW1lID09PSAnbWlncmF0aW9uX2JvdCc7XHJcbiAgICBjb25zdCBhY2Nlc3NUb2tlbkV4cGlyZXNJbiA9IGlzQm90XHJcbiAgICAgID8gJzEwMHknXHJcbiAgICAgIDogdGhpcy5jb25maWdTZXJ2aWNlLmdldDxzdHJpbmc+KCdKV1RfRVhQSVJBVElPTicpIHx8ICcxNW0nO1xyXG5cclxuICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgdGhpcy5qd3RTZXJ2aWNlLnNpZ25Bc3luYyhwYXlsb2FkLCB7XHJcbiAgICAgIHNlY3JldDogdGhpcy5jb25maWdTZXJ2aWNlLmdldDxzdHJpbmc+KCdKV1RfU0VDUkVUJyksXHJcbiAgICAgIGV4cGlyZXNJbjogYWNjZXNzVG9rZW5FeHBpcmVzSW4gYXMgU3RyaW5nVmFsdWUsXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCByZWZyZXNoVG9rZW5FeHBpcmVzSW4gPSBpc0JvdFxyXG4gICAgICA/ICcxMDB5J1xyXG4gICAgICA6IHRoaXMuY29uZmlnU2VydmljZS5nZXQ8c3RyaW5nPignSldUX1JFRlJFU0hfRVhQSVJBVElPTicpIHx8ICc3ZCc7XHJcblxyXG4gICAgY29uc3QgcmVmcmVzaFRva2VuID0gYXdhaXQgdGhpcy5qd3RTZXJ2aWNlLnNpZ25Bc3luYyhwYXlsb2FkLCB7XHJcbiAgICAgIHNlY3JldDogdGhpcy5jb25maWdTZXJ2aWNlLmdldDxzdHJpbmc+KCdKV1RfUkVGUkVTSF9TRUNSRVQnKSxcclxuICAgICAgZXhwaXJlc0luOiByZWZyZXNoVG9rZW5FeHBpcmVzSW4gYXMgU3RyaW5nVmFsdWUsXHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBbUDItMl0gU3RvcmUgUmVmcmVzaCBUb2tlbiBpbiBEQlxyXG4gICAgYXdhaXQgdGhpcy5zdG9yZVJlZnJlc2hUb2tlbih1c2VyLnVzZXJfaWQsIHJlZnJlc2hUb2tlbik7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgYWNjZXNzX3Rva2VuOiBhY2Nlc3NUb2tlbixcclxuICAgICAgcmVmcmVzaF90b2tlbjogcmVmcmVzaFRva2VuLFxyXG4gICAgICB1c2VyOiB1c2VyLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vIFtQMi0yXSBTdG9yZSBSZWZyZXNoIFRva2VuIExvZ2ljXHJcbiAgcHJpdmF0ZSBhc3luYyBzdG9yZVJlZnJlc2hUb2tlbihcclxuICAgIHVzZXJJZDogbnVtYmVyLFxyXG4gICAgdG9rZW46IHN0cmluZ1xyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gSGFzaCB0b2tlbiBiZWZvcmUgc3RvcmluZyBmb3Igc2VjdXJpdHlcclxuICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHRva2VuKS5kaWdlc3QoJ2hleCcpO1xyXG4gICAgY29uc3QgZXhwaXJlc0luRGF5cyA9IDc7IC8vIFNob3VsZCBtYXRjaCBKV1RfUkVGUkVTSF9FWFBJUkFUSU9OXHJcbiAgICBjb25zdCBleHBpcmVzQXQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgZXhwaXJlc0F0LnNldERhdGUoZXhwaXJlc0F0LmdldERhdGUoKSArIGV4cGlyZXNJbkRheXMpO1xyXG5cclxuICAgIGNvbnN0IHJlZnJlc2hUb2tlbkVudGl0eSA9IHRoaXMucmVmcmVzaFRva2VuUmVwb3NpdG9yeS5jcmVhdGUoe1xyXG4gICAgICB1c2VySWQsXHJcbiAgICAgIHRva2VuSGFzaDogaGFzaCxcclxuICAgICAgZXhwaXJlc0F0LFxyXG4gICAgICBpc1Jldm9rZWQ6IGZhbHNlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoVG9rZW5SZXBvc2l0b3J5LnNhdmUocmVmcmVzaFRva2VuRW50aXR5KTtcclxuICB9XHJcblxyXG4gIC8vIDMuIFJlZ2lzdGVyICjguKrguLPguKvguKPguLHguJogQWRtaW4pXHJcbiAgYXN5bmMgcmVnaXN0ZXIodXNlckR0bzogUmVnaXN0ZXJEdG8pIHtcclxuICAgIGNvbnN0IGV4aXN0aW5nVXNlciA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZmluZE9uZUJ5VXNlcm5hbWUoXHJcbiAgICAgIHVzZXJEdG8udXNlcm5hbWVcclxuICAgICk7XHJcbiAgICBpZiAoZXhpc3RpbmdVc2VyKSB7XHJcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCdVc2VybmFtZSBhbHJlYWR5IGV4aXN0cycpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNhbHQgPSBhd2FpdCBiY3J5cHQuZ2VuU2FsdCgpO1xyXG4gICAgY29uc3QgaGFzaGVkUGFzc3dvcmQgPSBhd2FpdCBiY3J5cHQuaGFzaCh1c2VyRHRvLnBhc3N3b3JkLCBzYWx0KTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy51c2VyU2VydmljZS5jcmVhdGUoe1xyXG4gICAgICAuLi51c2VyRHRvLFxyXG4gICAgICBwYXNzd29yZDogaGFzaGVkUGFzc3dvcmQsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIDQuIFJlZnJlc2ggVG9rZW46IOC4leC4o+C4p+C4iOC4quC4reC4muC5geC4peC4sOC4reC4reC4gSBUb2tlbiDguYPguKvguKHguYggKFJvdGF0aW9uKVxyXG4gIGFzeW5jIHJlZnJlc2hUb2tlbihcclxuICAgIHVzZXJJZDogbnVtYmVyLFxyXG4gICAgcmVmcmVzaFRva2VuOiBzdHJpbmdcclxuICApOiBQcm9taXNlPHsgYWNjZXNzX3Rva2VuOiBzdHJpbmc7IHJlZnJlc2hfdG9rZW46IHN0cmluZyB9PiB7XHJcbiAgICAvLyBIYXNoIGluY29taW5nIHRva2VuIHRvIG1hdGNoIHdpdGggREJcclxuICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHJlZnJlc2hUb2tlbikuZGlnZXN0KCdoZXgnKTtcclxuXHJcbiAgICAvLyBGaW5kIHRva2VuIGluIERCXHJcbiAgICBjb25zdCBzdG9yZWRUb2tlbiA9IGF3YWl0IHRoaXMucmVmcmVzaFRva2VuUmVwb3NpdG9yeS5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgdG9rZW5IYXNoOiBoYXNoIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIXN0b3JlZFRva2VuKSB7XHJcbiAgICAgIHRocm93IG5ldyBVbmF1dGhvcml6ZWRFeGNlcHRpb24oJ0ludmFsaWQgcmVmcmVzaCB0b2tlbicpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdG9yZWRUb2tlbi5pc1Jldm9rZWQpIHtcclxuICAgICAgLy8gW1AyLTIuMV0gR3JhY2UgcGVyaW9kIGZvciBUb2tlbiBSb3RhdGlvbiAoMzAgc2Vjb25kcylcclxuICAgICAgLy8g4Lib4LmJ4Lit4LiH4LiB4Lix4LiZIFJhY2UgQ29uZGl0aW9uIOC5gOC4oeC4t+C5iOC4rSBGcm9udGVuZCDguKrguYjguIcgUmVmcmVzaCBSZXF1ZXN0IOC4i+C5ieC4reC4meC4geC4seC4meC5g+C4meC4iuC4seC5iOC4p+C4nuC4o+C4tOC4muC4leC4slxyXG4gICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICBjb25zdCByZXZva2VkQXQgPSBuZXcgRGF0ZShzdG9yZWRUb2tlbi51cGRhdGVkQXQpO1xyXG4gICAgICBjb25zdCBkaWZmTXMgPSBub3cuZ2V0VGltZSgpIC0gcmV2b2tlZEF0LmdldFRpbWUoKTtcclxuXHJcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbREVCVUctVE9LRU5dIHVzZXI9JHt1c2VySWR9YCk7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbREVCVUctVE9LRU5dIG5vdz0ke25vdy50b0lTT1N0cmluZygpfWApO1xyXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcclxuICAgICAgICBgW0RFQlVHLVRPS0VOXSB1cGRhdGVkQXQ9JHtzdG9yZWRUb2tlbi51cGRhdGVkQXQgPyBuZXcgRGF0ZShzdG9yZWRUb2tlbi51cGRhdGVkQXQpLnRvSVNPU3RyaW5nKCkgOiAnTlVMTCd9YFxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0RFQlVHLVRPS0VOXSBkaWZmTXM9JHtkaWZmTXN9YCk7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxyXG4gICAgICAgIGBbREVCVUctVE9LRU5dIHJlcGxhY2VkQnk9JHtzdG9yZWRUb2tlbi5yZXBsYWNlZEJ5VG9rZW4gPyAnWUVTKEhBU0hFRCknIDogJ05VTEwnfWBcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmIChkaWZmTXMgPD0gMzAwMDAgJiYgc3RvcmVkVG9rZW4ucmVwbGFjZWRCeVRva2VuKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcclxuICAgICAgICAgIGBSZWZyZXNoIHRva2VuIHJldXNlIGRldGVjdGVkIHdpdGhpbiBncmFjZSBwZXJpb2QgKCR7ZGlmZk1zfW1zKSBmb3IgdXNlciAke3VzZXJJZH0uIEFsbG93aW5nIGFub3RoZXIgcm90YXRpb24uYFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgLy8g4LmE4Lih4LmI4LiV4LmJ4Lit4LiHIHJldm9rZUFsbFVzZXJUb2tlbnMg4LmB4Lil4Liw4Lit4LiZ4Li44LiN4Liy4LiV4LmD4Lir4LmJ4LiX4Liz4LiH4Liy4LiZ4LiV4LmI4Lit4LiU4LmJ4Liy4LiZ4Lil4LmI4Liy4LiH4LmA4Lie4Li34LmI4Lit4Lit4Lit4LiBIFRva2VuIOC4iuC4uOC4lOC5g+C4q+C4oeC5iFxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIFBvc3NpYmxlIHRva2VuIHRoZWZ0ISBJbnZhbGlkYXRlIGFsbCB1c2VyIHRva2VucyBmYW1pbHlcclxuICAgICAgICBhd2FpdCB0aGlzLnJldm9rZUFsbFVzZXJUb2tlbnModXNlcklkKTtcclxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcclxuICAgICAgICAgIGBSZWZyZXNoIHRva2VuIHJldm9rZWQgLSBTZWN1cml0eSBhbGVydCBmb3IgdXNlciAke3VzZXJJZH0uIEFsbCB0b2tlbnMgaW52YWxpZGF0ZWQuYFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhyb3cgbmV3IFVuYXV0aG9yaXplZEV4Y2VwdGlvbihcclxuICAgICAgICAgICdSZWZyZXNoIHRva2VuIHJldm9rZWQgLSBTZWN1cml0eSBhbGVydCdcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN0b3JlZFRva2VuLmV4cGlyZXNBdCA8IG5ldyBEYXRlKCkpIHtcclxuICAgICAgdGhyb3cgbmV3IFVuYXV0aG9yaXplZEV4Y2VwdGlvbignUmVmcmVzaCB0b2tlbiBleHBpcmVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVmFsaWQgdG9rZW4gLT4gUm90YXRlIGl0XHJcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5maW5kT25lKHVzZXJJZCk7XHJcbiAgICBpZiAoIXVzZXIpIHRocm93IG5ldyBVbmF1dGhvcml6ZWRFeGNlcHRpb24oJ1VzZXIgbm90IGZvdW5kJyk7XHJcblxyXG4gICAgY29uc3QgcGF5bG9hZCA9IHsgdXNlcm5hbWU6IHVzZXIudXNlcm5hbWUsIHN1YjogdXNlci51c2VyX2lkIH07XHJcblxyXG4gICAgLy8gR2VuZXJhdGUgTkVXIHRva2Vuc1xyXG4gICAgY29uc3QgbmV3QWNjZXNzVG9rZW4gPSBhd2FpdCB0aGlzLmp3dFNlcnZpY2Uuc2lnbkFzeW5jKHBheWxvYWQsIHtcclxuICAgICAgc2VjcmV0OiB0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0PHN0cmluZz4oJ0pXVF9TRUNSRVQnKSxcclxuICAgICAgZXhwaXJlc0luOiAodGhpcy5jb25maWdTZXJ2aWNlLmdldDxzdHJpbmc+KCdKV1RfRVhQSVJBVElPTicpIHx8XHJcbiAgICAgICAgJzE1bScpIGFzIFN0cmluZ1ZhbHVlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgbmV3UmVmcmVzaFRva2VuID0gYXdhaXQgdGhpcy5qd3RTZXJ2aWNlLnNpZ25Bc3luYyhwYXlsb2FkLCB7XHJcbiAgICAgIHNlY3JldDogdGhpcy5jb25maWdTZXJ2aWNlLmdldDxzdHJpbmc+KCdKV1RfUkVGUkVTSF9TRUNSRVQnKSxcclxuICAgICAgZXhwaXJlc0luOiAodGhpcy5jb25maWdTZXJ2aWNlLmdldDxzdHJpbmc+KCdKV1RfUkVGUkVTSF9FWFBJUkFUSU9OJykgfHxcclxuICAgICAgICAnN2QnKSBhcyBTdHJpbmdWYWx1ZSxcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFJldm9rZSBPTEQgdG9rZW4gYW5kIHBvaW50IHRvIE5FVyBvbmVcclxuICAgIGNvbnN0IG5ld0hhc2ggPSBjcnlwdG9cclxuICAgICAgLmNyZWF0ZUhhc2goJ3NoYTI1NicpXHJcbiAgICAgIC51cGRhdGUobmV3UmVmcmVzaFRva2VuKVxyXG4gICAgICAuZGlnZXN0KCdoZXgnKTtcclxuXHJcbiAgICAvLyBbUDItMl0gTWFyayBvbGQgdG9rZW4gYXMgcmV2b2tlZCBhbmQgcm90YXRlZFxyXG4gICAgc3RvcmVkVG9rZW4uaXNSZXZva2VkID0gdHJ1ZTtcclxuICAgIHN0b3JlZFRva2VuLnJlcGxhY2VkQnlUb2tlbiA9IG5ld0hhc2g7XHJcbiAgICBzdG9yZWRUb2tlbi51cGRhdGVkQXQgPSBuZXcgRGF0ZSgpOyAvLyBGYWxsYmFjazogTWFudWFsbHkgdXBkYXRlIGluc3RlYWQgb2YgcmVseWluZyBzb2xlbHkgb24gQFVwZGF0ZURhdGVDb2x1bW5cclxuICAgIGF3YWl0IHRoaXMucmVmcmVzaFRva2VuUmVwb3NpdG9yeS5zYXZlKHN0b3JlZFRva2VuKTtcclxuXHJcbiAgICAvLyBTYXZlIE5FVyB0b2tlblxyXG4gICAgYXdhaXQgdGhpcy5zdG9yZVJlZnJlc2hUb2tlbih1c2VySWQsIG5ld1JlZnJlc2hUb2tlbik7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgYWNjZXNzX3Rva2VuOiBuZXdBY2Nlc3NUb2tlbixcclxuICAgICAgcmVmcmVzaF90b2tlbjogbmV3UmVmcmVzaFRva2VuLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vIFtQMi0yXSBIZWxwZXI6IFJldm9rZSBhbGwgdG9rZW5zIGZvciBhIHVzZXIgKFNlY3VyaXR5IE1lYXN1cmUpXHJcbiAgcHJpdmF0ZSBhc3luYyByZXZva2VBbGxVc2VyVG9rZW5zKHVzZXJJZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLnJlZnJlc2hUb2tlblJlcG9zaXRvcnkudXBkYXRlKFxyXG4gICAgICB7IHVzZXJJZCwgaXNSZXZva2VkOiBmYWxzZSB9LFxyXG4gICAgICB7IGlzUmV2b2tlZDogdHJ1ZSB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gNS4gTG9nb3V0OiBSZXZva2UgY3VycmVudCByZWZyZXNoIHRva2VuICYgQmxhY2tsaXN0IEFjY2VzcyBUb2tlblxyXG4gIGFzeW5jIGxvZ291dCh1c2VySWQ6IG51bWJlciwgYWNjZXNzVG9rZW46IHN0cmluZywgcmVmcmVzaFRva2VuPzogc3RyaW5nKSB7XHJcbiAgICAvLyBCbGFja2xpc3QgQWNjZXNzIFRva2VuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBkZWNvZGVkID0gdGhpcy5qd3RTZXJ2aWNlLmRlY29kZTx7IGV4cDogbnVtYmVyIH0+KGFjY2Vzc1Rva2VuKTtcclxuICAgICAgaWYgKGRlY29kZWQgJiYgZGVjb2RlZC5leHApIHtcclxuICAgICAgICBjb25zdCB0dGwgPSBkZWNvZGVkLmV4cCAtIE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xyXG4gICAgICAgIGlmICh0dGwgPiAwKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmNhY2hlTWFuYWdlci5zZXQoXHJcbiAgICAgICAgICAgIGBibGFja2xpc3Q6dG9rZW46JHthY2Nlc3NUb2tlbn1gLFxyXG4gICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgICB0dGwgKiAxMDAwXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIC8vIElnbm9yZSBkZWNvZGluZyBlcnJvclxyXG4gICAgfVxyXG5cclxuICAgIC8vIFtQMi0yXSBSZXZva2UgUmVmcmVzaCBUb2tlbiBpZiBwcm92aWRlZFxyXG4gICAgaWYgKHJlZnJlc2hUb2tlbikge1xyXG4gICAgICBjb25zdCBoYXNoID0gY3J5cHRvXHJcbiAgICAgICAgLmNyZWF0ZUhhc2goJ3NoYTI1NicpXHJcbiAgICAgICAgLnVwZGF0ZShyZWZyZXNoVG9rZW4pXHJcbiAgICAgICAgLmRpZ2VzdCgnaGV4Jyk7XHJcbiAgICAgIGF3YWl0IHRoaXMucmVmcmVzaFRva2VuUmVwb3NpdG9yeS51cGRhdGUoXHJcbiAgICAgICAgeyB0b2tlbkhhc2g6IGhhc2ggfSxcclxuICAgICAgICB7IGlzUmV2b2tlZDogdHJ1ZSB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHsgbWVzc2FnZTogJ0xvZ2dlZCBvdXQgc3VjY2Vzc2Z1bGx5JyB9O1xyXG4gIH1cclxuXHJcbiAgLy8gW05ld10gR2V0IEFjdGl2ZSBTZXNzaW9uc1xyXG4gIGFzeW5jIGdldEFjdGl2ZVNlc3Npb25zKCkge1xyXG4gICAgLy8gT25seSByZXR1cm4gdG9rZW5zIHRoYXQgYXJlIE5PVCByZXZva2VkIGFuZCBOT1QgZXhwaXJlZFxyXG4gICAgY29uc3QgYWN0aXZlVG9rZW5zID0gYXdhaXQgdGhpcy5yZWZyZXNoVG9rZW5SZXBvc2l0b3J5LmZpbmQoe1xyXG4gICAgICB3aGVyZToge1xyXG4gICAgICAgIGlzUmV2b2tlZDogZmFsc2UsXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlbGF0aW9uczogWyd1c2VyJ10sIC8vIEVuc3VyZSByZWxhdGlvbnM6IFsndXNlciddIHdvcmtzIGlmIFJlZnJlc2hUb2tlbiBlbnRpdHkgaGFzIHJlbGF0aW9uXHJcbiAgICAgIG9yZGVyOiB7IGNyZWF0ZWRBdDogJ0RFU0MnIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xyXG4gICAgLy8gRmlsdGVyIGV4cGlyZWQgdG9rZW5zIGluIG1lbW9yeSBpZiBxdWVyeSBidWlsZGVyIGlzIGNvbXBsZXgsIG9yIHJlbHkgb24gd2hlcmUgY2xhdXNlIGlmIHBvc3NpYmxlLlxyXG4gICAgLy8gRmlsdGVyIGV4cGlyZWQgdG9rZW5zXHJcbiAgICByZXR1cm4gYWN0aXZlVG9rZW5zXHJcbiAgICAgIC5maWx0ZXIoKHQpID0+IG5ldyBEYXRlKHQuZXhwaXJlc0F0KSA+IG5vdylcclxuICAgICAgLm1hcCgodCkgPT4gKHtcclxuICAgICAgICBpZDogdC50b2tlbklkLnRvU3RyaW5nKCksXHJcbiAgICAgICAgdXNlcklkOiB0LnVzZXJJZCxcclxuICAgICAgICB1c2VyOiB7XHJcbiAgICAgICAgICB1c2VybmFtZTogdC51c2VyPy51c2VybmFtZSB8fCAnVW5rbm93bicsXHJcbiAgICAgICAgICBmaXJzdE5hbWU6IHQudXNlcj8uZmlyc3ROYW1lIHx8ICcnLFxyXG4gICAgICAgICAgbGFzdE5hbWU6IHQudXNlcj8ubGFzdE5hbWUgfHwgJycsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBkZXZpY2VOYW1lOiAnVW5rbm93biBEZXZpY2UnLCAvLyBOb3Qgc3RvcmVkIGluIERCXHJcbiAgICAgICAgaXBBZGRyZXNzOiAnVW5rbm93biBJUCcsIC8vIE5vdCBzdG9yZWQgaW4gREJcclxuICAgICAgICBsYXN0QWN0aXZlOiB0LmNyZWF0ZWRBdC50b0lTT1N0cmluZygpLCAvLyBCZXN0IGFwcHJveGltYXRpb25cclxuICAgICAgICBpc0N1cnJlbnQ6IGZhbHNlLCAvLyBDYW5ub3QgZGV0ZXJtaW5lIGlzQ3VycmVudCB3aXRob3V0IGN1cnJlbnQgc2Vzc2lvbiBjb250ZXh0IG1hdGNoXHJcbiAgICAgIH0pKTtcclxuICB9XHJcblxyXG4gIC8vIFtOZXddIFJldm9rZSBTZXNzaW9uIGJ5IElEXHJcbiAgYXN5bmMgcmV2b2tlU2Vzc2lvbihzZXNzaW9uSWQ6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMucmVmcmVzaFRva2VuUmVwb3NpdG9yeS51cGRhdGUoXHJcbiAgICAgIHsgdG9rZW5JZDogc2Vzc2lvbklkIH0sXHJcbiAgICAgIHsgaXNSZXZva2VkOiB0cnVlIH1cclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8d/authservice_8d6ae9b98ba0de0c46e8600296cc75f9.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8d/authservice_8d6ae9b98ba0de0c46e8600296cc75f9.map new file mode 100644 index 0000000..1e945b3 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8d/authservice_8d6ae9b98ba0de0c46e8600296cc75f9.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\auth\\auth.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\auth\\auth.service.ts"],"sourcesContent":["// File: src/common/auth/auth.service.ts\r\n// บันทึกการแก้ไข:\r\n// 1. แก้ไข Type Mismatch ใน signAsync\r\n// 2. แก้ไข validateUser ให้ดึง password_hash ออกมาด้วย (Fix HTTP 500: data and hash arguments required)\r\n// 3. [P2-2] Implement Refresh Token storage & rotation\r\n\r\nimport {\r\n Injectable,\r\n UnauthorizedException,\r\n Inject,\r\n BadRequestException,\r\n Logger,\r\n} from '@nestjs/common';\r\nimport { JwtService } from '@nestjs/jwt';\r\nimport { ConfigService } from '@nestjs/config';\r\nimport { CACHE_MANAGER } from '@nestjs/cache-manager';\r\nimport { InjectRepository } from '@nestjs/typeorm';\r\nimport { Repository } from 'typeorm';\r\nimport type { Cache } from 'cache-manager';\r\nimport * as bcrypt from 'bcrypt';\r\nimport * as crypto from 'crypto';\r\nimport type { StringValue } from 'ms';\r\n\r\nimport { UserService } from '../../modules/user/user.service';\r\nimport { User } from '../../modules/user/entities/user.entity';\r\nimport { RegisterDto } from './dto/register.dto';\r\nimport { RefreshToken } from './entities/refresh-token.entity'; // [P2-2]\r\n\r\n@Injectable()\r\nexport class AuthService {\r\n private readonly logger = new Logger(AuthService.name);\r\n\r\n constructor(\r\n private userService: UserService,\r\n private jwtService: JwtService,\r\n private configService: ConfigService,\r\n @Inject(CACHE_MANAGER) private cacheManager: Cache,\r\n @InjectRepository(User)\r\n private usersRepository: Repository,\r\n // [P2-2] Inject RefreshToken Repository\r\n @InjectRepository(RefreshToken)\r\n private refreshTokenRepository: Repository\r\n ) {}\r\n\r\n // 1. ตรวจสอบ Username/Password\r\n async validateUser(username: string, pass: string): Promise {\r\n this.logger.log(`🔍 Checking login for: ${username}`);\r\n const user = await this.usersRepository\r\n .createQueryBuilder('user')\r\n .addSelect('user.password')\r\n .leftJoinAndSelect('user.assignments', 'assignments')\r\n .leftJoinAndSelect('assignments.role', 'role')\r\n .where('user.username = :username', { username })\r\n .getOne();\r\n\r\n if (!user) {\r\n this.logger.warn('❌ User not found in database');\r\n return null;\r\n }\r\n\r\n // ตรวจสอบว่ามี user และมี password hash หรือไม่\r\n if (user && user.password && (await bcrypt.compare(pass, user.password))) {\r\n // Logic: Map RBAC Roles to 'ADMIN' | 'DC' | 'User' for Frontend Compatibility\r\n // Roles Table: 'Superadmin', 'Org Admin', 'Document Control', 'Editor', 'Viewer'\r\n\r\n let derivedRole = 'User';\r\n if (user.assignments && user.assignments.length > 0) {\r\n const roleNames = user.assignments\r\n .map((a) => a.role?.roleName)\r\n .filter(Boolean);\r\n\r\n // Check for Admin privileges\r\n if (roleNames.some((r) => r === 'Superadmin' || r === 'Org Admin')) {\r\n derivedRole = 'ADMIN';\r\n }\r\n // Check for Document Control privileges\r\n else if (roleNames.some((r) => r === 'Document Control')) {\r\n derivedRole = 'DC';\r\n }\r\n }\r\n const { password: _password, ...result } = user;\r\n return { ...result, role: derivedRole } as User & { role: string };\r\n }\r\n return null;\r\n }\r\n\r\n // 2. Login: สร้าง Access & Refresh Token และบันทึกลง DB\r\n async login(user: User) {\r\n const payload = {\r\n username: user.username,\r\n sub: user.user_id,\r\n scope: 'Global',\r\n };\r\n\r\n const isBot = user.username === 'migration_bot';\r\n const accessTokenExpiresIn = isBot\r\n ? '100y'\r\n : this.configService.get('JWT_EXPIRATION') || '15m';\r\n\r\n const accessToken = await this.jwtService.signAsync(payload, {\r\n secret: this.configService.get('JWT_SECRET'),\r\n expiresIn: accessTokenExpiresIn as StringValue,\r\n });\r\n\r\n const refreshTokenExpiresIn = isBot\r\n ? '100y'\r\n : this.configService.get('JWT_REFRESH_EXPIRATION') || '7d';\r\n\r\n const refreshToken = await this.jwtService.signAsync(payload, {\r\n secret: this.configService.get('JWT_REFRESH_SECRET'),\r\n expiresIn: refreshTokenExpiresIn as StringValue,\r\n });\r\n\r\n // [P2-2] Store Refresh Token in DB\r\n await this.storeRefreshToken(user.user_id, refreshToken);\r\n\r\n return {\r\n access_token: accessToken,\r\n refresh_token: refreshToken,\r\n user: user,\r\n };\r\n }\r\n\r\n // [P2-2] Store Refresh Token Logic\r\n private async storeRefreshToken(\r\n userId: number,\r\n token: string\r\n ): Promise {\r\n // Hash token before storing for security\r\n const hash = crypto.createHash('sha256').update(token).digest('hex');\r\n const expiresInDays = 7; // Should match JWT_REFRESH_EXPIRATION\r\n const expiresAt = new Date();\r\n expiresAt.setDate(expiresAt.getDate() + expiresInDays);\r\n\r\n const refreshTokenEntity = this.refreshTokenRepository.create({\r\n userId,\r\n tokenHash: hash,\r\n expiresAt,\r\n isRevoked: false,\r\n });\r\n\r\n await this.refreshTokenRepository.save(refreshTokenEntity);\r\n }\r\n\r\n // 3. Register (สำหรับ Admin)\r\n async register(userDto: RegisterDto) {\r\n const existingUser = await this.userService.findOneByUsername(\r\n userDto.username\r\n );\r\n if (existingUser) {\r\n throw new BadRequestException('Username already exists');\r\n }\r\n\r\n const salt = await bcrypt.genSalt();\r\n const hashedPassword = await bcrypt.hash(userDto.password, salt);\r\n\r\n return this.userService.create({\r\n ...userDto,\r\n password: hashedPassword,\r\n });\r\n }\r\n\r\n // 4. Refresh Token: ตรวจสอบและออก Token ใหม่ (Rotation)\r\n async refreshToken(\r\n userId: number,\r\n refreshToken: string\r\n ): Promise<{ access_token: string; refresh_token: string }> {\r\n // Hash incoming token to match with DB\r\n const hash = crypto.createHash('sha256').update(refreshToken).digest('hex');\r\n\r\n // Find token in DB\r\n const storedToken = await this.refreshTokenRepository.findOne({\r\n where: { tokenHash: hash },\r\n });\r\n\r\n if (!storedToken) {\r\n throw new UnauthorizedException('Invalid refresh token');\r\n }\r\n\r\n if (storedToken.isRevoked) {\r\n // [P2-2.1] Grace period for Token Rotation (30 seconds)\r\n // ป้องกัน Race Condition เมื่อ Frontend ส่ง Refresh Request ซ้อนกันในชั่วพริบตา\r\n const now = new Date();\r\n const revokedAt = new Date(storedToken.updatedAt);\r\n const diffMs = now.getTime() - revokedAt.getTime();\r\n\r\n this.logger.debug(`[DEBUG-TOKEN] user=${userId}`);\r\n this.logger.debug(`[DEBUG-TOKEN] now=${now.toISOString()}`);\r\n this.logger.debug(\r\n `[DEBUG-TOKEN] updatedAt=${storedToken.updatedAt ? new Date(storedToken.updatedAt).toISOString() : 'NULL'}`\r\n );\r\n this.logger.debug(`[DEBUG-TOKEN] diffMs=${diffMs}`);\r\n this.logger.debug(\r\n `[DEBUG-TOKEN] replacedBy=${storedToken.replacedByToken ? 'YES(HASHED)' : 'NULL'}`\r\n );\r\n\r\n if (diffMs <= 30000 && storedToken.replacedByToken) {\r\n this.logger.warn(\r\n `Refresh token reuse detected within grace period (${diffMs}ms) for user ${userId}. Allowing another rotation.`\r\n );\r\n // ไม่ต้อง revokeAllUserTokens และอนุญาตให้ทำงานต่อด้านล่างเพื่อออก Token ชุดใหม่\r\n } else {\r\n // Possible token theft! Invalidate all user tokens family\r\n await this.revokeAllUserTokens(userId);\r\n this.logger.error(\r\n `Refresh token revoked - Security alert for user ${userId}. All tokens invalidated.`\r\n );\r\n throw new UnauthorizedException(\r\n 'Refresh token revoked - Security alert'\r\n );\r\n }\r\n }\r\n\r\n if (storedToken.expiresAt < new Date()) {\r\n throw new UnauthorizedException('Refresh token expired');\r\n }\r\n\r\n // Valid token -> Rotate it\r\n const user = await this.userService.findOne(userId);\r\n if (!user) throw new UnauthorizedException('User not found');\r\n\r\n const payload = { username: user.username, sub: user.user_id };\r\n\r\n // Generate NEW tokens\r\n const newAccessToken = await this.jwtService.signAsync(payload, {\r\n secret: this.configService.get('JWT_SECRET'),\r\n expiresIn: (this.configService.get('JWT_EXPIRATION') ||\r\n '15m') as StringValue,\r\n });\r\n\r\n const newRefreshToken = await this.jwtService.signAsync(payload, {\r\n secret: this.configService.get('JWT_REFRESH_SECRET'),\r\n expiresIn: (this.configService.get('JWT_REFRESH_EXPIRATION') ||\r\n '7d') as StringValue,\r\n });\r\n\r\n // Revoke OLD token and point to NEW one\r\n const newHash = crypto\r\n .createHash('sha256')\r\n .update(newRefreshToken)\r\n .digest('hex');\r\n\r\n // [P2-2] Mark old token as revoked and rotated\r\n storedToken.isRevoked = true;\r\n storedToken.replacedByToken = newHash;\r\n storedToken.updatedAt = new Date(); // Fallback: Manually update instead of relying solely on @UpdateDateColumn\r\n await this.refreshTokenRepository.save(storedToken);\r\n\r\n // Save NEW token\r\n await this.storeRefreshToken(userId, newRefreshToken);\r\n\r\n return {\r\n access_token: newAccessToken,\r\n refresh_token: newRefreshToken,\r\n };\r\n }\r\n\r\n // [P2-2] Helper: Revoke all tokens for a user (Security Measure)\r\n private async revokeAllUserTokens(userId: number): Promise {\r\n await this.refreshTokenRepository.update(\r\n { userId, isRevoked: false },\r\n { isRevoked: true }\r\n );\r\n }\r\n\r\n // 5. Logout: Revoke current refresh token & Blacklist Access Token\r\n async logout(userId: number, accessToken: string, refreshToken?: string) {\r\n // Blacklist Access Token\r\n try {\r\n const decoded = this.jwtService.decode<{ exp: number }>(accessToken);\r\n if (decoded && decoded.exp) {\r\n const ttl = decoded.exp - Math.floor(Date.now() / 1000);\r\n if (ttl > 0) {\r\n await this.cacheManager.set(\r\n `blacklist:token:${accessToken}`,\r\n true,\r\n ttl * 1000\r\n );\r\n }\r\n }\r\n } catch {\r\n // Ignore decoding error\r\n }\r\n\r\n // [P2-2] Revoke Refresh Token if provided\r\n if (refreshToken) {\r\n const hash = crypto\r\n .createHash('sha256')\r\n .update(refreshToken)\r\n .digest('hex');\r\n await this.refreshTokenRepository.update(\r\n { tokenHash: hash },\r\n { isRevoked: true }\r\n );\r\n }\r\n\r\n return { message: 'Logged out successfully' };\r\n }\r\n\r\n // [New] Get Active Sessions\r\n async getActiveSessions() {\r\n // Only return tokens that are NOT revoked and NOT expired\r\n const activeTokens = await this.refreshTokenRepository.find({\r\n where: {\r\n isRevoked: false,\r\n },\r\n relations: ['user'], // Ensure relations: ['user'] works if RefreshToken entity has relation\r\n order: { createdAt: 'DESC' },\r\n });\r\n\r\n const now = new Date();\r\n // Filter expired tokens in memory if query builder is complex, or rely on where clause if possible.\r\n // Filter expired tokens\r\n return activeTokens\r\n .filter((t) => new Date(t.expiresAt) > now)\r\n .map((t) => ({\r\n id: t.tokenId.toString(),\r\n userId: t.userId,\r\n user: {\r\n username: t.user?.username || 'Unknown',\r\n firstName: t.user?.firstName || '',\r\n lastName: t.user?.lastName || '',\r\n },\r\n deviceName: 'Unknown Device', // Not stored in DB\r\n ipAddress: 'Unknown IP', // Not stored in DB\r\n lastActive: t.createdAt.toISOString(), // Best approximation\r\n isCurrent: false, // Cannot determine isCurrent without current session context match\r\n }));\r\n }\r\n\r\n // [New] Revoke Session by ID\r\n async revokeSession(sessionId: number) {\r\n return this.refreshTokenRepository.update(\r\n { tokenId: sessionId },\r\n { isRevoked: true }\r\n );\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8e/manualoverrideservicespec_8e8583e4fc564774b51895736ccdf1f1 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8e/manualoverrideservicespec_8e8583e4fc564774b51895736ccdf1f1 new file mode 100644 index 0000000..cf640ef --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8e/manualoverrideservicespec_8e8583e4fc564774b51895736ccdf1f1 @@ -0,0 +1,59 @@ +40be8371f2364576c0803581e6f461db +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const testing_1 = require("@nestjs/testing"); +const manual_override_service_1 = require("./manual-override.service"); +const counter_service_1 = require("./counter.service"); +const audit_service_1 = require("./audit.service"); +describe('ManualOverrideService', () => { + let service; + let counterService; + let auditService; + const mockCounterService = { + forceUpdateCounter: jest.fn(), + }; + const mockAuditService = { + log: jest.fn(), + }; + beforeEach(async () => { + const module = await testing_1.Test.createTestingModule({ + providers: [ + manual_override_service_1.ManualOverrideService, + { provide: counter_service_1.CounterService, useValue: mockCounterService }, + { provide: audit_service_1.AuditService, useValue: mockAuditService }, + ], + }).compile(); + service = module.get(manual_override_service_1.ManualOverrideService); + counterService = module.get(counter_service_1.CounterService); + auditService = module.get(audit_service_1.AuditService); + }); + afterEach(() => { + jest.clearAllMocks(); + }); + it('should apply override and log audit', async () => { + const dto = { + projectId: 1, + originatorOrganizationId: 2, + recipientOrganizationId: 3, + correspondenceTypeId: 4, + subTypeId: 5, + rfaTypeId: 6, + disciplineId: 7, + resetScope: 'YEAR_2024', + newLastNumber: 999, + reason: 'System sync', + reference: 'TICKET-123', + }; + const userId = 101; + await service.applyOverride(dto, userId); + expect(counterService.forceUpdateCounter).toHaveBeenCalledWith(dto, 999); + expect(auditService.log).toHaveBeenCalledWith(expect.objectContaining({ + documentNumber: 'OVERRIDE-TO-999', + operation: 'MANUAL_OVERRIDE', + status: 'MANUAL', + userId: userId, + metadata: { reason: 'System sync', reference: 'TICKET-123' }, + })); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxzZXJ2aWNlc1xcbWFudWFsLW92ZXJyaWRlLnNlcnZpY2Uuc3BlYy50cyIsIm1hcHBpbmdzIjoiOztBQUFBLDZDQUFzRDtBQUN0RCx1RUFBa0U7QUFDbEUsdURBQW1EO0FBQ25ELG1EQUErQztBQUcvQyxRQUFRLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO0lBQ3JDLElBQUksT0FBOEIsQ0FBQztJQUNuQyxJQUFJLGNBQThCLENBQUM7SUFDbkMsSUFBSSxZQUEwQixDQUFDO0lBRS9CLE1BQU0sa0JBQWtCLEdBQUc7UUFDekIsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtLQUM5QixDQUFDO0lBRUYsTUFBTSxnQkFBZ0IsR0FBRztRQUN2QixHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtLQUNmLENBQUM7SUFFRixVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDcEIsTUFBTSxNQUFNLEdBQWtCLE1BQU0sY0FBSSxDQUFDLG1CQUFtQixDQUFDO1lBQzNELFNBQVMsRUFBRTtnQkFDVCwrQ0FBcUI7Z0JBQ3JCLEVBQUUsT0FBTyxFQUFFLGdDQUFjLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFO2dCQUN6RCxFQUFFLE9BQU8sRUFBRSw0QkFBWSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRTthQUN0RDtTQUNGLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUViLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUF3QiwrQ0FBcUIsQ0FBQyxDQUFDO1FBQ25FLGNBQWMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFpQixnQ0FBYyxDQUFDLENBQUM7UUFDNUQsWUFBWSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQWUsNEJBQVksQ0FBQyxDQUFDO0lBQ3hELENBQUMsQ0FBQyxDQUFDO0lBRUgsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNiLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNuRCxNQUFNLEdBQUcsR0FBc0I7WUFDN0IsU0FBUyxFQUFFLENBQUM7WUFDWix3QkFBd0IsRUFBRSxDQUFDO1lBQzNCLHVCQUF1QixFQUFFLENBQUM7WUFDMUIsb0JBQW9CLEVBQUUsQ0FBQztZQUN2QixTQUFTLEVBQUUsQ0FBQztZQUNaLFNBQVMsRUFBRSxDQUFDO1lBQ1osWUFBWSxFQUFFLENBQUM7WUFDZixVQUFVLEVBQUUsV0FBVztZQUN2QixhQUFhLEVBQUUsR0FBRztZQUNsQixNQUFNLEVBQUUsYUFBYTtZQUNyQixTQUFTLEVBQUUsWUFBWTtTQUN4QixDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBRW5CLE1BQU0sT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFekMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN6RSxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLG9CQUFvQixDQUMzQyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7WUFDdEIsY0FBYyxFQUFFLGlCQUFpQjtZQUNqQyxTQUFTLEVBQUUsaUJBQWlCO1lBQzVCLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFO1NBQzdELENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxkb2N1bWVudC1udW1iZXJpbmdcXHNlcnZpY2VzXFxtYW51YWwtb3ZlcnJpZGUuc2VydmljZS5zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlc3QsIFRlc3RpbmdNb2R1bGUgfSBmcm9tICdAbmVzdGpzL3Rlc3RpbmcnO1xuaW1wb3J0IHsgTWFudWFsT3ZlcnJpZGVTZXJ2aWNlIH0gZnJvbSAnLi9tYW51YWwtb3ZlcnJpZGUuc2VydmljZSc7XG5pbXBvcnQgeyBDb3VudGVyU2VydmljZSB9IGZyb20gJy4vY291bnRlci5zZXJ2aWNlJztcbmltcG9ydCB7IEF1ZGl0U2VydmljZSB9IGZyb20gJy4vYXVkaXQuc2VydmljZSc7XG5pbXBvcnQgeyBNYW51YWxPdmVycmlkZUR0byB9IGZyb20gJy4uL2R0by9tYW51YWwtb3ZlcnJpZGUuZHRvJztcblxuZGVzY3JpYmUoJ01hbnVhbE92ZXJyaWRlU2VydmljZScsICgpID0+IHtcbiAgbGV0IHNlcnZpY2U6IE1hbnVhbE92ZXJyaWRlU2VydmljZTtcbiAgbGV0IGNvdW50ZXJTZXJ2aWNlOiBDb3VudGVyU2VydmljZTtcbiAgbGV0IGF1ZGl0U2VydmljZTogQXVkaXRTZXJ2aWNlO1xuXG4gIGNvbnN0IG1vY2tDb3VudGVyU2VydmljZSA9IHtcbiAgICBmb3JjZVVwZGF0ZUNvdW50ZXI6IGplc3QuZm4oKSxcbiAgfTtcblxuICBjb25zdCBtb2NrQXVkaXRTZXJ2aWNlID0ge1xuICAgIGxvZzogamVzdC5mbigpLFxuICB9O1xuXG4gIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG1vZHVsZTogVGVzdGluZ01vZHVsZSA9IGF3YWl0IFRlc3QuY3JlYXRlVGVzdGluZ01vZHVsZSh7XG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgTWFudWFsT3ZlcnJpZGVTZXJ2aWNlLFxuICAgICAgICB7IHByb3ZpZGU6IENvdW50ZXJTZXJ2aWNlLCB1c2VWYWx1ZTogbW9ja0NvdW50ZXJTZXJ2aWNlIH0sXG4gICAgICAgIHsgcHJvdmlkZTogQXVkaXRTZXJ2aWNlLCB1c2VWYWx1ZTogbW9ja0F1ZGl0U2VydmljZSB9LFxuICAgICAgXSxcbiAgICB9KS5jb21waWxlKCk7XG5cbiAgICBzZXJ2aWNlID0gbW9kdWxlLmdldDxNYW51YWxPdmVycmlkZVNlcnZpY2U+KE1hbnVhbE92ZXJyaWRlU2VydmljZSk7XG4gICAgY291bnRlclNlcnZpY2UgPSBtb2R1bGUuZ2V0PENvdW50ZXJTZXJ2aWNlPihDb3VudGVyU2VydmljZSk7XG4gICAgYXVkaXRTZXJ2aWNlID0gbW9kdWxlLmdldDxBdWRpdFNlcnZpY2U+KEF1ZGl0U2VydmljZSk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYXBwbHkgb3ZlcnJpZGUgYW5kIGxvZyBhdWRpdCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkdG86IE1hbnVhbE92ZXJyaWRlRHRvID0ge1xuICAgICAgcHJvamVjdElkOiAxLFxuICAgICAgb3JpZ2luYXRvck9yZ2FuaXphdGlvbklkOiAyLFxuICAgICAgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQ6IDMsXG4gICAgICBjb3JyZXNwb25kZW5jZVR5cGVJZDogNCxcbiAgICAgIHN1YlR5cGVJZDogNSxcbiAgICAgIHJmYVR5cGVJZDogNixcbiAgICAgIGRpc2NpcGxpbmVJZDogNyxcbiAgICAgIHJlc2V0U2NvcGU6ICdZRUFSXzIwMjQnLFxuICAgICAgbmV3TGFzdE51bWJlcjogOTk5LFxuICAgICAgcmVhc29uOiAnU3lzdGVtIHN5bmMnLFxuICAgICAgcmVmZXJlbmNlOiAnVElDS0VULTEyMycsXG4gICAgfTtcbiAgICBjb25zdCB1c2VySWQgPSAxMDE7XG5cbiAgICBhd2FpdCBzZXJ2aWNlLmFwcGx5T3ZlcnJpZGUoZHRvLCB1c2VySWQpO1xuXG4gICAgZXhwZWN0KGNvdW50ZXJTZXJ2aWNlLmZvcmNlVXBkYXRlQ291bnRlcikudG9IYXZlQmVlbkNhbGxlZFdpdGgoZHRvLCA5OTkpO1xuICAgIGV4cGVjdChhdWRpdFNlcnZpY2UubG9nKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgZG9jdW1lbnROdW1iZXI6ICdPVkVSUklERS1UTy05OTknLFxuICAgICAgICBvcGVyYXRpb246ICdNQU5VQUxfT1ZFUlJJREUnLFxuICAgICAgICBzdGF0dXM6ICdNQU5VQUwnLFxuICAgICAgICB1c2VySWQ6IHVzZXJJZCxcbiAgICAgICAgbWV0YWRhdGE6IHsgcmVhc29uOiAnU3lzdGVtIHN5bmMnLCByZWZlcmVuY2U6ICdUSUNLRVQtMTIzJyB9LFxuICAgICAgfSlcbiAgICApO1xuICB9KTtcbn0pO1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8e/manualoverrideservicespec_8e8583e4fc564774b51895736ccdf1f1.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8e/manualoverrideservicespec_8e8583e4fc564774b51895736ccdf1f1.map new file mode 100644 index 0000000..0cf6b22 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8e/manualoverrideservicespec_8e8583e4fc564774b51895736ccdf1f1.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\manual-override.service.spec.ts","mappings":";;AAAA,6CAAsD;AACtD,uEAAkE;AAClE,uDAAmD;AACnD,mDAA+C;AAG/C,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAI,OAA8B,CAAC;IACnC,IAAI,cAA8B,CAAC;IACnC,IAAI,YAA0B,CAAC;IAE/B,MAAM,kBAAkB,GAAG;QACzB,kBAAkB,EAAE,IAAI,CAAC,EAAE,EAAE;KAC9B,CAAC;IAEF,MAAM,gBAAgB,GAAG;QACvB,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;KACf,CAAC;IAEF,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,MAAM,GAAkB,MAAM,cAAI,CAAC,mBAAmB,CAAC;YAC3D,SAAS,EAAE;gBACT,+CAAqB;gBACrB,EAAE,OAAO,EAAE,gCAAc,EAAE,QAAQ,EAAE,kBAAkB,EAAE;gBACzD,EAAE,OAAO,EAAE,4BAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE;aACtD;SACF,CAAC,CAAC,OAAO,EAAE,CAAC;QAEb,OAAO,GAAG,MAAM,CAAC,GAAG,CAAwB,+CAAqB,CAAC,CAAC;QACnE,cAAc,GAAG,MAAM,CAAC,GAAG,CAAiB,gCAAc,CAAC,CAAC;QAC5D,YAAY,GAAG,MAAM,CAAC,GAAG,CAAe,4BAAY,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,GAAG,GAAsB;YAC7B,SAAS,EAAE,CAAC;YACZ,wBAAwB,EAAE,CAAC;YAC3B,uBAAuB,EAAE,CAAC;YAC1B,oBAAoB,EAAE,CAAC;YACvB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;YACZ,YAAY,EAAE,CAAC;YACf,UAAU,EAAE,WAAW;YACvB,aAAa,EAAE,GAAG;YAClB,MAAM,EAAE,aAAa;YACrB,SAAS,EAAE,YAAY;SACxB,CAAC;QACF,MAAM,MAAM,GAAG,GAAG,CAAC;QAEnB,MAAM,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAEzC,MAAM,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACzE,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAC3C,MAAM,CAAC,gBAAgB,CAAC;YACtB,cAAc,EAAE,iBAAiB;YACjC,SAAS,EAAE,iBAAiB;YAC5B,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE;SAC7D,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\manual-override.service.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\nimport { ManualOverrideService } from './manual-override.service';\nimport { CounterService } from './counter.service';\nimport { AuditService } from './audit.service';\nimport { ManualOverrideDto } from '../dto/manual-override.dto';\n\ndescribe('ManualOverrideService', () => {\n let service: ManualOverrideService;\n let counterService: CounterService;\n let auditService: AuditService;\n\n const mockCounterService = {\n forceUpdateCounter: jest.fn(),\n };\n\n const mockAuditService = {\n log: jest.fn(),\n };\n\n beforeEach(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n ManualOverrideService,\n { provide: CounterService, useValue: mockCounterService },\n { provide: AuditService, useValue: mockAuditService },\n ],\n }).compile();\n\n service = module.get(ManualOverrideService);\n counterService = module.get(CounterService);\n auditService = module.get(AuditService);\n });\n\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n it('should apply override and log audit', async () => {\n const dto: ManualOverrideDto = {\n projectId: 1,\n originatorOrganizationId: 2,\n recipientOrganizationId: 3,\n correspondenceTypeId: 4,\n subTypeId: 5,\n rfaTypeId: 6,\n disciplineId: 7,\n resetScope: 'YEAR_2024',\n newLastNumber: 999,\n reason: 'System sync',\n reference: 'TICKET-123',\n };\n const userId = 101;\n\n await service.applyOverride(dto, userId);\n\n expect(counterService.forceUpdateCounter).toHaveBeenCalledWith(dto, 999);\n expect(auditService.log).toHaveBeenCalledWith(\n expect.objectContaining({\n documentNumber: 'OVERRIDE-TO-999',\n operation: 'MANUAL_OVERRIDE',\n status: 'MANUAL',\n userId: userId,\n metadata: { reason: 'System sync', reference: 'TICKET-123' },\n })\n );\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8f/documentnumberauditentity_8f1d1cd40dada15740cff52014266f7a b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8f/documentnumberauditentity_8f1d1cd40dada15740cff52014266f7a new file mode 100644 index 0000000..1a56319 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8f/documentnumberauditentity_8f1d1cd40dada15740cff52014266f7a @@ -0,0 +1,144 @@ +8150b30d642d2e60c2ef044bef476538 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DocumentNumberAudit = void 0; +const typeorm_1 = require("typeorm"); +let DocumentNumberAudit = class DocumentNumberAudit { +}; +exports.DocumentNumberAudit = DocumentNumberAudit; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], DocumentNumberAudit.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'document_id', nullable: true }), + __metadata("design:type", Number) +], DocumentNumberAudit.prototype, "documentId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'document_number', length: 100 }), + __metadata("design:type", String) +], DocumentNumberAudit.prototype, "documentNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'counter_key', type: 'json' }), + __metadata("design:type", typeof (_a = typeof Record !== "undefined" && Record) === "function" ? _a : Object) +], DocumentNumberAudit.prototype, "counterKey", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'template_used', length: 200 }), + __metadata("design:type", String) +], DocumentNumberAudit.prototype, "templateUsed", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'operation', + type: 'enum', + enum: [ + 'RESERVE', + 'CONFIRM', + 'CANCEL', + 'MANUAL_OVERRIDE', + 'VOID', + 'VOID_REPLACE', + 'GENERATE', + ], + default: 'CONFIRM', + }), + __metadata("design:type", String) +], DocumentNumberAudit.prototype, "operation", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'status', + type: 'enum', + enum: ['RESERVED', 'CONFIRMED', 'CANCELLED', 'VOID', 'MANUAL'], + nullable: true, + }), + __metadata("design:type", String) +], DocumentNumberAudit.prototype, "status", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'reservation_token', length: 36, nullable: true }), + __metadata("design:type", String) +], DocumentNumberAudit.prototype, "reservationToken", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'idempotency_key', length: 36, nullable: true }), + __metadata("design:type", String) +], DocumentNumberAudit.prototype, "idempotencyKey", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'originator_organization_id', nullable: true }), + __metadata("design:type", Number) +], DocumentNumberAudit.prototype, "originatorOrganizationId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'recipient_organization_id', nullable: true }), + __metadata("design:type", Number) +], DocumentNumberAudit.prototype, "recipientOrganizationId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'old_value', type: 'text', nullable: true }), + __metadata("design:type", String) +], DocumentNumberAudit.prototype, "oldValue", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'new_value', type: 'text', nullable: true }), + __metadata("design:type", String) +], DocumentNumberAudit.prototype, "newValue", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'metadata', type: 'json', nullable: true }), + __metadata("design:type", typeof (_b = typeof Record !== "undefined" && Record) === "function" ? _b : Object) +], DocumentNumberAudit.prototype, "metadata", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'user_id', nullable: true }), + __metadata("design:type", Number) +], DocumentNumberAudit.prototype, "userId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'ip_address', length: 45, nullable: true }), + __metadata("design:type", String) +], DocumentNumberAudit.prototype, "ipAddress", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'user_agent', type: 'text', nullable: true }), + __metadata("design:type", String) +], DocumentNumberAudit.prototype, "userAgent", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_success', default: true }), + __metadata("design:type", Boolean) +], DocumentNumberAudit.prototype, "isSuccess", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'retry_count', default: 0 }), + __metadata("design:type", Number) +], DocumentNumberAudit.prototype, "retryCount", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'lock_wait_ms', nullable: true }), + __metadata("design:type", Number) +], DocumentNumberAudit.prototype, "lockWaitMs", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'total_duration_ms', nullable: true }), + __metadata("design:type", Number) +], DocumentNumberAudit.prototype, "totalDurationMs", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'fallback_used', + type: 'enum', + enum: ['NONE', 'DB_LOCK', 'RETRY'], + default: 'NONE', + }), + __metadata("design:type", String) +], DocumentNumberAudit.prototype, "fallbackUsed", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], DocumentNumberAudit.prototype, "createdAt", void 0); +exports.DocumentNumberAudit = DocumentNumberAudit = __decorate([ + (0, typeorm_1.Entity)('document_number_audit'), + (0, typeorm_1.Index)(['createdAt']), + (0, typeorm_1.Index)(['userId']), + (0, typeorm_1.Index)(['documentId']), + (0, typeorm_1.Index)(['status']), + (0, typeorm_1.Index)(['operation']), + (0, typeorm_1.Index)(['documentNumber']), + (0, typeorm_1.Index)(['reservationToken']) +], DocumentNumberAudit); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxlbnRpdGllc1xcZG9jdW1lbnQtbnVtYmVyLWF1ZGl0LmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBTWlCO0FBVVYsSUFBTSxtQkFBbUIsR0FBekIsTUFBTSxtQkFBbUI7Q0E0Ri9CLENBQUE7QUE1Rlksa0RBQW1CO0FBRTlCO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7K0NBQ2I7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzt1REFDNUI7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOzsyREFDekI7QUFHeEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztrREFDakMsTUFBTSxvQkFBTixNQUFNO3VEQUFrQjtBQUdyQztJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOzt5REFDekI7QUFnQnRCO0lBZEMsSUFBQSxnQkFBTSxFQUFDO1FBQ04sSUFBSSxFQUFFLFdBQVc7UUFDakIsSUFBSSxFQUFFLE1BQU07UUFDWixJQUFJLEVBQUU7WUFDSixTQUFTO1lBQ1QsU0FBUztZQUNULFFBQVE7WUFDUixpQkFBaUI7WUFDakIsTUFBTTtZQUNOLGNBQWM7WUFDZCxVQUFVO1NBQ1g7UUFDRCxPQUFPLEVBQUUsU0FBUztLQUNuQixDQUFDOztzREFDaUI7QUFRbkI7SUFOQyxJQUFBLGdCQUFNLEVBQUM7UUFDTixJQUFJLEVBQUUsUUFBUTtRQUNkLElBQUksRUFBRSxNQUFNO1FBQ1osSUFBSSxFQUFFLENBQUMsVUFB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QyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pCLElBQUEsZUFBSyxFQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDckIsSUFBQSxlQUFLLEVBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqQixJQUFBLGVBQUssRUFBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3BCLElBQUEsZUFBSyxFQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN6QixJQUFBLGVBQUssRUFBQyxDQUFDLGtCQUFrQixDQUFDLENBQUM7R0FDZixtQkFBbUIsQ0E0Ri9CIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGRvY3VtZW50LW51bWJlcmluZ1xcZW50aXRpZXNcXGRvY3VtZW50LW51bWJlci1hdWRpdC5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW50aXR5LFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBDb2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIEluZGV4LFxufSBmcm9tICd0eXBlb3JtJztcblxuQEVudGl0eSgnZG9jdW1lbnRfbnVtYmVyX2F1ZGl0JylcbkBJbmRleChbJ2NyZWF0ZWRBdCddKVxuQEluZGV4KFsndXNlcklkJ10pXG5ASW5kZXgoWydkb2N1bWVudElkJ10pXG5ASW5kZXgoWydzdGF0dXMnXSlcbkBJbmRleChbJ29wZXJhdGlvbiddKVxuQEluZGV4KFsnZG9jdW1lbnROdW1iZXInXSlcbkBJbmRleChbJ3Jlc2VydmF0aW9uVG9rZW4nXSlcbmV4cG9ydCBjbGFzcyBEb2N1bWVudE51bWJlckF1ZGl0IHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuICBpZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2RvY3VtZW50X2lkJywgbnVsbGFibGU6IHRydWUgfSlcbiAgZG9jdW1lbnRJZD86IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2RvY3VtZW50X251bWJlcicsIGxlbmd0aDogMTAwIH0pXG4gIGRvY3VtZW50TnVtYmVyITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnY291bnRlcl9rZXknLCB0eXBlOiAnanNvbicgfSlcbiAgY291bnRlcktleSE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAndGVtcGxhdGVfdXNlZCcsIGxlbmd0aDogMjAwIH0pXG4gIHRlbXBsYXRlVXNlZCE6IHN0cmluZztcblxuICBAQ29sdW1uKHtcbiAgICBuYW1lOiAnb3BlcmF0aW9uJyxcbiAgICB0eXBlOiAnZW51bScsXG4gICAgZW51bTogW1xuICAgICAgJ1JFU0VSVkUnLFxuICAgICAgJ0NPTkZJUk0nLFxuICAgICAgJ0NBTkNFTCcsXG4gICAgICAnTUFOVUFMX09WRVJSSURFJyxcbiAgICAgICdWT0lEJyxcbiAgICAgICdWT0lEX1JFUExBQ0UnLFxuICAgICAgJ0dFTkVSQVRFJyxcbiAgICBdLFxuICAgIGRlZmF1bHQ6ICdDT05GSVJNJyxcbiAgfSlcbiAgb3BlcmF0aW9uITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oe1xuICAgIG5hbWU6ICdzdGF0dXMnLFxuICAgIHR5cGU6ICdlbnVtJyxcbiAgICBlbnVtOiBbJ1JFU0VSVkVEJywgJ0NPTkZJUk1FRCcsICdDQU5DRUxMRUQnLCAnVk9JRCcsICdNQU5VQUwnXSxcbiAgICBudWxsYWJsZTogdHJ1ZSxcbiAgfSlcbiAgc3RhdHVzPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmVzZXJ2YXRpb25fdG9rZW4nLCBsZW5ndGg6IDM2LCBudWxsYWJsZTogdHJ1ZSB9KVxuICByZXNlcnZhdGlvblRva2VuPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnaWRlbXBvdGVuY3lfa2V5JywgbGVuZ3RoOiAzNiwgbnVsbGFibGU6IHRydWUgfSlcbiAgaWRlbXBvdGVuY3lLZXk/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdvcmlnaW5hdG9yX29yZ2FuaXphdGlvbl9pZCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIG9yaWdpbmF0b3JPcmdhbml6YXRpb25JZD86IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3JlY2lwaWVudF9vcmdhbml6YXRpb25faWQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICByZWNpcGllbnRPcmdhbml6YXRpb25JZD86IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ29sZF92YWx1ZScsIHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgb2xkVmFsdWU/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICduZXdfdmFsdWUnLCB0eXBlOiAndGV4dCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIG5ld1ZhbHVlPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnbWV0YWRhdGEnLCB0eXBlOiAnanNvbicsIG51bGxhYmxlOiB0cnVlIH0pXG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgQENvbHVtbih7IG5hbWU6ICd1c2VyX2lkJywgbnVsbGFibGU6IHRydWUgfSlcbiAgdXNlcklkPzogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXBfYWRkcmVzcycsIGxlbmd0aDogNDUsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGlwQWRkcmVzcz86IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ3VzZXJfYWdlbnQnLCB0eXBlOiAndGV4dCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHVzZXJBZ2VudD86IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ2lzX3N1Y2Nlc3MnLCBkZWZhdWx0OiB0cnVlIH0pXG4gIGlzU3VjY2VzcyE6IGJvb2xlYW47XG5cbiAgQENvbHVtbih7IG5hbWU6ICdyZXRyeV9jb3VudCcsIGRlZmF1bHQ6IDAgfSlcbiAgcmV0cnlDb3VudCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2xvY2tfd2FpdF9tcycsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGxvY2tXYWl0TXM/OiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICd0b3RhbF9kdXJhdGlvbl9tcycsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHRvdGFsRHVyYXRpb25Ncz86IG51bWJlcjtcblxuICBAQ29sdW1uKHtcbiAgICBuYW1lOiAnZmFsbGJhY2tfdXNlZCcsXG4gICAgdHlwZTogJ2VudW0nLFxuICAgIGVudW06IFsnTk9ORScsICdEQl9MT0NLJywgJ1JFVFJZJ10sXG4gICAgZGVmYXVsdDogJ05PTkUnLFxuICB9KVxuICBmYWxsYmFja1VzZWQ/OiBzdHJpbmc7XG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8f/documentnumberauditentity_8f1d1cd40dada15740cff52014266f7a.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8f/documentnumberauditentity_8f1d1cd40dada15740cff52014266f7a.map new file mode 100644 index 0000000..6d946aa --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8f/documentnumberauditentity_8f1d1cd40dada15740cff52014266f7a.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\entities\\document-number-audit.entity.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\entities\\document-number-audit.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n Index,\n} from 'typeorm';\n\n@Entity('document_number_audit')\n@Index(['createdAt'])\n@Index(['userId'])\n@Index(['documentId'])\n@Index(['status'])\n@Index(['operation'])\n@Index(['documentNumber'])\n@Index(['reservationToken'])\nexport class DocumentNumberAudit {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'document_id', nullable: true })\n documentId?: number;\n\n @Column({ name: 'document_number', length: 100 })\n documentNumber!: string;\n\n @Column({ name: 'counter_key', type: 'json' })\n counterKey!: Record;\n\n @Column({ name: 'template_used', length: 200 })\n templateUsed!: string;\n\n @Column({\n name: 'operation',\n type: 'enum',\n enum: [\n 'RESERVE',\n 'CONFIRM',\n 'CANCEL',\n 'MANUAL_OVERRIDE',\n 'VOID',\n 'VOID_REPLACE',\n 'GENERATE',\n ],\n default: 'CONFIRM',\n })\n operation!: string;\n\n @Column({\n name: 'status',\n type: 'enum',\n enum: ['RESERVED', 'CONFIRMED', 'CANCELLED', 'VOID', 'MANUAL'],\n nullable: true,\n })\n status?: string;\n\n @Column({ name: 'reservation_token', length: 36, nullable: true })\n reservationToken?: string;\n\n @Column({ name: 'idempotency_key', length: 36, nullable: true })\n idempotencyKey?: string;\n\n @Column({ name: 'originator_organization_id', nullable: true })\n originatorOrganizationId?: number;\n\n @Column({ name: 'recipient_organization_id', nullable: true })\n recipientOrganizationId?: number;\n\n @Column({ name: 'old_value', type: 'text', nullable: true })\n oldValue?: string;\n\n @Column({ name: 'new_value', type: 'text', nullable: true })\n newValue?: string;\n\n @Column({ name: 'metadata', type: 'json', nullable: true })\n metadata?: Record;\n\n @Column({ name: 'user_id', nullable: true })\n userId?: number;\n\n @Column({ name: 'ip_address', length: 45, nullable: true })\n ipAddress?: string;\n\n @Column({ name: 'user_agent', type: 'text', nullable: true })\n userAgent?: string;\n\n @Column({ name: 'is_success', default: true })\n isSuccess!: boolean;\n\n @Column({ name: 'retry_count', default: 0 })\n retryCount!: number;\n\n @Column({ name: 'lock_wait_ms', nullable: true })\n lockWaitMs?: number;\n\n @Column({ name: 'total_duration_ms', nullable: true })\n totalDurationMs?: number;\n\n @Column({\n name: 'fallback_used',\n type: 'enum',\n enum: ['NONE', 'DB_LOCK', 'RETRY'],\n default: 'NONE',\n })\n fallbackUsed?: string;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8f/manualoverrideservice_8f2885af9b3396edaff274554fed1fb9 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8f/manualoverrideservice_8f2885af9b3396edaff274554fed1fb9 new file mode 100644 index 0000000..4c2ffc5 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8f/manualoverrideservice_8f2885af9b3396edaff274554fed1fb9 @@ -0,0 +1,49 @@ +ea5854e4f402d5a4cd11e53728564e14 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var ManualOverrideService_1; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ManualOverrideService = void 0; +const common_1 = require("@nestjs/common"); +const counter_service_1 = require("./counter.service"); +const audit_service_1 = require("./audit.service"); +let ManualOverrideService = ManualOverrideService_1 = class ManualOverrideService { + constructor(counterService, auditService) { + this.counterService = counterService; + this.auditService = auditService; + this.logger = new common_1.Logger(ManualOverrideService_1.name); + } + async applyOverride(dto, userId) { + this.logger.log(`Applying manual override by user ${userId}: ${JSON.stringify(dto)}`); + // 1. Force update the counter + await this.counterService.forceUpdateCounter(dto, dto.newLastNumber); + // 2. Log Audit + await this.auditService.log({ + documentId: undefined, // No specific document + documentNumber: `OVERRIDE-TO-${dto.newLastNumber}`, + operation: 'MANUAL_OVERRIDE', + status: 'MANUAL', + counterKey: dto, // CounterKeyDto part of ManualOverrideDto + templateUsed: 'MANUAL_OVERRIDE', + userId: userId, + isSuccess: true, + metadata: { reason: dto.reason, reference: dto.reference }, + totalDurationMs: 0, + }); + } +}; +exports.ManualOverrideService = ManualOverrideService; +exports.ManualOverrideService = ManualOverrideService = ManualOverrideService_1 = __decorate([ + (0, common_1.Injectable)(), + __metadata("design:paramtypes", [typeof (_a = typeof counter_service_1.CounterService !== "undefined" && counter_service_1.CounterService) === "function" ? _a : Object, typeof (_b = typeof audit_service_1.AuditService !== "undefined" && audit_service_1.AuditService) === "function" ? _b : Object]) +], ManualOverrideService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxzZXJ2aWNlc1xcbWFudWFsLW92ZXJyaWRlLnNlcnZpY2UudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBb0Q7QUFDcEQsdURBQW1EO0FBQ25ELG1EQUErQztBQUl4QyxJQUFNLHFCQUFxQiw2QkFBM0IsTUFBTSxxQkFBcUI7SUFHaEMsWUFDbUIsY0FBOEIsRUFDOUIsWUFBMEI7UUFEMUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBSjVCLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyx1QkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUs5RCxDQUFDO0lBRUosS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFzQixFQUFFLE1BQWM7UUFDeEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQ2Isb0NBQW9DLE1BQU0sS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQ3JFLENBQUM7UUFFRiw4QkFBOEI7UUFDOUIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFckUsZUFBZTtRQUNmLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7WUFDMUIsVUFBVSxFQUFFLFNBQVMsRUFBRSx1QkFBdUI7WUFDOUMsY0FBYyxFQUFFLGVBQWUsR0FBRyxDQUFDLGFBQWEsRUFBRTtZQUNsRCxTQUFTLEVBQUUsaUJBQWlCO1lBQzVCLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLFVBQVUsRUFBRSxHQUF5QyxFQUFFLDBDQUEwQztZQUNqRyxZQUFZLEVBQUUsaUJBQWlCO1lBQy9CLE1BQU0sRUFBRSxNQUFNO1lBQ2QsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRTtZQUMxRCxlQUFlLEVBQUUsQ0FBQztTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YsQ0FBQTtBQTlCWSxzREFBcUI7Z0NBQXJCLHFCQUFxQjtJQURqQyxJQUFBLG1CQUFVLEdBQUU7eURBS3dCLGdDQUFjLG9CQUFkLGdDQUFjLG9EQUNoQiw0QkFBWSxvQkFBWiw0QkFBWTtHQUxsQyxxQkFBcUIsQ0E4QmpDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGRvY3VtZW50LW51bWJlcmluZ1xcc2VydmljZXNcXG1hbnVhbC1vdmVycmlkZS5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIExvZ2dlciB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcclxuaW1wb3J0IHsgQ291bnRlclNlcnZpY2UgfSBmcm9tICcuL2NvdW50ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEF1ZGl0U2VydmljZSB9IGZyb20gJy4vYXVkaXQuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hbnVhbE92ZXJyaWRlRHRvIH0gZnJvbSAnLi4vZHRvL21hbnVhbC1vdmVycmlkZS5kdG8nO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTWFudWFsT3ZlcnJpZGVTZXJ2aWNlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoTWFudWFsT3ZlcnJpZGVTZXJ2aWNlLm5hbWUpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY291bnRlclNlcnZpY2U6IENvdW50ZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdWRpdFNlcnZpY2U6IEF1ZGl0U2VydmljZVxyXG4gICkge31cclxuXHJcbiAgYXN5bmMgYXBwbHlPdmVycmlkZShkdG86IE1hbnVhbE92ZXJyaWRlRHRvLCB1c2VySWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5sb2dnZXIubG9nKFxyXG4gICAgICBgQXBwbHlpbmcgbWFudWFsIG92ZXJyaWRlIGJ5IHVzZXIgJHt1c2VySWR9OiAke0pTT04uc3RyaW5naWZ5KGR0byl9YFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyAxLiBGb3JjZSB1cGRhdGUgdGhlIGNvdW50ZXJcclxuICAgIGF3YWl0IHRoaXMuY291bnRlclNlcnZpY2UuZm9yY2VVcGRhdGVDb3VudGVyKGR0bywgZHRvLm5ld0xhc3ROdW1iZXIpO1xyXG5cclxuICAgIC8vIDIuIExvZyBBdWRpdFxyXG4gICAgYXdhaXQgdGhpcy5hdWRpdFNlcnZpY2UubG9nKHtcclxuICAgICAgZG9jdW1lbnRJZDogdW5kZWZpbmVkLCAvLyBObyBzcGVjaWZpYyBkb2N1bWVudFxyXG4gICAgICBkb2N1bWVudE51bWJlcjogYE9WRVJSSURFLVRPLSR7ZHRvLm5ld0xhc3ROdW1iZXJ9YCxcclxuICAgICAgb3BlcmF0aW9uOiAnTUFOVUFMX09WRVJSSURFJyxcclxuICAgICAgc3RhdHVzOiAnTUFOVUFMJyxcclxuICAgICAgY291bnRlcktleTogZHRvIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIC8vIENvdW50ZXJLZXlEdG8gcGFydCBvZiBNYW51YWxPdmVycmlkZUR0b1xyXG4gICAgICB0ZW1wbGF0ZVVzZWQ6ICdNQU5VQUxfT1ZFUlJJREUnLFxyXG4gICAgICB1c2VySWQ6IHVzZXJJZCxcclxuICAgICAgaXNTdWNjZXNzOiB0cnVlLFxyXG4gICAgICBtZXRhZGF0YTogeyByZWFzb246IGR0by5yZWFzb24sIHJlZmVyZW5jZTogZHRvLnJlZmVyZW5jZSB9LFxyXG4gICAgICB0b3RhbER1cmF0aW9uTXM6IDAsXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8f/manualoverrideservice_8f2885af9b3396edaff274554fed1fb9.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8f/manualoverrideservice_8f2885af9b3396edaff274554fed1fb9.map new file mode 100644 index 0000000..b055a1b --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/8f/manualoverrideservice_8f2885af9b3396edaff274554fed1fb9.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\manual-override.service.ts","mappings":";;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,uDAAmD;AACnD,mDAA+C;AAIxC,IAAM,qBAAqB,6BAA3B,MAAM,qBAAqB;IAGhC,YACmB,cAA8B,EAC9B,YAA0B;QAD1B,mBAAc,GAAd,cAAc,CAAgB;QAC9B,iBAAY,GAAZ,YAAY,CAAc;QAJ5B,WAAM,GAAG,IAAI,eAAM,CAAC,uBAAqB,CAAC,IAAI,CAAC,CAAC;IAK9D,CAAC;IAEJ,KAAK,CAAC,aAAa,CAAC,GAAsB,EAAE,MAAc;QACxD,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,oCAAoC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CACrE,CAAC;QAEF,8BAA8B;QAC9B,MAAM,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAErE,eAAe;QACf,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;YAC1B,UAAU,EAAE,SAAS,EAAE,uBAAuB;YAC9C,cAAc,EAAE,eAAe,GAAG,CAAC,aAAa,EAAE;YAClD,SAAS,EAAE,iBAAiB;YAC5B,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE,GAAyC,EAAE,0CAA0C;YACjG,YAAY,EAAE,iBAAiB;YAC/B,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE;YAC1D,eAAe,EAAE,CAAC;SACnB,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AA9BY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;yDAKwB,gCAAc,oBAAd,gCAAc,oDAChB,4BAAY,oBAAZ,4BAAY;GALlC,qBAAqB,CA8BjC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\manual-override.service.ts"],"sourcesContent":["import { Injectable, Logger } from '@nestjs/common';\r\nimport { CounterService } from './counter.service';\r\nimport { AuditService } from './audit.service';\r\nimport { ManualOverrideDto } from '../dto/manual-override.dto';\r\n\r\n@Injectable()\r\nexport class ManualOverrideService {\r\n private readonly logger = new Logger(ManualOverrideService.name);\r\n\r\n constructor(\r\n private readonly counterService: CounterService,\r\n private readonly auditService: AuditService\r\n ) {}\r\n\r\n async applyOverride(dto: ManualOverrideDto, userId: number): Promise {\r\n this.logger.log(\r\n `Applying manual override by user ${userId}: ${JSON.stringify(dto)}`\r\n );\r\n\r\n // 1. Force update the counter\r\n await this.counterService.forceUpdateCounter(dto, dto.newLastNumber);\r\n\r\n // 2. Log Audit\r\n await this.auditService.log({\r\n documentId: undefined, // No specific document\r\n documentNumber: `OVERRIDE-TO-${dto.newLastNumber}`,\r\n operation: 'MANUAL_OVERRIDE',\r\n status: 'MANUAL',\r\n counterKey: dto as unknown as Record, // CounterKeyDto part of ManualOverrideDto\r\n templateUsed: 'MANUAL_OVERRIDE',\r\n userId: userId,\r\n isSuccess: true,\r\n metadata: { reason: dto.reason, reference: dto.reference },\r\n totalDurationMs: 0,\r\n });\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/90/workflowdslservice_909e15f6dcb6f70cf3679802928c76ce b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/90/workflowdslservice_909e15f6dcb6f70cf3679802928c76ce new file mode 100644 index 0000000..7b45a1a --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/90/workflowdslservice_909e15f6dcb6f70cf3679802928c76ce @@ -0,0 +1,171 @@ +acf3bdafe93d39c72fa04f7887ca17bc +"use strict"; +// File: src/modules/workflow-engine/workflow-dsl.service.ts +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var WorkflowDslService_1; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WorkflowDslService = void 0; +const common_1 = require("@nestjs/common"); +let WorkflowDslService = WorkflowDslService_1 = class WorkflowDslService { + constructor() { + this.logger = new common_1.Logger(WorkflowDslService_1.name); + } + /** + * [Compile Time] + * แปลง Raw DSL เป็น Compiled Structure พร้อม Validation + */ + compile(dsl) { + this.validateSchemaStructure(dsl); + const compiled = { + workflow: dsl.workflow, + version: dsl.version || 1, + initialState: '', + states: {}, + }; + const definedStates = new Set(dsl.states.map((s) => s.name)); + let initialFound = false; + // 1. Process States + for (const rawState of dsl.states) { + if (rawState.initial) { + if (initialFound) { + throw new common_1.BadRequestException(`DSL Error: Multiple initial states found (at "${rawState.name}").`); + } + compiled.initialState = rawState.name; + initialFound = true; + } + const compiledState = { + terminal: !!rawState.terminal, + transitions: {}, + }; + // 2. Process Transitions + if (rawState.on) { + for (const [action, rule] of Object.entries(rawState.on)) { + // Validation: Target state must exist + if (!definedStates.has(rule.to)) { + throw new common_1.BadRequestException(`DSL Error: State "${rawState.name}" transitions via "${action}" to unknown state "${rule.to}".`); + } + compiledState.transitions[action] = { + to: rule.to, + requirements: { + roles: rule.require?.role + ? Array.isArray(rule.require.role) + ? rule.require.role + : [rule.require.role] + : [], + userId: rule.require?.user, + }, + condition: rule.condition, + events: rule.events || [], + }; + } + } + else if (!rawState.terminal) { + this.logger.warn(`State "${rawState.name}" is not terminal but has no transitions.`); + } + compiled.states[rawState.name] = compiledState; + } + if (!initialFound) { + throw new common_1.BadRequestException('DSL Error: No initial state defined.'); + } + return compiled; + } + /** + * [Runtime] + * ประมวลผล Action และคืนค่า State ถัดไป + */ + evaluate(compiled, currentState, action, context = {}) { + const stateConfig = compiled.states[currentState]; + // 1. Validate State Existence + if (!stateConfig) { + throw new common_1.BadRequestException(`Runtime Error: Current state "${currentState}" is invalid.`); + } + // 2. Check if terminal + if (stateConfig.terminal) { + throw new common_1.BadRequestException(`Runtime Error: Cannot transition from terminal state "${currentState}".`); + } + // 3. Find Transition + const transition = stateConfig.transitions[action]; + if (!transition) { + const allowed = Object.keys(stateConfig.transitions).join(', '); + throw new common_1.BadRequestException(`Invalid Action: "${action}" is not allowed from "${currentState}". Allowed: [${allowed}]`); + } + // 4. Validate Requirements (RBAC) + this.checkRequirements(transition.requirements, context); + // 5. Evaluate Condition (Dynamic Logic) + if (transition.condition) { + const isMet = this.evaluateCondition(transition.condition, context); + if (!isMet) { + throw new common_1.BadRequestException('Condition Failed: The criteria for this transition are not met.'); + } + } + return { + nextState: transition.to, + events: transition.events, + }; + } + // -------------------------------------------------------- + // Private Helpers + // -------------------------------------------------------- + validateSchemaStructure(dsl) { + if (!dsl || typeof dsl !== 'object') { + throw new common_1.BadRequestException('DSL must be a JSON object.'); + } + const d = dsl; + if (!d.workflow || !d.states || !Array.isArray(d.states)) { + throw new common_1.BadRequestException('DSL Error: Missing required fields (workflow, states).'); + } + } + checkRequirements(req, context) { + // [FIX] Early return if no requirements defined + if (!req) { + return; + } + const userRoles = context.roles || []; + const userId = context.userId; + // Check Roles (OR logic inside array) - with null-safety + const requiredRoles = req.roles || []; + if (requiredRoles.length > 0) { + const hasRole = requiredRoles.some((r) => userRoles.includes(r)); + if (!hasRole) { + throw new common_1.BadRequestException(`Access Denied: Required roles [${requiredRoles.join(', ')}]`); + } + } + // Check Specific User + if (req.userId && String(req.userId) !== String(userId)) { + throw new common_1.BadRequestException('Access Denied: User mismatch.'); + } + } + /** + * Evaluate simple JS expression securely + * NOTE: In production, use a safe parser like 'json-logic-js' or vm2 + * For this phase, we use a simple Function constructor with restricted scope. + */ + evaluateCondition(expression, context) { + try { + // Simple guard against malicious code (basic) + if (expression.includes('process') || expression.includes('require')) { + throw new Error('Unsafe expression detected'); + } + // Create a function that returns the expression result + // "context" is available inside the expression + // eslint-disable-next-line @typescript-eslint/no-implied-eval + const func = new Function('context', `return ${expression};`); + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + return !!func(context); + } + catch (error) { + this.logger.error(`Condition Error: "${expression}" -> ${error instanceof Error ? error.message : String(error)}`); + return false; // Fail safe + } + } +}; +exports.WorkflowDslService = WorkflowDslService; +exports.WorkflowDslService = WorkflowDslService = WorkflowDslService_1 = __decorate([ + (0, common_1.Injectable)() +], WorkflowDslService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcd29ya2Zsb3ctZW5naW5lXFx3b3JrZmxvdy1kc2wuc2VydmljZS50cyIsIm1hcHBpbmdzIjoiO0FBQUEsNERBQTREOzs7Ozs7Ozs7O0FBRTVELDJDQUF5RTtBQThEbEUsSUFBTSxrQkFBa0IsMEJBQXhCLE1BQU0sa0JBQWtCO0lBQXhCO1FBQ1ksV0FBTSxHQUFHLElBQUksZUFBTSxDQUFDLG9CQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBMk1oRSxDQUFDO0lBek1DOzs7T0FHRztJQUNILE9BQU8sQ0FBQyxHQUFtQjtRQUN6QixJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFbEMsTUFBTSxRQUFRLEdBQXFCO1lBQ2pDLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtZQUN0QixPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU8sSUFBSSxDQUFDO1lBQ3pCLFlBQVksRUFBRSxFQUFFO1lBQ2hCLE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQztRQUVGLE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxDQUFTLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNyRSxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7UUFFekIsb0JBQW9CO1FBQ3BCLEtBQUssTUFBTSxRQUFRLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xDLElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNyQixJQUFJLFlBQVksRUFBRSxDQUFDO29CQUNqQixNQUFNLElBQUksNEJBQW1CLENBQzNCLGlEQUFpRCxRQUFRLENBQUMsSUFBSSxLQUFLLENBQ3BFLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxRQUFRLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQ3RDLFlBQVksR0FBRyxJQUFJ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K0NBQStDO1lBQy9DLDhEQUE4RDtZQUM5RCxNQUFNLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxTQUFTLEVBQUUsVUFBVSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1lBQzlELDZEQUE2RDtZQUM3RCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2YscUJBQXFCLFVBQVUsUUFBUSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDaEcsQ0FBQztZQUNGLE9BQU8sS0FBSyxDQUFDLENBQUMsWUFBWTtRQUM1QixDQUFDO0lBQ0gsQ0FBQztDQUNGLENBQUE7QUE1TVksZ0RBQWtCOzZCQUFsQixrQkFBa0I7SUFEOUIsSUFBQSxtQkFBVSxHQUFFO0dBQ0Esa0JBQWtCLENBNE05QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFx3b3JrZmxvdy1lbmdpbmVcXHdvcmtmbG93LWRzbC5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9tb2R1bGVzL3dvcmtmbG93LWVuZ2luZS93b3JrZmxvdy1kc2wuc2VydmljZS50c1xuXG5pbXBvcnQgeyBCYWRSZXF1ZXN0RXhjZXB0aW9uLCBJbmplY3RhYmxlLCBMb2dnZXIgfSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gMS4gSW50ZXJmYWNlcyBmb3IgUkFXIERTTCAoSW5wdXQgZnJvbSBVc2VyKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgaW50ZXJmYWNlIFJhd1dvcmtmbG93RFNMIHtcbiAgd29ya2Zsb3c6IHN0cmluZztcbiAgdmVyc2lvbj86IG51bWJlcjtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHN0YXRlczogUmF3U3RhdGVbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSYXdTdGF0ZSB7XG4gIG5hbWU6IHN0cmluZztcbiAgaW5pdGlhbD86IGJvb2xlYW47XG4gIHRlcm1pbmFsPzogYm9vbGVhbjtcbiAgb24/OiBSZWNvcmQ8c3RyaW5nLCBSYXdUcmFuc2l0aW9uPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSYXdUcmFuc2l0aW9uIHtcbiAgdG86IHN0cmluZztcbiAgcmVxdWlyZT86IHtcbiAgICByb2xlPzogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgdXNlcj86IHN0cmluZztcbiAgfTtcbiAgY29uZGl0aW9uPzogc3RyaW5nOyAvLyBKYXZhU2NyaXB0IEV4cHJlc3Npb24gc3RyaW5nXG4gIGV2ZW50cz86IFJhd0V2ZW50W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmF3RXZlbnQge1xuICB0eXBlOiAnbm90aWZ5JyB8ICd3ZWJob29rJyB8ICdhc3NpZ24nIHwgJ2F1dG9fYWN0aW9uJztcbiAgdGFyZ2V0Pzogc3RyaW5nO1xuICB0ZW1wbGF0ZT86IHN0cmluZztcbiAgcGF5bG9hZD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIDIuIEludGVyZmFjZXMgZm9yIENPTVBJTEVEIFNjaGVtYSAoT3B0aW1pemVkIGZvciBSdW50aW1lKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgaW50ZXJmYWNlIENvbXBpbGVkV29ya2Zsb3cge1xuICB3b3JrZmxvdzogc3RyaW5nO1xuICB2ZXJzaW9uOiBudW1iZXI7XG4gIGluaXRpYWxTdGF0ZTogc3RyaW5nOyAvLyBPcHRpbWl6ZTog4LmA4LiB4LmH4Lia4LiK4Li34LmI4LitIEluaXRpYWwgU3RhdGUg4LmE4Lin4LmJ4LmA4Lil4LiiIOC5hOC4oeC5iOC4leC5ieC4reC4hyBsb29wIOC4q+C4slxuICBzdGF0ZXM6IFJlY29yZDxzdHJpbmcsIENvbXBpbGVkU3RhdGU+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBpbGVkU3RhdGUge1xuICB0ZXJtaW5hbDogYm9vbGVhbjtcbiAgdHJhbnNpdGlvbnM6IFJlY29yZDxzdHJpbmcsIENvbXBpbGVkVHJhbnNpdGlvbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZWRUcmFuc2l0aW9uIHtcbiAgdG86IHN0cmluZztcbiAgcmVxdWlyZW1lbnRzOiB7XG4gICAgcm9sZXM6IHN0cmluZ1tdO1xuICAgIHVzZXJJZD86IHN0cmluZztcbiAgfTtcbiAgY29uZGl0aW9uPzogc3RyaW5nO1xuICBldmVudHM6IFJhd0V2ZW50W107XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBXb3JrZmxvd0RzbFNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoV29ya2Zsb3dEc2xTZXJ2aWNlLm5hbWUpO1xuXG4gIC8qKlxuICAgKiBbQ29tcGlsZSBUaW1lXVxuICAgKiDguYHguJvguKXguIcgUmF3IERTTCDguYDguJvguYfguJkgQ29tcGlsZWQgU3RydWN0dXJlIOC4nuC4o+C5ieC4reC4oSBWYWxpZGF0aW9uXG4gICAqL1xuICBjb21waWxlKGRzbDogUmF3V29ya2Zsb3dEU0wpOiBDb21waWxlZFdvcmtmbG93IHtcbiAgICB0aGlzLnZhbGlkYXRlU2NoZW1hU3RydWN0dXJlKGRzbCk7XG5cbiAgICBjb25zdCBjb21waWxlZDogQ29tcGlsZWRXb3JrZmxvdyA9IHtcbiAgICAgIHdvcmtmbG93OiBkc2wud29ya2Zsb3csXG4gICAgICB2ZXJzaW9uOiBkc2wudmVyc2lvbiB8fCAxLFxuICAgICAgaW5pdGlhbFN0YXRlOiAnJyxcbiAgICAgIHN0YXRlczoge30sXG4gICAgfTtcblxuICAgIGNvbnN0IGRlZmluZWRTdGF0ZXMgPSBuZXcgU2V0PHN0cmluZz4oZHNsLnN0YXRlcy5tYXAoKHMpID0+IHMubmFtZSkpO1xuICAgIGxldCBpbml0aWFsRm91bmQgPSBmYWxzZTtcblxuICAgIC8vIDEuIFByb2Nlc3MgU3RhdGVzXG4gICAgZm9yIChjb25zdCByYXdTdGF0ZSBvZiBkc2wuc3RhdGVzKSB7XG4gICAgICBpZiAocmF3U3RhdGUuaW5pdGlhbCkge1xuICAgICAgICBpZiAoaW5pdGlhbEZvdW5kKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgICAgICBgRFNMIEVycm9yOiBNdWx0aXBsZSBpbml0aWFsIHN0YXRlcyBmb3VuZCAoYXQgXCIke3Jhd1N0YXRlLm5hbWV9XCIpLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbXBpbGVkLmluaXRpYWxTdGF0ZSA9IHJhd1N0YXRlLm5hbWU7XG4gICAgICAgIGluaXRpYWxGb3VuZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbXBpbGVkU3RhdGU6IENvbXBpbGVkU3RhdGUgPSB7XG4gICAgICAgIHRlcm1pbmFsOiAhIXJhd1N0YXRlLnRlcm1pbmFsLFxuICAgICAgICB0cmFuc2l0aW9uczoge30sXG4gICAgICB9O1xuXG4gICAgICAvLyAyLiBQcm9jZXNzIFRyYW5zaXRpb25zXG4gICAgICBpZiAocmF3U3RhdGUub24pIHtcbiAgICAgICAgZm9yIChjb25zdCBbYWN0aW9uLCBydWxlXSBvZiBPYmplY3QuZW50cmllcyhyYXdTdGF0ZS5vbikpIHtcbiAgICAgICAgICAvLyBWYWxpZGF0aW9uOiBUYXJnZXQgc3RhdGUgbXVzdCBleGlzdFxuICAgICAgICAgIGlmICghZGVmaW5lZFN0YXRlcy5oYXMocnVsZS50bykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICAgICAgICBgRFNMIEVycm9yOiBTdGF0ZSBcIiR7cmF3U3RhdGUubmFtZX1cIiB0cmFuc2l0aW9ucyB2aWEgXCIke2FjdGlvbn1cIiB0byB1bmtub3duIHN0YXRlIFwiJHtydWxlLnRvfVwiLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29tcGlsZWRTdGF0ZS50cmFuc2l0aW9uc1thY3Rpb25dID0ge1xuICAgICAgICAgICAgdG86IHJ1bGUudG8sXG4gICAgICAgICAgICByZXF1aXJlbWVudHM6IHtcbiAgICAgICAgICAgICAgcm9sZXM6IHJ1bGUucmVxdWlyZT8ucm9sZVxuICAgICAgICAgICAgICAgID8gQXJyYXkuaXNBcnJheShydWxlLnJlcXVpcmUucm9sZSlcbiAgICAgICAgICAgICAgICAgID8gcnVsZS5yZXF1aXJlLnJvbGVcbiAgICAgICAgICAgICAgICAgIDogW3J1bGUucmVxdWlyZS5yb2xlXVxuICAgICAgICAgICAgICAgIDogW10sXG4gICAgICAgICAgICAgIHVzZXJJZDogcnVsZS5yZXF1aXJlPy51c2VyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmRpdGlvbjogcnVsZS5jb25kaXRpb24sXG4gICAgICAgICAgICBldmVudHM6IHJ1bGUuZXZlbnRzIHx8IFtdLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXJhd1N0YXRlLnRlcm1pbmFsKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgYFN0YXRlIFwiJHtyYXdTdGF0ZS5uYW1lfVwiIGlzIG5vdCB0ZXJtaW5hbCBidXQgaGFzIG5vIHRyYW5zaXRpb25zLmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29tcGlsZWQuc3RhdGVzW3Jhd1N0YXRlLm5hbWVdID0gY29tcGlsZWRTdGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoIWluaXRpYWxGb3VuZCkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oJ0RTTCBFcnJvcjogTm8gaW5pdGlhbCBzdGF0ZSBkZWZpbmVkLicpO1xuICAgIH1cblxuICAgIHJldHVybiBjb21waWxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBbUnVudGltZV1cbiAgICog4Lib4Lij4Liw4Lih4Lin4Lil4Lic4LilIEFjdGlvbiDguYHguKXguLDguITguLfguJnguITguYjguLIgU3RhdGUg4LiW4Lix4LiU4LmE4LibXG4gICAqL1xuICBldmFsdWF0ZShcbiAgICBjb21waWxlZDogQ29tcGlsZWRXb3JrZmxvdyxcbiAgICBjdXJyZW50U3RhdGU6IHN0cmluZyxcbiAgICBhY3Rpb246IHN0cmluZyxcbiAgICBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gICk6IHsgbmV4dFN0YXRlOiBzdHJpbmc7IGV2ZW50czogUmF3RXZlbnRbXSB9IHtcbiAgICBjb25zdCBzdGF0ZUNvbmZpZyA9IGNvbXBpbGVkLnN0YXRlc1tjdXJyZW50U3RhdGVdO1xuXG4gICAgLy8gMS4gVmFsaWRhdGUgU3RhdGUgRXhpc3RlbmNlXG4gICAgaWYgKCFzdGF0ZUNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgIGBSdW50aW1lIEVycm9yOiBDdXJyZW50IHN0YXRlIFwiJHtjdXJyZW50U3RhdGV9XCIgaXMgaW52YWxpZC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDIuIENoZWNrIGlmIHRlcm1pbmFsXG4gICAgaWYgKHN0YXRlQ29uZmlnLnRlcm1pbmFsKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgYFJ1bnRpbWUgRXJyb3I6IENhbm5vdCB0cmFuc2l0aW9uIGZyb20gdGVybWluYWwgc3RhdGUgXCIke2N1cnJlbnRTdGF0ZX1cIi5gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDMuIEZpbmQgVHJhbnNpdGlvblxuICAgIGNvbnN0IHRyYW5zaXRpb24gPSBzdGF0ZUNvbmZpZy50cmFuc2l0aW9uc1thY3Rpb25dO1xuICAgIGlmICghdHJhbnNpdGlvbikge1xuICAgICAgY29uc3QgYWxsb3dlZCA9IE9iamVjdC5rZXlzKHN0YXRlQ29uZmlnLnRyYW5zaXRpb25zKS5qb2luKCcsICcpO1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgIGBJbnZhbGlkIEFjdGlvbjogXCIke2FjdGlvbn1cIiBpcyBub3QgYWxsb3dlZCBmcm9tIFwiJHtjdXJyZW50U3RhdGV9XCIuIEFsbG93ZWQ6IFske2FsbG93ZWR9XWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gNC4gVmFsaWRhdGUgUmVxdWlyZW1lbnRzIChSQkFDKVxuICAgIHRoaXMuY2hlY2tSZXF1aXJlbWVudHModHJhbnNpdGlvbi5yZXF1aXJlbWVudHMsIGNvbnRleHQpO1xuXG4gICAgLy8gNS4gRXZhbHVhdGUgQ29uZGl0aW9uIChEeW5hbWljIExvZ2ljKVxuICAgIGlmICh0cmFuc2l0aW9uLmNvbmRpdGlvbikge1xuICAgICAgY29uc3QgaXNNZXQgPSB0aGlzLmV2YWx1YXRlQ29uZGl0aW9uKHRyYW5zaXRpb24uY29uZGl0aW9uLCBjb250ZXh0KTtcbiAgICAgIGlmICghaXNNZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgICAgJ0NvbmRpdGlvbiBGYWlsZWQ6IFRoZSBjcml0ZXJpYSBmb3IgdGhpcyB0cmFuc2l0aW9uIGFyZSBub3QgbWV0LidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmV4dFN0YXRlOiB0cmFuc2l0aW9uLnRvLFxuICAgICAgZXZlbnRzOiB0cmFuc2l0aW9uLmV2ZW50cyxcbiAgICB9O1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUHJpdmF0ZSBIZWxwZXJzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVNjaGVtYVN0cnVjdHVyZShkc2w6IHVua25vd24pIHtcbiAgICBpZiAoIWRzbCB8fCB0eXBlb2YgZHNsICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oJ0RTTCBtdXN0IGJlIGEgSlNPTiBvYmplY3QuJyk7XG4gICAgfVxuICAgIGNvbnN0IGQgPSBkc2wgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKCFkLndvcmtmbG93IHx8ICFkLnN0YXRlcyB8fCAhQXJyYXkuaXNBcnJheShkLnN0YXRlcykpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICAnRFNMIEVycm9yOiBNaXNzaW5nIHJlcXVpcmVkIGZpZWxkcyAod29ya2Zsb3csIHN0YXRlcykuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrUmVxdWlyZW1lbnRzKFxuICAgIHJlcTogQ29tcGlsZWRUcmFuc2l0aW9uWydyZXF1aXJlbWVudHMnXSxcbiAgICBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApIHtcbiAgICAvLyBbRklYXSBFYXJseSByZXR1cm4gaWYgbm8gcmVxdWlyZW1lbnRzIGRlZmluZWRcbiAgICBpZiAoIXJlcSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJSb2xlczogc3RyaW5nW10gPSAoY29udGV4dC5yb2xlcyBhcyBzdHJpbmdbXSkgfHwgW107XG4gICAgY29uc3QgdXNlcklkOiBzdHJpbmcgfCBudW1iZXIgPSBjb250ZXh0LnVzZXJJZCBhcyBzdHJpbmcgfCBudW1iZXI7XG5cbiAgICAvLyBDaGVjayBSb2xlcyAoT1IgbG9naWMgaW5zaWRlIGFycmF5KSAtIHdpdGggbnVsbC1zYWZldHlcbiAgICBjb25zdCByZXF1aXJlZFJvbGVzID0gcmVxLnJvbGVzIHx8IFtdO1xuICAgIGlmIChyZXF1aXJlZFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGhhc1JvbGUgPSByZXF1aXJlZFJvbGVzLnNvbWUoKHIpID0+IHVzZXJSb2xlcy5pbmNsdWRlcyhyKSk7XG4gICAgICBpZiAoIWhhc1JvbGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgICAgYEFjY2VzcyBEZW5pZWQ6IFJlcXVpcmVkIHJvbGVzIFske3JlcXVpcmVkUm9sZXMuam9pbignLCAnKX1dYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIFNwZWNpZmljIFVzZXJcbiAgICBpZiAocmVxLnVzZXJJZCAmJiBTdHJpbmcocmVxLnVzZXJJZCkgIT09IFN0cmluZyh1c2VySWQpKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbignQWNjZXNzIERlbmllZDogVXNlciBtaXNtYXRjaC4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGUgc2ltcGxlIEpTIGV4cHJlc3Npb24gc2VjdXJlbHlcbiAgICogTk9URTogSW4gcHJvZHVjdGlvbiwgdXNlIGEgc2FmZSBwYXJzZXIgbGlrZSAnanNvbi1sb2dpYy1qcycgb3Igdm0yXG4gICAqIEZvciB0aGlzIHBoYXNlLCB3ZSB1c2UgYSBzaW1wbGUgRnVuY3Rpb24gY29uc3RydWN0b3Igd2l0aCByZXN0cmljdGVkIHNjb3BlLlxuICAgKi9cbiAgcHJpdmF0ZSBldmFsdWF0ZUNvbmRpdGlvbihcbiAgICBleHByZXNzaW9uOiBzdHJpbmcsXG4gICAgY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFNpbXBsZSBndWFyZCBhZ2FpbnN0IG1hbGljaW91cyBjb2RlIChiYXNpYylcbiAgICAgIGlmIChleHByZXNzaW9uLmluY2x1ZGVzKCdwcm9jZXNzJykgfHwgZXhwcmVzc2lvbi5pbmNsdWRlcygncmVxdWlyZScpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zYWZlIGV4cHJlc3Npb24gZGV0ZWN0ZWQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBleHByZXNzaW9uIHJlc3VsdFxuICAgICAgLy8gXCJjb250ZXh0XCIgaXMgYXZhaWxhYmxlIGluc2lkZSB0aGUgZXhwcmVzc2lvblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbXBsaWVkLWV2YWxcbiAgICAgIGNvbnN0IGZ1bmMgPSBuZXcgRnVuY3Rpb24oJ2NvbnRleHQnLCBgcmV0dXJuICR7ZXhwcmVzc2lvbn07YCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsXG4gICAgICByZXR1cm4gISFmdW5jKGNvbnRleHQpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYENvbmRpdGlvbiBFcnJvcjogXCIke2V4cHJlc3Npb259XCIgLT4gJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gRmFpbCBzYWZlXG4gICAgfVxuICB9XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/90/workflowdslservice_909e15f6dcb6f70cf3679802928c76ce.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/90/workflowdslservice_909e15f6dcb6f70cf3679802928c76ce.map new file mode 100644 index 0000000..c659d1d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/90/workflowdslservice_909e15f6dcb6f70cf3679802928c76ce.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\workflow-dsl.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\workflow-dsl.service.ts"],"sourcesContent":["// File: src/modules/workflow-engine/workflow-dsl.service.ts\n\nimport { BadRequestException, Injectable, Logger } from '@nestjs/common';\n\n// ==========================================\n// 1. Interfaces for RAW DSL (Input from User)\n// ==========================================\nexport interface RawWorkflowDSL {\n workflow: string;\n version?: number;\n description?: string;\n states: RawState[];\n}\n\nexport interface RawState {\n name: string;\n initial?: boolean;\n terminal?: boolean;\n on?: Record;\n}\n\nexport interface RawTransition {\n to: string;\n require?: {\n role?: string | string[];\n user?: string;\n };\n condition?: string; // JavaScript Expression string\n events?: RawEvent[];\n}\n\nexport interface RawEvent {\n type: 'notify' | 'webhook' | 'assign' | 'auto_action';\n target?: string;\n template?: string;\n payload?: Record;\n}\n\n// ==========================================\n// 2. Interfaces for COMPILED Schema (Optimized for Runtime)\n// ==========================================\nexport interface CompiledWorkflow {\n workflow: string;\n version: number;\n initialState: string; // Optimize: เก็บชื่อ Initial State ไว้เลย ไม่ต้อง loop หา\n states: Record;\n}\n\nexport interface CompiledState {\n terminal: boolean;\n transitions: Record;\n}\n\nexport interface CompiledTransition {\n to: string;\n requirements: {\n roles: string[];\n userId?: string;\n };\n condition?: string;\n events: RawEvent[];\n}\n\n@Injectable()\nexport class WorkflowDslService {\n private readonly logger = new Logger(WorkflowDslService.name);\n\n /**\n * [Compile Time]\n * แปลง Raw DSL เป็น Compiled Structure พร้อม Validation\n */\n compile(dsl: RawWorkflowDSL): CompiledWorkflow {\n this.validateSchemaStructure(dsl);\n\n const compiled: CompiledWorkflow = {\n workflow: dsl.workflow,\n version: dsl.version || 1,\n initialState: '',\n states: {},\n };\n\n const definedStates = new Set(dsl.states.map((s) => s.name));\n let initialFound = false;\n\n // 1. Process States\n for (const rawState of dsl.states) {\n if (rawState.initial) {\n if (initialFound) {\n throw new BadRequestException(\n `DSL Error: Multiple initial states found (at \"${rawState.name}\").`\n );\n }\n compiled.initialState = rawState.name;\n initialFound = true;\n }\n\n const compiledState: CompiledState = {\n terminal: !!rawState.terminal,\n transitions: {},\n };\n\n // 2. Process Transitions\n if (rawState.on) {\n for (const [action, rule] of Object.entries(rawState.on)) {\n // Validation: Target state must exist\n if (!definedStates.has(rule.to)) {\n throw new BadRequestException(\n `DSL Error: State \"${rawState.name}\" transitions via \"${action}\" to unknown state \"${rule.to}\".`\n );\n }\n\n compiledState.transitions[action] = {\n to: rule.to,\n requirements: {\n roles: rule.require?.role\n ? Array.isArray(rule.require.role)\n ? rule.require.role\n : [rule.require.role]\n : [],\n userId: rule.require?.user,\n },\n condition: rule.condition,\n events: rule.events || [],\n };\n }\n } else if (!rawState.terminal) {\n this.logger.warn(\n `State \"${rawState.name}\" is not terminal but has no transitions.`\n );\n }\n\n compiled.states[rawState.name] = compiledState;\n }\n\n if (!initialFound) {\n throw new BadRequestException('DSL Error: No initial state defined.');\n }\n\n return compiled;\n }\n\n /**\n * [Runtime]\n * ประมวลผล Action และคืนค่า State ถัดไป\n */\n evaluate(\n compiled: CompiledWorkflow,\n currentState: string,\n action: string,\n context: Record = {}\n ): { nextState: string; events: RawEvent[] } {\n const stateConfig = compiled.states[currentState];\n\n // 1. Validate State Existence\n if (!stateConfig) {\n throw new BadRequestException(\n `Runtime Error: Current state \"${currentState}\" is invalid.`\n );\n }\n\n // 2. Check if terminal\n if (stateConfig.terminal) {\n throw new BadRequestException(\n `Runtime Error: Cannot transition from terminal state \"${currentState}\".`\n );\n }\n\n // 3. Find Transition\n const transition = stateConfig.transitions[action];\n if (!transition) {\n const allowed = Object.keys(stateConfig.transitions).join(', ');\n throw new BadRequestException(\n `Invalid Action: \"${action}\" is not allowed from \"${currentState}\". Allowed: [${allowed}]`\n );\n }\n\n // 4. Validate Requirements (RBAC)\n this.checkRequirements(transition.requirements, context);\n\n // 5. Evaluate Condition (Dynamic Logic)\n if (transition.condition) {\n const isMet = this.evaluateCondition(transition.condition, context);\n if (!isMet) {\n throw new BadRequestException(\n 'Condition Failed: The criteria for this transition are not met.'\n );\n }\n }\n\n return {\n nextState: transition.to,\n events: transition.events,\n };\n }\n\n // --------------------------------------------------------\n // Private Helpers\n // --------------------------------------------------------\n\n private validateSchemaStructure(dsl: unknown) {\n if (!dsl || typeof dsl !== 'object') {\n throw new BadRequestException('DSL must be a JSON object.');\n }\n const d = dsl as Record;\n if (!d.workflow || !d.states || !Array.isArray(d.states)) {\n throw new BadRequestException(\n 'DSL Error: Missing required fields (workflow, states).'\n );\n }\n }\n\n private checkRequirements(\n req: CompiledTransition['requirements'],\n context: Record\n ) {\n // [FIX] Early return if no requirements defined\n if (!req) {\n return;\n }\n\n const userRoles: string[] = (context.roles as string[]) || [];\n const userId: string | number = context.userId as string | number;\n\n // Check Roles (OR logic inside array) - with null-safety\n const requiredRoles = req.roles || [];\n if (requiredRoles.length > 0) {\n const hasRole = requiredRoles.some((r) => userRoles.includes(r));\n if (!hasRole) {\n throw new BadRequestException(\n `Access Denied: Required roles [${requiredRoles.join(', ')}]`\n );\n }\n }\n\n // Check Specific User\n if (req.userId && String(req.userId) !== String(userId)) {\n throw new BadRequestException('Access Denied: User mismatch.');\n }\n }\n\n /**\n * Evaluate simple JS expression securely\n * NOTE: In production, use a safe parser like 'json-logic-js' or vm2\n * For this phase, we use a simple Function constructor with restricted scope.\n */\n private evaluateCondition(\n expression: string,\n context: Record\n ): boolean {\n try {\n // Simple guard against malicious code (basic)\n if (expression.includes('process') || expression.includes('require')) {\n throw new Error('Unsafe expression detected');\n }\n\n // Create a function that returns the expression result\n // \"context\" is available inside the expression\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const func = new Function('context', `return ${expression};`);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n return !!func(context);\n } catch (error: unknown) {\n this.logger.error(\n `Condition Error: \"${expression}\" -> ${error instanceof Error ? error.message : String(error)}`\n );\n return false; // Fail safe\n }\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/91/rng_9185b5bf4adcd6c99f571f345039954e b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/91/rng_9185b5bf4adcd6c99f571f345039954e new file mode 100644 index 0000000..dd5ebd0 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/91/rng_9185b5bf4adcd6c99f571f345039954e @@ -0,0 +1,15 @@ +4dcc71217185c6c2dc7c0f5d3b7d21b1 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const crypto_1 = require("crypto"); +const rnds8Pool = new Uint8Array(256); +let poolPtr = rnds8Pool.length; +function rng() { + if (poolPtr > rnds8Pool.length - 16) { + (0, crypto_1.randomFillSync)(rnds8Pool); + poolPtr = 0; + } + return rnds8Pool.slice(poolPtr, (poolPtr += 16)); +} +exports.default = rng; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xccm5nLmpzIiwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUNiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNuQyxNQUFNLFNBQVMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QyxJQUFJLE9BQU8sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO0FBQy9CLFNBQVMsR0FBRztJQUNSLElBQUksT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDbEMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBQ0QsT0FBTyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xccm5nLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgY3J5cHRvXzEgPSByZXF1aXJlKFwiY3J5cHRvXCIpO1xuY29uc3Qgcm5kczhQb29sID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbmxldCBwb29sUHRyID0gcm5kczhQb29sLmxlbmd0aDtcbmZ1bmN0aW9uIHJuZygpIHtcbiAgICBpZiAocG9vbFB0ciA+IHJuZHM4UG9vbC5sZW5ndGggLSAxNikge1xuICAgICAgICAoMCwgY3J5cHRvXzEucmFuZG9tRmlsbFN5bmMpKHJuZHM4UG9vbCk7XG4gICAgICAgIHBvb2xQdHIgPSAwO1xuICAgIH1cbiAgICByZXR1cm4gcm5kczhQb29sLnNsaWNlKHBvb2xQdHIsIChwb29sUHRyICs9IDE2KSk7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBybmc7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/91/rng_9185b5bf4adcd6c99f571f345039954e.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/91/rng_9185b5bf4adcd6c99f571f345039954e.map new file mode 100644 index 0000000..d3c5abb --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/91/rng_9185b5bf4adcd6c99f571f345039954e.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\rng.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AACnC,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;AACtC,IAAI,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC;AAC/B,SAAS,GAAG;IACR,IAAI,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAClC,CAAC,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC,CAAC;QACxC,OAAO,GAAG,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;AACrD,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,GAAG,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\rng.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst crypto_1 = require(\"crypto\");\nconst rnds8Pool = new Uint8Array(256);\nlet poolPtr = rnds8Pool.length;\nfunction rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n (0, crypto_1.randomFillSync)(rnds8Pool);\n poolPtr = 0;\n }\n return rnds8Pool.slice(poolPtr, (poolPtr += 16));\n}\nexports.default = rng;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/91/v4_91908fa9c1f1402413509327d57a3d17 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/91/v4_91908fa9c1f1402413509327d57a3d17 new file mode 100644 index 0000000..bdb62ce --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/91/v4_91908fa9c1f1402413509327d57a3d17 @@ -0,0 +1,31 @@ +4107ffd41799cc491c407852a84c0110 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const native_js_1 = require("./native.js"); +const rng_js_1 = require("./rng.js"); +const stringify_js_1 = require("./stringify.js"); +function v4(options, buf, offset) { + if (native_js_1.default.randomUUID && !buf && !options) { + return native_js_1.default.randomUUID(); + } + options = options || {}; + const rnds = options.random ?? options.rng?.() ?? (0, rng_js_1.default)(); + if (rnds.length < 16) { + throw new Error('Random bytes length must be >= 16'); + } + rnds[6] = (rnds[6] & 0x0f) | 0x40; + rnds[8] = (rnds[8] & 0x3f) | 0x80; + if (buf) { + offset = offset || 0; + if (offset < 0 || offset + 16 > buf.length) { + throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`); + } + for (let i = 0; i < 16; ++i) { + buf[offset + i] = rnds[i]; + } + return buf; + } + return (0, stringify_js_1.unsafeStringify)(rnds); +} +exports.default = v4; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdjQuanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDO0FBQ2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQzNDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNyQyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUNqRCxTQUFTLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU07SUFDNUIsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JELE9BQU8sV0FBVyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsT0FBTyxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDeEIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUMxRSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ2xDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDbEMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNOLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBQ3JCLElBQUksTUFBTSxHQUFHLENBQUMsSUFBSSxNQUFNLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN6QyxNQUFNLElBQUksVUFBVSxDQUFDLG1CQUFtQixNQUFNLElBQUksTUFBTSxHQUFHLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztRQUM3RixDQUFDO1FBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzFCLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBQ0QsT0FBTyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdjQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBuYXRpdmVfanNfMSA9IHJlcXVpcmUoXCIuL25hdGl2ZS5qc1wiKTtcbmNvbnN0IHJuZ19qc18xID0gcmVxdWlyZShcIi4vcm5nLmpzXCIpO1xuY29uc3Qgc3RyaW5naWZ5X2pzXzEgPSByZXF1aXJlKFwiLi9zdHJpbmdpZnkuanNcIik7XG5mdW5jdGlvbiB2NChvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICAgIGlmIChuYXRpdmVfanNfMS5kZWZhdWx0LnJhbmRvbVVVSUQgJiYgIWJ1ZiAmJiAhb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmF0aXZlX2pzXzEuZGVmYXVsdC5yYW5kb21VVUlEKCk7XG4gICAgfVxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IHJuZHMgPSBvcHRpb25zLnJhbmRvbSA/PyBvcHRpb25zLnJuZz8uKCkgPz8gKDAsIHJuZ19qc18xLmRlZmF1bHQpKCk7XG4gICAgaWYgKHJuZHMubGVuZ3RoIDwgMTYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSYW5kb20gYnl0ZXMgbGVuZ3RoIG11c3QgYmUgPj0gMTYnKTtcbiAgICB9XG4gICAgcm5kc1s2XSA9IChybmRzWzZdICYgMHgwZikgfCAweDQwO1xuICAgIHJuZHNbOF0gPSAocm5kc1s4XSAmIDB4M2YpIHwgMHg4MDtcbiAgICBpZiAoYnVmKSB7XG4gICAgICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgKyAxNiA+IGJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBVVUlEIGJ5dGUgcmFuZ2UgJHtvZmZzZXR9OiR7b2Zmc2V0ICsgMTV9IGlzIG91dCBvZiBidWZmZXIgYm91bmRzYCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICAgICAgICBidWZbb2Zmc2V0ICsgaV0gPSBybmRzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWY7XG4gICAgfVxuICAgIHJldHVybiAoMCwgc3RyaW5naWZ5X2pzXzEudW5zYWZlU3RyaW5naWZ5KShybmRzKTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IHY0O1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/91/v4_91908fa9c1f1402413509327d57a3d17.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/91/v4_91908fa9c1f1402413509327d57a3d17.map new file mode 100644 index 0000000..d5066a0 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/91/v4_91908fa9c1f1402413509327d57a3d17.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v4.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACrC,MAAM,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AACjD,SAAS,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM;IAC5B,IAAI,WAAW,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QACrD,OAAO,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;IACxB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;IAC1E,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAClC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAClC,IAAI,GAAG,EAAE,CAAC;QACN,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC;QACrB,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;YACzC,MAAM,IAAI,UAAU,CAAC,mBAAmB,MAAM,IAAI,MAAM,GAAG,EAAE,0BAA0B,CAAC,CAAC;QAC7F,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1B,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IACD,OAAO,CAAC,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC;AACrD,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,EAAE,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v4.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst native_js_1 = require(\"./native.js\");\nconst rng_js_1 = require(\"./rng.js\");\nconst stringify_js_1 = require(\"./stringify.js\");\nfunction v4(options, buf, offset) {\n if (native_js_1.default.randomUUID && !buf && !options) {\n return native_js_1.default.randomUUID();\n }\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? (0, rng_js_1.default)();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return (0, stringify_js_1.unsafeStringify)(rnds);\n}\nexports.default = v4;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/93/jwtrefreshguard_93de3b0a08eb778599bcf4f333440a10 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/93/jwtrefreshguard_93de3b0a08eb778599bcf4f333440a10 new file mode 100644 index 0000000..07653ac --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/93/jwtrefreshguard_93de3b0a08eb778599bcf4f333440a10 @@ -0,0 +1,19 @@ +e82c4b744dda03fcded00886af48000c +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.JwtRefreshGuard = void 0; +const common_1 = require("@nestjs/common"); +const passport_1 = require("@nestjs/passport"); +let JwtRefreshGuard = class JwtRefreshGuard extends (0, passport_1.AuthGuard)('jwt-refresh') { +}; +exports.JwtRefreshGuard = JwtRefreshGuard; +exports.JwtRefreshGuard = JwtRefreshGuard = __decorate([ + (0, common_1.Injectable)() +], JwtRefreshGuard); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxndWFyZHNcXGp3dC1yZWZyZXNoLmd1YXJkLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLDJDQUE0QztBQUM1QywrQ0FBNkM7QUFHdEMsSUFBTSxlQUFlLEdBQXJCLE1BQU0sZUFBZ0IsU0FBUSxJQUFBLG9CQUFTLEVBQUMsYUFBYSxDQUFDO0NBQUcsQ0FBQTtBQUFuRCwwQ0FBZTswQkFBZixlQUFlO0lBRDNCLElBQUEsbUJBQVUsR0FBRTtHQUNBLGVBQWUsQ0FBb0MiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxndWFyZHNcXGp3dC1yZWZyZXNoLmd1YXJkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XG5pbXBvcnQgeyBBdXRoR3VhcmQgfSBmcm9tICdAbmVzdGpzL3Bhc3Nwb3J0JztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEp3dFJlZnJlc2hHdWFyZCBleHRlbmRzIEF1dGhHdWFyZCgnand0LXJlZnJlc2gnKSB7fVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/93/jwtrefreshguard_93de3b0a08eb778599bcf4f333440a10.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/93/jwtrefreshguard_93de3b0a08eb778599bcf4f333440a10.map new file mode 100644 index 0000000..8513e5b --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/93/jwtrefreshguard_93de3b0a08eb778599bcf4f333440a10.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\guards\\jwt-refresh.guard.ts","mappings":";;;;;;;;;AAAA,2CAA4C;AAC5C,+CAA6C;AAGtC,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,IAAA,oBAAS,EAAC,aAAa,CAAC;CAAG,CAAA;AAAnD,0CAAe;0BAAf,eAAe;IAD3B,IAAA,mBAAU,GAAE;GACA,eAAe,CAAoC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\guards\\jwt-refresh.guard.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { AuthGuard } from '@nestjs/passport';\n\n@Injectable()\nexport class JwtRefreshGuard extends AuthGuard('jwt-refresh') {}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/98/jsonschemaentity_98f89c5c1b7cc2c3d1aa088965d21d23 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/98/jsonschemaentity_98f89c5c1b7cc2c3d1aa088965d21d23 new file mode 100644 index 0000000..6c422f7 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/98/jsonschemaentity_98f89c5c1b7cc2c3d1aa088965d21d23 @@ -0,0 +1,69 @@ +e39388ae6bb9b4276d70001bc08b9a22 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.JsonSchema = void 0; +// File: src/modules/json-schema/entities/json-schema.entity.ts +const typeorm_1 = require("typeorm"); +let JsonSchema = class JsonSchema { +}; +exports.JsonSchema = JsonSchema; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], JsonSchema.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'schema_code', length: 100 }), + __metadata("design:type", String) +], JsonSchema.prototype, "schemaCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ default: 1 }), + __metadata("design:type", Number) +], JsonSchema.prototype, "version", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'table_name', length: 100, nullable: false }) // ✅ เพิ่ม: ระบุตารางเป้าหมาย + , + __metadata("design:type", String) +], JsonSchema.prototype, "tableName", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'schema_definition', type: 'json' }), + __metadata("design:type", typeof (_a = typeof Record !== "undefined" && Record) === "function" ? _a : Object) +], JsonSchema.prototype, "schemaDefinition", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'ui_schema', type: 'json', nullable: true }), + __metadata("design:type", typeof (_b = typeof Record !== "undefined" && Record) === "function" ? _b : Object) +], JsonSchema.prototype, "uiSchema", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'virtual_columns', type: 'json', nullable: true }), + __metadata("design:type", Array) +], JsonSchema.prototype, "virtualColumns", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'migration_script', type: 'json', nullable: true }), + __metadata("design:type", typeof (_c = typeof Record !== "undefined" && Record) === "function" ? _c : Object) +], JsonSchema.prototype, "migrationScript", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true }), + __metadata("design:type", Boolean) +], JsonSchema.prototype, "isActive", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_d = typeof Date !== "undefined" && Date) === "function" ? _d : Object) +], JsonSchema.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_e = typeof Date !== "undefined" && Date) === "function" ? _e : Object) +], JsonSchema.prototype, "updatedAt", void 0); +exports.JsonSchema = JsonSchema = __decorate([ + (0, typeorm_1.Entity)('json_schemas'), + (0, typeorm_1.Index)(['schemaCode', 'version'], { unique: true }) +], JsonSchema); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcanNvbi1zY2hlbWFcXGVudGl0aWVzXFxqc29uLXNjaGVtYS5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLCtEQUErRDtBQUMvRCxxQ0FPaUI7QUFZVixJQUFNLFVBQVUsR0FBaEIsTUFBTSxVQUFVO0NBaUN0QixDQUFBO0FBakNZLGdDQUFVO0FBRXJCO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7c0NBQ2I7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOzs4Q0FDekI7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7OzJDQUNOO0FBR2pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLDZCQUE2Qjs7OzZDQUN4RTtBQUduQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7a0RBQ2pDLE1BQU0sb0JBQU4sTUFBTTtvREFBa0I7QUFHM0M7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO2tEQUNqRCxNQUFNLG9CQUFOLE1BQU07NENBQWtCO0FBR25DO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOztrREFDM0I7QUFHdkM7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7a0RBQ2pELE1BQU0sb0JBQU4sTUFBTTttREFBa0I7QUFHMUM7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7NENBQzFCO0FBR25CO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDN0IsSUFBSSxvQkFBSixJQUFJOzZDQUFDO0FBR2pCO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDN0IsSUFBSSxvQkFBSixJQUFJOzZDQUFDO3FCQWhDTixVQUFVO0lBRnRCLElBQUEsZ0JBQU0sRUFBQyxjQUFjLENBQUM7SUFDdEIsSUFBQSxlQUFLLEVBQUMsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7R0FDdEMsVUFBVSxDQWlDdEIiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcanNvbi1zY2hlbWFcXGVudGl0aWVzXFxqc29uLXNjaGVtYS5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRmlsZTogc3JjL21vZHVsZXMvanNvbi1zY2hlbWEvZW50aXRpZXMvanNvbi1zY2hlbWEuZW50aXR5LnRzXHJcbmltcG9ydCB7XHJcbiAgRW50aXR5LFxyXG4gIENvbHVtbixcclxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxyXG4gIENyZWF0ZURhdGVDb2x1bW4sXHJcbiAgVXBkYXRlRGF0ZUNvbHVtbixcclxuICBJbmRleCxcclxufSBmcm9tICd0eXBlb3JtJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVmlydHVhbENvbHVtbkNvbmZpZyB7XHJcbiAganNvblBhdGg6IHN0cmluZztcclxuICBjb2x1bW5OYW1lOiBzdHJpbmc7XHJcbiAgZGF0YVR5cGU6ICdJTlQnIHwgJ1ZBUkNIQVInIHwgJ0JPT0xFQU4nIHwgJ0RBVEUnIHwgJ0RFQ0lNQUwnIHwgJ0RBVEVUSU1FJztcclxuICBpbmRleFR5cGU/OiAnSU5ERVgnIHwgJ1VOSVFVRScgfCAnRlVMTFRFWFQnO1xyXG4gIGlzUmVxdWlyZWQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbkBFbnRpdHkoJ2pzb25fc2NoZW1hcycpXHJcbkBJbmRleChbJ3NjaGVtYUNvZGUnLCAndmVyc2lvbiddLCB7IHVuaXF1ZTogdHJ1ZSB9KVxyXG5leHBvcnQgY2xhc3MgSnNvblNjaGVtYSB7XHJcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxyXG4gIGlkITogbnVtYmVyO1xyXG5cclxuICBAQ29sdW1uKHsgbmFtZTogJ3NjaGVtYV9jb2RlJywgbGVuZ3RoOiAxMDAgfSlcclxuICBzY2hlbWFDb2RlITogc3RyaW5nO1xyXG5cclxuICBAQ29sdW1uKHsgZGVmYXVsdDogMSB9KVxyXG4gIHZlcnNpb24hOiBudW1iZXI7XHJcblxyXG4gIEBDb2x1bW4oeyBuYW1lOiAndGFibGVfbmFtZScsIGxlbmd0aDogMTAwLCBudWxsYWJsZTogZmFsc2UgfSkgLy8g4pyFIOC5gOC4nuC4tOC5iOC4oTog4Lij4Liw4Lia4Li44LiV4Liy4Lij4Liy4LiH4LmA4Lib4LmJ4Liy4Lir4Lih4Liy4LiiXHJcbiAgdGFibGVOYW1lITogc3RyaW5nO1xyXG5cclxuICBAQ29sdW1uKHsgbmFtZTogJ3NjaGVtYV9kZWZpbml0aW9uJywgdHlwZTogJ2pzb24nIH0pXHJcbiAgc2NoZW1hRGVmaW5pdGlvbiE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG5cclxuICBAQ29sdW1uKHsgbmFtZTogJ3VpX3NjaGVtYScsIHR5cGU6ICdqc29uJywgbnVsbGFibGU6IHRydWUgfSlcclxuICB1aVNjaGVtYT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG5cclxuICBAQ29sdW1uKHsgbmFtZTogJ3ZpcnR1YWxfY29sdW1ucycsIHR5cGU6ICdqc29uJywgbnVsbGFibGU6IHRydWUgfSlcclxuICB2aXJ0dWFsQ29sdW1ucz86IFZpcnR1YWxDb2x1bW5Db25maWdbXTtcclxuXHJcbiAgQENvbHVtbih7IG5hbWU6ICdtaWdyYXRpb25fc2NyaXB0JywgdHlwZTogJ2pzb24nLCBudWxsYWJsZTogdHJ1ZSB9KVxyXG4gIG1pZ3JhdGlvblNjcmlwdD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG5cclxuICBAQ29sdW1uKHsgbmFtZTogJ2lzX2FjdGl2ZScsIGRlZmF1bHQ6IHRydWUgfSlcclxuICBpc0FjdGl2ZSE6IGJvb2xlYW47XHJcblxyXG4gIEBDcmVhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXHJcbiAgY3JlYXRlZEF0ITogRGF0ZTtcclxuXHJcbiAgQFVwZGF0ZURhdGVDb2x1bW4oeyBuYW1lOiAndXBkYXRlZF9hdCcgfSlcclxuICB1cGRhdGVkQXQhOiBEYXRlO1xyXG59XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/98/jsonschemaentity_98f89c5c1b7cc2c3d1aa088965d21d23.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/98/jsonschemaentity_98f89c5c1b7cc2c3d1aa088965d21d23.map new file mode 100644 index 0000000..8847c89 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/98/jsonschemaentity_98f89c5c1b7cc2c3d1aa088965d21d23.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\entities\\json-schema.entity.ts","mappings":";;;;;;;;;;;;;AAAA,+DAA+D;AAC/D,qCAOiB;AAYV,IAAM,UAAU,GAAhB,MAAM,UAAU;CAiCtB,CAAA;AAjCY,gCAAU;AAErB;IADC,IAAA,gCAAsB,GAAE;;sCACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;8CACzB;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;2CACN;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,6BAA6B;;;6CACxE;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;kDACjC,MAAM,oBAAN,MAAM;oDAAkB;AAG3C;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACjD,MAAM,oBAAN,MAAM;4CAAkB;AAGnC;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kDAC3B;AAGvC;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACjD,MAAM,oBAAN,MAAM;mDAAkB;AAG1C;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;4CAC1B;AAGnB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;6CAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;6CAAC;qBAhCN,UAAU;IAFtB,IAAA,gBAAM,EAAC,cAAc,CAAC;IACtB,IAAA,eAAK,EAAC,CAAC,YAAY,EAAE,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;GACtC,UAAU,CAiCtB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\entities\\json-schema.entity.ts"],"sourcesContent":["// File: src/modules/json-schema/entities/json-schema.entity.ts\r\nimport {\r\n Entity,\r\n Column,\r\n PrimaryGeneratedColumn,\r\n CreateDateColumn,\r\n UpdateDateColumn,\r\n Index,\r\n} from 'typeorm';\r\n\r\nexport interface VirtualColumnConfig {\r\n jsonPath: string;\r\n columnName: string;\r\n dataType: 'INT' | 'VARCHAR' | 'BOOLEAN' | 'DATE' | 'DECIMAL' | 'DATETIME';\r\n indexType?: 'INDEX' | 'UNIQUE' | 'FULLTEXT';\r\n isRequired: boolean;\r\n}\r\n\r\n@Entity('json_schemas')\r\n@Index(['schemaCode', 'version'], { unique: true })\r\nexport class JsonSchema {\r\n @PrimaryGeneratedColumn()\r\n id!: number;\r\n\r\n @Column({ name: 'schema_code', length: 100 })\r\n schemaCode!: string;\r\n\r\n @Column({ default: 1 })\r\n version!: number;\r\n\r\n @Column({ name: 'table_name', length: 100, nullable: false }) // ✅ เพิ่ม: ระบุตารางเป้าหมาย\r\n tableName!: string;\r\n\r\n @Column({ name: 'schema_definition', type: 'json' })\r\n schemaDefinition!: Record;\r\n\r\n @Column({ name: 'ui_schema', type: 'json', nullable: true })\r\n uiSchema?: Record;\r\n\r\n @Column({ name: 'virtual_columns', type: 'json', nullable: true })\r\n virtualColumns?: VirtualColumnConfig[];\r\n\r\n @Column({ name: 'migration_script', type: 'json', nullable: true })\r\n migrationScript?: Record;\r\n\r\n @Column({ name: 'is_active', default: true })\r\n isActive!: boolean;\r\n\r\n @CreateDateColumn({ name: 'created_at' })\r\n createdAt!: Date;\r\n\r\n @UpdateDateColumn({ name: 'updated_at' })\r\n updatedAt!: Date;\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/99/correspondencetypeentity_997ac5f038b75f4cd42c9c3e9e2adef7 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/99/correspondencetypeentity_997ac5f038b75f4cd42c9c3e9e2adef7 new file mode 100644 index 0000000..c1e3465 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/99/correspondencetypeentity_997ac5f038b75f4cd42c9c3e9e2adef7 @@ -0,0 +1,41 @@ +688f6163b48210e8a7ecc58566c1199a +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceType = void 0; +const typeorm_1 = require("typeorm"); +let CorrespondenceType = class CorrespondenceType { +}; +exports.CorrespondenceType = CorrespondenceType; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], CorrespondenceType.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'type_code', unique: true, length: 50 }), + __metadata("design:type", String) +], CorrespondenceType.prototype, "typeCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'type_name', length: 255 }), + __metadata("design:type", String) +], CorrespondenceType.prototype, "typeName", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sort_order', default: 0 }), + __metadata("design:type", Number) +], CorrespondenceType.prototype, "sortOrder", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true, type: 'tinyint' }), + __metadata("design:type", Boolean) +], CorrespondenceType.prototype, "isActive", void 0); +exports.CorrespondenceType = CorrespondenceType = __decorate([ + (0, typeorm_1.Entity)('correspondence_types') +], CorrespondenceType); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGVudGl0aWVzXFxjb3JyZXNwb25kZW5jZS10eXBlLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBaUU7QUFHMUQsSUFBTSxrQkFBa0IsR0FBeEIsTUFBTSxrQkFBa0I7Q0FlOUIsQ0FBQTtBQWZZLGdEQUFrQjtBQUU3QjtJQURDLElBQUEsZ0NBQXNCLEdBQUU7OzhDQUNiO0FBR1o7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDOztvREFDdEM7QUFHbEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7b0RBQ3pCO0FBR2xCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7O3FEQUN4QjtBQUduQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7O29EQUMzQzs2QkFkUixrQkFBa0I7SUFEOUIsSUFBQSxnQkFBTSxFQUFDLHNCQUFzQixDQUFDO0dBQ2xCLGtCQUFrQixDQWU5QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxjb3JyZXNwb25kZW5jZVxcZW50aXRpZXNcXGNvcnJlc3BvbmRlbmNlLXR5cGUuZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudGl0eSwgQ29sdW1uLCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uIH0gZnJvbSAndHlwZW9ybSc7XG5cbkBFbnRpdHkoJ2NvcnJlc3BvbmRlbmNlX3R5cGVzJylcbmV4cG9ydCBjbGFzcyBDb3JyZXNwb25kZW5jZVR5cGUge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIGlkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAndHlwZV9jb2RlJywgdW5pcXVlOiB0cnVlLCBsZW5ndGg6IDUwIH0pXG4gIHR5cGVDb2RlITogc3RyaW5nOyAvLyDguYDguIrguYjguJkgUkZBLCBSRkksIExFVFRFUlxuXG4gIEBDb2x1bW4oeyBuYW1lOiAndHlwZV9uYW1lJywgbGVuZ3RoOiAyNTUgfSlcbiAgdHlwZU5hbWUhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdzb3J0X29yZGVyJywgZGVmYXVsdDogMCB9KVxuICBzb3J0T3JkZXIhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdpc19hY3RpdmUnLCBkZWZhdWx0OiB0cnVlLCB0eXBlOiAndGlueWludCcgfSlcbiAgaXNBY3RpdmUhOiBib29sZWFuO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/99/correspondencetypeentity_997ac5f038b75f4cd42c9c3e9e2adef7.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/99/correspondencetypeentity_997ac5f038b75f4cd42c9c3e9e2adef7.map new file mode 100644 index 0000000..f61c10f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/99/correspondencetypeentity_997ac5f038b75f4cd42c9c3e9e2adef7.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-type.entity.ts","mappings":";;;;;;;;;;;;AAAA,qCAAiE;AAG1D,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;CAe9B,CAAA;AAfY,gDAAkB;AAE7B;IADC,IAAA,gCAAsB,GAAE;;8CACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;oDACtC;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;oDACzB;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;qDACxB;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;oDAC3C;6BAdR,kBAAkB;IAD9B,IAAA,gBAAM,EAAC,sBAAsB,CAAC;GAClB,kBAAkB,CAe9B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-type.entity.ts"],"sourcesContent":["import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';\n\n@Entity('correspondence_types')\nexport class CorrespondenceType {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'type_code', unique: true, length: 50 })\n typeCode!: string; // เช่น RFA, RFI, LETTER\n\n @Column({ name: 'type_name', length: 255 })\n typeName!: string;\n\n @Column({ name: 'sort_order', default: 0 })\n sortOrder!: number;\n\n @Column({ name: 'is_active', default: true, type: 'tinyint' })\n isActive!: boolean;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/99/createprojectdto_9915d0c26c54bc0d6f46c43fd4f57da3 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/99/createprojectdto_9915d0c26c54bc0d6f46c43fd4f57da3 new file mode 100644 index 0000000..5be4ddc --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/99/createprojectdto_9915d0c26c54bc0d6f46c43fd4f57da3 @@ -0,0 +1,33 @@ +7b24aae96ff0c3174dd008b159ff6fdc +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CreateProjectDto = void 0; +const class_validator_1 = require("class-validator"); +class CreateProjectDto { +} +exports.CreateProjectDto = CreateProjectDto; +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], CreateProjectDto.prototype, "projectCode", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], CreateProjectDto.prototype, "projectName", void 0); +__decorate([ + (0, class_validator_1.IsBoolean)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Boolean) +], CreateProjectDto.prototype, "isActive", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccHJvamVjdFxcZHRvXFxjcmVhdGUtcHJvamVjdC5kdG8udHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEscURBQThFO0FBRTlFLE1BQWEsZ0JBQWdCO0NBWTVCO0FBWkQsNENBWUM7QUFUQztJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7cURBQ1E7QUFJckI7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7O3FEQUNRO0FBSXJCO0lBRkMsSUFBQSwyQkFBUyxHQUFFO0lBQ1gsSUFBQSw0QkFBVSxHQUFFOztrREFDTSIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxwcm9qZWN0XFxkdG9cXGNyZWF0ZS1wcm9qZWN0LmR0by50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJc1N0cmluZywgSXNOb3RFbXB0eSwgSXNPcHRpb25hbCwgSXNCb29sZWFuIH0gZnJvbSAnY2xhc3MtdmFsaWRhdG9yJztcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVByb2plY3REdG8ge1xuICBASXNTdHJpbmcoKVxuICBASXNOb3RFbXB0eSgpXG4gIHByb2plY3RDb2RlITogc3RyaW5nOyAvLyDguKPguKvguLHguKrguYLguITguKPguIfguIHguLLguKMgKOC5gOC4iuC5iOC4mSBMQ0JQMylcblxuICBASXNTdHJpbmcoKVxuICBASXNOb3RFbXB0eSgpXG4gIHByb2plY3ROYW1lITogc3RyaW5nOyAvLyDguIrguLfguYjguK3guYLguITguKPguIfguIHguLLguKNcblxuICBASXNCb29sZWFuKClcbiAgQElzT3B0aW9uYWwoKVxuICBpc0FjdGl2ZT86IGJvb2xlYW47IC8vIOC4quC4luC4suC4meC4sOC4geC4suC4o+C5g+C4iuC5ieC4h+C4suC4mSAoRGVmYXVsdDogdHJ1ZSlcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/99/createprojectdto_9915d0c26c54bc0d6f46c43fd4f57da3.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/99/createprojectdto_9915d0c26c54bc0d6f46c43fd4f57da3.map new file mode 100644 index 0000000..8cf8881 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/99/createprojectdto_9915d0c26c54bc0d6f46c43fd4f57da3.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\project\\dto\\create-project.dto.ts","mappings":";;;;;;;;;;;;AAAA,qDAA8E;AAE9E,MAAa,gBAAgB;CAY5B;AAZD,4CAYC;AATC;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;qDACQ;AAIrB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;qDACQ;AAIrB;IAFC,IAAA,2BAAS,GAAE;IACX,IAAA,4BAAU,GAAE;;kDACM","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\project\\dto\\create-project.dto.ts"],"sourcesContent":["import { IsString, IsNotEmpty, IsOptional, IsBoolean } from 'class-validator';\n\nexport class CreateProjectDto {\n @IsString()\n @IsNotEmpty()\n projectCode!: string; // รหัสโครงการ (เช่น LCBP3)\n\n @IsString()\n @IsNotEmpty()\n projectName!: string; // ชื่อโครงการ\n\n @IsBoolean()\n @IsOptional()\n isActive?: boolean; // สถานะการใช้งาน (Default: true)\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/99/parseuuidpipespec_99d299cb6228d815df5dc89951f747ab b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/99/parseuuidpipespec_99d299cb6228d815df5dc89951f747ab new file mode 100644 index 0000000..1e9dd83 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/99/parseuuidpipespec_99d299cb6228d815df5dc89951f747ab @@ -0,0 +1,71 @@ +13c5a10d242dcb21fd76c7d8b6c864a9 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +// Mock uuid module to avoid ESM import issue with uuid@13 +jest.mock('uuid', () => ({ + validate: (str) => /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(str), + v7: () => '01912345-6789-7abc-8def-0123456789ab', +})); +const common_1 = require("@nestjs/common"); +const parse_uuid_pipe_1 = require("./parse-uuid.pipe"); +describe('ParseUuidPipe', () => { + let pipe; + beforeEach(() => { + pipe = new parse_uuid_pipe_1.ParseUuidPipe(); + }); + // ========================================================== + // Valid UUIDs + // ========================================================== + describe('valid UUIDs', () => { + it('should accept a valid UUIDv4 and return lowercase', () => { + const uuid = 'a1b2c3d4-e5f6-4789-abcd-ef0123456789'; + expect(pipe.transform(uuid)).toBe(uuid); + }); + it('should accept a valid UUIDv7 and return lowercase', () => { + const uuid = '01912345-6789-7abc-8def-0123456789ab'; + expect(pipe.transform(uuid)).toBe(uuid); + }); + it('should accept a valid UUIDv1 (MariaDB DEFAULT)', () => { + const uuid = '550e8400-e29b-11d4-a716-446655440000'; + expect(pipe.transform(uuid)).toBe(uuid); + }); + it('should normalize uppercase UUID to lowercase', () => { + const uuid = 'A1B2C3D4-E5F6-4789-ABCD-EF0123456789'; + expect(pipe.transform(uuid)).toBe(uuid.toLowerCase()); + }); + it('should normalize mixed case UUID to lowercase', () => { + const uuid = 'a1B2c3D4-e5F6-4789-AbCd-eF0123456789'; + expect(pipe.transform(uuid)).toBe(uuid.toLowerCase()); + }); + }); + // ========================================================== + // Invalid inputs + // ========================================================== + describe('invalid inputs', () => { + it('should throw BadRequestException for empty string', () => { + expect(() => pipe.transform('')).toThrow(common_1.BadRequestException); + }); + it('should throw BadRequestException for random string', () => { + expect(() => pipe.transform('not-a-uuid')).toThrow(common_1.BadRequestException); + }); + it('should throw BadRequestException for numeric string', () => { + expect(() => pipe.transform('12345')).toThrow(common_1.BadRequestException); + }); + it('should throw BadRequestException for UUID without hyphens', () => { + expect(() => pipe.transform('a1b2c3d4e5f64789abcdef0123456789')).toThrow(common_1.BadRequestException); + }); + it('should throw BadRequestException for UUID with extra characters', () => { + expect(() => pipe.transform('a1b2c3d4-e5f6-4789-abcd-ef0123456789-extra')).toThrow(common_1.BadRequestException); + }); + it('should include the invalid value in error message', () => { + try { + pipe.transform('bad-value'); + fail('Should have thrown'); + } + catch (error) { + expect(error.message).toContain('bad-value'); + } + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxwaXBlc1xccGFyc2UtdXVpZC5waXBlLnNwZWMudHMiLCJtYXBwaW5ncyI6Ijs7QUFHQSwwREFBMEQ7QUFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUN2QixRQUFRLEVBQUUsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUN4QixpRUFBaUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQzdFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxzQ0FBc0M7Q0FDakQsQ0FBQyxDQUFDLENBQUM7QUFSSiwyQ0FBcUQ7QUFDckQsdURBQWtEO0FBU2xELFFBQVEsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFO0lBQzdCLElBQUksSUFBbUIsQ0FBQztJQUV4QixVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsSUFBSSxHQUFHLElBQUksK0JBQWEsRUFBRSxDQUFDO0lBQzdCLENBQUMsQ0FBQyxDQUFDO0lBRUgsNkRBQTZEO0lBQzdELGNBQWM7SUFDZCw2REFBNkQ7SUFFN0QsUUFBUSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUU7UUFDM0IsRUFBRSxDQUFDLG1EQUFtRCxFQUFFLEdBQUcsRUFBRTtZQUMzRCxNQUFNLElBQUksR0FBRyxzQ0FBc0MsQ0FBQztZQUNwRCxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxtREFBbUQsRUFBRSxHQUFHLEVBQUU7WUFDM0QsTUFBTSxJQUFJLEdBQUcsc0NBQXNDLENBQUM7WUFDcEQsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0RBQWdELEVBQUUsR0FBRyxFQUFFO1lBQ3hELE1BQU0sSUFBSSxHQUFHLHNDQUFzQyxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDhDQUE4QyxFQUFFLEdBQUcsRUFBRTtZQUN0RCxNQUFNLElBQUksR0FBRyxzQ0FBc0MsQ0FBQztZQUNwRCxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN4RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywrQ0FBK0MsRUFBRSxHQUFHLEVBQUU7WUFDdkQsTUFBTSxJQUFJLEdBQUcsc0NBQXNDLENBQUM7WUFDcEQsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDeEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILDZEQUE2RDtJQUM3RCxpQkFBaUI7SUFDakIsNkRBQTZEO0lBRTdELFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUU7UUFDOUIsRUFBRSxDQUFDLG1EQUFtRCxFQUFFLEdBQUcsRUFBRTtZQUMzRCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyw0QkFBbUIsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLEdBQUcsRUFBRTtZQUM1RCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyw0QkFBbUIsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHFEQUFxRCxFQUFFLEdBQUcsRUFBRTtZQUM3RCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyw0QkFBbUIsQ0FBQyxDQUFDO1FBQ3JFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDJEQUEyRCxFQUFFLEdBQUcsRUFBRTtZQUNuRSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUN0RSw0QkFBbUIsQ0FDcEIsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGlFQUFpRSxFQUFFLEdBQUcsRUFBRTtZQUN6RSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQ1YsSUFBSSxDQUFDLFNBQVMsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUM3RCxDQUFDLE9BQU8sQ0FBQyw0QkFBbUIsQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1EQUFtRCxFQUFFLEdBQUcsRUFBRTtZQUMzRCxJQUFJLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDN0IsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxDQUFFLEtBQTZCLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3hFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxwaXBlc1xccGFyc2UtdXVpZC5waXBlLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFkUmVxdWVzdEV4Y2VwdGlvbiB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcbmltcG9ydCB7IFBhcnNlVXVpZFBpcGUgfSBmcm9tICcuL3BhcnNlLXV1aWQucGlwZSc7XG5cbi8vIE1vY2sgdXVpZCBtb2R1bGUgdG8gYXZvaWQgRVNNIGltcG9ydCBpc3N1ZSB3aXRoIHV1aWRAMTNcbmplc3QubW9jaygndXVpZCcsICgpID0+ICh7XG4gIHZhbGlkYXRlOiAoc3RyOiBzdHJpbmcpID0+XG4gICAgL15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kL2kudGVzdChzdHIpLFxuICB2NzogKCkgPT4gJzAxOTEyMzQ1LTY3ODktN2FiYy04ZGVmLTAxMjM0NTY3ODlhYicsXG59KSk7XG5cbmRlc2NyaWJlKCdQYXJzZVV1aWRQaXBlJywgKCkgPT4ge1xuICBsZXQgcGlwZTogUGFyc2VVdWlkUGlwZTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBwaXBlID0gbmV3IFBhcnNlVXVpZFBpcGUoKTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBWYWxpZCBVVUlEc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZGVzY3JpYmUoJ3ZhbGlkIFVVSURzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYWNjZXB0IGEgdmFsaWQgVVVJRHY0IGFuZCByZXR1cm4gbG93ZXJjYXNlJywgKCkgPT4ge1xuICAgICAgY29uc3QgdXVpZCA9ICdhMWIyYzNkNC1lNWY2LTQ3ODktYWJjZC1lZjAxMjM0NTY3ODknO1xuICAgICAgZXhwZWN0KHBpcGUudHJhbnNmb3JtKHV1aWQpKS50b0JlKHV1aWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgYSB2YWxpZCBVVUlEdjcgYW5kIHJldHVybiBsb3dlcmNhc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB1dWlkID0gJzAxOTEyMzQ1LTY3ODktN2FiYy04ZGVmLTAxMjM0NTY3ODlhYic7XG4gICAgICBleHBlY3QocGlwZS50cmFuc2Zvcm0odXVpZCkpLnRvQmUodXVpZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBhIHZhbGlkIFVVSUR2MSAoTWFyaWFEQiBERUZBVUxUKScsICgpID0+IHtcbiAgICAgIGNvbnN0IHV1aWQgPSAnNTUwZTg0MDAtZTI5Yi0xMWQ0LWE3MTYtNDQ2NjU1NDQwMDAwJztcbiAgICAgIGV4cGVjdChwaXBlLnRyYW5zZm9ybSh1dWlkKSkudG9CZSh1dWlkKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm9ybWFsaXplIHVwcGVyY2FzZSBVVUlEIHRvIGxvd2VyY2FzZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHV1aWQgPSAnQTFCMkMzRDQtRTVGNi00Nzg5LUFCQ0QtRUYwMTIzNDU2Nzg5JztcbiAgICAgIGV4cGVjdChwaXBlLnRyYW5zZm9ybSh1dWlkKSkudG9CZSh1dWlkLnRvTG93ZXJDYXNlKCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3JtYWxpemUgbWl4ZWQgY2FzZSBVVUlEIHRvIGxvd2VyY2FzZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHV1aWQgPSAnYTFCMmMzRDQtZTVGNi00Nzg5LUFiQ2QtZUYwMTIzNDU2Nzg5JztcbiAgICAgIGV4cGVjdChwaXBlLnRyYW5zZm9ybSh1dWlkKSkudG9CZSh1dWlkLnRvTG93ZXJDYXNlKCkpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEludmFsaWQgaW5wdXRzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBkZXNjcmliZSgnaW52YWxpZCBpbnB1dHMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBCYWRSZXF1ZXN0RXhjZXB0aW9uIGZvciBlbXB0eSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4gcGlwZS50cmFuc2Zvcm0oJycpKS50b1Rocm93KEJhZFJlcXVlc3RFeGNlcHRpb24pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBCYWRSZXF1ZXN0RXhjZXB0aW9uIGZvciByYW5kb20gc3RyaW5nJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KCgpID0+IHBpcGUudHJhbnNmb3JtKCdub3QtYS11dWlkJykpLnRvVGhyb3coQmFkUmVxdWVzdEV4Y2VwdGlvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IEJhZFJlcXVlc3RFeGNlcHRpb24gZm9yIG51bWVyaWMgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KCgpID0+IHBpcGUudHJhbnNmb3JtKCcxMjM0NScpKS50b1Rocm93KEJhZFJlcXVlc3RFeGNlcHRpb24pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBCYWRSZXF1ZXN0RXhjZXB0aW9uIGZvciBVVUlEIHdpdGhvdXQgaHlwaGVucycsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PiBwaXBlLnRyYW5zZm9ybSgnYTFiMmMzZDRlNWY2NDc4OWFiY2RlZjAxMjM0NTY3ODknKSkudG9UaHJvdyhcbiAgICAgICAgQmFkUmVxdWVzdEV4Y2VwdGlvblxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgQmFkUmVxdWVzdEV4Y2VwdGlvbiBmb3IgVVVJRCB3aXRoIGV4dHJhIGNoYXJhY3RlcnMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT5cbiAgICAgICAgcGlwZS50cmFuc2Zvcm0oJ2ExYjJjM2Q0LWU1ZjYtNDc4OS1hYmNkLWVmMDEyMzQ1Njc4OS1leHRyYScpXG4gICAgICApLnRvVGhyb3coQmFkUmVxdWVzdEV4Y2VwdGlvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGluY2x1ZGUgdGhlIGludmFsaWQgdmFsdWUgaW4gZXJyb3IgbWVzc2FnZScsICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBpcGUudHJhbnNmb3JtKCdiYWQtdmFsdWUnKTtcbiAgICAgICAgZmFpbCgnU2hvdWxkIGhhdmUgdGhyb3duJyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBleHBlY3QoKGVycm9yIGFzIEJhZFJlcXVlc3RFeGNlcHRpb24pLm1lc3NhZ2UpLnRvQ29udGFpbignYmFkLXZhbHVlJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/99/parseuuidpipespec_99d299cb6228d815df5dc89951f747ab.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/99/parseuuidpipespec_99d299cb6228d815df5dc89951f747ab.map new file mode 100644 index 0000000..fc4014c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/99/parseuuidpipespec_99d299cb6228d815df5dc89951f747ab.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\pipes\\parse-uuid.pipe.spec.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\pipes\\parse-uuid.pipe.spec.ts"],"sourcesContent":["import { BadRequestException } from '@nestjs/common';\nimport { ParseUuidPipe } from './parse-uuid.pipe';\n\n// Mock uuid module to avoid ESM import issue with uuid@13\njest.mock('uuid', () => ({\n validate: (str: string) =>\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(str),\n v7: () => '01912345-6789-7abc-8def-0123456789ab',\n}));\n\ndescribe('ParseUuidPipe', () => {\n let pipe: ParseUuidPipe;\n\n beforeEach(() => {\n pipe = new ParseUuidPipe();\n });\n\n // ==========================================================\n // Valid UUIDs\n // ==========================================================\n\n describe('valid UUIDs', () => {\n it('should accept a valid UUIDv4 and return lowercase', () => {\n const uuid = 'a1b2c3d4-e5f6-4789-abcd-ef0123456789';\n expect(pipe.transform(uuid)).toBe(uuid);\n });\n\n it('should accept a valid UUIDv7 and return lowercase', () => {\n const uuid = '01912345-6789-7abc-8def-0123456789ab';\n expect(pipe.transform(uuid)).toBe(uuid);\n });\n\n it('should accept a valid UUIDv1 (MariaDB DEFAULT)', () => {\n const uuid = '550e8400-e29b-11d4-a716-446655440000';\n expect(pipe.transform(uuid)).toBe(uuid);\n });\n\n it('should normalize uppercase UUID to lowercase', () => {\n const uuid = 'A1B2C3D4-E5F6-4789-ABCD-EF0123456789';\n expect(pipe.transform(uuid)).toBe(uuid.toLowerCase());\n });\n\n it('should normalize mixed case UUID to lowercase', () => {\n const uuid = 'a1B2c3D4-e5F6-4789-AbCd-eF0123456789';\n expect(pipe.transform(uuid)).toBe(uuid.toLowerCase());\n });\n });\n\n // ==========================================================\n // Invalid inputs\n // ==========================================================\n\n describe('invalid inputs', () => {\n it('should throw BadRequestException for empty string', () => {\n expect(() => pipe.transform('')).toThrow(BadRequestException);\n });\n\n it('should throw BadRequestException for random string', () => {\n expect(() => pipe.transform('not-a-uuid')).toThrow(BadRequestException);\n });\n\n it('should throw BadRequestException for numeric string', () => {\n expect(() => pipe.transform('12345')).toThrow(BadRequestException);\n });\n\n it('should throw BadRequestException for UUID without hyphens', () => {\n expect(() => pipe.transform('a1b2c3d4e5f64789abcdef0123456789')).toThrow(\n BadRequestException\n );\n });\n\n it('should throw BadRequestException for UUID with extra characters', () => {\n expect(() =>\n pipe.transform('a1b2c3d4-e5f6-4789-abcd-ef0123456789-extra')\n ).toThrow(BadRequestException);\n });\n\n it('should include the invalid value in error message', () => {\n try {\n pipe.transform('bad-value');\n fail('Should have thrown');\n } catch (error) {\n expect((error as BadRequestException).message).toContain('bad-value');\n }\n });\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9a/searchjsonschemadto_9a77995363a030e6d1582008441b405e b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9a/searchjsonschemadto_9a77995363a030e6d1582008441b405e new file mode 100644 index 0000000..985f2c1 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9a/searchjsonschemadto_9a77995363a030e6d1582008441b405e @@ -0,0 +1,52 @@ +7e124beec9cd746e0a8515ac0bacdd03 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SearchJsonSchemaDto = void 0; +const class_validator_1 = require("class-validator"); +const class_transformer_1 = require("class-transformer"); +class SearchJsonSchemaDto { + constructor() { + this.page = 1; + this.limit = 20; + } +} +exports.SearchJsonSchemaDto = SearchJsonSchemaDto; +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], SearchJsonSchemaDto.prototype, "search", void 0); +__decorate([ + (0, class_validator_1.IsBoolean)(), + (0, class_validator_1.IsOptional)(), + (0, class_transformer_1.Transform)(({ value }) => { + if (value === 'true') + return true; + if (value === 'false') + return false; + return value; + }), + __metadata("design:type", Boolean) +], SearchJsonSchemaDto.prototype, "isActive", void 0); +__decorate([ + (0, class_validator_1.IsOptional)(), + (0, class_validator_1.IsInt)(), + (0, class_transformer_1.Type)(() => Number), + __metadata("design:type", Number) +], SearchJsonSchemaDto.prototype, "page", void 0); +__decorate([ + (0, class_validator_1.IsOptional)(), + (0, class_validator_1.IsInt)(), + (0, class_transformer_1.Type)(() => Number), + __metadata("design:type", Number) +], SearchJsonSchemaDto.prototype, "limit", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcanNvbi1zY2hlbWFcXGR0b1xcc2VhcmNoLWpzb24tc2NoZW1hLmR0by50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxxREFBeUU7QUFDekUseURBQW9EO0FBRXBELE1BQWEsbUJBQW1CO0lBQWhDO1FBaUJFLFNBQUksR0FBVyxDQUFDLENBQUM7UUFLakIsVUFBSyxHQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0NBQUE7QUF2QkQsa0RBdUJDO0FBcEJDO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzttREFDRztBQVNoQjtJQVBDLElBQUEsMkJBQVMsR0FBRTtJQUNYLElBQUEsNEJBQVUsR0FBRTtJQUNaLElBQUEsNkJBQVMsRUFBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtRQUN2QixJQUFJLEtBQUssS0FBSyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDbEMsSUFBSSxLQUFLLEtBQUssT0FBTztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3BDLE9BQU8sS0FBNEIsQ0FBQztJQUN0QyxDQUFDLENBQUM7O3FEQUNpQjtBQUtuQjtJQUhDLElBQUEsNEJBQVUsR0FBRTtJQUNaLElBQUEsdUJBQUssR0FBRTtJQUNQLElBQUEsd0JBQUksRUFBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7O2lEQUNGO0FBS2pCO0lBSEMsSUFBQSw0QkFBVSxHQUFFO0lBQ1osSUFBQSx1QkFBSyxHQUFFO0lBQ1AsSUFBQSx3QkFBSSxFQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQzs7a0RBQ0EiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcanNvbi1zY2hlbWFcXGR0b1xcc2VhcmNoLWpzb24tc2NoZW1hLmR0by50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJc1N0cmluZywgSXNPcHRpb25hbCwgSXNCb29sZWFuLCBJc0ludCB9IGZyb20gJ2NsYXNzLXZhbGlkYXRvcic7XG5pbXBvcnQgeyBUeXBlLCBUcmFuc2Zvcm0gfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hKc29uU2NoZW1hRHRvIHtcbiAgQElzU3RyaW5nKClcbiAgQElzT3B0aW9uYWwoKVxuICBzZWFyY2g/OiBzdHJpbmc7IC8vIOC4hOC5ieC4meC4q+C4suC4iOC4suC4gSBzY2hlbWFDb2RlXG5cbiAgQElzQm9vbGVhbigpXG4gIEBJc09wdGlvbmFsKClcbiAgQFRyYW5zZm9ybSgoeyB2YWx1ZSB9KSA9PiB7XG4gICAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHJldHVybiB0cnVlO1xuICAgIGlmICh2YWx1ZSA9PT0gJ2ZhbHNlJykgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB2YWx1ZSBhcyBib29sZWFuIHwgdW5kZWZpbmVkO1xuICB9KVxuICBpc0FjdGl2ZT86IGJvb2xlYW47XG5cbiAgQElzT3B0aW9uYWwoKVxuICBASXNJbnQoKVxuICBAVHlwZSgoKSA9PiBOdW1iZXIpXG4gIHBhZ2U6IG51bWJlciA9IDE7XG5cbiAgQElzT3B0aW9uYWwoKVxuICBASXNJbnQoKVxuICBAVHlwZSgoKSA9PiBOdW1iZXIpXG4gIGxpbWl0OiBudW1iZXIgPSAyMDtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9a/searchjsonschemadto_9a77995363a030e6d1582008441b405e.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9a/searchjsonschemadto_9a77995363a030e6d1582008441b405e.map new file mode 100644 index 0000000..3e446e0 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9a/searchjsonschemadto_9a77995363a030e6d1582008441b405e.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\dto\\search-json-schema.dto.ts","mappings":";;;;;;;;;;;;AAAA,qDAAyE;AACzE,yDAAoD;AAEpD,MAAa,mBAAmB;IAAhC;QAiBE,SAAI,GAAW,CAAC,CAAC;QAKjB,UAAK,GAAW,EAAE,CAAC;IACrB,CAAC;CAAA;AAvBD,kDAuBC;AApBC;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;mDACG;AAShB;IAPC,IAAA,2BAAS,GAAE;IACX,IAAA,4BAAU,GAAE;IACZ,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QACvB,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC;QAClC,IAAI,KAAK,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC;QACpC,OAAO,KAA4B,CAAC;IACtC,CAAC,CAAC;;qDACiB;AAKnB;IAHC,IAAA,4BAAU,GAAE;IACZ,IAAA,uBAAK,GAAE;IACP,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;;iDACF;AAKjB;IAHC,IAAA,4BAAU,GAAE;IACZ,IAAA,uBAAK,GAAE;IACP,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;;kDACA","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\dto\\search-json-schema.dto.ts"],"sourcesContent":["import { IsString, IsOptional, IsBoolean, IsInt } from 'class-validator';\nimport { Type, Transform } from 'class-transformer';\n\nexport class SearchJsonSchemaDto {\n @IsString()\n @IsOptional()\n search?: string; // ค้นหาจาก schemaCode\n\n @IsBoolean()\n @IsOptional()\n @Transform(({ value }) => {\n if (value === 'true') return true;\n if (value === 'false') return false;\n return value as boolean | undefined;\n })\n isActive?: boolean;\n\n @IsOptional()\n @IsInt()\n @Type(() => Number)\n page: number = 1;\n\n @IsOptional()\n @IsInt()\n @Type(() => Number)\n limit: number = 20;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9b/notificationentity_9ba306f97bcbc6961a6aaa73f7ef7b0e b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9b/notificationentity_9ba306f97bcbc6961a6aaa73f7ef7b0e new file mode 100644 index 0000000..ab93957 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9b/notificationentity_9ba306f97bcbc6961a6aaa73f7ef7b0e @@ -0,0 +1,78 @@ +13340187d49b680ecdfe6abb0e074407 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Notification = exports.NotificationType = void 0; +const typeorm_1 = require("typeorm"); +const user_entity_1 = require("../../user/entities/user.entity"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const class_transformer_1 = require("class-transformer"); +var NotificationType; +(function (NotificationType) { + NotificationType["EMAIL"] = "EMAIL"; + NotificationType["LINE"] = "LINE"; + NotificationType["SYSTEM"] = "SYSTEM"; +})(NotificationType || (exports.NotificationType = NotificationType = {})); +let Notification = class Notification extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.Notification = Notification; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], Notification.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'user_id' }), + __metadata("design:type", Number) +], Notification.prototype, "userId", void 0); +__decorate([ + (0, typeorm_1.Column)({ length: 255 }), + __metadata("design:type", String) +], Notification.prototype, "title", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text' }), + __metadata("design:type", String) +], Notification.prototype, "message", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'notification_type', + type: 'enum', + enum: NotificationType, + }), + __metadata("design:type", String) +], Notification.prototype, "notificationType", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_read', default: false }), + __metadata("design:type", Boolean) +], Notification.prototype, "isRead", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'entity_type', length: 50, nullable: true }), + __metadata("design:type", String) +], Notification.prototype, "entityType", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'entity_id', nullable: true }), + __metadata("design:type", Number) +], Notification.prototype, "entityId", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + (0, typeorm_1.PrimaryColumn)(), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], Notification.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'user_id' }), + __metadata("design:type", typeof (_b = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _b : Object) +], Notification.prototype, "user", void 0); +exports.Notification = Notification = __decorate([ + (0, typeorm_1.Entity)('notifications') +], Notification); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbm90aWZpY2F0aW9uXFxlbnRpdGllc1xcbm90aWZpY2F0aW9uLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBUWlCO0FBQ2pCLGlFQUF1RDtBQUN2RCxnRkFBMkU7QUFDM0UseURBQTRDO0FBRTVDLElBQVksZ0JBSVg7QUFKRCxXQUFZLGdCQUFnQjtJQUMxQixtQ0FBZSxDQUFBO0lBQ2YsaUNBQWEsQ0FBQTtJQUNiLHFDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFKVyxnQkFBZ0IsZ0NBQWhCLGdCQUFnQixRQUkzQjtBQUdNLElBQU0sWUFBWSxHQUFsQixNQUFNLFlBQWEsU0FBUSxpQ0FBYztDQXdDL0MsQ0FBQTtBQXhDWSxvQ0FBWTtBQUd2QjtJQUZDLElBQUEsZ0NBQXNCLEdBQUU7SUFDeEIsSUFBQSwyQkFBTyxHQUFFOzt3Q0FDRTtBQUdaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOzs0Q0FDWjtBQUdoQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7MkNBQ1Q7QUFHZjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7NkNBQ1I7QUFPakI7SUFMQyxJQUFBLGdCQUFNLEVBQUM7UUFDTixJQUFJLEVBQUUsbUJBQW1CO1FBQ3pCLElBQUksRUFBRSxNQUFNO1FBQ1osSUFBSSxFQUFFLGdCQUFnQjtLQUN2QixDQUFDOztzREFDa0M7QUFHcEM7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQzs7NENBQzNCO0FBR2pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Z0RBQ3hDO0FBR3BCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7OzhDQUM1QjtBQUtsQjtJQUZDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7SUFDeEMsSUFBQSx1QkFBYSxHQUFFO2tEQUNKLElBQUksb0JBQUosSUFBSTsrQ0FBQztBQU1qQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBSSxDQUFDO0lBQ3JCLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztrREFDekIsa0JBQUksb0JBQUosa0JBQUk7MENBQUM7dUJBdkNELFlBQVk7SUFEeEIsSUFBQSxnQkFBTSxFQUFDLGVBQWUsQ0FBQztHQUNYLFlBQVksQ0F3Q3hCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXG5vdGlmaWNhdGlvblxcZW50aXRpZXNcXG5vdGlmaWNhdGlvbi5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW50aXR5LFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBDb2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIE1hbnlUb09uZSxcbiAgSm9pbkNvbHVtbixcbiAgUHJpbWFyeUNvbHVtbiwgLy8g4pyFIFtGaXhdIOC5gOC4nuC4tOC5iOC4oSBJbXBvcnQg4LiZ4Li14LmJXG59IGZyb20gJ3R5cGVvcm0nO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL3VzZXIvZW50aXRpZXMvdXNlci5lbnRpdHknO1xuaW1wb3J0IHsgVXVpZEJhc2VFbnRpdHkgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZW50aXRpZXMvdXVpZC1iYXNlLmVudGl0eSc7XG5pbXBvcnQgeyBFeGNsdWRlIH0gZnJvbSAnY2xhc3MtdHJhbnNmb3JtZXInO1xuXG5leHBvcnQgZW51bSBOb3RpZmljYXRpb25UeXBlIHtcbiAgRU1BSUwgPSAnRU1BSUwnLFxuICBMSU5FID0gJ0xJTkUnLFxuICBTWVNURU0gPSAnU1lTVEVNJyxcbn1cblxuQEVudGl0eSgnbm90aWZpY2F0aW9ucycpXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uIGV4dGVuZHMgVXVpZEJhc2VFbnRpdHkge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIEBFeGNsdWRlKClcbiAgaWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICd1c2VyX2lkJyB9KVxuICB1c2VySWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IGxlbmd0aDogMjU1IH0pXG4gIHRpdGxlITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndGV4dCcgfSlcbiAgbWVzc2FnZSE6IHN0cmluZztcblxuICBAQ29sdW1uKHtcbiAgICBuYW1lOiAnbm90aWZpY2F0aW9uX3R5cGUnLFxuICAgIHR5cGU6ICdlbnVtJyxcbiAgICBlbnVtOiBOb3RpZmljYXRpb25UeXBlLFxuICB9KVxuICBub3RpZmljYXRpb25UeXBlITogTm90aWZpY2F0aW9uVHlwZTtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2lzX3JlYWQnLCBkZWZhdWx0OiBmYWxzZSB9KVxuICBpc1JlYWQhOiBib29sZWFuO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnZW50aXR5X3R5cGUnLCBsZW5ndGg6IDUwLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBlbnRpdHlUeXBlPzogc3RyaW5nOyAvLyBlLmcuLCAncmZhJywgJ2NpcmN1bGF0aW9uJywgJ2NvcnJlc3BvbmRlbmNlJ1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnZW50aXR5X2lkJywgbnVsbGFibGU6IHRydWUgfSlcbiAgZW50aXR5SWQ/OiBudW1iZXI7XG5cbiAgLy8g4pyFIFtGaXhdIOC4o+C4p+C4oSBEZWNvcmF0b3Ig4LmE4Lin4LmJ4LiX4Li14LmI4LiZ4Li14LmI4LiX4Li14LmI4LmA4LiU4Li14Lii4LinICjguYDguJvguYfguJnguJfguLHguYnguIcgQ3JlYXRlRGF0ZSDguYHguKXguLAgUHJpbWFyeUNvbHVtbiDguKrguLPguKvguKPguLHguJogUGFydGl0aW9uKVxuICBAQ3JlYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICdjcmVhdGVkX2F0JyB9KVxuICBAUHJpbWFyeUNvbHVtbigpXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG5cbiAgLy8gLS0tIFJlbGF0aW9ucyAtLS1cblxuICBATWFueVRvT25lKCgpID0+IFVzZXIpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3VzZXJfaWQnIH0pXG4gIHVzZXIhOiBVc2VyO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9b/notificationentity_9ba306f97bcbc6961a6aaa73f7ef7b0e.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9b/notificationentity_9ba306f97bcbc6961a6aaa73f7ef7b0e.map new file mode 100644 index 0000000..a96695b --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9b/notificationentity_9ba306f97bcbc6961a6aaa73f7ef7b0e.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\notification\\entities\\notification.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAQiB;AACjB,iEAAuD;AACvD,gFAA2E;AAC3E,yDAA4C;AAE5C,IAAY,gBAIX;AAJD,WAAY,gBAAgB;IAC1B,mCAAe,CAAA;IACf,iCAAa,CAAA;IACb,qCAAiB,CAAA;AACnB,CAAC,EAJW,gBAAgB,gCAAhB,gBAAgB,QAI3B;AAGM,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,iCAAc;CAwC/C,CAAA;AAxCY,oCAAY;AAGvB;IAFC,IAAA,gCAAsB,GAAE;IACxB,IAAA,2BAAO,GAAE;;wCACE;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;4CACZ;AAGhB;IADC,IAAA,gBAAM,EAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;2CACT;AAGf;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;6CACR;AAOjB;IALC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,gBAAgB;KACvB,CAAC;;sDACkC;AAGpC;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;4CAC3B;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;gDACxC;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;8CAC5B;AAKlB;IAFC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IACxC,IAAA,uBAAa,GAAE;kDACJ,IAAI,oBAAJ,IAAI;+CAAC;AAMjB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,CAAC;IACrB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;kDACzB,kBAAI,oBAAJ,kBAAI;0CAAC;uBAvCD,YAAY;IADxB,IAAA,gBAAM,EAAC,eAAe,CAAC;GACX,YAAY,CAwCxB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\notification\\entities\\notification.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n ManyToOne,\n JoinColumn,\n PrimaryColumn, // ✅ [Fix] เพิ่ม Import นี้\n} from 'typeorm';\nimport { User } from '../../user/entities/user.entity';\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\nimport { Exclude } from 'class-transformer';\n\nexport enum NotificationType {\n EMAIL = 'EMAIL',\n LINE = 'LINE',\n SYSTEM = 'SYSTEM',\n}\n\n@Entity('notifications')\nexport class Notification extends UuidBaseEntity {\n @PrimaryGeneratedColumn()\n @Exclude()\n id!: number;\n\n @Column({ name: 'user_id' })\n userId!: number;\n\n @Column({ length: 255 })\n title!: string;\n\n @Column({ type: 'text' })\n message!: string;\n\n @Column({\n name: 'notification_type',\n type: 'enum',\n enum: NotificationType,\n })\n notificationType!: NotificationType;\n\n @Column({ name: 'is_read', default: false })\n isRead!: boolean;\n\n @Column({ name: 'entity_type', length: 50, nullable: true })\n entityType?: string; // e.g., 'rfa', 'circulation', 'correspondence'\n\n @Column({ name: 'entity_id', nullable: true })\n entityId?: number;\n\n // ✅ [Fix] รวม Decorator ไว้ที่นี่ที่เดียว (เป็นทั้ง CreateDate และ PrimaryColumn สำหรับ Partition)\n @CreateDateColumn({ name: 'created_at' })\n @PrimaryColumn()\n createdAt!: Date;\n\n // --- Relations ---\n\n @ManyToOne(() => User)\n @JoinColumn({ name: 'user_id' })\n user!: User;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9c/max_9c6c3f2785acbd15308947612bb30e18 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9c/max_9c6c3f2785acbd15308947612bb30e18 new file mode 100644 index 0000000..eff7459 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9c/max_9c6c3f2785acbd15308947612bb30e18 @@ -0,0 +1,5 @@ +953273cd2789fc4731de75cc9fe93c69 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = 'ffffffff-ffff-ffff-ffff-ffffffffffff'; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcbWF4LmpzIiwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUNiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlELE9BQU8sQ0FBQyxPQUFPLEdBQUcsc0NBQXNDLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcbWF4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gJ2ZmZmZmZmZmLWZmZmYtZmZmZi1mZmZmLWZmZmZmZmZmZmZmZic7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9c/max_9c6c3f2785acbd15308947612bb30e18.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9c/max_9c6c3f2785acbd15308947612bb30e18.map new file mode 100644 index 0000000..4278ab8 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9c/max_9c6c3f2785acbd15308947612bb30e18.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\max.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,OAAO,CAAC,OAAO,GAAG,sCAAsC,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\max.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = 'ffffffff-ffff-ffff-ffff-ffffffffffff';\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9d/jsonschemacontrollerspec_9dcd614ef36fcf352a01bb00013221d4 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9d/jsonschemacontrollerspec_9dcd614ef36fcf352a01bb00013221d4 new file mode 100644 index 0000000..e91c48b --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9d/jsonschemacontrollerspec_9dcd614ef36fcf352a01bb00013221d4 @@ -0,0 +1,50 @@ +f3432b76d42a5c88d4b0652e23c069e5 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const testing_1 = require("@nestjs/testing"); +const json_schema_controller_1 = require("./json-schema.controller"); +const json_schema_service_1 = require("./json-schema.service"); +const schema_migration_service_1 = require("./services/schema-migration.service"); +const rbac_guard_1 = require("../../common/guards/rbac.guard"); +const jwt_auth_guard_1 = require("../../common/guards/jwt-auth.guard"); +describe('JsonSchemaController', () => { + let controller; + const mockJsonSchemaService = { + create: jest.fn(), + findAll: jest.fn(), + findOne: jest.fn(), + findLatestByCode: jest.fn(), + update: jest.fn(), + remove: jest.fn(), + validateData: jest.fn(), + processReadData: jest.fn(), + }; + const mockSchemaMigrationService = { + migrateData: jest.fn(), + }; + beforeEach(async () => { + const module = await testing_1.Test.createTestingModule({ + controllers: [json_schema_controller_1.JsonSchemaController], + providers: [ + { + provide: json_schema_service_1.JsonSchemaService, + useValue: mockJsonSchemaService, + }, + { + provide: schema_migration_service_1.SchemaMigrationService, + useValue: mockSchemaMigrationService, + }, + ], + }) + .overrideGuard(jwt_auth_guard_1.JwtAuthGuard) // Override Guards to avoid dependency issues in Unit Test + .useValue({ canActivate: () => true }) + .overrideGuard(rbac_guard_1.RbacGuard) + .useValue({ canActivate: () => true }) + .compile(); + controller = module.get(json_schema_controller_1.JsonSchemaController); + }); + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcanNvbi1zY2hlbWFcXGpzb24tc2NoZW1hLmNvbnRyb2xsZXIuc3BlYy50cyIsIm1hcHBpbmdzIjoiOztBQUFBLDZDQUFzRDtBQUN0RCxxRUFBZ0U7QUFDaEUsK0RBQTBEO0FBQzFELGtGQUE2RTtBQUM3RSwrREFBMkQ7QUFDM0QsdUVBQWtFO0FBRWxFLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLEVBQUU7SUFDcEMsSUFBSSxVQUFnQyxDQUFDO0lBRXJDLE1BQU0scUJBQXFCLEdBQUc7UUFDNUIsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDakIsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDbEIsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDbEIsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUMzQixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNqQixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNqQixZQUFZLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUN2QixlQUFlLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtLQUMzQixDQUFDO0lBRUYsTUFBTSwwQkFBMEIsR0FBRztRQUNqQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtLQUN2QixDQUFDO0lBRUYsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ3BCLE1BQU0sTUFBTSxHQUFrQixNQUFNLGNBQUksQ0FBQyxtQkFBbUIsQ0FBQztZQUMzRCxXQUFXLEVBQUUsQ0FBQyw2Q0FBb0IsQ0FBQztZQUNuQyxTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsT0FBTyxFQUFFLHVDQUFpQjtvQkFDMUIsUUFBUSxFQUFFLHFCQUFxQjtpQkFDaEM7Z0JBQ0Q7b0JBQ0UsT0FBTyxFQUFFLGlEQUFzQjtvQkFDL0IsUUFBUSxFQUFFLDBCQUEwQjtpQkFDckM7YUFDRjtTQUNGLENBQUM7YUFDQyxhQUFhLENBQUMsNkJBQVksQ0FBQyxDQUFDLDBEQUEwRDthQUN0RixRQUFRLENBQUMsRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDckMsYUFBYSxDQUFDLHNCQUFTLENBQUM7YUFDeEIsUUFBUSxDQUFDLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ3JDLE9BQU8sRUFBRSxDQUFDO1FBRWIsVUFBVSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQXVCLDZDQUFvQixDQUFDLENBQUM7SUFDdEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxFQUFFO1FBQzNCLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNuQyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGpzb24tc2NoZW1hXFxqc29uLXNjaGVtYS5jb250cm9sbGVyLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVzdCwgVGVzdGluZ01vZHVsZSB9IGZyb20gJ0BuZXN0anMvdGVzdGluZyc7XG5pbXBvcnQgeyBKc29uU2NoZW1hQ29udHJvbGxlciB9IGZyb20gJy4vanNvbi1zY2hlbWEuY29udHJvbGxlcic7XG5pbXBvcnQgeyBKc29uU2NoZW1hU2VydmljZSB9IGZyb20gJy4vanNvbi1zY2hlbWEuc2VydmljZSc7XG5pbXBvcnQgeyBTY2hlbWFNaWdyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9zY2hlbWEtbWlncmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmJhY0d1YXJkIH0gZnJvbSAnLi4vLi4vY29tbW9uL2d1YXJkcy9yYmFjLmd1YXJkJztcbmltcG9ydCB7IEp3dEF1dGhHdWFyZCB9IGZyb20gJy4uLy4uL2NvbW1vbi9ndWFyZHMvand0LWF1dGguZ3VhcmQnO1xuXG5kZXNjcmliZSgnSnNvblNjaGVtYUNvbnRyb2xsZXInLCAoKSA9PiB7XG4gIGxldCBjb250cm9sbGVyOiBKc29uU2NoZW1hQ29udHJvbGxlcjtcblxuICBjb25zdCBtb2NrSnNvblNjaGVtYVNlcnZpY2UgPSB7XG4gICAgY3JlYXRlOiBqZXN0LmZuKCksXG4gICAgZmluZEFsbDogamVzdC5mbigpLFxuICAgIGZpbmRPbmU6IGplc3QuZm4oKSxcbiAgICBmaW5kTGF0ZXN0QnlDb2RlOiBqZXN0LmZuKCksXG4gICAgdXBkYXRlOiBqZXN0LmZuKCksXG4gICAgcmVtb3ZlOiBqZXN0LmZuKCksXG4gICAgdmFsaWRhdGVEYXRhOiBqZXN0LmZuKCksXG4gICAgcHJvY2Vzc1JlYWREYXRhOiBqZXN0LmZuKCksXG4gIH07XG5cbiAgY29uc3QgbW9ja1NjaGVtYU1pZ3JhdGlvblNlcnZpY2UgPSB7XG4gICAgbWlncmF0ZURhdGE6IGplc3QuZm4oKSxcbiAgfTtcblxuICBiZWZvcmVFYWNoKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBtb2R1bGU6IFRlc3RpbmdNb2R1bGUgPSBhd2FpdCBUZXN0LmNyZWF0ZVRlc3RpbmdNb2R1bGUoe1xuICAgICAgY29udHJvbGxlcnM6IFtKc29uU2NoZW1hQ29udHJvbGxlcl0sXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IEpzb25TY2hlbWFTZXJ2aWNlLFxuICAgICAgICAgIHVzZVZhbHVlOiBtb2NrSnNvblNjaGVtYVNlcnZpY2UsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBTY2hlbWFNaWdyYXRpb25TZXJ2aWNlLFxuICAgICAgICAgIHVzZVZhbHVlOiBtb2NrU2NoZW1hTWlncmF0aW9uU2VydmljZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSlcbiAgICAgIC5vdmVycmlkZUd1YXJkKEp3dEF1dGhHdWFyZCkgLy8gT3ZlcnJpZGUgR3VhcmRzIHRvIGF2b2lkIGRlcGVuZGVuY3kgaXNzdWVzIGluIFVuaXQgVGVzdFxuICAgICAgLnVzZVZhbHVlKHsgY2FuQWN0aXZhdGU6ICgpID0+IHRydWUgfSlcbiAgICAgIC5vdmVycmlkZUd1YXJkKFJiYWNHdWFyZClcbiAgICAgIC51c2VWYWx1ZSh7IGNhbkFjdGl2YXRlOiAoKSA9PiB0cnVlIH0pXG4gICAgICAuY29tcGlsZSgpO1xuXG4gICAgY29udHJvbGxlciA9IG1vZHVsZS5nZXQ8SnNvblNjaGVtYUNvbnRyb2xsZXI+KEpzb25TY2hlbWFDb250cm9sbGVyKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBiZSBkZWZpbmVkJywgKCkgPT4ge1xuICAgIGV4cGVjdChjb250cm9sbGVyKS50b0JlRGVmaW5lZCgpO1xuICB9KTtcbn0pO1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9d/jsonschemacontrollerspec_9dcd614ef36fcf352a01bb00013221d4.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9d/jsonschemacontrollerspec_9dcd614ef36fcf352a01bb00013221d4.map new file mode 100644 index 0000000..6d33b84 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9d/jsonschemacontrollerspec_9dcd614ef36fcf352a01bb00013221d4.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\json-schema.controller.spec.ts","mappings":";;AAAA,6CAAsD;AACtD,qEAAgE;AAChE,+DAA0D;AAC1D,kFAA6E;AAC7E,+DAA2D;AAC3D,uEAAkE;AAElE,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,IAAI,UAAgC,CAAC;IAErC,MAAM,qBAAqB,GAAG;QAC5B,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;QACjB,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;QAClB,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;QAClB,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE;QAC3B,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;QACjB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;QACjB,YAAY,EAAE,IAAI,CAAC,EAAE,EAAE;QACvB,eAAe,EAAE,IAAI,CAAC,EAAE,EAAE;KAC3B,CAAC;IAEF,MAAM,0BAA0B,GAAG;QACjC,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE;KACvB,CAAC;IAEF,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,MAAM,GAAkB,MAAM,cAAI,CAAC,mBAAmB,CAAC;YAC3D,WAAW,EAAE,CAAC,6CAAoB,CAAC;YACnC,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,uCAAiB;oBAC1B,QAAQ,EAAE,qBAAqB;iBAChC;gBACD;oBACE,OAAO,EAAE,iDAAsB;oBAC/B,QAAQ,EAAE,0BAA0B;iBACrC;aACF;SACF,CAAC;aACC,aAAa,CAAC,6BAAY,CAAC,CAAC,0DAA0D;aACtF,QAAQ,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;aACrC,aAAa,CAAC,sBAAS,CAAC;aACxB,QAAQ,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;aACrC,OAAO,EAAE,CAAC;QAEb,UAAU,GAAG,MAAM,CAAC,GAAG,CAAuB,6CAAoB,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\json-schema.controller.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\nimport { JsonSchemaController } from './json-schema.controller';\nimport { JsonSchemaService } from './json-schema.service';\nimport { SchemaMigrationService } from './services/schema-migration.service';\nimport { RbacGuard } from '../../common/guards/rbac.guard';\nimport { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';\n\ndescribe('JsonSchemaController', () => {\n let controller: JsonSchemaController;\n\n const mockJsonSchemaService = {\n create: jest.fn(),\n findAll: jest.fn(),\n findOne: jest.fn(),\n findLatestByCode: jest.fn(),\n update: jest.fn(),\n remove: jest.fn(),\n validateData: jest.fn(),\n processReadData: jest.fn(),\n };\n\n const mockSchemaMigrationService = {\n migrateData: jest.fn(),\n };\n\n beforeEach(async () => {\n const module: TestingModule = await Test.createTestingModule({\n controllers: [JsonSchemaController],\n providers: [\n {\n provide: JsonSchemaService,\n useValue: mockJsonSchemaService,\n },\n {\n provide: SchemaMigrationService,\n useValue: mockSchemaMigrationService,\n },\n ],\n })\n .overrideGuard(JwtAuthGuard) // Override Guards to avoid dependency issues in Unit Test\n .useValue({ canActivate: () => true })\n .overrideGuard(RbacGuard)\n .useValue({ canActivate: () => true })\n .compile();\n\n controller = module.get(JsonSchemaController);\n });\n\n it('should be defined', () => {\n expect(controller).toBeDefined();\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9e/contractdrawingentity_9ee4ac5a7e2bbbe13e27e541a8ffd285 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9e/contractdrawingentity_9ee4ac5a7e2bbbe13e27e541a8ffd285 new file mode 100644 index 0000000..c122f3b --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9e/contractdrawingentity_9ee4ac5a7e2bbbe13e27e541a8ffd285 @@ -0,0 +1,103 @@ +807639fd30adcc6c120b368656e59367 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e, _f, _g; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ContractDrawing = void 0; +const typeorm_1 = require("typeorm"); +const project_entity_1 = require("../../project/entities/project.entity"); +const user_entity_1 = require("../../user/entities/user.entity"); +const attachment_entity_1 = require("../../../common/file-storage/entities/attachment.entity"); +const contract_drawing_subcat_cat_map_entity_1 = require("./contract-drawing-subcat-cat-map.entity"); +const contract_drawing_volume_entity_1 = require("./contract-drawing-volume.entity"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const class_transformer_1 = require("class-transformer"); +let ContractDrawing = class ContractDrawing extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.ContractDrawing = ContractDrawing; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], ContractDrawing.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id' }), + __metadata("design:type", Number) +], ContractDrawing.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'condwg_no', length: 255 }), + __metadata("design:type", String) +], ContractDrawing.prototype, "contractDrawingNo", void 0); +__decorate([ + (0, typeorm_1.Column)({ length: 255 }), + __metadata("design:type", String) +], ContractDrawing.prototype, "title", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'map_cat_id', nullable: true }), + __metadata("design:type", Number) +], ContractDrawing.prototype, "mapCatId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'volume_id', nullable: true }), + __metadata("design:type", Number) +], ContractDrawing.prototype, "volumeId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'volume_page', nullable: true }), + __metadata("design:type", Number) +], ContractDrawing.prototype, "volumePage", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], ContractDrawing.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], ContractDrawing.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.DeleteDateColumn)({ name: 'deleted_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], ContractDrawing.prototype, "deletedAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'updated_by', nullable: true }), + __metadata("design:type", Number) +], ContractDrawing.prototype, "updatedBy", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => project_entity_1.Project), + (0, typeorm_1.JoinColumn)({ name: 'project_id' }), + __metadata("design:type", typeof (_d = typeof project_entity_1.Project !== "undefined" && project_entity_1.Project) === "function" ? _d : Object) +], ContractDrawing.prototype, "project", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'updated_by' }), + __metadata("design:type", typeof (_e = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _e : Object) +], ContractDrawing.prototype, "updater", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => contract_drawing_subcat_cat_map_entity_1.ContractDrawingSubcatCatMap), + (0, typeorm_1.JoinColumn)({ name: 'map_cat_id' }), + __metadata("design:type", typeof (_f = typeof contract_drawing_subcat_cat_map_entity_1.ContractDrawingSubcatCatMap !== "undefined" && contract_drawing_subcat_cat_map_entity_1.ContractDrawingSubcatCatMap) === "function" ? _f : Object) +], ContractDrawing.prototype, "mapCategory", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => contract_drawing_volume_entity_1.ContractDrawingVolume), + (0, typeorm_1.JoinColumn)({ name: 'volume_id' }), + __metadata("design:type", typeof (_g = typeof contract_drawing_volume_entity_1.ContractDrawingVolume !== "undefined" && contract_drawing_volume_entity_1.ContractDrawingVolume) === "function" ? _g : Object) +], ContractDrawing.prototype, "volume", void 0); +__decorate([ + (0, typeorm_1.ManyToMany)(() => attachment_entity_1.Attachment), + (0, typeorm_1.JoinTable)({ + name: 'contract_drawing_attachments', + joinColumn: { name: 'contract_drawing_id', referencedColumnName: 'id' }, + inverseJoinColumn: { name: 'attachment_id', referencedColumnName: 'id' }, + }), + __metadata("design:type", Array) +], ContractDrawing.prototype, "attachments", void 0); +exports.ContractDrawing = ContractDrawing = __decorate([ + (0, typeorm_1.Entity)('contract_drawings') +], ContractDrawing); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXGNvbnRyYWN0LWRyYXdpbmcuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FXaUI7QUFDakIsMEVBQWdFO0FBQ2hFLGlFQUF1RDtBQUN2RCwrRkFBcUY7QUFDckYscUdBQXVGO0FBQ3ZGLHFGQUF5RTtBQUN6RSxnRkFBMkU7QUFDM0UseURBQTRDO0FBR3JDLElBQU0sZUFBZSxHQUFyQixNQUFNLGVBQWdCLFNBQVEsaUNBQWM7Q0E0RGxELENBQUE7QUE1RFksMENBQWU7QUFHMUI7SUFGQyxJQUFBLGdDQUFzQixHQUFFO0lBQ3hCLElBQUEsMkJBQU8sR0FBRTs7MkNBQ0U7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7a0RBQ1o7QUFHbkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7MERBQ2hCO0FBRzNCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOzs4Q0FDVDtBQUdmO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O2lEQUM3QjtBQUdsQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOztpREFDNUI7QUFHbEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7bURBQzVCO0FBR3BCO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDN0IsSUFBSSxvQkFBSixJQUFJO2tEQUFDO0FBR2pCO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDN0IsSUFBSSxvQkFBSixJQUFJO2tEQUFDO0FBR2pCO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDN0IsSUFBSSxvQkFBSixJQUFJO2tEQUFDO0FBR2pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O2tEQUM1QjtBQU1uQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyx3QkFBTyxDQUFDO0lBQ3hCLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDekIsd0JBQU8sb0JBQVAsd0JBQU87Z0RBQUM7QUFJbEI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsa0JBQUksQ0FBQztJQUNyQixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLGtCQUFJLG9CQUFKLGtCQUFJO2dEQUFDO0FBSWY7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsb0VBQTJCLENBQUM7SUFDNUMsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUNyQixvRUFBMkIsb0JBQTNCLG9FQUEyQjtvREFBQztBQUkxQztJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxzREFBcUIsQ0FBQztJQUN0QyxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7a0RBQ3pCLHNEQUFxQixvQkFBckIsc0RBQXFCOytDQUFDO0FBUS9CO0lBTkMsSUFBQSxvQkFBVSxFQUFDLEdBQUcsRUFBRSxDQUFDLDhCQUFVLENBQUM7SUFDNUIsSUFBQSxtQkFBUyxFQUFDO1FBQ1QsSUFBSSxFQUFFLDhCQUE4QjtRQUNwQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxFQUFFO1FBQ3ZFLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUU7S0FDekUsQ0FBQzs7b0RBQ3lCOzBCQTNEaEIsZUFBZTtJQUQzQixJQUFBLGdCQUFNLEVBQUMsbUJBQW1CLENBQUM7R0FDZixlQUFlLENBNEQzQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxkcmF3aW5nXFxlbnRpdGllc1xcY29udHJhY3QtZHJhd2luZy5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW50aXR5LFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBDb2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIFVwZGF0ZURhdGVDb2x1bW4sXG4gIERlbGV0ZURhdGVDb2x1bW4sXG4gIE1hbnlUb09uZSxcbiAgSm9pbkNvbHVtbixcbiAgTWFueVRvTWFueSxcbiAgSm9pblRhYmxlLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0L2VudGl0aWVzL3Byb2plY3QuZW50aXR5JztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi8uLi91c2VyL2VudGl0aWVzL3VzZXIuZW50aXR5JztcbmltcG9ydCB7IEF0dGFjaG1lbnQgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZmlsZS1zdG9yYWdlL2VudGl0aWVzL2F0dGFjaG1lbnQuZW50aXR5JztcbmltcG9ydCB7IENvbnRyYWN0RHJhd2luZ1N1YmNhdENhdE1hcCB9IGZyb20gJy4vY29udHJhY3QtZHJhd2luZy1zdWJjYXQtY2F0LW1hcC5lbnRpdHknO1xuaW1wb3J0IHsgQ29udHJhY3REcmF3aW5nVm9sdW1lIH0gZnJvbSAnLi9jb250cmFjdC1kcmF3aW5nLXZvbHVtZS5lbnRpdHknO1xuaW1wb3J0IHsgVXVpZEJhc2VFbnRpdHkgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZW50aXRpZXMvdXVpZC1iYXNlLmVudGl0eSc7XG5pbXBvcnQgeyBFeGNsdWRlIH0gZnJvbSAnY2xhc3MtdHJhbnNmb3JtZXInO1xuXG5ARW50aXR5KCdjb250cmFjdF9kcmF3aW5ncycpXG5leHBvcnQgY2xhc3MgQ29udHJhY3REcmF3aW5nIGV4dGVuZHMgVXVpZEJhc2VFbnRpdHkge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIEBFeGNsdWRlKClcbiAgaWQhOiBudW1iZXI7IC8vICEg4Lir4LmJ4Liy4Lih4Lin4LmI4Liy4LiHXG5cbiAgQENvbHVtbih7IG5hbWU6ICdwcm9qZWN0X2lkJyB9KVxuICBwcm9qZWN0SWQhOiBudW1iZXI7IC8vICEg4Lir4LmJ4Liy4Lih4Lin4LmI4Liy4LiHXG5cbiAgQENvbHVtbih7IG5hbWU6ICdjb25kd2dfbm8nLCBsZW5ndGg6IDI1NSB9KVxuICBjb250cmFjdERyYXdpbmdObyE6IHN0cmluZzsgLy8gISDguKvguYnguLLguKHguKfguYjguLLguIdcblxuICBAQ29sdW1uKHsgbGVuZ3RoOiAyNTUgfSlcbiAgdGl0bGUhOiBzdHJpbmc7IC8vICEg4Lir4LmJ4Liy4Lih4Lin4LmI4Liy4LiHXG5cbiAgQENvbHVtbih7IG5hbWU6ICdtYXBfY2F0X2lkJywgbnVsbGFibGU6IHRydWUgfSlcbiAgbWFwQ2F0SWQ/OiBudW1iZXI7IC8vID8g4Lin4LmI4Liy4LiH4LmE4LiU4LmJIChOdWxsYWJsZSlcblxuICBAQ29sdW1uKHsgbmFtZTogJ3ZvbHVtZV9pZCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHZvbHVtZUlkPzogbnVtYmVyOyAvLyA/IOC4p+C5iOC4suC4h+C5hOC4lOC5iSAoTnVsbGFibGUpXG5cbiAgQENvbHVtbih7IG5hbWU6ICd2b2x1bWVfcGFnZScsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHZvbHVtZVBhZ2U/OiBudW1iZXI7XG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTsgLy8gISDguKvguYnguLLguKHguKfguYjguLLguIdcblxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxuICB1cGRhdGVkQXQhOiBEYXRlOyAvLyAhIOC4q+C5ieC4suC4oeC4p+C5iOC4suC4h1xuXG4gIEBEZWxldGVEYXRlQ29sdW1uKHsgbmFtZTogJ2RlbGV0ZWRfYXQnIH0pXG4gIGRlbGV0ZWRBdD86IERhdGU7IC8vID8g4Lin4LmI4Liy4LiH4LmE4LiU4LmJIChOdWxsYWJsZSlcblxuICBAQ29sdW1uKHsgbmFtZTogJ3VwZGF0ZWRfYnknLCBudWxsYWJsZTogdHJ1ZSB9KVxuICB1cGRhdGVkQnk/OiBudW1iZXI7IC8vID8g4Lin4LmI4Liy4LiH4LmE4LiU4LmJIChOdWxsYWJsZSlcblxuICAvLyAtLS0gUmVsYXRpb25zIC0tLVxuXG4gIEBNYW55VG9PbmUoKCkgPT4gUHJvamVjdClcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAncHJvamVjdF9pZCcgfSlcbiAgcHJvamVjdCE6IFByb2plY3Q7IC8vICEg4Lir4LmJ4Liy4Lih4Lin4LmI4Liy4LiHXG5cbiAgQE1hbnlUb09uZSgoKSA9PiBVc2VyKVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2J5JyB9KVxuICB1cGRhdGVyPzogVXNlcjsgLy8gPyDguKfguYjguLLguIfguYTguJTguYlcblxuICBATWFueVRvT25lKCgpID0+IENvbnRyYWN0RHJhd2luZ1N1YmNhdENhdE1hcClcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAnbWFwX2NhdF9pZCcgfSlcbiAgbWFwQ2F0ZWdvcnk/OiBDb250cmFjdERyYXdpbmdTdWJjYXRDYXRNYXA7XG5cbiAgQE1hbnlUb09uZSgoKSA9PiBDb250cmFjdERyYXdpbmdWb2x1bWUpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3ZvbHVtZV9pZCcgfSlcbiAgdm9sdW1lPzogQ29udHJhY3REcmF3aW5nVm9sdW1lOyAvLyA/IOC5geC4geC5ieC5hOC4guC4leC4o+C4h+C4meC4teC5iTog4LmD4Liq4LmIID8g4LmA4Lie4Lij4Liy4LiwIHZvbHVtZUlkIOC5gOC4m+C5h+C4mSBOdWxsYWJsZVxuXG4gIEBNYW55VG9NYW55KCgpID0+IEF0dGFjaG1lbnQpXG4gIEBKb2luVGFibGUoe1xuICAgIG5hbWU6ICdjb250cmFjdF9kcmF3aW5nX2F0dGFjaG1lbnRzJyxcbiAgICBqb2luQ29sdW1uOiB7IG5hbWU6ICdjb250cmFjdF9kcmF3aW5nX2lkJywgcmVmZXJlbmNlZENvbHVtbk5hbWU6ICdpZCcgfSxcbiAgICBpbnZlcnNlSm9pbkNvbHVtbjogeyBuYW1lOiAnYXR0YWNobWVudF9pZCcsIHJlZmVyZW5jZWRDb2x1bW5OYW1lOiAnaWQnIH0sXG4gIH0pXG4gIGF0dGFjaG1lbnRzITogQXR0YWNobWVudFtdOyAvLyAhIOC4q+C5ieC4suC4oeC4p+C5iOC4suC4hyAoVHlwZU9STSDguIjguLAgcmV0dXJuIFtdIOC4luC5ieC4suC5hOC4oeC5iOC4oeC4tSlcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9e/contractdrawingentity_9ee4ac5a7e2bbbe13e27e541a8ffd285.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9e/contractdrawingentity_9ee4ac5a7e2bbbe13e27e541a8ffd285.map new file mode 100644 index 0000000..3fedb20 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/9e/contractdrawingentity_9ee4ac5a7e2bbbe13e27e541a8ffd285.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\contract-drawing.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAWiB;AACjB,0EAAgE;AAChE,iEAAuD;AACvD,+FAAqF;AACrF,qGAAuF;AACvF,qFAAyE;AACzE,gFAA2E;AAC3E,yDAA4C;AAGrC,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,iCAAc;CA4DlD,CAAA;AA5DY,0CAAe;AAG1B;IAFC,IAAA,gCAAsB,GAAE;IACxB,IAAA,2BAAO,GAAE;;2CACE;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;kDACZ;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;0DAChB;AAG3B;IADC,IAAA,gBAAM,EAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;8CACT;AAGf;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iDAC7B;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iDAC5B;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;mDAC5B;AAGpB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;kDAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;kDAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;kDAAC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kDAC5B;AAMnB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wBAAO,CAAC;IACxB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,wBAAO,oBAAP,wBAAO;gDAAC;AAIlB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,CAAC;IACrB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,kBAAI,oBAAJ,kBAAI;gDAAC;AAIf;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,oEAA2B,CAAC;IAC5C,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACrB,oEAA2B,oBAA3B,oEAA2B;oDAAC;AAI1C;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,sDAAqB,CAAC;IACtC,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;kDACzB,sDAAqB,oBAArB,sDAAqB;+CAAC;AAQ/B;IANC,IAAA,oBAAU,EAAC,GAAG,EAAE,CAAC,8BAAU,CAAC;IAC5B,IAAA,mBAAS,EAAC;QACT,IAAI,EAAE,8BAA8B;QACpC,UAAU,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,IAAI,EAAE;QACvE,iBAAiB,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,oBAAoB,EAAE,IAAI,EAAE;KACzE,CAAC;;oDACyB;0BA3DhB,eAAe;IAD3B,IAAA,gBAAM,EAAC,mBAAmB,CAAC;GACf,eAAe,CA4D3B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\contract-drawing.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n UpdateDateColumn,\n DeleteDateColumn,\n ManyToOne,\n JoinColumn,\n ManyToMany,\n JoinTable,\n} from 'typeorm';\nimport { Project } from '../../project/entities/project.entity';\nimport { User } from '../../user/entities/user.entity';\nimport { Attachment } from '../../../common/file-storage/entities/attachment.entity';\nimport { ContractDrawingSubcatCatMap } from './contract-drawing-subcat-cat-map.entity';\nimport { ContractDrawingVolume } from './contract-drawing-volume.entity';\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\nimport { Exclude } from 'class-transformer';\n\n@Entity('contract_drawings')\nexport class ContractDrawing extends UuidBaseEntity {\n @PrimaryGeneratedColumn()\n @Exclude()\n id!: number; // ! ห้ามว่าง\n\n @Column({ name: 'project_id' })\n projectId!: number; // ! ห้ามว่าง\n\n @Column({ name: 'condwg_no', length: 255 })\n contractDrawingNo!: string; // ! ห้ามว่าง\n\n @Column({ length: 255 })\n title!: string; // ! ห้ามว่าง\n\n @Column({ name: 'map_cat_id', nullable: true })\n mapCatId?: number; // ? ว่างได้ (Nullable)\n\n @Column({ name: 'volume_id', nullable: true })\n volumeId?: number; // ? ว่างได้ (Nullable)\n\n @Column({ name: 'volume_page', nullable: true })\n volumePage?: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date; // ! ห้ามว่าง\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date; // ! ห้ามว่าง\n\n @DeleteDateColumn({ name: 'deleted_at' })\n deletedAt?: Date; // ? ว่างได้ (Nullable)\n\n @Column({ name: 'updated_by', nullable: true })\n updatedBy?: number; // ? ว่างได้ (Nullable)\n\n // --- Relations ---\n\n @ManyToOne(() => Project)\n @JoinColumn({ name: 'project_id' })\n project!: Project; // ! ห้ามว่าง\n\n @ManyToOne(() => User)\n @JoinColumn({ name: 'updated_by' })\n updater?: User; // ? ว่างได้\n\n @ManyToOne(() => ContractDrawingSubcatCatMap)\n @JoinColumn({ name: 'map_cat_id' })\n mapCategory?: ContractDrawingSubcatCatMap;\n\n @ManyToOne(() => ContractDrawingVolume)\n @JoinColumn({ name: 'volume_id' })\n volume?: ContractDrawingVolume; // ? แก้ไขตรงนี้: ใส่ ? เพราะ volumeId เป็น Nullable\n\n @ManyToMany(() => Attachment)\n @JoinTable({\n name: 'contract_drawing_attachments',\n joinColumn: { name: 'contract_drawing_id', referencedColumnName: 'id' },\n inverseJoinColumn: { name: 'attachment_id', referencedColumnName: 'id' },\n })\n attachments!: Attachment[]; // ! ห้ามว่าง (TypeORM จะ return [] ถ้าไม่มี)\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a1/asbuiltdrawingrevisionentity_a1ee00f00d5847dc62cefe60d16c955f b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a1/asbuiltdrawingrevisionentity_a1ee00f00d5847dc62cefe60d16c955f new file mode 100644 index 0000000..f79ea23 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a1/asbuiltdrawingrevisionentity_a1ee00f00d5847dc62cefe60d16c955f @@ -0,0 +1,127 @@ +955257e69863dc481082ae698de0a889 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AsBuiltDrawingRevision = void 0; +const typeorm_1 = require("typeorm"); +const asbuilt_drawing_entity_1 = require("./asbuilt-drawing.entity"); +const shop_drawing_revision_entity_1 = require("./shop-drawing-revision.entity"); +const attachment_entity_1 = require("../../../common/file-storage/entities/attachment.entity"); +const user_entity_1 = require("../../user/entities/user.entity"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const class_transformer_1 = require("class-transformer"); +let AsBuiltDrawingRevision = class AsBuiltDrawingRevision extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.AsBuiltDrawingRevision = AsBuiltDrawingRevision; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], AsBuiltDrawingRevision.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'asbuilt_drawing_id' }), + __metadata("design:type", Number) +], AsBuiltDrawingRevision.prototype, "asBuiltDrawingId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'revision_number' }), + __metadata("design:type", Number) +], AsBuiltDrawingRevision.prototype, "revisionNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'title', length: 255 }), + __metadata("design:type", String) +], AsBuiltDrawingRevision.prototype, "title", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'revision_label', length: 10, nullable: true }), + __metadata("design:type", String) +], AsBuiltDrawingRevision.prototype, "revisionLabel", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'revision_date', type: 'date', nullable: true }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], AsBuiltDrawingRevision.prototype, "revisionDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], AsBuiltDrawingRevision.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'legacy_drawing_number', length: 100, nullable: true }), + __metadata("design:type", String) +], AsBuiltDrawingRevision.prototype, "legacyDrawingNumber", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], AsBuiltDrawingRevision.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'is_current', + type: 'boolean', + nullable: true, + default: null, + }), + __metadata("design:type", Object) +], AsBuiltDrawingRevision.prototype, "isCurrent", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'created_by', nullable: true }), + __metadata("design:type", Number) +], AsBuiltDrawingRevision.prototype, "createdBy", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'updated_by', nullable: true }), + __metadata("design:type", Number) +], AsBuiltDrawingRevision.prototype, "updatedBy", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => asbuilt_drawing_entity_1.AsBuiltDrawing, (drawing) => drawing.revisions, { + onDelete: 'CASCADE', + }), + (0, typeorm_1.JoinColumn)({ name: 'asbuilt_drawing_id' }), + __metadata("design:type", typeof (_c = typeof asbuilt_drawing_entity_1.AsBuiltDrawing !== "undefined" && asbuilt_drawing_entity_1.AsBuiltDrawing) === "function" ? _c : Object) +], AsBuiltDrawingRevision.prototype, "asBuiltDrawing", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'created_by' }), + __metadata("design:type", typeof (_d = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _d : Object) +], AsBuiltDrawingRevision.prototype, "creator", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'updated_by' }), + __metadata("design:type", typeof (_e = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _e : Object) +], AsBuiltDrawingRevision.prototype, "updater", void 0); +__decorate([ + (0, typeorm_1.ManyToMany)(() => shop_drawing_revision_entity_1.ShopDrawingRevision), + (0, typeorm_1.JoinTable)({ + name: 'asbuilt_revision_shop_revisions_refs', + joinColumn: { + name: 'asbuilt_drawing_revision_id', + referencedColumnName: 'id', + }, + inverseJoinColumn: { + name: 'shop_drawing_revision_id', + referencedColumnName: 'id', + }, + }), + __metadata("design:type", Array) +], AsBuiltDrawingRevision.prototype, "shopDrawingRevisions", void 0); +__decorate([ + (0, typeorm_1.ManyToMany)(() => attachment_entity_1.Attachment), + (0, typeorm_1.JoinTable)({ + name: 'asbuilt_drawing_revision_attachments', + joinColumn: { + name: 'asbuilt_drawing_revision_id', + referencedColumnName: 'id', + }, + inverseJoinColumn: { name: 'attachment_id', referencedColumnName: 'id' }, + }), + __metadata("design:type", Array) +], AsBuiltDrawingRevision.prototype, "attachments", void 0); +exports.AsBuiltDrawingRevision = AsBuiltDrawingRevision = __decorate([ + (0, typeorm_1.Entity)('asbuilt_drawing_revisions'), + (0, typeorm_1.Unique)(['asBuiltDrawingId', 'isCurrent']) +], AsBuiltDrawingRevision); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXGFzYnVpbHQtZHJhd2luZy1yZXZpc2lvbi5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFDQVVpQjtBQUNqQixxRUFBMEQ7QUFDMUQsaUZBQXFFO0FBQ3JFLCtGQUFxRjtBQUNyRixpRUFBdUQ7QUFDdkQsZ0ZBQTJFO0FBQzNFLHlEQUE0QztBQUlyQyxJQUFNLHNCQUFzQixHQUE1QixNQUFNLHNCQUF1QixTQUFRLGlDQUFjO0NBb0Z6RCxDQUFBO0FBcEZZLHdEQUFzQjtBQUdqQztJQUZDLElBQUEsZ0NBQXNCLEdBQUU7SUFDeEIsSUFBQSwyQkFBTyxHQUFFOztrREFDRTtBQUdaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLENBQUM7O2dFQUNiO0FBRzFCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUM7OzhEQUNaO0FBR3hCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7O3FEQUN4QjtBQUdmO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzs2REFDeEM7QUFHdkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO2tEQUNqRCxJQUFJLG9CQUFKLElBQUk7NERBQUM7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7MkRBQ3BCO0FBR3JCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzttRUFDMUM7QUFHN0I7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7eURBQUM7QUFRakI7SUFOQyxJQUFBLGdCQUFNLEVBQUM7UUFDTixJQUFJLEVBQUUsWUFBWTtRQUNsQixJQUFJLEVBQUUsU0FBUztRQUNmLFFBQVEsRUFBRSxJQUFJO1FBQ2QsT0FBTyxFQUFFLElBQUk7S0FDZCxDQUFDOzt5REFDeUI7QUFHM0I7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7eURBQzVCO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O3lEQUM1QjtBQU9uQjtJQUpDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyx1Q0FBYyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO1FBQy9ELFFBQVEsRUFBRSxTQUFTO0tBQ3BCLENBQUM7SUFDRCxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztrREFDMUIsdUNBQWMsb0JBQWQsdUNBQWM7OERBQUM7QUFJaEM7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsa0JBQUksQ0FBQztJQUNyQixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLGtCQUFJLG9CQUFKLGtCQUFJO3VEQUFDO0FBSWY7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsa0JBQUksQ0FBQztJQUNyQixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLGtCQUFJLG9CQUFKLGtCQUFJO3VEQUFDO0FBZWY7SUFaQyxJQUFBLG9CQUFVLEVBQUMsR0FBRyxFQUFFLENBQUMsa0RBQW1CLENBQUM7SUFDckMsSUFBQSxtQkFBUyxFQUFDO1FBQ1QsSUFBSSxFQUFFLHNDQUFzQztRQUM1QyxVQUFVLEVBQUU7WUFDVixJQUFJLEVBQUUsNkJBQTZCO1lBQ25DLG9CQUFvQixFQUFFLElBQUk7U0FDM0I7UUFDRCxpQkFBaUIsRUFBRTtZQUNqQixJQUFJLEVBQUUsMEJBQTBCO1lBQ2hDLG9CQUFvQixFQUFFLElBQUk7U0FDM0I7S0FDRixDQUFDOztvRUFDMkM7QUFZN0M7SUFUQyxJQUFBLG9CQUFVLEVBQUMsR0FBRyxFQUFFLENBQUMsOEJBQVUsQ0FBQztJQUM1QixJQUFBLG1CQUFTLEVBQUM7UUFDVCxJQUFJLEVBQUUsc0NBQXNDO1FBQzVDLFVBQVUsRUFBRTtZQUNWLElBQUksRUFBRSw2QkFBNkI7WUFDbkMsb0JBQW9CLEVBQUUsSUFBSTtTQUMzQjtRQUNELGlCQUFpQixFQUFFLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUU7S0FDekUsQ0FBQzs7MkRBQ3lCO2lDQW5GaEIsc0JBQXNCO0lBRmxDLElBQUEsZ0JBQU0sRUFBQywyQkFBMkIsQ0FBQztJQUNuQyxJQUFBLGdCQUFNLEVBQUMsQ0FBQyxrQkFBa0IsRUFBRSxXQUFXLENBQUMsQ0FBQztHQUM3QixzQkFBc0IsQ0FvRmxDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGRyYXdpbmdcXGVudGl0aWVzXFxhc2J1aWx0LWRyYXdpbmctcmV2aXNpb24uZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVudGl0eSxcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbiAgQ29sdW1uLFxuICBDcmVhdGVEYXRlQ29sdW1uLFxuICBNYW55VG9PbmUsXG4gIEpvaW5Db2x1bW4sXG4gIE1hbnlUb01hbnksXG4gIEpvaW5UYWJsZSxcbiAgVW5pcXVlLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IEFzQnVpbHREcmF3aW5nIH0gZnJvbSAnLi9hc2J1aWx0LWRyYXdpbmcuZW50aXR5JztcbmltcG9ydCB7IFNob3BEcmF3aW5nUmV2aXNpb24gfSBmcm9tICcuL3Nob3AtZHJhd2luZy1yZXZpc2lvbi5lbnRpdHknO1xuaW1wb3J0IHsgQXR0YWNobWVudCB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9maWxlLXN0b3JhZ2UvZW50aXRpZXMvYXR0YWNobWVudC5lbnRpdHknO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL3VzZXIvZW50aXRpZXMvdXNlci5lbnRpdHknO1xuaW1wb3J0IHsgVXVpZEJhc2VFbnRpdHkgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZW50aXRpZXMvdXVpZC1iYXNlLmVudGl0eSc7XG5pbXBvcnQgeyBFeGNsdWRlIH0gZnJvbSAnY2xhc3MtdHJhbnNmb3JtZXInO1xuXG5ARW50aXR5KCdhc2J1aWx0X2RyYXdpbmdfcmV2aXNpb25zJylcbkBVbmlxdWUoWydhc0J1aWx0RHJhd2luZ0lkJywgJ2lzQ3VycmVudCddKVxuZXhwb3J0IGNsYXNzIEFzQnVpbHREcmF3aW5nUmV2aXNpb24gZXh0ZW5kcyBVdWlkQmFzZUVudGl0eSB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKClcbiAgQEV4Y2x1ZGUoKVxuICBpZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2FzYnVpbHRfZHJhd2luZ19pZCcgfSlcbiAgYXNCdWlsdERyYXdpbmdJZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3JldmlzaW9uX251bWJlcicgfSlcbiAgcmV2aXNpb25OdW1iZXIhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICd0aXRsZScsIGxlbmd0aDogMjU1IH0pXG4gIHRpdGxlITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmV2aXNpb25fbGFiZWwnLCBsZW5ndGg6IDEwLCBudWxsYWJsZTogdHJ1ZSB9KVxuICByZXZpc2lvbkxhYmVsPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmV2aXNpb25fZGF0ZScsIHR5cGU6ICdkYXRlJywgbnVsbGFibGU6IHRydWUgfSlcbiAgcmV2aXNpb25EYXRlPzogRGF0ZTtcblxuICBAQ29sdW1uKHsgdHlwZTogJ3RleHQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ2xlZ2FjeV9kcmF3aW5nX251bWJlcicsIGxlbmd0aDogMTAwLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBsZWdhY3lEcmF3aW5nTnVtYmVyPzogc3RyaW5nO1xuXG4gIEBDcmVhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG5cbiAgQENvbHVtbih7XG4gICAgbmFtZTogJ2lzX2N1cnJlbnQnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICBkZWZhdWx0OiBudWxsLFxuICB9KVxuICBpc0N1cnJlbnQ/OiBib29sZWFuIHwgbnVsbDtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYnknLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBjcmVhdGVkQnk/OiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2J5JywgbnVsbGFibGU6IHRydWUgfSlcbiAgdXBkYXRlZEJ5PzogbnVtYmVyO1xuXG4gIC8vIFJlbGF0aW9uc1xuICBATWFueVRvT25lKCgpID0+IEFzQnVpbHREcmF3aW5nLCAoZHJhd2luZykgPT4gZHJhd2luZy5yZXZpc2lvbnMsIHtcbiAgICBvbkRlbGV0ZTogJ0NBU0NBREUnLFxuICB9KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdhc2J1aWx0X2RyYXdpbmdfaWQnIH0pXG4gIGFzQnVpbHREcmF3aW5nITogQXNCdWlsdERyYXdpbmc7XG5cbiAgQE1hbnlUb09uZSgoKSA9PiBVc2VyKVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdjcmVhdGVkX2J5JyB9KVxuICBjcmVhdG9yPzogVXNlcjtcblxuICBATWFueVRvT25lKCgpID0+IFVzZXIpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3VwZGF0ZWRfYnknIH0pXG4gIHVwZGF0ZXI/OiBVc2VyO1xuXG4gIC8vIFJlbGF0aW9uIHRvIFNob3AgRHJhd2luZyBSZXZpc2lvbnMgKE06TilcbiAgQE1hbnlUb01hbnkoKCkgPT4gU2hvcERyYXdpbmdSZXZpc2lvbilcbiAgQEpvaW5UYWJsZSh7XG4gICAgbmFtZTogJ2FzYnVpbHRfcmV2aXNpb25fc2hvcF9yZXZpc2lvbnNfcmVmcycsXG4gICAgam9pbkNvbHVtbjoge1xuICAgICAgbmFtZTogJ2FzYnVpbHRfZHJhd2luZ19yZXZpc2lvbl9pZCcsXG4gICAgICByZWZlcmVuY2VkQ29sdW1uTmFtZTogJ2lkJyxcbiAgICB9LFxuICAgIGludmVyc2VKb2luQ29sdW1uOiB7XG4gICAgICBuYW1lOiAnc2hvcF9kcmF3aW5nX3JldmlzaW9uX2lkJyxcbiAgICAgIHJlZmVyZW5jZWRDb2x1bW5OYW1lOiAnaWQnLFxuICAgIH0sXG4gIH0pXG4gIHNob3BEcmF3aW5nUmV2aXNpb25zITogU2hvcERyYXdpbmdSZXZpc2lvbltdO1xuXG4gIC8vIEF0dGFjaG1lbnRzIChNOk4pXG4gIEBNYW55VG9NYW55KCgpID0+IEF0dGFjaG1lbnQpXG4gIEBKb2luVGFibGUoe1xuICAgIG5hbWU6ICdhc2J1aWx0X2RyYXdpbmdfcmV2aXNpb25fYXR0YWNobWVudHMnLFxuICAgIGpvaW5Db2x1bW46IHtcbiAgICAgIG5hbWU6ICdhc2J1aWx0X2RyYXdpbmdfcmV2aXNpb25faWQnLFxuICAgICAgcmVmZXJlbmNlZENvbHVtbk5hbWU6ICdpZCcsXG4gICAgfSxcbiAgICBpbnZlcnNlSm9pbkNvbHVtbjogeyBuYW1lOiAnYXR0YWNobWVudF9pZCcsIHJlZmVyZW5jZWRDb2x1bW5OYW1lOiAnaWQnIH0sXG4gIH0pXG4gIGF0dGFjaG1lbnRzITogQXR0YWNobWVudFtdO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a1/asbuiltdrawingrevisionentity_a1ee00f00d5847dc62cefe60d16c955f.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a1/asbuiltdrawingrevisionentity_a1ee00f00d5847dc62cefe60d16c955f.map new file mode 100644 index 0000000..b17fe75 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a1/asbuiltdrawingrevisionentity_a1ee00f00d5847dc62cefe60d16c955f.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\asbuilt-drawing-revision.entity.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\asbuilt-drawing-revision.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n ManyToOne,\n JoinColumn,\n ManyToMany,\n JoinTable,\n Unique,\n} from 'typeorm';\nimport { AsBuiltDrawing } from './asbuilt-drawing.entity';\nimport { ShopDrawingRevision } from './shop-drawing-revision.entity';\nimport { Attachment } from '../../../common/file-storage/entities/attachment.entity';\nimport { User } from '../../user/entities/user.entity';\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\nimport { Exclude } from 'class-transformer';\n\n@Entity('asbuilt_drawing_revisions')\n@Unique(['asBuiltDrawingId', 'isCurrent'])\nexport class AsBuiltDrawingRevision extends UuidBaseEntity {\n @PrimaryGeneratedColumn()\n @Exclude()\n id!: number;\n\n @Column({ name: 'asbuilt_drawing_id' })\n asBuiltDrawingId!: number;\n\n @Column({ name: 'revision_number' })\n revisionNumber!: number;\n\n @Column({ name: 'title', length: 255 })\n title!: string;\n\n @Column({ name: 'revision_label', length: 10, nullable: true })\n revisionLabel?: string;\n\n @Column({ name: 'revision_date', type: 'date', nullable: true })\n revisionDate?: Date;\n\n @Column({ type: 'text', nullable: true })\n description?: string;\n\n @Column({ name: 'legacy_drawing_number', length: 100, nullable: true })\n legacyDrawingNumber?: string;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @Column({\n name: 'is_current',\n type: 'boolean',\n nullable: true,\n default: null,\n })\n isCurrent?: boolean | null;\n\n @Column({ name: 'created_by', nullable: true })\n createdBy?: number;\n\n @Column({ name: 'updated_by', nullable: true })\n updatedBy?: number;\n\n // Relations\n @ManyToOne(() => AsBuiltDrawing, (drawing) => drawing.revisions, {\n onDelete: 'CASCADE',\n })\n @JoinColumn({ name: 'asbuilt_drawing_id' })\n asBuiltDrawing!: AsBuiltDrawing;\n\n @ManyToOne(() => User)\n @JoinColumn({ name: 'created_by' })\n creator?: User;\n\n @ManyToOne(() => User)\n @JoinColumn({ name: 'updated_by' })\n updater?: User;\n\n // Relation to Shop Drawing Revisions (M:N)\n @ManyToMany(() => ShopDrawingRevision)\n @JoinTable({\n name: 'asbuilt_revision_shop_revisions_refs',\n joinColumn: {\n name: 'asbuilt_drawing_revision_id',\n referencedColumnName: 'id',\n },\n inverseJoinColumn: {\n name: 'shop_drawing_revision_id',\n referencedColumnName: 'id',\n },\n })\n shopDrawingRevisions!: ShopDrawingRevision[];\n\n // Attachments (M:N)\n @ManyToMany(() => Attachment)\n @JoinTable({\n name: 'asbuilt_drawing_revision_attachments',\n joinColumn: {\n name: 'asbuilt_drawing_revision_id',\n referencedColumnName: 'id',\n },\n inverseJoinColumn: { name: 'attachment_id', referencedColumnName: 'id' },\n })\n attachments!: Attachment[];\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a2/shopdrawingmaincategoryentity_a28bd1b55d0bad1fa21b22665160c222 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a2/shopdrawingmaincategoryentity_a28bd1b55d0bad1fa21b22665160c222 new file mode 100644 index 0000000..10e8222 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a2/shopdrawingmaincategoryentity_a28bd1b55d0bad1fa21b22665160c222 @@ -0,0 +1,58 @@ +15cb4fea31d79b7a1b107de05ba734d9 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ShopDrawingMainCategory = void 0; +const typeorm_1 = require("typeorm"); +let ShopDrawingMainCategory = class ShopDrawingMainCategory { +}; +exports.ShopDrawingMainCategory = ShopDrawingMainCategory; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], ShopDrawingMainCategory.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id' }), + __metadata("design:type", Number) +], ShopDrawingMainCategory.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'main_category_code', length: 50, unique: true }), + __metadata("design:type", String) +], ShopDrawingMainCategory.prototype, "mainCategoryCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'main_category_name', length: 255 }), + __metadata("design:type", String) +], ShopDrawingMainCategory.prototype, "mainCategoryName", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], ShopDrawingMainCategory.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sort_order', default: 0 }), + __metadata("design:type", Number) +], ShopDrawingMainCategory.prototype, "sortOrder", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true }), + __metadata("design:type", Boolean) +], ShopDrawingMainCategory.prototype, "isActive", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], ShopDrawingMainCategory.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], ShopDrawingMainCategory.prototype, "updatedAt", void 0); +exports.ShopDrawingMainCategory = ShopDrawingMainCategory = __decorate([ + (0, typeorm_1.Entity)('shop_drawing_main_categories') +], ShopDrawingMainCategory); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXHNob3AtZHJhd2luZy1tYWluLWNhdGVnb3J5LmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBTWlCO0FBR1YsSUFBTSx1QkFBdUIsR0FBN0IsTUFBTSx1QkFBdUI7Q0EyQm5DLENBQUE7QUEzQlksMERBQXVCO0FBRWxDO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7bURBQ2I7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7MERBQ1o7QUFHbkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7O2lFQUN2QztBQUcxQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7O2lFQUMxQjtBQUcxQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzs0REFDcEI7QUFHckI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7MERBQ3hCO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7O3lEQUMxQjtBQUduQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTswREFBQztBQUdqQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTswREFBQztrQ0ExQk4sdUJBQXVCO0lBRG5DLElBQUEsZ0JBQU0sRUFBQyw4QkFBOEIsQ0FBQztHQUMxQix1QkFBdUIsQ0EyQm5DIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGRyYXdpbmdcXGVudGl0aWVzXFxzaG9wLWRyYXdpbmctbWFpbi1jYXRlZ29yeS5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW50aXR5LFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBDb2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIFVwZGF0ZURhdGVDb2x1bW4sXG59IGZyb20gJ3R5cGVvcm0nO1xuXG5ARW50aXR5KCdzaG9wX2RyYXdpbmdfbWFpbl9jYXRlZ29yaWVzJylcbmV4cG9ydCBjbGFzcyBTaG9wRHJhd2luZ01haW5DYXRlZ29yeSB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKClcbiAgaWQhOiBudW1iZXI7IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQENvbHVtbih7IG5hbWU6ICdwcm9qZWN0X2lkJyB9KVxuICBwcm9qZWN0SWQhOiBudW1iZXI7IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQENvbHVtbih7IG5hbWU6ICdtYWluX2NhdGVnb3J5X2NvZGUnLCBsZW5ndGg6IDUwLCB1bmlxdWU6IHRydWUgfSlcbiAgbWFpbkNhdGVnb3J5Q29kZSE6IHN0cmluZzsgLy8g4LmA4LiV4Li04LihICFcblxuICBAQ29sdW1uKHsgbmFtZTogJ21haW5fY2F0ZWdvcnlfbmFtZScsIGxlbmd0aDogMjU1IH0pXG4gIG1haW5DYXRlZ29yeU5hbWUhOiBzdHJpbmc7IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQENvbHVtbih7IHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7IC8vIG51bGxhYmxlXG5cbiAgQENvbHVtbih7IG5hbWU6ICdzb3J0X29yZGVyJywgZGVmYXVsdDogMCB9KVxuICBzb3J0T3JkZXIhOiBudW1iZXI7IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQENvbHVtbih7IG5hbWU6ICdpc19hY3RpdmUnLCBkZWZhdWx0OiB0cnVlIH0pXG4gIGlzQWN0aXZlITogYm9vbGVhbjsgLy8g4LmA4LiV4Li04LihICFcblxuICBAQ3JlYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICdjcmVhdGVkX2F0JyB9KVxuICBjcmVhdGVkQXQhOiBEYXRlOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBVcGRhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ3VwZGF0ZWRfYXQnIH0pXG4gIHVwZGF0ZWRBdCE6IERhdGU7IC8vIOC5gOC4leC4tOC4oSAhXG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a2/shopdrawingmaincategoryentity_a28bd1b55d0bad1fa21b22665160c222.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a2/shopdrawingmaincategoryentity_a28bd1b55d0bad1fa21b22665160c222.map new file mode 100644 index 0000000..fda4bff --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a2/shopdrawingmaincategoryentity_a28bd1b55d0bad1fa21b22665160c222.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\shop-drawing-main-category.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAMiB;AAGV,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;CA2BnC,CAAA;AA3BY,0DAAuB;AAElC;IADC,IAAA,gCAAsB,GAAE;;mDACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;0DACZ;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;iEACvC;AAG1B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;iEAC1B;AAG1B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4DACpB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;0DACxB;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;yDAC1B;AAGnB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;0DAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;0DAAC;kCA1BN,uBAAuB;IADnC,IAAA,gBAAM,EAAC,8BAA8B,CAAC;GAC1B,uBAAuB,CA2BnC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\shop-drawing-main-category.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n UpdateDateColumn,\n} from 'typeorm';\n\n@Entity('shop_drawing_main_categories')\nexport class ShopDrawingMainCategory {\n @PrimaryGeneratedColumn()\n id!: number; // เติม !\n\n @Column({ name: 'project_id' })\n projectId!: number; // เติม !\n\n @Column({ name: 'main_category_code', length: 50, unique: true })\n mainCategoryCode!: string; // เติม !\n\n @Column({ name: 'main_category_name', length: 255 })\n mainCategoryName!: string; // เติม !\n\n @Column({ type: 'text', nullable: true })\n description?: string; // nullable\n\n @Column({ name: 'sort_order', default: 0 })\n sortOrder!: number; // เติม !\n\n @Column({ name: 'is_active', default: true })\n isActive!: boolean; // เติม !\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date; // เติม !\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date; // เติม !\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a3/importcorrespondencedto_a3ceabf26c8ca26d934edda2b0ed4ab7 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a3/importcorrespondencedto_a3ceabf26c8ca26d934edda2b0ed4ab7 new file mode 100644 index 0000000..be944c4 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a3/importcorrespondencedto_a3ceabf26c8ca26d934edda2b0ed4ab7 @@ -0,0 +1,108 @@ +a58e113d51c4a144640cb12a81ce0c6f +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ImportCorrespondenceDto = void 0; +const class_validator_1 = require("class-validator"); +class ImportCorrespondenceDto { +} +exports.ImportCorrespondenceDto = ImportCorrespondenceDto; +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], ImportCorrespondenceDto.prototype, "documentNumber", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], ImportCorrespondenceDto.prototype, "subject", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], ImportCorrespondenceDto.prototype, "category", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], ImportCorrespondenceDto.prototype, "sourceFilePath", void 0); +__decorate([ + (0, class_validator_1.IsNumber)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], ImportCorrespondenceDto.prototype, "tempAttachmentId", void 0); +__decorate([ + (0, class_validator_1.IsNumber)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], ImportCorrespondenceDto.prototype, "aiConfidence", void 0); +__decorate([ + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Array) +], ImportCorrespondenceDto.prototype, "aiIssues", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], ImportCorrespondenceDto.prototype, "migratedBy", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], ImportCorrespondenceDto.prototype, "batchId", void 0); +__decorate([ + (0, class_validator_1.IsObject)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", typeof (_a = typeof Record !== "undefined" && Record) === "function" ? _a : Object) +], ImportCorrespondenceDto.prototype, "details", void 0); +__decorate([ + (0, class_validator_1.IsNumber)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", Number) +], ImportCorrespondenceDto.prototype, "projectId", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], ImportCorrespondenceDto.prototype, "issuedDate", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], ImportCorrespondenceDto.prototype, "receivedDate", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], ImportCorrespondenceDto.prototype, "documentDate", void 0); +__decorate([ + (0, class_validator_1.IsNumber)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], ImportCorrespondenceDto.prototype, "disciplineId", void 0); +__decorate([ + (0, class_validator_1.IsNumber)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], ImportCorrespondenceDto.prototype, "senderId", void 0); +__decorate([ + (0, class_validator_1.IsNumber)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], ImportCorrespondenceDto.prototype, "receiverId", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], ImportCorrespondenceDto.prototype, "body", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxkdG9cXGltcG9ydC1jb3JyZXNwb25kZW5jZS5kdG8udHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFEQU15QjtBQUV6QixNQUFhLHVCQUF1QjtDQXVFbkM7QUF2RUQsMERBdUVDO0FBcEVDO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzsrREFDVztBQUl4QjtJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7d0RBQ0k7QUFJakI7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7O3lEQUNLO0FBSWxCO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzsrREFDVztBQUl4QjtJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7aUVBQ2E7QUFJMUI7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7OzZEQUNTO0FBR3RCO0lBREMsSUFBQSw0QkFBVSxHQUFFOzt5REFDd0I7QUFJckM7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7OzJEQUNPO0FBSXBCO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzt3REFDSTtBQUlqQjtJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTtrREFDSCxNQUFNLG9CQUFOLE1BQU07d0RBQWtCO0FBSWxDO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzswREFDTTtBQUluQjtJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7MkRBQ087QUFJcEI7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7OzZEQUNTO0FBSXRCO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzs2REFDUztBQUl0QjtJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7NkRBQ1M7QUFJdEI7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7O3lEQUNLO0FBSWxCO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzsyREFDTztBQUlwQjtJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7cURBQ0MiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxkdG9cXGltcG9ydC1jb3JyZXNwb25kZW5jZS5kdG8udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBJc1N0cmluZyxcclxuICBJc05vdEVtcHR5LFxyXG4gIElzT3B0aW9uYWwsXHJcbiAgSXNOdW1iZXIsXHJcbiAgSXNPYmplY3QsXHJcbn0gZnJvbSAnY2xhc3MtdmFsaWRhdG9yJztcclxuXHJcbmV4cG9ydCBjbGFzcyBJbXBvcnRDb3JyZXNwb25kZW5jZUR0byB7XHJcbiAgQElzU3RyaW5nKClcclxuICBASXNOb3RFbXB0eSgpXHJcbiAgZG9jdW1lbnROdW1iZXIhOiBzdHJpbmc7XHJcblxyXG4gIEBJc1N0cmluZygpXHJcbiAgQElzTm90RW1wdHkoKVxyXG4gIHN1YmplY3QhOiBzdHJpbmc7XHJcblxyXG4gIEBJc1N0cmluZygpXHJcbiAgQElzTm90RW1wdHkoKVxyXG4gIGNhdGVnb3J5ITogc3RyaW5nO1xyXG5cclxuICBASXNTdHJpbmcoKVxyXG4gIEBJc09wdGlvbmFsKClcclxuICBzb3VyY2VGaWxlUGF0aD86IHN0cmluZztcclxuXHJcbiAgQElzTnVtYmVyKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgdGVtcEF0dGFjaG1lbnRJZD86IG51bWJlcjtcclxuXHJcbiAgQElzTnVtYmVyKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgYWlDb25maWRlbmNlPzogbnVtYmVyO1xyXG5cclxuICBASXNPcHRpb25hbCgpXHJcbiAgYWlJc3N1ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xyXG5cclxuICBASXNTdHJpbmcoKVxyXG4gIEBJc05vdEVtcHR5KClcclxuICBtaWdyYXRlZEJ5ITogc3RyaW5nOyAvLyBcIlNZU1RFTV9JTVBPUlRcIlxyXG5cclxuICBASXNTdHJpbmcoKVxyXG4gIEBJc05vdEVtcHR5KClcclxuICBiYXRjaElkITogc3RyaW5nO1xyXG5cclxuICBASXNPYmplY3QoKVxyXG4gIEBJc09wdGlvbmFsKClcclxuICBkZXRhaWxzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcblxyXG4gIEBJc051bWJlcigpXHJcbiAgQElzTm90RW1wdHkoKVxyXG4gIHByb2plY3RJZCE6IG51bWJlcjtcclxuXHJcbiAgQElzU3RyaW5nKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgaXNzdWVkRGF0ZT86IHN0cmluZztcclxuXHJcbiAgQElzU3RyaW5nKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgcmVjZWl2ZWREYXRlPzogc3RyaW5nO1xyXG5cclxuICBASXNTdHJpbmcoKVxyXG4gIEBJc09wdGlvbmFsKClcclxuICBkb2N1bWVudERhdGU/OiBzdHJpbmc7XHJcblxyXG4gIEBJc051bWJlcigpXHJcbiAgQElzT3B0aW9uYWwoKVxyXG4gIGRpc2NpcGxpbmVJZD86IG51bWJlcjtcclxuXHJcbiAgQElzTnVtYmVyKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgc2VuZGVySWQ/OiBudW1iZXI7XHJcblxyXG4gIEBJc051bWJlcigpXHJcbiAgQElzT3B0aW9uYWwoKVxyXG4gIHJlY2VpdmVySWQ/OiBudW1iZXI7XHJcblxyXG4gIEBJc1N0cmluZygpXHJcbiAgQElzT3B0aW9uYWwoKVxyXG4gIGJvZHk/OiBzdHJpbmc7XHJcbn1cclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a3/importcorrespondencedto_a3ceabf26c8ca26d934edda2b0ed4ab7.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a3/importcorrespondencedto_a3ceabf26c8ca26d934edda2b0ed4ab7.map new file mode 100644 index 0000000..f6b4cc4 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a3/importcorrespondencedto_a3ceabf26c8ca26d934edda2b0ed4ab7.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\dto\\import-correspondence.dto.ts","mappings":";;;;;;;;;;;;;AAAA,qDAMyB;AAEzB,MAAa,uBAAuB;CAuEnC;AAvED,0DAuEC;AApEC;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;+DACW;AAIxB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;wDACI;AAIjB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;yDACK;AAIlB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;+DACW;AAIxB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;iEACa;AAI1B;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;6DACS;AAGtB;IADC,IAAA,4BAAU,GAAE;;yDACwB;AAIrC;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;2DACO;AAIpB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;wDACI;AAIjB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;kDACH,MAAM,oBAAN,MAAM;wDAAkB;AAIlC;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;0DACM;AAInB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;2DACO;AAIpB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;6DACS;AAItB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;6DACS;AAItB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;6DACS;AAItB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;yDACK;AAIlB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;2DACO;AAIpB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;qDACC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\dto\\import-correspondence.dto.ts"],"sourcesContent":["import {\r\n IsString,\r\n IsNotEmpty,\r\n IsOptional,\r\n IsNumber,\r\n IsObject,\r\n} from 'class-validator';\r\n\r\nexport class ImportCorrespondenceDto {\r\n @IsString()\r\n @IsNotEmpty()\r\n documentNumber!: string;\r\n\r\n @IsString()\r\n @IsNotEmpty()\r\n subject!: string;\r\n\r\n @IsString()\r\n @IsNotEmpty()\r\n category!: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n sourceFilePath?: string;\r\n\r\n @IsNumber()\r\n @IsOptional()\r\n tempAttachmentId?: number;\r\n\r\n @IsNumber()\r\n @IsOptional()\r\n aiConfidence?: number;\r\n\r\n @IsOptional()\r\n aiIssues?: Record[];\r\n\r\n @IsString()\r\n @IsNotEmpty()\r\n migratedBy!: string; // \"SYSTEM_IMPORT\"\r\n\r\n @IsString()\r\n @IsNotEmpty()\r\n batchId!: string;\r\n\r\n @IsObject()\r\n @IsOptional()\r\n details?: Record;\r\n\r\n @IsNumber()\r\n @IsNotEmpty()\r\n projectId!: number;\r\n\r\n @IsString()\r\n @IsOptional()\r\n issuedDate?: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n receivedDate?: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n documentDate?: string;\r\n\r\n @IsNumber()\r\n @IsOptional()\r\n disciplineId?: number;\r\n\r\n @IsNumber()\r\n @IsOptional()\r\n senderId?: number;\r\n\r\n @IsNumber()\r\n @IsOptional()\r\n receiverId?: number;\r\n\r\n @IsString()\r\n @IsOptional()\r\n body?: string;\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a4/disciplineentity_a4babfc1dd3a9a2ef918333d11e29a97 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a4/disciplineentity_a4babfc1dd3a9a2ef918333d11e29a97 new file mode 100644 index 0000000..1b2b3b5 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a4/disciplineentity_a4babfc1dd3a9a2ef918333d11e29a97 @@ -0,0 +1,62 @@ +a3a93dffad359b8bf75f9440d291fa1c +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Discipline = void 0; +// File: src/modules/master/entities/discipline.entity.ts +const typeorm_1 = require("typeorm"); +const contract_entity_1 = require("../../contract/entities/contract.entity"); // ปรับ path ตามจริง +let Discipline = class Discipline { +}; +exports.Discipline = Discipline; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], Discipline.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'contract_id' }), + __metadata("design:type", Number) +], Discipline.prototype, "contractId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'discipline_code', length: 10 }), + __metadata("design:type", String) +], Discipline.prototype, "disciplineCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'code_name_th', nullable: true }), + __metadata("design:type", String) +], Discipline.prototype, "codeNameTh", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'code_name_en', nullable: true }), + __metadata("design:type", String) +], Discipline.prototype, "codeNameEn", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true }), + __metadata("design:type", Boolean) +], Discipline.prototype, "isActive", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], Discipline.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], Discipline.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => contract_entity_1.Contract), + (0, typeorm_1.JoinColumn)({ name: 'contract_id' }), + __metadata("design:type", typeof (_c = typeof contract_entity_1.Contract !== "undefined" && contract_entity_1.Contract) === "function" ? _c : Object) +], Discipline.prototype, "contract", void 0); +exports.Discipline = Discipline = __decorate([ + (0, typeorm_1.Entity)('disciplines'), + (0, typeorm_1.Unique)(['contractId', 'disciplineCode']) // ป้องกันรหัสซ้ำในสัญญาเดียวกัน +], Discipline); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWFzdGVyXFxlbnRpdGllc1xcZGlzY2lwbGluZS5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHlEQUF5RDtBQUN6RCxxQ0FTaUI7QUFDakIsNkVBQW1FLENBQUMsb0JBQW9CO0FBSWpGLElBQU0sVUFBVSxHQUFoQixNQUFNLFVBQVU7Q0E2QnRCLENBQUE7QUE3QlksZ0NBQVU7QUFFckI7SUFEQyxJQUFBLGdDQUFzQixHQUFFOztzQ0FDYjtBQUdaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDOzs4Q0FDWjtBQUdwQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7O2tEQUN4QjtBQUd4QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzs4Q0FDN0I7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7OENBQzdCO0FBR3BCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7OzRDQUMxQjtBQUduQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTs2Q0FBQztBQUdqQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTs2Q0FBQztBQUtqQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQywwQkFBUSxDQUFDO0lBQ3pCLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQztrREFDekIsMEJBQVEsb0JBQVIsMEJBQVE7NENBQUM7cUJBNUJULFVBQVU7SUFGdEIsSUFBQSxnQkFBTSxFQUFDLGFBQWEsQ0FBQztJQUNyQixJQUFBLGdCQUFNLEVBQUMsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGdDQUFnQztHQUM3RCxVQUFVLENBNkJ0QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxtYXN0ZXJcXGVudGl0aWVzXFxkaXNjaXBsaW5lLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGaWxlOiBzcmMvbW9kdWxlcy9tYXN0ZXIvZW50aXRpZXMvZGlzY2lwbGluZS5lbnRpdHkudHNcbmltcG9ydCB7XG4gIEVudGl0eSxcbiAgQ29sdW1uLFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBNYW55VG9PbmUsXG4gIEpvaW5Db2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIFVwZGF0ZURhdGVDb2x1bW4sXG4gIFVuaXF1ZSxcbn0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBDb250cmFjdCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0L2VudGl0aWVzL2NvbnRyYWN0LmVudGl0eSc7IC8vIOC4m+C4o+C4seC4miBwYXRoIOC4leC4suC4oeC4iOC4o+C4tOC4h1xuXG5ARW50aXR5KCdkaXNjaXBsaW5lcycpXG5AVW5pcXVlKFsnY29udHJhY3RJZCcsICdkaXNjaXBsaW5lQ29kZSddKSAvLyDguJvguYnguK3guIfguIHguLHguJnguKPguKvguLHguKrguIvguYnguLPguYPguJnguKrguLHguI3guI3guLLguYDguJTguLXguKLguKfguIHguLHguJlcbmV4cG9ydCBjbGFzcyBEaXNjaXBsaW5lIHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuICBpZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2NvbnRyYWN0X2lkJyB9KVxuICBjb250cmFjdElkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnZGlzY2lwbGluZV9jb2RlJywgbGVuZ3RoOiAxMCB9KVxuICBkaXNjaXBsaW5lQ29kZSE6IHN0cmluZzsgLy8g4LmA4LiK4LmI4LiZIEdFTiwgU1RSLCBBUkNcblxuICBAQ29sdW1uKHsgbmFtZTogJ2NvZGVfbmFtZV90aCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGNvZGVOYW1lVGg/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdjb2RlX25hbWVfZW4nLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBjb2RlTmFtZUVuPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXNfYWN0aXZlJywgZGVmYXVsdDogdHJ1ZSB9KVxuICBpc0FjdGl2ZSE6IGJvb2xlYW47XG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxuICB1cGRhdGVkQXQhOiBEYXRlO1xuXG4gIC8vIFJlbGF0aW9uc1xuICBATWFueVRvT25lKCgpID0+IENvbnRyYWN0KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdjb250cmFjdF9pZCcgfSlcbiAgY29udHJhY3Q/OiBDb250cmFjdDtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a4/disciplineentity_a4babfc1dd3a9a2ef918333d11e29a97.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a4/disciplineentity_a4babfc1dd3a9a2ef918333d11e29a97.map new file mode 100644 index 0000000..f08dcbb --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/a4/disciplineentity_a4babfc1dd3a9a2ef918333d11e29a97.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\master\\entities\\discipline.entity.ts","mappings":";;;;;;;;;;;;;AAAA,yDAAyD;AACzD,qCASiB;AACjB,6EAAmE,CAAC,oBAAoB;AAIjF,IAAM,UAAU,GAAhB,MAAM,UAAU;CA6BtB,CAAA;AA7BY,gCAAU;AAErB;IADC,IAAA,gCAAsB,GAAE;;sCACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;8CACZ;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;kDACxB;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;8CAC7B;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;8CAC7B;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;4CAC1B;AAGnB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;6CAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;6CAAC;AAKjB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,0BAAQ,CAAC;IACzB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;kDACzB,0BAAQ,oBAAR,0BAAQ;4CAAC;qBA5BT,UAAU;IAFtB,IAAA,gBAAM,EAAC,aAAa,CAAC;IACrB,IAAA,gBAAM,EAAC,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC,gCAAgC;GAC7D,UAAU,CA6BtB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\master\\entities\\discipline.entity.ts"],"sourcesContent":["// File: src/modules/master/entities/discipline.entity.ts\nimport {\n Entity,\n Column,\n PrimaryGeneratedColumn,\n ManyToOne,\n JoinColumn,\n CreateDateColumn,\n UpdateDateColumn,\n Unique,\n} from 'typeorm';\nimport { Contract } from '../../contract/entities/contract.entity'; // ปรับ path ตามจริง\n\n@Entity('disciplines')\n@Unique(['contractId', 'disciplineCode']) // ป้องกันรหัสซ้ำในสัญญาเดียวกัน\nexport class Discipline {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'contract_id' })\n contractId!: number;\n\n @Column({ name: 'discipline_code', length: 10 })\n disciplineCode!: string; // เช่น GEN, STR, ARC\n\n @Column({ name: 'code_name_th', nullable: true })\n codeNameTh?: string;\n\n @Column({ name: 'code_name_en', nullable: true })\n codeNameEn?: string;\n\n @Column({ name: 'is_active', default: true })\n isActive!: boolean;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n // Relations\n @ManyToOne(() => Contract)\n @JoinColumn({ name: 'contract_id' })\n contract?: Contract;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/aa/documentnumberingservicespec_aa9ebc4d0a97b6c3a1ddebf9c9b22032 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/aa/documentnumberingservicespec_aa9ebc4d0a97b6c3a1ddebf9c9b22032 new file mode 100644 index 0000000..7a97f3e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/aa/documentnumberingservicespec_aa9ebc4d0a97b6c3a1ddebf9c9b22032 @@ -0,0 +1,181 @@ +c44473e7789b8acd2ff00b8b42fb8d40 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const testing_1 = require("@nestjs/testing"); +const typeorm_1 = require("typeorm"); +const document_numbering_service_1 = require("./services/document-numbering.service"); +const counter_service_1 = require("./services/counter.service"); +const reservation_service_1 = require("./services/reservation.service"); +const format_service_1 = require("./services/format.service"); +const typeorm_2 = require("@nestjs/typeorm"); +const config_1 = require("@nestjs/config"); +const document_number_format_entity_1 = require("./entities/document-number-format.entity"); +const document_number_audit_entity_1 = require("./entities/document-number-audit.entity"); +const document_number_error_entity_1 = require("./entities/document-number-error.entity"); +const document_numbering_lock_service_1 = require("./services/document-numbering-lock.service"); +const manual_override_service_1 = require("./services/manual-override.service"); +const metrics_service_1 = require("./services/metrics.service"); +const uuid_resolver_service_1 = require("../../common/services/uuid-resolver.service"); +describe('DocumentNumberingService', () => { + let service; + let module; + let counterService; + let formatService; + const mockContext = { + projectId: 1, + originatorOrganizationId: 1, + recipientOrganizationId: 1, + typeId: 1, + subTypeId: 1, + rfaTypeId: 1, + disciplineId: 1, + year: 2025, + customTokens: { TYPE_CODE: 'COR', ORG_CODE: 'GGL' }, + }; + beforeEach(async () => { + module = await testing_1.Test.createTestingModule({ + providers: [ + document_numbering_service_1.DocumentNumberingService, + { + provide: config_1.ConfigService, + useValue: { get: jest.fn().mockReturnValue('localhost') }, + }, + { + provide: counter_service_1.CounterService, + useValue: { + incrementCounter: jest.fn().mockResolvedValue(1), + getCurrentSequence: jest.fn().mockResolvedValue(0), + }, + }, + { + provide: reservation_service_1.ReservationService, + useValue: { + reserve: jest.fn(), + confirm: jest.fn(), + cancel: jest.fn(), + }, + }, + { + provide: format_service_1.FormatService, + useValue: { + format: jest + .fn() + .mockResolvedValue({ previewNumber: '0001', isDefault: false }), + }, + }, + { + provide: document_numbering_lock_service_1.DocumentNumberingLockService, + useValue: { + acquireLock: jest.fn().mockResolvedValue({ release: jest.fn() }), + releaseLock: jest.fn(), + }, + }, + { + provide: manual_override_service_1.ManualOverrideService, + useValue: { applyOverride: jest.fn() }, + }, + { + provide: metrics_service_1.MetricsService, + useValue: { + numbersGenerated: { inc: jest.fn() }, + lockFailures: { inc: jest.fn() }, + }, + }, + { + provide: (0, typeorm_2.getRepositoryToken)(document_number_format_entity_1.DocumentNumberFormat), + useValue: { findOne: jest.fn() }, + }, + { + provide: (0, typeorm_2.getRepositoryToken)(document_number_audit_entity_1.DocumentNumberAudit), + useValue: { + create: jest.fn().mockReturnValue({ id: 1 }), + save: jest.fn().mockResolvedValue({ id: 1 }), + findOne: jest.fn(), + }, + }, + { + provide: (0, typeorm_2.getRepositoryToken)(document_number_error_entity_1.DocumentNumberError), + useValue: { + create: jest.fn().mockReturnValue({}), + save: jest.fn().mockResolvedValue({}), + }, + }, + { + provide: typeorm_1.EntityManager, + useValue: { transaction: jest.fn() }, + }, + { + provide: uuid_resolver_service_1.UuidResolverService, + useValue: { + resolveProjectId: jest.fn().mockResolvedValue(1), + resolveOrganizationId: jest.fn().mockResolvedValue(1), + }, + }, + ], + }).compile(); + service = module.get(document_numbering_service_1.DocumentNumberingService); + counterService = module.get(counter_service_1.CounterService); + formatService = module.get(format_service_1.FormatService); + }); + afterEach(() => { + jest.clearAllMocks(); + }); + it('should be defined', () => { + expect(service).toBeDefined(); + }); + describe('generateNextNumber', () => { + it('should generate a new number successfully', async () => { + counterService.incrementCounter.mockResolvedValue(1); + formatService.format.mockResolvedValue({ + previewNumber: 'DOC-0001', + isDefault: false, + }); + const result = await service.generateNextNumber(mockContext); + // Service returns object with number and auditId + expect(result).toHaveProperty('number'); + expect(result).toHaveProperty('auditId'); + expect(result.number).toBe('DOC-0001'); + expect(counterService.incrementCounter).toHaveBeenCalled(); + expect(formatService.format).toHaveBeenCalled(); + }); + it('should throw error when increment fails', async () => { + // Mock CounterService to throw error + counterService.incrementCounter.mockRejectedValue(new Error('Transaction failed')); + await expect(service.generateNextNumber(mockContext)).rejects.toThrow('Transaction failed'); + }); + }); + describe('Admin Operations', () => { + it('voidAndReplace should verify audit log exists', async () => { + const auditRepo = module.get((0, typeorm_2.getRepositoryToken)(document_number_audit_entity_1.DocumentNumberAudit)); + auditRepo.findOne.mockResolvedValue({ + documentNumber: 'DOC-001', + counterKey: JSON.stringify({ projectId: 1, correspondenceTypeId: 1 }), + templateUsed: 'test', + }); + auditRepo.save.mockResolvedValue({ id: 2 }); + const result = await service.voidAndReplace({ + documentNumber: 'DOC-001', + reason: 'test', + replace: false, + }); + expect(result.status).toBe('VOIDED'); + expect(auditRepo.save).toHaveBeenCalled(); + }); + it('cancelNumber should log cancellation', async () => { + const auditRepo = module.get((0, typeorm_2.getRepositoryToken)(document_number_audit_entity_1.DocumentNumberAudit)); + auditRepo.findOne.mockResolvedValue({ + documentNumber: 'DOC-002', + counterKey: {}, + }); + auditRepo.save.mockResolvedValue({ id: 3 }); + const result = await service.cancelNumber({ + documentNumber: 'DOC-002', + reason: 'bad', + projectId: 1, + }); + expect(result.status).toBe('CANCELLED'); + expect(auditRepo.save).toHaveBeenCalled(); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxkb2N1bWVudC1udW1iZXJpbmcuc2VydmljZS5zcGVjLnRzIiwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQXNEO0FBQ3RELHFDQUFvRDtBQUNwRCxzRkFBaUY7QUFDakYsZ0VBQTREO0FBQzVELHdFQUFvRTtBQUNwRSw4REFBMEQ7QUFDMUQsNkNBQXFEO0FBQ3JELDJDQUErQztBQUMvQyw0RkFBZ0Y7QUFDaEYsMEZBQThFO0FBQzlFLDBGQUE4RTtBQUU5RSxnR0FBMEY7QUFDMUYsZ0ZBQTJFO0FBQzNFLGdFQUE0RDtBQUM1RCx1RkFBa0Y7QUFFbEYsUUFBUSxDQUFDLDBCQUEwQixFQUFFLEdBQUcsRUFBRTtJQUN4QyxJQUFJLE9BQWlDLENBQUM7SUFDdEMsSUFBSSxNQUFxQixDQUFDO0lBQzFCLElBQUksY0FBOEIsQ0FBQztJQUNuQyxJQUFJLGFBQTRCLENBQUM7SUFFakMsTUFBTSxXQUFXLEdBQUc7UUFDbEIsU0FBUyxFQUFFLENBQUM7UUFDWix3QkFBd0IsRUFBRSxDQUFDO1FBQzNCLHVCQUF1QixFQUFFLENBQUM7UUFDMUIsTUFBTSxFQUFFLENBQUM7UUFDVCxTQUFTLEVBQUUsQ0FBQztRQUNaLFNBQVMsRUFBRSxDQUFDO1FBQ1osWUFBWSxFQUFFLENBQUM7UUFDZixJQUFJLEVBQUUsSUFBSTtRQUNWLFlBQVksRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtLQUNwRCxDQUFDO0lBRUYsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ3BCLE1BQU0sR0FBRyxNQUFNLGNBQUksQ0FBQyxtQkFBbUIsQ0FBQztZQUN0QyxTQUFTLEVBQUU7Z0JBQ1QscURBQXdCO2dCQUN4QjtvQkFDRSxPQUFPLEVBQUUsc0JBQWE7b0JBQ3RCLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLFdB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ZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxkb2N1bWVudC1udW1iZXJpbmcuc2VydmljZS5zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlc3QsIFRlc3RpbmdNb2R1bGUgfSBmcm9tICdAbmVzdGpzL3Rlc3RpbmcnO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSwgRW50aXR5TWFuYWdlciB9IGZyb20gJ3R5cGVvcm0nO1xuaW1wb3J0IHsgRG9jdW1lbnROdW1iZXJpbmdTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9kb2N1bWVudC1udW1iZXJpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBDb3VudGVyU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvY291bnRlci5zZXJ2aWNlJztcbmltcG9ydCB7IFJlc2VydmF0aW9uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvcmVzZXJ2YXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBGb3JtYXRTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9mb3JtYXQuc2VydmljZSc7XG5pbXBvcnQgeyBnZXRSZXBvc2l0b3J5VG9rZW4gfSBmcm9tICdAbmVzdGpzL3R5cGVvcm0nO1xuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJ0BuZXN0anMvY29uZmlnJztcbmltcG9ydCB7IERvY3VtZW50TnVtYmVyRm9ybWF0IH0gZnJvbSAnLi9lbnRpdGllcy9kb2N1bWVudC1udW1iZXItZm9ybWF0LmVudGl0eSc7XG5pbXBvcnQgeyBEb2N1bWVudE51bWJlckF1ZGl0IH0gZnJvbSAnLi9lbnRpdGllcy9kb2N1bWVudC1udW1iZXItYXVkaXQuZW50aXR5JztcbmltcG9ydCB7IERvY3VtZW50TnVtYmVyRXJyb3IgfSBmcm9tICcuL2VudGl0aWVzL2RvY3VtZW50LW51bWJlci1lcnJvci5lbnRpdHknO1xuXG5pbXBvcnQgeyBEb2N1bWVudE51bWJlcmluZ0xvY2tTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9kb2N1bWVudC1udW1iZXJpbmctbG9jay5zZXJ2aWNlJztcbmltcG9ydCB7IE1hbnVhbE92ZXJyaWRlU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvbWFudWFsLW92ZXJyaWRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWV0cmljc1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL21ldHJpY3Muc2VydmljZSc7XG5pbXBvcnQgeyBVdWlkUmVzb2x2ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uL3NlcnZpY2VzL3V1aWQtcmVzb2x2ZXIuc2VydmljZSc7XG5cbmRlc2NyaWJlKCdEb2N1bWVudE51bWJlcmluZ1NlcnZpY2UnLCAoKSA9PiB7XG4gIGxldCBzZXJ2aWNlOiBEb2N1bWVudE51bWJlcmluZ1NlcnZpY2U7XG4gIGxldCBtb2R1bGU6IFRlc3RpbmdNb2R1bGU7XG4gIGxldCBjb3VudGVyU2VydmljZTogQ291bnRlclNlcnZpY2U7XG4gIGxldCBmb3JtYXRTZXJ2aWNlOiBGb3JtYXRTZXJ2aWNlO1xuXG4gIGNvbnN0IG1vY2tDb250ZXh0ID0ge1xuICAgIHByb2plY3RJZDogMSxcbiAgICBvcmlnaW5hdG9yT3JnYW5pemF0aW9uSWQ6IDEsXG4gICAgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQ6IDEsXG4gICAgdHlwZUlkOiAxLFxuICAgIHN1YlR5cGVJZDogMSxcbiAgICByZmFUeXBlSWQ6IDEsXG4gICAgZGlzY2lwbGluZUlkOiAxLFxuICAgIHllYXI6IDIwMjUsXG4gICAgY3VzdG9tVG9rZW5zOiB7IFRZUEVfQ09ERTogJ0NPUicsIE9SR19DT0RFOiAnR0dMJyB9LFxuICB9O1xuXG4gIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgIG1vZHVsZSA9IGF3YWl0IFRlc3QuY3JlYXRlVGVzdGluZ01vZHVsZSh7XG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgRG9jdW1lbnROdW1iZXJpbmdTZXJ2aWNlLFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogQ29uZmlnU2VydmljZSxcbiAgICAgICAgICB1c2VWYWx1ZTogeyBnZXQ6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoJ2xvY2FsaG9zdCcpIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBDb3VudGVyU2VydmljZSxcbiAgICAgICAgICB1c2VWYWx1ZToge1xuICAgICAgICAgICAgaW5jcmVtZW50Q291bnRlcjogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKDEpLFxuICAgICAgICAgICAgZ2V0Q3VycmVudFNlcXVlbmNlOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoMCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IFJlc2VydmF0aW9uU2VydmljZSxcbiAgICAgICAgICB1c2VWYWx1ZToge1xuICAgICAgICAgICAgcmVzZXJ2ZTogamVzdC5mbigpLFxuICAgICAgICAgICAgY29uZmlybTogamVzdC5mbigpLFxuICAgICAgICAgICAgY2FuY2VsOiBqZXN0LmZuKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IEZvcm1hdFNlcnZpY2UsXG4gICAgICAgICAgdXNlVmFsdWU6IHtcbiAgICAgICAgICAgIGZvcm1hdDogamVzdFxuICAgICAgICAgICAgICAuZm4oKVxuICAgICAgICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWUoeyBwcmV2aWV3TnVtYmVyOiAnMDAwMScsIGlzRGVmYXVsdDogZmFsc2UgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IERvY3VtZW50TnVtYmVyaW5nTG9ja1NlcnZpY2UsXG4gICAgICAgICAgdXNlVmFsdWU6IHtcbiAgICAgICAgICAgIGFjcXVpcmVMb2NrOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoeyByZWxlYXNlOiBqZXN0LmZuKCkgfSksXG4gICAgICAgICAgICByZWxlYXNlTG9jazogamVzdC5mbigpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBNYW51YWxPdmVycmlkZVNlcnZpY2UsXG4gICAgICAgICAgdXNlVmFsdWU6IHsgYXBwbHlPdmVycmlkZTogamVzdC5mbigpIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBNZXRyaWNzU2VydmljZSxcbiAgICAgICAgICB1c2VWYWx1ZToge1xuICAgICAgICAgICAgbnVtYmVyc0dlbmVyYXRlZDogeyBpbmM6IGplc3QuZm4oKSB9LFxuICAgICAgICAgICAgbG9ja0ZhaWx1cmVzOiB7IGluYzogamVzdC5mbigpIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IGdldFJlcG9zaXRvcnlUb2tlbihEb2N1bWVudE51bWJlckZvcm1hdCksXG4gICAgICAgICAgdXNlVmFsdWU6IHsgZmluZE9uZTogamVzdC5mbigpIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBnZXRSZXBvc2l0b3J5VG9rZW4oRG9jdW1lbnROdW1iZXJBdWRpdCksXG4gICAgICAgICAgdXNlVmFsdWU6IHtcbiAgICAgICAgICAgIGNyZWF0ZTogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh7IGlkOiAxIH0pLFxuICAgICAgICAgICAgc2F2ZTogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHsgaWQ6IDEgfSksXG4gICAgICAgICAgICBmaW5kT25lOiBqZXN0LmZuKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IGdldFJlcG9zaXRvcnlUb2tlbihEb2N1bWVudE51bWJlckVycm9yKSxcbiAgICAgICAgICB1c2VWYWx1ZToge1xuICAgICAgICAgICAgY3JlYXRlOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHt9KSxcbiAgICAgICAgICAgIHNhdmU6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7fSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IEVudGl0eU1hbmFnZXIsXG4gICAgICAgICAgdXNlVmFsdWU6IHsgdHJhbnNhY3Rpb246IGplc3QuZm4oKSB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogVXVpZFJlc29sdmVyU2VydmljZSxcbiAgICAgICAgICB1c2VWYWx1ZToge1xuICAgICAgICAgICAgcmVzb2x2ZVByb2plY3RJZDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKDEpLFxuICAgICAgICAgICAgcmVzb2x2ZU9yZ2FuaXphdGlvbklkOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoMSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSkuY29tcGlsZSgpO1xuXG4gICAgc2VydmljZSA9IG1vZHVsZS5nZXQ8RG9jdW1lbnROdW1iZXJpbmdTZXJ2aWNlPihEb2N1bWVudE51bWJlcmluZ1NlcnZpY2UpO1xuICAgIGNvdW50ZXJTZXJ2aWNlID0gbW9kdWxlLmdldDxDb3VudGVyU2VydmljZT4oQ291bnRlclNlcnZpY2UpO1xuICAgIGZvcm1hdFNlcnZpY2UgPSBtb2R1bGUuZ2V0PEZvcm1hdFNlcnZpY2U+KEZvcm1hdFNlcnZpY2UpO1xuICB9KTtcblxuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIGplc3QuY2xlYXJBbGxNb2NrcygpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJlIGRlZmluZWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHNlcnZpY2UpLnRvQmVEZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZW5lcmF0ZU5leHROdW1iZXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBhIG5ldyBudW1iZXIgc3VjY2Vzc2Z1bGx5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgKGNvdW50ZXJTZXJ2aWNlLmluY3JlbWVudENvdW50ZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSgxKTtcbiAgICAgIChmb3JtYXRTZXJ2aWNlLmZvcm1hdCBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgICAgcHJldmlld051bWJlcjogJ0RPQy0wMDAxJyxcbiAgICAgICAgaXNEZWZhdWx0OiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXJ2aWNlLmdlbmVyYXRlTmV4dE51bWJlcihtb2NrQ29udGV4dCk7XG5cbiAgICAgIC8vIFNlcnZpY2UgcmV0dXJucyBvYmplY3Qgd2l0aCBudW1iZXIgYW5kIGF1ZGl0SWRcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvSGF2ZVByb3BlcnR5KCdudW1iZXInKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvSGF2ZVByb3BlcnR5KCdhdWRpdElkJyk7XG4gICAgICBleHBlY3QocmVzdWx0Lm51bWJlcikudG9CZSgnRE9DLTAwMDEnKTtcbiAgICAgIGV4cGVjdChjb3VudGVyU2VydmljZS5pbmNyZW1lbnRDb3VudGVyIGFzIGplc3QuTW9jaykudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgZXhwZWN0KGZvcm1hdFNlcnZpY2UuZm9ybWF0IGFzIGplc3QuTW9jaykudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIGluY3JlbWVudCBmYWlscycsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIE1vY2sgQ291bnRlclNlcnZpY2UgdG8gdGhyb3cgZXJyb3JcbiAgICAgIChjb3VudGVyU2VydmljZS5pbmNyZW1lbnRDb3VudGVyIGFzIGplc3QuTW9jaykubW9ja1JlamVjdGVkVmFsdWUoXG4gICAgICAgIG5ldyBFcnJvcignVHJhbnNhY3Rpb24gZmFpbGVkJylcbiAgICAgICk7XG5cbiAgICAgIGF3YWl0IGV4cGVjdChzZXJ2aWNlLmdlbmVyYXRlTmV4dE51bWJlcihtb2NrQ29udGV4dCkpLnJlamVjdHMudG9UaHJvdyhcbiAgICAgICAgJ1RyYW5zYWN0aW9uIGZhaWxlZCdcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdBZG1pbiBPcGVyYXRpb25zJywgKCkgPT4ge1xuICAgIGl0KCd2b2lkQW5kUmVwbGFjZSBzaG91bGQgdmVyaWZ5IGF1ZGl0IGxvZyBleGlzdHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBhdWRpdFJlcG8gPSBtb2R1bGUuZ2V0PFJlcG9zaXRvcnk8RG9jdW1lbnROdW1iZXJBdWRpdD4+KFxuICAgICAgICBnZXRSZXBvc2l0b3J5VG9rZW4oRG9jdW1lbnROdW1iZXJBdWRpdClcbiAgICAgICk7XG4gICAgICAoYXVkaXRSZXBvLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICAgIGRvY3VtZW50TnVtYmVyOiAnRE9DLTAwMScsXG4gICAgICAgIGNvdW50ZXJLZXk6IEpTT04uc3RyaW5naWZ5KHsgcHJvamVjdElkOiAxLCBjb3JyZXNwb25kZW5jZVR5cGVJZDogMSB9KSxcbiAgICAgICAgdGVtcGxhdGVVc2VkOiAndGVzdCcsXG4gICAgICB9KTtcbiAgICAgIChhdWRpdFJlcG8uc2F2ZSBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHsgaWQ6IDIgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlcnZpY2Uudm9pZEFuZFJlcGxhY2Uoe1xuICAgICAgICBkb2N1bWVudE51bWJlcjogJ0RPQy0wMDEnLFxuICAgICAgICByZWFzb246ICd0ZXN0JyxcbiAgICAgICAgcmVwbGFjZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChyZXN1bHQuc3RhdHVzKS50b0JlKCdWT0lERUQnKTtcbiAgICAgIGV4cGVjdChhdWRpdFJlcG8uc2F2ZSBhcyBqZXN0Lk1vY2spLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYW5jZWxOdW1iZXIgc2hvdWxkIGxvZyBjYW5jZWxsYXRpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBhdWRpdFJlcG8gPSBtb2R1bGUuZ2V0PFJlcG9zaXRvcnk8RG9jdW1lbnROdW1iZXJBdWRpdD4+KFxuICAgICAgICBnZXRSZXBvc2l0b3J5VG9rZW4oRG9jdW1lbnROdW1iZXJBdWRpdClcbiAgICAgICk7XG4gICAgICAoYXVkaXRSZXBvLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICAgIGRvY3VtZW50TnVtYmVyOiAnRE9DLTAwMicsXG4gICAgICAgIGNvdW50ZXJLZXk6IHt9LFxuICAgICAgfSk7XG4gICAgICAoYXVkaXRSZXBvLnNhdmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7IGlkOiAzIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXJ2aWNlLmNhbmNlbE51bWJlcih7XG4gICAgICAgIGRvY3VtZW50TnVtYmVyOiAnRE9DLTAwMicsXG4gICAgICAgIHJlYXNvbjogJ2JhZCcsXG4gICAgICAgIHByb2plY3RJZDogMSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdC5zdGF0dXMpLnRvQmUoJ0NBTkNFTExFRCcpO1xuICAgICAgZXhwZWN0KGF1ZGl0UmVwby5zYXZlIGFzIGplc3QuTW9jaykudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/aa/documentnumberingservicespec_aa9ebc4d0a97b6c3a1ddebf9c9b22032.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/aa/documentnumberingservicespec_aa9ebc4d0a97b6c3a1ddebf9c9b22032.map new file mode 100644 index 0000000..e96235c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/aa/documentnumberingservicespec_aa9ebc4d0a97b6c3a1ddebf9c9b22032.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\document-numbering.service.spec.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\document-numbering.service.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\nimport { Repository, EntityManager } from 'typeorm';\nimport { DocumentNumberingService } from './services/document-numbering.service';\nimport { CounterService } from './services/counter.service';\nimport { ReservationService } from './services/reservation.service';\nimport { FormatService } from './services/format.service';\nimport { getRepositoryToken } from '@nestjs/typeorm';\nimport { ConfigService } from '@nestjs/config';\nimport { DocumentNumberFormat } from './entities/document-number-format.entity';\nimport { DocumentNumberAudit } from './entities/document-number-audit.entity';\nimport { DocumentNumberError } from './entities/document-number-error.entity';\n\nimport { DocumentNumberingLockService } from './services/document-numbering-lock.service';\nimport { ManualOverrideService } from './services/manual-override.service';\nimport { MetricsService } from './services/metrics.service';\nimport { UuidResolverService } from '../../common/services/uuid-resolver.service';\n\ndescribe('DocumentNumberingService', () => {\n let service: DocumentNumberingService;\n let module: TestingModule;\n let counterService: CounterService;\n let formatService: FormatService;\n\n const mockContext = {\n projectId: 1,\n originatorOrganizationId: 1,\n recipientOrganizationId: 1,\n typeId: 1,\n subTypeId: 1,\n rfaTypeId: 1,\n disciplineId: 1,\n year: 2025,\n customTokens: { TYPE_CODE: 'COR', ORG_CODE: 'GGL' },\n };\n\n beforeEach(async () => {\n module = await Test.createTestingModule({\n providers: [\n DocumentNumberingService,\n {\n provide: ConfigService,\n useValue: { get: jest.fn().mockReturnValue('localhost') },\n },\n {\n provide: CounterService,\n useValue: {\n incrementCounter: jest.fn().mockResolvedValue(1),\n getCurrentSequence: jest.fn().mockResolvedValue(0),\n },\n },\n {\n provide: ReservationService,\n useValue: {\n reserve: jest.fn(),\n confirm: jest.fn(),\n cancel: jest.fn(),\n },\n },\n {\n provide: FormatService,\n useValue: {\n format: jest\n .fn()\n .mockResolvedValue({ previewNumber: '0001', isDefault: false }),\n },\n },\n {\n provide: DocumentNumberingLockService,\n useValue: {\n acquireLock: jest.fn().mockResolvedValue({ release: jest.fn() }),\n releaseLock: jest.fn(),\n },\n },\n {\n provide: ManualOverrideService,\n useValue: { applyOverride: jest.fn() },\n },\n {\n provide: MetricsService,\n useValue: {\n numbersGenerated: { inc: jest.fn() },\n lockFailures: { inc: jest.fn() },\n },\n },\n {\n provide: getRepositoryToken(DocumentNumberFormat),\n useValue: { findOne: jest.fn() },\n },\n {\n provide: getRepositoryToken(DocumentNumberAudit),\n useValue: {\n create: jest.fn().mockReturnValue({ id: 1 }),\n save: jest.fn().mockResolvedValue({ id: 1 }),\n findOne: jest.fn(),\n },\n },\n {\n provide: getRepositoryToken(DocumentNumberError),\n useValue: {\n create: jest.fn().mockReturnValue({}),\n save: jest.fn().mockResolvedValue({}),\n },\n },\n {\n provide: EntityManager,\n useValue: { transaction: jest.fn() },\n },\n {\n provide: UuidResolverService,\n useValue: {\n resolveProjectId: jest.fn().mockResolvedValue(1),\n resolveOrganizationId: jest.fn().mockResolvedValue(1),\n },\n },\n ],\n }).compile();\n\n service = module.get(DocumentNumberingService);\n counterService = module.get(CounterService);\n formatService = module.get(FormatService);\n });\n\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n it('should be defined', () => {\n expect(service).toBeDefined();\n });\n\n describe('generateNextNumber', () => {\n it('should generate a new number successfully', async () => {\n (counterService.incrementCounter as jest.Mock).mockResolvedValue(1);\n (formatService.format as jest.Mock).mockResolvedValue({\n previewNumber: 'DOC-0001',\n isDefault: false,\n });\n\n const result = await service.generateNextNumber(mockContext);\n\n // Service returns object with number and auditId\n expect(result).toHaveProperty('number');\n expect(result).toHaveProperty('auditId');\n expect(result.number).toBe('DOC-0001');\n expect(counterService.incrementCounter as jest.Mock).toHaveBeenCalled();\n expect(formatService.format as jest.Mock).toHaveBeenCalled();\n });\n\n it('should throw error when increment fails', async () => {\n // Mock CounterService to throw error\n (counterService.incrementCounter as jest.Mock).mockRejectedValue(\n new Error('Transaction failed')\n );\n\n await expect(service.generateNextNumber(mockContext)).rejects.toThrow(\n 'Transaction failed'\n );\n });\n });\n\n describe('Admin Operations', () => {\n it('voidAndReplace should verify audit log exists', async () => {\n const auditRepo = module.get>(\n getRepositoryToken(DocumentNumberAudit)\n );\n (auditRepo.findOne as jest.Mock).mockResolvedValue({\n documentNumber: 'DOC-001',\n counterKey: JSON.stringify({ projectId: 1, correspondenceTypeId: 1 }),\n templateUsed: 'test',\n });\n (auditRepo.save as jest.Mock).mockResolvedValue({ id: 2 });\n\n const result = await service.voidAndReplace({\n documentNumber: 'DOC-001',\n reason: 'test',\n replace: false,\n });\n expect(result.status).toBe('VOIDED');\n expect(auditRepo.save as jest.Mock).toHaveBeenCalled();\n });\n\n it('cancelNumber should log cancellation', async () => {\n const auditRepo = module.get>(\n getRepositoryToken(DocumentNumberAudit)\n );\n (auditRepo.findOne as jest.Mock).mockResolvedValue({\n documentNumber: 'DOC-002',\n counterKey: {},\n });\n (auditRepo.save as jest.Mock).mockResolvedValue({ id: 3 });\n\n const result = await service.cancelNumber({\n documentNumber: 'DOC-002',\n reason: 'bad',\n projectId: 1,\n });\n expect(result.status).toBe('CANCELLED');\n expect(auditRepo.save as jest.Mock).toHaveBeenCalled();\n });\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/aa/migrationreviewqueueentity_aac64a604f7801b0724251867566c1b8 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/aa/migrationreviewqueueentity_aac64a604f7801b0724251867566c1b8 new file mode 100644 index 0000000..9f21d83 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/aa/migrationreviewqueueentity_aac64a604f7801b0724251867566c1b8 @@ -0,0 +1,126 @@ +62e1d2e515c13e92150166089ef1908a +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MigrationReviewQueue = exports.MigrationReviewStatus = void 0; +const typeorm_1 = require("typeorm"); +var MigrationReviewStatus; +(function (MigrationReviewStatus) { + MigrationReviewStatus["PENDING"] = "PENDING"; + MigrationReviewStatus["APPROVED"] = "APPROVED"; + MigrationReviewStatus["REJECTED"] = "REJECTED"; +})(MigrationReviewStatus || (exports.MigrationReviewStatus = MigrationReviewStatus = {})); +let MigrationReviewQueue = class MigrationReviewQueue { +}; +exports.MigrationReviewQueue = MigrationReviewQueue; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], MigrationReviewQueue.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'document_number', length: 100, unique: true }), + __metadata("design:type", String) +], MigrationReviewQueue.prototype, "documentNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], MigrationReviewQueue.prototype, "subject", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'original_subject', type: 'text', nullable: true }), + __metadata("design:type", String) +], MigrationReviewQueue.prototype, "originalSubject", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], MigrationReviewQueue.prototype, "body", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'ai_suggested_category', length: 50, nullable: true }), + __metadata("design:type", String) +], MigrationReviewQueue.prototype, "aiSuggestedCategory", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'ai_confidence', + type: 'decimal', + precision: 4, + scale: 3, + nullable: true, + }), + __metadata("design:type", Number) +], MigrationReviewQueue.prototype, "aiConfidence", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'ai_issues', type: 'json', nullable: true }), + __metadata("design:type", Array) +], MigrationReviewQueue.prototype, "aiIssues", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'review_reason', length: 255, nullable: true }), + __metadata("design:type", String) +], MigrationReviewQueue.prototype, "reviewReason", void 0); +__decorate([ + (0, typeorm_1.Column)({ + type: 'enum', + enum: MigrationReviewStatus, + default: MigrationReviewStatus.PENDING, + }), + __metadata("design:type", String) +], MigrationReviewQueue.prototype, "status", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'reviewed_by', length: 100, nullable: true }), + __metadata("design:type", String) +], MigrationReviewQueue.prototype, "reviewedBy", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'reviewed_at', type: 'timestamp', nullable: true }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], MigrationReviewQueue.prototype, "reviewedAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id', type: 'int', nullable: true }), + __metadata("design:type", Number) +], MigrationReviewQueue.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sender_organization_id', type: 'int', nullable: true }), + __metadata("design:type", Number) +], MigrationReviewQueue.prototype, "senderOrganizationId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'receiver_organization_id', type: 'int', nullable: true }), + __metadata("design:type", Number) +], MigrationReviewQueue.prototype, "receiverOrganizationId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'received_date', type: 'date', nullable: true }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], MigrationReviewQueue.prototype, "receivedDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'issued_date', type: 'date', nullable: true }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], MigrationReviewQueue.prototype, "issuedDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], MigrationReviewQueue.prototype, "remarks", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'ai_summary', type: 'text', nullable: true }), + __metadata("design:type", String) +], MigrationReviewQueue.prototype, "aiSummary", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'extracted_tags', type: 'json', nullable: true }), + __metadata("design:type", Array) +], MigrationReviewQueue.prototype, "extractedTags", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'temp_attachment_id', type: 'int', nullable: true }), + __metadata("design:type", Number) +], MigrationReviewQueue.prototype, "tempAttachmentId", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_d = typeof Date !== "undefined" && Date) === "function" ? _d : Object) +], MigrationReviewQueue.prototype, "createdAt", void 0); +exports.MigrationReviewQueue = MigrationReviewQueue = __decorate([ + (0, typeorm_1.Entity)('migration_review_queue') +], MigrationReviewQueue); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxlbnRpdGllc1xcbWlncmF0aW9uLXJldmlldy1xdWV1ZS5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFDQUtpQjtBQUVqQixJQUFZLHFCQUlYO0FBSkQsV0FBWSxxQkFBcUI7SUFDL0IsNENBQW1CLENBQUE7SUFDbkIsOENBQXFCLENBQUE7SUFDckIsOENBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQUpXLHFCQUFxQixxQ0FBckIscUJBQXFCLFFBSWhDO0FBR00sSUFBTSxvQkFBb0IsR0FBMUIsTUFBTSxvQkFBb0I7Q0E0RWhDLENBQUE7QUE1RVksb0RBQW9CO0FBRS9CO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7Z0RBQ2I7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7NERBQ3ZDO0FBR3hCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O3FEQUN4QjtBQUdqQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7NkRBQzFDO0FBR3pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O2tEQUMzQjtBQUdkO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOztpRUFDekM7QUFTN0I7SUFQQyxJQUFBLGdCQUFNLEVBQUM7UUFDTixJQUFJLEVBQUUs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bWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxtaWdyYXRpb25cXGVudGl0aWVzXFxtaWdyYXRpb24tcmV2aWV3LXF1ZXVlLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHksXG4gIENvbHVtbixcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbiAgQ3JlYXRlRGF0ZUNvbHVtbixcbn0gZnJvbSAndHlwZW9ybSc7XG5cbmV4cG9ydCBlbnVtIE1pZ3JhdGlvblJldmlld1N0YXR1cyB7XG4gIFBFTkRJTkcgPSAnUEVORElORycsXG4gIEFQUFJPVkVEID0gJ0FQUFJPVkVEJyxcbiAgUkVKRUNURUQgPSAnUkVKRUNURUQnLFxufVxuXG5ARW50aXR5KCdtaWdyYXRpb25fcmV2aWV3X3F1ZXVlJylcbmV4cG9ydCBjbGFzcyBNaWdyYXRpb25SZXZpZXdRdWV1ZSB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKClcbiAgaWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdkb2N1bWVudF9udW1iZXInLCBsZW5ndGg6IDEwMCwgdW5pcXVlOiB0cnVlIH0pXG4gIGRvY3VtZW50TnVtYmVyITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndGV4dCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHN1YmplY3Q/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdvcmlnaW5hbF9zdWJqZWN0JywgdHlwZTogJ3RleHQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBvcmlnaW5hbFN1YmplY3Q/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgYm9keT86IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ2FpX3N1Z2dlc3RlZF9jYXRlZ29yeScsIGxlbmd0aDogNTAsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGFpU3VnZ2VzdGVkQ2F0ZWdvcnk/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7XG4gICAgbmFtZTogJ2FpX2NvbmZpZGVuY2UnLFxuICAgIHR5cGU6ICdkZWNpbWFsJyxcbiAgICBwcmVjaXNpb246IDQsXG4gICAgc2NhbGU6IDMsXG4gICAgbnVsbGFibGU6IHRydWUsXG4gIH0pXG4gIGFpQ29uZmlkZW5jZT86IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2FpX2lzc3VlcycsIHR5cGU6ICdqc29uJywgbnVsbGFibGU6IHRydWUgfSlcbiAgYWlJc3N1ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmV2aWV3X3JlYXNvbicsIGxlbmd0aDogMjU1LCBudWxsYWJsZTogdHJ1ZSB9KVxuICByZXZpZXdSZWFzb24/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7XG4gICAgdHlwZTogJ2VudW0nLFxuICAgIGVudW06IE1pZ3JhdGlvblJldmlld1N0YXR1cyxcbiAgICBkZWZhdWx0OiBNaWdyYXRpb25SZXZpZXdTdGF0dXMuUEVORElORyxcbiAgfSlcbiAgc3RhdHVzITogTWlncmF0aW9uUmV2aWV3U3RhdHVzO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmV2aWV3ZWRfYnknLCBsZW5ndGg6IDEwMCwgbnVsbGFibGU6IHRydWUgfSlcbiAgcmV2aWV3ZWRCeT86IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ3Jldmlld2VkX2F0JywgdHlwZTogJ3RpbWVzdGFtcCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHJldmlld2VkQXQ/OiBEYXRlO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncHJvamVjdF9pZCcsIHR5cGU6ICdpbnQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBwcm9qZWN0SWQ/OiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdzZW5kZXJfb3JnYW5pemF0aW9uX2lkJywgdHlwZTogJ2ludCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHNlbmRlck9yZ2FuaXphdGlvbklkPzogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmVjZWl2ZXJfb3JnYW5pemF0aW9uX2lkJywgdHlwZTogJ2ludCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHJlY2VpdmVyT3JnYW5pemF0aW9uSWQ/OiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdyZWNlaXZlZF9kYXRlJywgdHlwZTogJ2RhdGUnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICByZWNlaXZlZERhdGU/OiBEYXRlO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXNzdWVkX2RhdGUnLCB0eXBlOiAnZGF0ZScsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGlzc3VlZERhdGU/OiBEYXRlO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndGV4dCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHJlbWFya3M/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdhaV9zdW1tYXJ5JywgdHlwZTogJ3RleHQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBhaVN1bW1hcnk/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdleHRyYWN0ZWRfdGFncycsIHR5cGU6ICdqc29uJywgbnVsbGFibGU6IHRydWUgfSlcbiAgZXh0cmFjdGVkVGFncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5bXTtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3RlbXBfYXR0YWNobWVudF9pZCcsIHR5cGU6ICdpbnQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICB0ZW1wQXR0YWNobWVudElkPzogbnVtYmVyO1xuXG4gIEBDcmVhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/aa/migrationreviewqueueentity_aac64a604f7801b0724251867566c1b8.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/aa/migrationreviewqueueentity_aac64a604f7801b0724251867566c1b8.map new file mode 100644 index 0000000..3df0ba7 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/aa/migrationreviewqueueentity_aac64a604f7801b0724251867566c1b8.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\entities\\migration-review-queue.entity.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\entities\\migration-review-queue.entity.ts"],"sourcesContent":["import {\n Entity,\n Column,\n PrimaryGeneratedColumn,\n CreateDateColumn,\n} from 'typeorm';\n\nexport enum MigrationReviewStatus {\n PENDING = 'PENDING',\n APPROVED = 'APPROVED',\n REJECTED = 'REJECTED',\n}\n\n@Entity('migration_review_queue')\nexport class MigrationReviewQueue {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'document_number', length: 100, unique: true })\n documentNumber!: string;\n\n @Column({ type: 'text', nullable: true })\n subject?: string;\n\n @Column({ name: 'original_subject', type: 'text', nullable: true })\n originalSubject?: string;\n\n @Column({ type: 'text', nullable: true })\n body?: string;\n\n @Column({ name: 'ai_suggested_category', length: 50, nullable: true })\n aiSuggestedCategory?: string;\n\n @Column({\n name: 'ai_confidence',\n type: 'decimal',\n precision: 4,\n scale: 3,\n nullable: true,\n })\n aiConfidence?: number;\n\n @Column({ name: 'ai_issues', type: 'json', nullable: true })\n aiIssues?: Record[];\n\n @Column({ name: 'review_reason', length: 255, nullable: true })\n reviewReason?: string;\n\n @Column({\n type: 'enum',\n enum: MigrationReviewStatus,\n default: MigrationReviewStatus.PENDING,\n })\n status!: MigrationReviewStatus;\n\n @Column({ name: 'reviewed_by', length: 100, nullable: true })\n reviewedBy?: string;\n\n @Column({ name: 'reviewed_at', type: 'timestamp', nullable: true })\n reviewedAt?: Date;\n\n @Column({ name: 'project_id', type: 'int', nullable: true })\n projectId?: number;\n\n @Column({ name: 'sender_organization_id', type: 'int', nullable: true })\n senderOrganizationId?: number;\n\n @Column({ name: 'receiver_organization_id', type: 'int', nullable: true })\n receiverOrganizationId?: number;\n\n @Column({ name: 'received_date', type: 'date', nullable: true })\n receivedDate?: Date;\n\n @Column({ name: 'issued_date', type: 'date', nullable: true })\n issuedDate?: Date;\n\n @Column({ type: 'text', nullable: true })\n remarks?: string;\n\n @Column({ name: 'ai_summary', type: 'text', nullable: true })\n aiSummary?: string;\n\n @Column({ name: 'extracted_tags', type: 'json', nullable: true })\n extractedTags?: Record[];\n\n @Column({ name: 'temp_attachment_id', type: 'int', nullable: true })\n tempAttachmentId?: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ad/correspondenceentity_ad8bc364adfe3a46bba930b3a508713d b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ad/correspondenceentity_ad8bc364adfe3a46bba930b3a508713d new file mode 100644 index 0000000..b796bad --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ad/correspondenceentity_ad8bc364adfe3a46bba930b3a508713d @@ -0,0 +1,109 @@ +426c5f9699779d214149eb42c5d3c3f9 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e, _f, _g; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Correspondence = void 0; +const typeorm_1 = require("typeorm"); +const project_entity_1 = require("../../project/entities/project.entity"); +const organization_entity_1 = require("../../organization/entities/organization.entity"); +const correspondence_type_entity_1 = require("./correspondence-type.entity"); +const user_entity_1 = require("../../user/entities/user.entity"); +const correspondence_recipient_entity_1 = require("./correspondence-recipient.entity"); +const correspondence_revision_entity_1 = require("./correspondence-revision.entity"); +const discipline_entity_1 = require("../../master/entities/discipline.entity"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const class_transformer_1 = require("class-transformer"); +let Correspondence = class Correspondence extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.Correspondence = Correspondence; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], Correspondence.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'correspondence_number', length: 100 }), + __metadata("design:type", String) +], Correspondence.prototype, "correspondenceNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'correspondence_type_id' }), + __metadata("design:type", Number) +], Correspondence.prototype, "correspondenceTypeId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'discipline_id', nullable: true }), + __metadata("design:type", Number) +], Correspondence.prototype, "disciplineId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id' }), + __metadata("design:type", Number) +], Correspondence.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'originator_id', nullable: true }), + __metadata("design:type", Number) +], Correspondence.prototype, "originatorId", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'is_internal_communication', + default: false, + type: 'tinyint', + }), + __metadata("design:type", Boolean) +], Correspondence.prototype, "isInternal", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], Correspondence.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'created_by', nullable: true }), + __metadata("design:type", Number) +], Correspondence.prototype, "createdBy", void 0); +__decorate([ + (0, typeorm_1.DeleteDateColumn)({ name: 'deleted_at', select: false }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], Correspondence.prototype, "deletedAt", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => correspondence_type_entity_1.CorrespondenceType), + (0, typeorm_1.JoinColumn)({ name: 'correspondence_type_id' }), + __metadata("design:type", typeof (_c = typeof correspondence_type_entity_1.CorrespondenceType !== "undefined" && correspondence_type_entity_1.CorrespondenceType) === "function" ? _c : Object) +], Correspondence.prototype, "type", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => project_entity_1.Project), + (0, typeorm_1.JoinColumn)({ name: 'project_id' }), + __metadata("design:type", typeof (_d = typeof project_entity_1.Project !== "undefined" && project_entity_1.Project) === "function" ? _d : Object) +], Correspondence.prototype, "project", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => organization_entity_1.Organization), + (0, typeorm_1.JoinColumn)({ name: 'originator_id' }), + __metadata("design:type", typeof (_e = typeof organization_entity_1.Organization !== "undefined" && organization_entity_1.Organization) === "function" ? _e : Object) +], Correspondence.prototype, "originator", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'created_by' }), + __metadata("design:type", typeof (_f = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _f : Object) +], Correspondence.prototype, "creator", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => discipline_entity_1.Discipline), + (0, typeorm_1.JoinColumn)({ name: 'discipline_id' }), + __metadata("design:type", typeof (_g = typeof discipline_entity_1.Discipline !== "undefined" && discipline_entity_1.Discipline) === "function" ? _g : Object) +], Correspondence.prototype, "discipline", void 0); +__decorate([ + (0, typeorm_1.OneToMany)(() => correspondence_revision_entity_1.CorrespondenceRevision, (revision) => revision.correspondence), + __metadata("design:type", Array) +], Correspondence.prototype, "revisions", void 0); +__decorate([ + (0, typeorm_1.OneToMany)(() => correspondence_recipient_entity_1.CorrespondenceRecipient, (recipient) => recipient.correspondence, { cascade: true }), + __metadata("design:type", Array) +], Correspondence.prototype, "recipients", void 0); +exports.Correspondence = Correspondence = __decorate([ + (0, typeorm_1.Entity)('correspondences') +], Correspondence); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGVudGl0aWVzXFxjb3JyZXNwb25kZW5jZS5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFDQVNpQjtBQUNqQiwwRUFBZ0U7QUFDaEUseUZBQStFO0FBQy9FLDZFQUFrRTtBQUNsRSxpRUFBdUQ7QUFDdkQsdUZBQTRFO0FBQzVFLHFGQUEwRTtBQUMxRSwrRUFBcUU7QUFDckUsZ0ZBQTJFO0FBQzNFLHlEQUE0QztBQUdyQyxJQUFNLGNBQWMsR0FBcEIsTUFBTSxjQUFlLFNBQVEsaUNBQWM7Q0F1RWpELENBQUE7QUF2RVksd0NBQWM7QUFHekI7SUFGQyxJQUFBLGdDQUFzQixHQUFFO0lBQ3hCLElBQUEsMkJBQU8sR0FBRTs7MENBQ0U7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7OzREQUN6QjtBQUc5QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSx3QkFBd0IsRUFBRSxDQUFDOzs0REFDYjtBQUc5QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOztvREFDNUI7QUFHdEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7O2lEQUNaO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O29EQUM1QjtBQU90QjtJQUxDLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSwyQkFBMkI7UUFDakMsT0FBTyxFQUFFLEtBQUs7UUFDZCxJQUFJLEVBQUUsU0FBUztLQUNoQixDQUFDOztrREFDbUI7QUFHckI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7aURBQUM7QUFHakI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7aURBQzVCO0FBR25CO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO2tEQUM1QyxJQUFJLG9CQUFKLElBQUk7aURBQUM7QUFLakI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsK0NBQWtCLENBQUM7SUFDbkMsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLHdCQUF3QixFQUFFLENBQUM7a0RBQ3hDLCtDQUFrQixvQkFBbEIsK0NBQWtCOzRDQUFDO0FBSTFCO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLHdCQUFPLENBQUM7SUFDeEIsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUN6Qix3QkFBTyxvQkFBUCx3QkFBTzsrQ0FBQztBQUlsQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxrQ0FBWSxDQUFDO0lBQzdCLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQztrREFDekIsa0NBQVksb0JBQVosa0NBQVk7a0RBQUM7QUFJMUI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsa0JBQUksQ0FBQztJQUNyQixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLGtCQUFJLG9CQUFKLGtCQUFJOytDQUFDO0FBS2Y7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsOEJBQVUsQ0FBQztJQUMzQixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLENBQUM7a0RBQ3pCLDhCQUFVLG9CQUFWLDhCQUFVO2tEQUFDO0FBT3hCO0lBSkMsSUFBQSxtQkFBUyxFQUNSLEdBQUcsRUFBRSxDQUFDLHVEQUFzQixFQUM1QixDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FDdEM7O2lEQUNvQztBQU9yQztJQUxDLElBQUEsbUJBQVMsRUFDUixHQUFHLEVBQUUsQ0FBQyx5REFBdUIsRUFDN0IsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQ3ZDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUNsQjs7a0RBQ3NDO3lCQXRFNUIsY0FBYztJQUQxQixJQUFBLGdCQUFNLEVBQUMsaUJBQWlCLENBQUM7R0FDYixjQUFjLENBdUUxQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxjb3JyZXNwb25kZW5jZVxcZW50aXRpZXNcXGNvcnJlc3BvbmRlbmNlLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHksXG4gIENvbHVtbixcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbiAgTWFueVRvT25lLFxuICBKb2luQ29sdW1uLFxuICBPbmVUb01hbnksXG4gIERlbGV0ZURhdGVDb2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG59IGZyb20gJ3R5cGVvcm0nO1xuaW1wb3J0IHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QvZW50aXRpZXMvcHJvamVjdC5lbnRpdHknO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uIH0gZnJvbSAnLi4vLi4vb3JnYW5pemF0aW9uL2VudGl0aWVzL29yZ2FuaXphdGlvbi5lbnRpdHknO1xuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VUeXBlIH0gZnJvbSAnLi9jb3JyZXNwb25kZW5jZS10eXBlLmVudGl0eSc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vLi4vdXNlci9lbnRpdGllcy91c2VyLmVudGl0eSc7XG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJlY2lwaWVudCB9IGZyb20gJy4vY29ycmVzcG9uZGVuY2UtcmVjaXBpZW50LmVudGl0eSc7XG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJldmlzaW9uIH0gZnJvbSAnLi9jb3JyZXNwb25kZW5jZS1yZXZpc2lvbi5lbnRpdHknO1xuaW1wb3J0IHsgRGlzY2lwbGluZSB9IGZyb20gJy4uLy4uL21hc3Rlci9lbnRpdGllcy9kaXNjaXBsaW5lLmVudGl0eSc7XG5pbXBvcnQgeyBVdWlkQmFzZUVudGl0eSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9lbnRpdGllcy91dWlkLWJhc2UuZW50aXR5JztcbmltcG9ydCB7IEV4Y2x1ZGUgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XG5cbkBFbnRpdHkoJ2NvcnJlc3BvbmRlbmNlcycpXG5leHBvcnQgY2xhc3MgQ29ycmVzcG9uZGVuY2UgZXh0ZW5kcyBVdWlkQmFzZUVudGl0eSB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKClcbiAgQEV4Y2x1ZGUoKVxuICBpZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2NvcnJlc3BvbmRlbmNlX251bWJlcicsIGxlbmd0aDogMTAwIH0pXG4gIGNvcnJlc3BvbmRlbmNlTnVtYmVyITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnY29ycmVzcG9uZGVuY2VfdHlwZV9pZCcgfSlcbiAgY29ycmVzcG9uZGVuY2VUeXBlSWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdkaXNjaXBsaW5lX2lkJywgbnVsbGFibGU6IHRydWUgfSlcbiAgZGlzY2lwbGluZUlkPzogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncHJvamVjdF9pZCcgfSlcbiAgcHJvamVjdElkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnb3JpZ2luYXRvcl9pZCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIG9yaWdpbmF0b3JJZD86IG51bWJlcjtcblxuICBAQ29sdW1uKHtcbiAgICBuYW1lOiAnaXNfaW50ZXJuYWxfY29tbXVuaWNhdGlvbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gICAgdHlwZTogJ3RpbnlpbnQnLFxuICB9KVxuICBpc0ludGVybmFsITogYm9vbGVhbjtcblxuICBAQ3JlYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICdjcmVhdGVkX2F0JyB9KVxuICBjcmVhdGVkQXQhOiBEYXRlO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9ieScsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGNyZWF0ZWRCeT86IG51bWJlcjtcblxuICBARGVsZXRlRGF0ZUNvbHVtbih7IG5hbWU6ICdkZWxldGVkX2F0Jywgc2VsZWN0OiBmYWxzZSB9KVxuICBkZWxldGVkQXQ/OiBEYXRlO1xuXG4gIC8vIFJlbGF0aW9uc1xuICBATWFueVRvT25lKCgpID0+IENvcnJlc3BvbmRlbmNlVHlwZSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAnY29ycmVzcG9uZGVuY2VfdHlwZV9pZCcgfSlcbiAgdHlwZT86IENvcnJlc3BvbmRlbmNlVHlwZTtcblxuICBATWFueVRvT25lKCgpID0+IFByb2plY3QpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3Byb2plY3RfaWQnIH0pXG4gIHByb2plY3Q/OiBQcm9qZWN0O1xuXG4gIEBNYW55VG9PbmUoKCkgPT4gT3JnYW5pemF0aW9uKVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdvcmlnaW5hdG9yX2lkJyB9KVxuICBvcmlnaW5hdG9yPzogT3JnYW5pemF0aW9uO1xuXG4gIEBNYW55VG9PbmUoKCkgPT4gVXNlcilcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9ieScgfSlcbiAgY3JlYXRvcj86IFVzZXI7XG5cbiAgLy8gW05ldyBWMS41LjFdXG4gIEBNYW55VG9PbmUoKCkgPT4gRGlzY2lwbGluZSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAnZGlzY2lwbGluZV9pZCcgfSlcbiAgZGlzY2lwbGluZT86IERpc2NpcGxpbmU7XG5cbiAgLy8gT25lIENvcnJlc3BvbmRlbmNlIGhhcyBNYW55IFJldmlzaW9uc1xuICBAT25lVG9NYW55KFxuICAgICgpID0+IENvcnJlc3BvbmRlbmNlUmV2aXNpb24sXG4gICAgKHJldmlzaW9uKSA9PiByZXZpc2lvbi5jb3JyZXNwb25kZW5jZVxuICApXG4gIHJldmlzaW9ucz86IENvcnJlc3BvbmRlbmNlUmV2aXNpb25bXTtcblxuICBAT25lVG9NYW55KFxuICAgICgpID0+IENvcnJlc3BvbmRlbmNlUmVjaXBpZW50LFxuICAgIChyZWNpcGllbnQpID0+IHJlY2lwaWVudC5jb3JyZXNwb25kZW5jZSxcbiAgICB7IGNhc2NhZGU6IHRydWUgfVxuICApXG4gIHJlY2lwaWVudHM/OiBDb3JyZXNwb25kZW5jZVJlY2lwaWVudFtdO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ad/correspondenceentity_ad8bc364adfe3a46bba930b3a508713d.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ad/correspondenceentity_ad8bc364adfe3a46bba930b3a508713d.map new file mode 100644 index 0000000..be25fc9 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ad/correspondenceentity_ad8bc364adfe3a46bba930b3a508713d.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence.entity.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence.entity.ts"],"sourcesContent":["import {\n Entity,\n Column,\n PrimaryGeneratedColumn,\n ManyToOne,\n JoinColumn,\n OneToMany,\n DeleteDateColumn,\n CreateDateColumn,\n} from 'typeorm';\nimport { Project } from '../../project/entities/project.entity';\nimport { Organization } from '../../organization/entities/organization.entity';\nimport { CorrespondenceType } from './correspondence-type.entity';\nimport { User } from '../../user/entities/user.entity';\nimport { CorrespondenceRecipient } from './correspondence-recipient.entity';\nimport { CorrespondenceRevision } from './correspondence-revision.entity';\nimport { Discipline } from '../../master/entities/discipline.entity';\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\nimport { Exclude } from 'class-transformer';\n\n@Entity('correspondences')\nexport class Correspondence extends UuidBaseEntity {\n @PrimaryGeneratedColumn()\n @Exclude()\n id!: number;\n\n @Column({ name: 'correspondence_number', length: 100 })\n correspondenceNumber!: string;\n\n @Column({ name: 'correspondence_type_id' })\n correspondenceTypeId!: number;\n\n @Column({ name: 'discipline_id', nullable: true })\n disciplineId?: number;\n\n @Column({ name: 'project_id' })\n projectId!: number;\n\n @Column({ name: 'originator_id', nullable: true })\n originatorId?: number;\n\n @Column({\n name: 'is_internal_communication',\n default: false,\n type: 'tinyint',\n })\n isInternal!: boolean;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @Column({ name: 'created_by', nullable: true })\n createdBy?: number;\n\n @DeleteDateColumn({ name: 'deleted_at', select: false })\n deletedAt?: Date;\n\n // Relations\n @ManyToOne(() => CorrespondenceType)\n @JoinColumn({ name: 'correspondence_type_id' })\n type?: CorrespondenceType;\n\n @ManyToOne(() => Project)\n @JoinColumn({ name: 'project_id' })\n project?: Project;\n\n @ManyToOne(() => Organization)\n @JoinColumn({ name: 'originator_id' })\n originator?: Organization;\n\n @ManyToOne(() => User)\n @JoinColumn({ name: 'created_by' })\n creator?: User;\n\n // [New V1.5.1]\n @ManyToOne(() => Discipline)\n @JoinColumn({ name: 'discipline_id' })\n discipline?: Discipline;\n\n // One Correspondence has Many Revisions\n @OneToMany(\n () => CorrespondenceRevision,\n (revision) => revision.correspondence\n )\n revisions?: CorrespondenceRevision[];\n\n @OneToMany(\n () => CorrespondenceRecipient,\n (recipient) => recipient.correspondence,\n { cascade: true }\n )\n recipients?: CorrespondenceRecipient[];\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/af/correspondencetagentity_af3367c9adb35a574b84ed144a9fb079 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/af/correspondencetagentity_af3367c9adb35a574b84ed144a9fb079 new file mode 100644 index 0000000..d65b872 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/af/correspondencetagentity_af3367c9adb35a574b84ed144a9fb079 @@ -0,0 +1,42 @@ +19c2bf4018ef993662d5343a6296d9d2 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceTag = void 0; +const typeorm_1 = require("typeorm"); +const correspondence_entity_1 = require("./correspondence.entity"); +const tag_entity_1 = require("../../master/entities/tag.entity"); +let CorrespondenceTag = class CorrespondenceTag { +}; +exports.CorrespondenceTag = CorrespondenceTag; +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'correspondence_id' }), + __metadata("design:type", Number) +], CorrespondenceTag.prototype, "correspondenceId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'tag_id' }), + __metadata("design:type", Number) +], CorrespondenceTag.prototype, "tagId", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => correspondence_entity_1.Correspondence, { onDelete: 'CASCADE' }), + (0, typeorm_1.JoinColumn)({ name: 'correspondence_id' }), + __metadata("design:type", typeof (_a = typeof correspondence_entity_1.Correspondence !== "undefined" && correspondence_entity_1.Correspondence) === "function" ? _a : Object) +], CorrespondenceTag.prototype, "correspondence", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => tag_entity_1.Tag, { onDelete: 'CASCADE', eager: true }), + (0, typeorm_1.JoinColumn)({ name: 'tag_id' }), + __metadata("design:type", typeof (_b = typeof tag_entity_1.Tag !== "undefined" && tag_entity_1.Tag) === "function" ? _b : Object) +], CorrespondenceTag.prototype, "tag", void 0); +exports.CorrespondenceTag = CorrespondenceTag = __decorate([ + (0, typeorm_1.Entity)('correspondence_tags') +], CorrespondenceTag); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGVudGl0aWVzXFxjb3JyZXNwb25kZW5jZS10YWcuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBdUU7QUFDdkUsbUVBQXlEO0FBQ3pELGlFQUF1RDtBQUdoRCxJQUFNLGlCQUFpQixHQUF2QixNQUFNLGlCQUFpQjtDQWM3QixDQUFBO0FBZFksOENBQWlCO0FBRTVCO0lBREMsSUFBQSx1QkFBYSxFQUFDLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLENBQUM7OzJEQUNuQjtBQUcxQjtJQURDLElBQUEsdUJBQWEsRUFBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Z0RBQ25CO0FBSWY7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsc0NBQWMsRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUN4RCxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQztrREFDekIsc0NBQWMsb0JBQWQsc0NBQWM7eURBQUM7QUFJaEM7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsZ0JBQUcsRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzFELElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQztrREFDekIsZ0JBQUcsb0JBQUgsZ0JBQUc7OENBQUM7NEJBYkMsaUJBQWlCO0lBRDdCLElBQUEsZ0JBQU0sRUFBQyxxQkFBcUIsQ0FBQztHQUNqQixpQkFBaUIsQ0FjN0IiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGVudGl0aWVzXFxjb3JyZXNwb25kZW5jZS10YWcuZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudGl0eSwgUHJpbWFyeUNvbHVtbiwgTWFueVRvT25lLCBKb2luQ29sdW1uIH0gZnJvbSAndHlwZW9ybSc7XHJcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlIH0gZnJvbSAnLi9jb3JyZXNwb25kZW5jZS5lbnRpdHknO1xyXG5pbXBvcnQgeyBUYWcgfSBmcm9tICcuLi8uLi9tYXN0ZXIvZW50aXRpZXMvdGFnLmVudGl0eSc7XHJcblxyXG5ARW50aXR5KCdjb3JyZXNwb25kZW5jZV90YWdzJylcclxuZXhwb3J0IGNsYXNzIENvcnJlc3BvbmRlbmNlVGFnIHtcclxuICBAUHJpbWFyeUNvbHVtbih7IG5hbWU6ICdjb3JyZXNwb25kZW5jZV9pZCcgfSlcclxuICBjb3JyZXNwb25kZW5jZUlkITogbnVtYmVyO1xyXG5cclxuICBAUHJpbWFyeUNvbHVtbih7IG5hbWU6ICd0YWdfaWQnIH0pXHJcbiAgdGFnSWQhOiBudW1iZXI7XHJcblxyXG4gIEBNYW55VG9PbmUoKCkgPT4gQ29ycmVzcG9uZGVuY2UsIHsgb25EZWxldGU6ICdDQVNDQURFJyB9KVxyXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2NvcnJlc3BvbmRlbmNlX2lkJyB9KVxyXG4gIGNvcnJlc3BvbmRlbmNlPzogQ29ycmVzcG9uZGVuY2U7XHJcblxyXG4gIEBNYW55VG9PbmUoKCkgPT4gVGFnLCB7IG9uRGVsZXRlOiAnQ0FTQ0FERScsIGVhZ2VyOiB0cnVlIH0pXHJcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAndGFnX2lkJyB9KVxyXG4gIHRhZz86IFRhZztcclxufVxyXG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/af/correspondencetagentity_af3367c9adb35a574b84ed144a9fb079.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/af/correspondencetagentity_af3367c9adb35a574b84ed144a9fb079.map new file mode 100644 index 0000000..0120f99 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/af/correspondencetagentity_af3367c9adb35a574b84ed144a9fb079.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-tag.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAAuE;AACvE,mEAAyD;AACzD,iEAAuD;AAGhD,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;CAc7B,CAAA;AAdY,8CAAiB;AAE5B;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;;2DACnB;AAG1B;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;;gDACnB;AAIf;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,sCAAc,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACxD,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;kDACzB,sCAAc,oBAAd,sCAAc;yDAAC;AAIhC;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,gBAAG,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC1D,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;kDACzB,gBAAG,oBAAH,gBAAG;8CAAC;4BAbC,iBAAiB;IAD7B,IAAA,gBAAM,EAAC,qBAAqB,CAAC;GACjB,iBAAiB,CAc7B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-tag.entity.ts"],"sourcesContent":["import { Entity, PrimaryColumn, ManyToOne, JoinColumn } from 'typeorm';\r\nimport { Correspondence } from './correspondence.entity';\r\nimport { Tag } from '../../master/entities/tag.entity';\r\n\r\n@Entity('correspondence_tags')\r\nexport class CorrespondenceTag {\r\n @PrimaryColumn({ name: 'correspondence_id' })\r\n correspondenceId!: number;\r\n\r\n @PrimaryColumn({ name: 'tag_id' })\r\n tagId!: number;\r\n\r\n @ManyToOne(() => Correspondence, { onDelete: 'CASCADE' })\r\n @JoinColumn({ name: 'correspondence_id' })\r\n correspondence?: Correspondence;\r\n\r\n @ManyToOne(() => Tag, { onDelete: 'CASCADE', eager: true })\r\n @JoinColumn({ name: 'tag_id' })\r\n tag?: Tag;\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b3/searchprojectdto_b37c976b8cc164c77012c317a0db0327 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b3/searchprojectdto_b37c976b8cc164c77012c317a0db0327 new file mode 100644 index 0000000..bd84a38 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b3/searchprojectdto_b37c976b8cc164c77012c317a0db0327 @@ -0,0 +1,52 @@ +b16da3edf295caa4e12ee7c563e66669 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SearchProjectDto = void 0; +const class_validator_1 = require("class-validator"); +const class_transformer_1 = require("class-transformer"); +class SearchProjectDto { + constructor() { + this.page = 1; + this.limit = 20; + } +} +exports.SearchProjectDto = SearchProjectDto; +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], SearchProjectDto.prototype, "search", void 0); +__decorate([ + (0, class_validator_1.IsOptional)(), + (0, class_validator_1.IsBoolean)(), + (0, class_transformer_1.Transform)(({ value }) => { + if (value === 'true') + return true; + if (value === 'false') + return false; + return value; + }), + __metadata("design:type", Boolean) +], SearchProjectDto.prototype, "isActive", void 0); +__decorate([ + (0, class_validator_1.IsOptional)(), + (0, class_validator_1.IsInt)(), + (0, class_transformer_1.Type)(() => Number), + __metadata("design:type", Number) +], SearchProjectDto.prototype, "page", void 0); +__decorate([ + (0, class_validator_1.IsOptional)(), + (0, class_validator_1.IsInt)(), + (0, class_transformer_1.Type)(() => Number), + __metadata("design:type", Number) +], SearchProjectDto.prototype, "limit", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccHJvamVjdFxcZHRvXFxzZWFyY2gtcHJvamVjdC5kdG8udHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEscURBQXlFO0FBQ3pFLHlEQUFvRDtBQUVwRCxNQUFhLGdCQUFnQjtJQUE3QjtRQWlCRSxTQUFJLEdBQVcsQ0FBQyxDQUFDO1FBS2pCLFVBQUssR0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztDQUFBO0FBdkJELDRDQXVCQztBQXBCQztJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7Z0RBQ0c7QUFTaEI7SUFQQyxJQUFBLDRCQUFVLEdBQUU7SUFDWixJQUFBLDJCQUFTLEdBQUU7SUFDWCxJQUFBLDZCQUFTLEVBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7UUFDdkIsSUFBSSxLQUFLLEtBQUssTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2xDLElBQUksS0FBSyxLQUFLLE9BQU87WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNwQyxPQUFPLEtBQTRCLENBQUM7SUFDdEMsQ0FBQyxDQUFDOztrREFDaUI7QUFLbkI7SUFIQyxJQUFBLDRCQUFVLEdBQUU7SUFDWixJQUFBLHVCQUFLLEdBQUU7SUFDUCxJQUFBLHdCQUFJLEVBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDOzs4Q0FDRjtBQUtqQjtJQUhDLElBQUEsNEJBQVUsR0FBRTtJQUNaLElBQUEsdUJBQUssR0FBRTtJQUNQLElBQUEsd0JBQUksRUFBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7OytDQUNBIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXHByb2plY3RcXGR0b1xcc2VhcmNoLXByb2plY3QuZHRvLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElzU3RyaW5nLCBJc09wdGlvbmFsLCBJc0ludCwgSXNCb29sZWFuIH0gZnJvbSAnY2xhc3MtdmFsaWRhdG9yJztcbmltcG9ydCB7IFR5cGUsIFRyYW5zZm9ybSB9IGZyb20gJ2NsYXNzLXRyYW5zZm9ybWVyJztcblxuZXhwb3J0IGNsYXNzIFNlYXJjaFByb2plY3REdG8ge1xuICBASXNTdHJpbmcoKVxuICBASXNPcHRpb25hbCgpXG4gIHNlYXJjaD86IHN0cmluZzsgLy8g4LiE4LmJ4LiZ4Lir4Liy4LiI4Liy4LiBIFByb2plY3QgQ29kZSDguKvguKPguLfguK0gTmFtZVxuXG4gIEBJc09wdGlvbmFsKClcbiAgQElzQm9vbGVhbigpXG4gIEBUcmFuc2Zvcm0oKHsgdmFsdWUgfSkgPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gJ3RydWUnKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodmFsdWUgPT09ICdmYWxzZScpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdmFsdWUgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgfSlcbiAgaXNBY3RpdmU/OiBib29sZWFuOyAvLyDguIHguKPguK3guIfguJXguLLguKHguKrguJbguLLguJnguLAgQWN0aXZlXG5cbiAgQElzT3B0aW9uYWwoKVxuICBASXNJbnQoKVxuICBAVHlwZSgoKSA9PiBOdW1iZXIpXG4gIHBhZ2U6IG51bWJlciA9IDE7XG5cbiAgQElzT3B0aW9uYWwoKVxuICBASXNJbnQoKVxuICBAVHlwZSgoKSA9PiBOdW1iZXIpXG4gIGxpbWl0OiBudW1iZXIgPSAyMDtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b3/searchprojectdto_b37c976b8cc164c77012c317a0db0327.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b3/searchprojectdto_b37c976b8cc164c77012c317a0db0327.map new file mode 100644 index 0000000..6b1179d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b3/searchprojectdto_b37c976b8cc164c77012c317a0db0327.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\project\\dto\\search-project.dto.ts","mappings":";;;;;;;;;;;;AAAA,qDAAyE;AACzE,yDAAoD;AAEpD,MAAa,gBAAgB;IAA7B;QAiBE,SAAI,GAAW,CAAC,CAAC;QAKjB,UAAK,GAAW,EAAE,CAAC;IACrB,CAAC;CAAA;AAvBD,4CAuBC;AApBC;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;gDACG;AAShB;IAPC,IAAA,4BAAU,GAAE;IACZ,IAAA,2BAAS,GAAE;IACX,IAAA,6BAAS,EAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QACvB,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC;QAClC,IAAI,KAAK,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC;QACpC,OAAO,KAA4B,CAAC;IACtC,CAAC,CAAC;;kDACiB;AAKnB;IAHC,IAAA,4BAAU,GAAE;IACZ,IAAA,uBAAK,GAAE;IACP,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;;8CACF;AAKjB;IAHC,IAAA,4BAAU,GAAE;IACZ,IAAA,uBAAK,GAAE;IACP,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;;+CACA","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\project\\dto\\search-project.dto.ts"],"sourcesContent":["import { IsString, IsOptional, IsInt, IsBoolean } from 'class-validator';\nimport { Type, Transform } from 'class-transformer';\n\nexport class SearchProjectDto {\n @IsString()\n @IsOptional()\n search?: string; // ค้นหาจาก Project Code หรือ Name\n\n @IsOptional()\n @IsBoolean()\n @Transform(({ value }) => {\n if (value === 'true') return true;\n if (value === 'false') return false;\n return value as boolean | undefined;\n })\n isActive?: boolean; // กรองตามสถานะ Active\n\n @IsOptional()\n @IsInt()\n @Type(() => Number)\n page: number = 1;\n\n @IsOptional()\n @IsInt()\n @Type(() => Number)\n limit: number = 20;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b5/projectservice_b58a6892c260dee338f7b0290c276312 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b5/projectservice_b58a6892c260dee338f7b0290c276312 new file mode 100644 index 0000000..63b19c8 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b5/projectservice_b58a6892c260dee338f7b0290c276312 @@ -0,0 +1,114 @@ +71b0c30cffc1f68125bb58938647cd7a +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var ProjectService_1; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ProjectService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +// Entities +const project_entity_1 = require("./entities/project.entity"); +const organization_service_1 = require("../organization/organization.service"); +let ProjectService = ProjectService_1 = class ProjectService { + constructor(projectRepository, organizationService) { + this.projectRepository = projectRepository; + this.organizationService = organizationService; + this.logger = new common_1.Logger(ProjectService_1.name); + } + // --- CRUD Operations --- + async create(createDto) { + // 1. เช็คชื่อ/รหัสซ้ำ (ถ้าจำเป็น) + const existing = await this.projectRepository.findOne({ + where: { projectCode: createDto.projectCode }, + }); + if (existing) { + throw new common_1.ConflictException(`Project Code "${createDto.projectCode}" already exists`); + } + // 2. สร้าง Project + const project = this.projectRepository.create(createDto); + return this.projectRepository.save(project); + } + async findAll(searchDto) { + const { search, isActive, page = 1, limit = 20 } = searchDto; + const skip = (page - 1) * limit; + // สร้าง Query Builder + const query = this.projectRepository.createQueryBuilder('project'); + if (isActive !== undefined) { + query.andWhere('project.isActive = :isActive', { isActive }); + } + if (search) { + query.andWhere('(project.projectCode LIKE :search OR project.projectName LIKE :search)', { search: `%${search}%` }); + } + query.orderBy('project.createdAt', 'DESC'); + query.skip(skip).take(limit); + const [items, total] = await query.getManyAndCount(); + return { + data: items, + meta: { + total, + page, + limit, + totalPages: Math.ceil(total / limit), + }, + }; + } + async findOne(id) { + const project = await this.projectRepository.findOne({ + where: { id }, + relations: ['contracts'], // ดึงสัญญาที่เกี่ยวข้องมาด้วย + }); + if (!project) { + throw new common_1.NotFoundException(`Project ID ${id} not found`); + } + return project; + } + async findOneByUuid(publicId) { + const project = await this.projectRepository.findOne({ + where: { publicId }, + relations: ['contracts'], + }); + if (!project) { + throw new common_1.NotFoundException(`Project with publicId ${publicId} not found`); + } + return project; + } + async update(publicId, updateDto) { + const project = await this.findOneByUuid(publicId); + // Merge ข้อมูลใหม่ใส่ข้อมูลเดิม + this.projectRepository.merge(project, updateDto); + return this.projectRepository.save(project); + } + async remove(publicId) { + const project = await this.findOneByUuid(publicId); + // ใช้ Soft Delete + return this.projectRepository.softRemove(project); + } + async findContracts(publicId) { + const project = await this.findOneByUuid(publicId); + return project.contracts; + } + // --- Organization Helper --- + async findAllOrganizations() { + return this.organizationService.findAllActive(); + } +}; +exports.ProjectService = ProjectService; +exports.ProjectService = ProjectService = ProjectService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(project_entity_1.Project)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object, typeof (_b = typeof organization_service_1.OrganizationService !== "undefined" && organization_service_1.OrganizationService) === "function" ? _b : Object]) +], ProjectService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccHJvamVjdFxccHJvamVjdC5zZXJ2aWNlLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBS3dCO0FBQ3hCLDZDQUFtRDtBQUNuRCxxQ0FBcUM7QUFFckMsV0FBVztBQUNYLDhEQUFvRDtBQUNwRCwrRUFBMkU7QUFRcEUsSUFBTSxjQUFjLHNCQUFwQixNQUFNLGNBQWM7SUFHekIsWUFFRSxpQkFBOEMsRUFDdEMsbUJBQXdDO1FBRHhDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBcUI7UUFDdEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUxqQyxXQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsZ0JBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQU12RCxDQUFDO0lBRUosMEJBQTBCO0lBRTFCLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBMkI7UUFDdEMsa0NBQWtDO1FBQ2xDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQztZQUNwRCxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLFdBQVcsRUFBRTtTQUM5QyxDQUFDLENBQUM7UUFDSCxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLDBCQUFpQixDQUN6QixpQkFBaUIsU0FBUyxDQUFDLFdBQVcsa0JBQWtCLENBQ3pELENBQUM7UUFDSixDQUFDO1FBRUQsbUJBQW1CO1FBQ25CLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekQsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQTJCO1FBQ3ZDLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUs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UUFBZ0I7UUFDbEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sT0FBTyxDQUFDLFNBQVMsQ0FBQztJQUMzQixDQUFDO0lBRUQsOEJBQThCO0lBRTlCLEtBQUssQ0FBQyxvQkFBb0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDbEQsQ0FBQztDQUNGLENBQUE7QUFsSFksd0NBQWM7eUJBQWQsY0FBYztJQUQxQixJQUFBLG1CQUFVLEdBQUU7SUFLUixXQUFBLElBQUEsMEJBQWdCLEVBQUMsd0JBQU8sQ0FBQyxDQUFBO3lEQUNDLG9CQUFVLG9CQUFWLG9CQUFVLG9EQUNSLDBDQUFtQixvQkFBbkIsMENBQW1CO0dBTnZDLGNBQWMsQ0FrSDFCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXHByb2plY3RcXHByb2plY3Quc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEluamVjdGFibGUsXHJcbiAgTm90Rm91bmRFeGNlcHRpb24sXHJcbiAgQ29uZmxpY3RFeGNlcHRpb24sXHJcbiAgTG9nZ2VyLFxyXG59IGZyb20gJ0BuZXN0anMvY29tbW9uJztcclxuaW1wb3J0IHsgSW5qZWN0UmVwb3NpdG9yeSB9IGZyb20gJ0BuZXN0anMvdHlwZW9ybSc7XHJcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tICd0eXBlb3JtJztcclxuXHJcbi8vIEVudGl0aWVzXHJcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuL2VudGl0aWVzL3Byb2plY3QuZW50aXR5JztcclxuaW1wb3J0IHsgT3JnYW5pemF0aW9uU2VydmljZSB9IGZyb20gJy4uL29yZ2FuaXphdGlvbi9vcmdhbml6YXRpb24uc2VydmljZSc7XHJcblxyXG4vLyBEVE9zXHJcbmltcG9ydCB7IENyZWF0ZVByb2plY3REdG8gfSBmcm9tICcuL2R0by9jcmVhdGUtcHJvamVjdC5kdG8uanMnO1xyXG5pbXBvcnQgeyBVcGRhdGVQcm9qZWN0RHRvIH0gZnJvbSAnLi9kdG8vdXBkYXRlLXByb2plY3QuZHRvLmpzJztcclxuaW1wb3J0IHsgU2VhcmNoUHJvamVjdER0byB9IGZyb20gJy4vZHRvL3NlYXJjaC1wcm9qZWN0LmR0by5qcyc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBQcm9qZWN0U2VydmljZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKFByb2plY3RTZXJ2aWNlLm5hbWUpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KFByb2plY3QpXHJcbiAgICBwcml2YXRlIHByb2plY3RSZXBvc2l0b3J5OiBSZXBvc2l0b3J5PFByb2plY3Q+LFxyXG4gICAgcHJpdmF0ZSBvcmdhbml6YXRpb25TZXJ2aWNlOiBPcmdhbml6YXRpb25TZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICAvLyAtLS0gQ1JVRCBPcGVyYXRpb25zIC0tLVxyXG5cclxuICBhc3luYyBjcmVhdGUoY3JlYXRlRHRvOiBDcmVhdGVQcm9qZWN0RHRvKSB7XHJcbiAgICAvLyAxLiDguYDguIrguYfguITguIrguLfguYjguK0v4Lij4Lir4Lix4Liq4LiL4LmJ4LizICjguJbguYnguLLguIjguLPguYDguJvguYfguJkpXHJcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMucHJvamVjdFJlcG9zaXRvcnkuZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7IHByb2plY3RDb2RlOiBjcmVhdGVEdG8ucHJvamVjdENvZGUgfSxcclxuICAgIH0pO1xyXG4gICAgaWYgKGV4aXN0aW5nKSB7XHJcbiAgICAgIHRocm93IG5ldyBDb25mbGljdEV4Y2VwdGlvbihcclxuICAgICAgICBgUHJvamVjdCBDb2RlIFwiJHtjcmVhdGVEdG8ucHJvamVjdENvZGV9XCIgYWxyZWFkeSBleGlzdHNgXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMi4g4Liq4Lij4LmJ4Liy4LiHIFByb2plY3RcclxuICAgIGNvbnN0IHByb2plY3QgPSB0aGlzLnByb2plY3RSZXBvc2l0b3J5LmNyZWF0ZShjcmVhdGVEdG8pO1xyXG4gICAgcmV0dXJuIHRoaXMucHJvamVjdFJlcG9zaXRvcnkuc2F2ZShwcm9qZWN0KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGZpbmRBbGwoc2VhcmNoRHRvOiBTZWFyY2hQcm9qZWN0RHRvKSB7XHJcbiAgICBjb25zdCB7IHNlYXJjaCwgaXNBY3RpdmUsIHBhZ2UgPSAxLCBsaW1pdCA9IDIwIH0gPSBzZWFyY2hEdG87XHJcbiAgICBjb25zdCBza2lwID0gKHBhZ2UgLSAxKSAqIGxpbWl0O1xyXG5cclxuICAgIC8vIOC4quC4o+C5ieC4suC4hyBRdWVyeSBCdWlsZGVyXHJcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMucHJvamVjdFJlcG9zaXRvcnkuY3JlYXRlUXVlcnlCdWlsZGVyKCdwcm9qZWN0Jyk7XHJcblxyXG4gICAgaWYgKGlzQWN0aXZlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcXVlcnkuYW5kV2hlcmUoJ3Byb2plY3QuaXNBY3RpdmUgPSA6aXNBY3RpdmUnLCB7IGlzQWN0aXZlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZWFyY2gpIHtcclxuICAgICAgcXVlcnkuYW5kV2hlcmUoXHJcbiAgICAgICAgJyhwcm9qZWN0LnByb2plY3RDb2RlIExJS0UgOnNlYXJjaCBPUiBwcm9qZWN0LnByb2plY3ROYW1lIExJS0UgOnNlYXJjaCknLFxyXG4gICAgICAgIHsgc2VhcmNoOiBgJSR7c2VhcmNofSVgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBxdWVyeS5vcmRlckJ5KCdwcm9qZWN0LmNyZWF0ZWRBdCcsICdERVNDJyk7XHJcbiAgICBxdWVyeS5za2lwKHNraXApLnRha2UobGltaXQpO1xyXG5cclxuICAgIGNvbnN0IFtpdGVtcywgdG90YWxdID0gYXdhaXQgcXVlcnkuZ2V0TWFueUFuZENvdW50KCk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZGF0YTogaXRlbXMsXHJcbiAgICAgIG1ldGE6IHtcclxuICAgICAgICB0b3RhbCxcclxuICAgICAgICBwYWdlLFxyXG4gICAgICAgIGxpbWl0LFxyXG4gICAgICAgIHRvdGFsUGFnZXM6IE1hdGguY2VpbCh0b3RhbCAvIGxpbWl0KSxcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBhc3luYyBmaW5kT25lKGlkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHByb2plY3QgPSBhd2FpdCB0aGlzLnByb2plY3RSZXBvc2l0b3J5LmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBpZCB9LFxyXG4gICAgICByZWxhdGlvbnM6IFsnY29udHJhY3RzJ10sIC8vIOC4lOC4tuC4h+C4quC4seC4jeC4jeC4suC4l+C4teC5iOC5gOC4geC4teC5iOC4ouC4p+C4guC5ieC4reC4h+C4oeC4suC4lOC5ieC4p+C4olxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCFwcm9qZWN0KSB7XHJcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgUHJvamVjdCBJRCAke2lkfSBub3QgZm91bmRgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcHJvamVjdDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGZpbmRPbmVCeVV1aWQocHVibGljSWQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgcHJvamVjdCA9IGF3YWl0IHRoaXMucHJvamVjdFJlcG9zaXRvcnkuZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7IHB1YmxpY0lkIH0sXHJcbiAgICAgIHJlbGF0aW9uczogWydjb250cmFjdHMnXSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghcHJvamVjdCkge1xyXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oXHJcbiAgICAgICAgYFByb2plY3Qgd2l0aCBwdWJsaWNJZCAke3B1YmxpY0lkfSBub3QgZm91bmRgXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHByb2plY3Q7XHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGRhdGUocHVibGljSWQ6IHN0cmluZywgdXBkYXRlRHRvOiBVcGRhdGVQcm9qZWN0RHRvKSB7XHJcbiAgICBjb25zdCBwcm9qZWN0ID0gYXdhaXQgdGhpcy5maW5kT25lQnlVdWlkKHB1YmxpY0lkKTtcclxuXHJcbiAgICAvLyBNZXJnZSDguILguYnguK3guKHguLnguKXguYPguKvguKHguYjguYPguKrguYjguILguYnguK3guKHguLnguKXguYDguJTguLTguKFcclxuICAgIHRoaXMucHJvamVjdFJlcG9zaXRvcnkubWVyZ2UocHJvamVjdCwgdXBkYXRlRHRvKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5wcm9qZWN0UmVwb3NpdG9yeS5zYXZlKHByb2plY3QpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVtb3ZlKHB1YmxpY0lkOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHByb2plY3QgPSBhd2FpdCB0aGlzLmZpbmRPbmVCeVV1aWQocHVibGljSWQpO1xyXG4gICAgLy8g4LmD4LiK4LmJIFNvZnQgRGVsZXRlXHJcbiAgICByZXR1cm4gdGhpcy5wcm9qZWN0UmVwb3NpdG9yeS5zb2Z0UmVtb3ZlKHByb2plY3QpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmluZENvbnRyYWN0cyhwdWJsaWNJZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBwcm9qZWN0ID0gYXdhaXQgdGhpcy5maW5kT25lQnlVdWlkKHB1YmxpY0lkKTtcclxuICAgIHJldHVybiBwcm9qZWN0LmNvbnRyYWN0cztcclxuICB9XHJcblxyXG4gIC8vIC0tLSBPcmdhbml6YXRpb24gSGVscGVyIC0tLVxyXG5cclxuICBhc3luYyBmaW5kQWxsT3JnYW5pemF0aW9ucygpIHtcclxuICAgIHJldHVybiB0aGlzLm9yZ2FuaXphdGlvblNlcnZpY2UuZmluZEFsbEFjdGl2ZSgpO1xyXG4gIH1cclxufVxyXG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b5/projectservice_b58a6892c260dee338f7b0290c276312.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b5/projectservice_b58a6892c260dee338f7b0290c276312.map new file mode 100644 index 0000000..152ea64 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/b5/projectservice_b58a6892c260dee338f7b0290c276312.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\project\\project.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\project\\project.service.ts"],"sourcesContent":["import {\r\n Injectable,\r\n NotFoundException,\r\n ConflictException,\r\n Logger,\r\n} from '@nestjs/common';\r\nimport { InjectRepository } from '@nestjs/typeorm';\r\nimport { Repository } from 'typeorm';\r\n\r\n// Entities\r\nimport { Project } from './entities/project.entity';\r\nimport { OrganizationService } from '../organization/organization.service';\r\n\r\n// DTOs\r\nimport { CreateProjectDto } from './dto/create-project.dto.js';\r\nimport { UpdateProjectDto } from './dto/update-project.dto.js';\r\nimport { SearchProjectDto } from './dto/search-project.dto.js';\r\n\r\n@Injectable()\r\nexport class ProjectService {\r\n private readonly logger = new Logger(ProjectService.name);\r\n\r\n constructor(\r\n @InjectRepository(Project)\r\n private projectRepository: Repository,\r\n private organizationService: OrganizationService\r\n ) {}\r\n\r\n // --- CRUD Operations ---\r\n\r\n async create(createDto: CreateProjectDto) {\r\n // 1. เช็คชื่อ/รหัสซ้ำ (ถ้าจำเป็น)\r\n const existing = await this.projectRepository.findOne({\r\n where: { projectCode: createDto.projectCode },\r\n });\r\n if (existing) {\r\n throw new ConflictException(\r\n `Project Code \"${createDto.projectCode}\" already exists`\r\n );\r\n }\r\n\r\n // 2. สร้าง Project\r\n const project = this.projectRepository.create(createDto);\r\n return this.projectRepository.save(project);\r\n }\r\n\r\n async findAll(searchDto: SearchProjectDto) {\r\n const { search, isActive, page = 1, limit = 20 } = searchDto;\r\n const skip = (page - 1) * limit;\r\n\r\n // สร้าง Query Builder\r\n const query = this.projectRepository.createQueryBuilder('project');\r\n\r\n if (isActive !== undefined) {\r\n query.andWhere('project.isActive = :isActive', { isActive });\r\n }\r\n\r\n if (search) {\r\n query.andWhere(\r\n '(project.projectCode LIKE :search OR project.projectName LIKE :search)',\r\n { search: `%${search}%` }\r\n );\r\n }\r\n\r\n query.orderBy('project.createdAt', 'DESC');\r\n query.skip(skip).take(limit);\r\n\r\n const [items, total] = await query.getManyAndCount();\r\n\r\n return {\r\n data: items,\r\n meta: {\r\n total,\r\n page,\r\n limit,\r\n totalPages: Math.ceil(total / limit),\r\n },\r\n };\r\n }\r\n\r\n async findOne(id: number) {\r\n const project = await this.projectRepository.findOne({\r\n where: { id },\r\n relations: ['contracts'], // ดึงสัญญาที่เกี่ยวข้องมาด้วย\r\n });\r\n\r\n if (!project) {\r\n throw new NotFoundException(`Project ID ${id} not found`);\r\n }\r\n\r\n return project;\r\n }\r\n\r\n async findOneByUuid(publicId: string) {\r\n const project = await this.projectRepository.findOne({\r\n where: { publicId },\r\n relations: ['contracts'],\r\n });\r\n\r\n if (!project) {\r\n throw new NotFoundException(\r\n `Project with publicId ${publicId} not found`\r\n );\r\n }\r\n\r\n return project;\r\n }\r\n\r\n async update(publicId: string, updateDto: UpdateProjectDto) {\r\n const project = await this.findOneByUuid(publicId);\r\n\r\n // Merge ข้อมูลใหม่ใส่ข้อมูลเดิม\r\n this.projectRepository.merge(project, updateDto);\r\n\r\n return this.projectRepository.save(project);\r\n }\r\n\r\n async remove(publicId: string) {\r\n const project = await this.findOneByUuid(publicId);\r\n // ใช้ Soft Delete\r\n return this.projectRepository.softRemove(project);\r\n }\r\n\r\n async findContracts(publicId: string) {\r\n const project = await this.findOneByUuid(publicId);\r\n return project.contracts;\r\n }\r\n\r\n // --- Organization Helper ---\r\n\r\n async findAllOrganizations() {\r\n return this.organizationService.findAllActive();\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bc/v6ToV1_bc94dc67f15a0950896bd74549e92e15 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bc/v6ToV1_bc94dc67f15a0950896bd74549e92e15 new file mode 100644 index 0000000..3a4a5cd --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bc/v6ToV1_bc94dc67f15a0950896bd74549e92e15 @@ -0,0 +1,15 @@ +c986d37c0a9fa0d03986777b9073c586 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const parse_js_1 = require("./parse.js"); +const stringify_js_1 = require("./stringify.js"); +function v6ToV1(uuid) { + const v6Bytes = typeof uuid === 'string' ? (0, parse_js_1.default)(uuid) : uuid; + const v1Bytes = _v6ToV1(v6Bytes); + return typeof uuid === 'string' ? (0, stringify_js_1.unsafeStringify)(v1Bytes) : v1Bytes; +} +exports.default = v6ToV1; +function _v6ToV1(v6Bytes) { + return Uint8Array.of(((v6Bytes[3] & 0x0f) << 4) | ((v6Bytes[4] >> 4) & 0x0f), ((v6Bytes[4] & 0x0f) << 4) | ((v6Bytes[5] & 0xf0) >> 4), ((v6Bytes[5] & 0x0f) << 4) | (v6Bytes[6] & 0x0f), v6Bytes[7], ((v6Bytes[1] & 0x0f) << 4) | ((v6Bytes[2] & 0xf0) >> 4), ((v6Bytes[2] & 0x0f) << 4) | ((v6Bytes[3] & 0xf0) >> 4), 0x10 | ((v6Bytes[0] & 0xf0) >> 4), ((v6Bytes[0] & 0x0f) << 4) | ((v6Bytes[1] & 0xf0) >> 4), v6Bytes[8], v6Bytes[9], v6Bytes[10], v6Bytes[11], v6Bytes[12], v6Bytes[13], v6Bytes[14], v6Bytes[15]); +} +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdjZUb1YxLmpzIiwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUNiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUN6QyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUNqRCxTQUFTLE1BQU0sQ0FBQyxJQUFJO0lBQ2hCLE1BQU0sT0FBTyxHQUFHLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDaEYsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUM3RixDQUFDO0FBQ0QsT0FBTyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7QUFDekIsU0FBUyxPQUFPLENBQUMsT0FBTztJQUNwQixPQUFPLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDN2YsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcbm9kZV9tb2R1bGVzXFwucG5wbVxcdXVpZEAxMS4xLjBcXG5vZGVfbW9kdWxlc1xcdXVpZFxcZGlzdFxcY2pzXFx2NlRvVjEuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBwYXJzZV9qc18xID0gcmVxdWlyZShcIi4vcGFyc2UuanNcIik7XG5jb25zdCBzdHJpbmdpZnlfanNfMSA9IHJlcXVpcmUoXCIuL3N0cmluZ2lmeS5qc1wiKTtcbmZ1bmN0aW9uIHY2VG9WMSh1dWlkKSB7XG4gICAgY29uc3QgdjZCeXRlcyA9IHR5cGVvZiB1dWlkID09PSAnc3RyaW5nJyA/ICgwLCBwYXJzZV9qc18xLmRlZmF1bHQpKHV1aWQpIDogdXVpZDtcbiAgICBjb25zdCB2MUJ5dGVzID0gX3Y2VG9WMSh2NkJ5dGVzKTtcbiAgICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnID8gKDAsIHN0cmluZ2lmeV9qc18xLnVuc2FmZVN0cmluZ2lmeSkodjFCeXRlcykgOiB2MUJ5dGVzO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gdjZUb1YxO1xuZnVuY3Rpb24gX3Y2VG9WMSh2NkJ5dGVzKSB7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkub2YoKCh2NkJ5dGVzWzNdICYgMHgwZikgPDwgNCkgfCAoKHY2Qnl0ZXNbNF0gPj4gNCkgJiAweDBmKSwgKCh2NkJ5dGVzWzRdICYgMHgwZikgPDwgNCkgfCAoKHY2Qnl0ZXNbNV0gJiAweGYwKSA+PiA0KSwgKCh2NkJ5dGVzWzVdICYgMHgwZikgPDwgNCkgfCAodjZCeXRlc1s2XSAmIDB4MGYpLCB2NkJ5dGVzWzddLCAoKHY2Qnl0ZXNbMV0gJiAweDBmKSA8PCA0KSB8ICgodjZCeXRlc1syXSAmIDB4ZjApID4+IDQpLCAoKHY2Qnl0ZXNbMl0gJiAweDBmKSA8PCA0KSB8ICgodjZCeXRlc1szXSAmIDB4ZjApID4+IDQpLCAweDEwIHwgKCh2NkJ5dGVzWzBdICYgMHhmMCkgPj4gNCksICgodjZCeXRlc1swXSAmIDB4MGYpIDw8IDQpIHwgKCh2NkJ5dGVzWzFdICYgMHhmMCkgPj4gNCksIHY2Qnl0ZXNbOF0sIHY2Qnl0ZXNbOV0sIHY2Qnl0ZXNbMTBdLCB2NkJ5dGVzWzExXSwgdjZCeXRlc1sxMl0sIHY2Qnl0ZXNbMTNdLCB2NkJ5dGVzWzE0XSwgdjZCeXRlc1sxNV0pO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bc/v6ToV1_bc94dc67f15a0950896bd74549e92e15.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bc/v6ToV1_bc94dc67f15a0950896bd74549e92e15.map new file mode 100644 index 0000000..f50d9e8 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bc/v6ToV1_bc94dc67f15a0950896bd74549e92e15.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v6ToV1.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;AACzC,MAAM,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AACjD,SAAS,MAAM,CAAC,IAAI;IAChB,MAAM,OAAO,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC7F,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;AACzB,SAAS,OAAO,CAAC,OAAO;IACpB,OAAO,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7f,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v6ToV1.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst parse_js_1 = require(\"./parse.js\");\nconst stringify_js_1 = require(\"./stringify.js\");\nfunction v6ToV1(uuid) {\n const v6Bytes = typeof uuid === 'string' ? (0, parse_js_1.default)(uuid) : uuid;\n const v1Bytes = _v6ToV1(v6Bytes);\n return typeof uuid === 'string' ? (0, stringify_js_1.unsafeStringify)(v1Bytes) : v1Bytes;\n}\nexports.default = v6ToV1;\nfunction _v6ToV1(v6Bytes) {\n return Uint8Array.of(((v6Bytes[3] & 0x0f) << 4) | ((v6Bytes[4] >> 4) & 0x0f), ((v6Bytes[4] & 0x0f) << 4) | ((v6Bytes[5] & 0xf0) >> 4), ((v6Bytes[5] & 0x0f) << 4) | (v6Bytes[6] & 0x0f), v6Bytes[7], ((v6Bytes[1] & 0x0f) << 4) | ((v6Bytes[2] & 0xf0) >> 4), ((v6Bytes[2] & 0x0f) << 4) | ((v6Bytes[3] & 0xf0) >> 4), 0x10 | ((v6Bytes[0] & 0xf0) >> 4), ((v6Bytes[0] & 0x0f) << 4) | ((v6Bytes[1] & 0xf0) >> 4), v6Bytes[8], v6Bytes[9], v6Bytes[10], v6Bytes[11], v6Bytes[12], v6Bytes[13], v6Bytes[14], v6Bytes[15]);\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/be/authcontrollerspec_be01d6d478a32ac64cf5ff735bdc6ed3 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/be/authcontrollerspec_be01d6d478a32ac64cf5ff735bdc6ed3 new file mode 100644 index 0000000..ed075e6 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/be/authcontrollerspec_be01d6d478a32ac64cf5ff735bdc6ed3 @@ -0,0 +1,70 @@ +17d93463a5f26bea1065a5cafefc7621 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const testing_1 = require("@nestjs/testing"); +const common_1 = require("@nestjs/common"); +const auth_controller_1 = require("./auth.controller"); +const auth_service_1 = require("./auth.service"); +describe('AuthController', () => { + let controller; + let mockAuthService; + beforeEach(async () => { + mockAuthService = { + validateUser: jest.fn(), + login: jest.fn(), + register: jest.fn(), + refreshToken: jest.fn(), + logout: jest.fn(), + }; + const module = await testing_1.Test.createTestingModule({ + controllers: [auth_controller_1.AuthController], + providers: [ + { + provide: auth_service_1.AuthService, + useValue: mockAuthService, + }, + ], + }).compile(); + controller = module.get(auth_controller_1.AuthController); + }); + it('should be defined', () => { + expect(controller).toBeDefined(); + }); + describe('login', () => { + it('should return tokens when credentials are valid', async () => { + const loginDto = { username: 'test', password: 'password' }; + const mockUser = { user_id: 1, username: 'test' }; + const mockTokens = { + access_token: 'access_token', + refresh_token: 'refresh_token', + user: mockUser, + }; + mockAuthService.validateUser.mockResolvedValue(mockUser); + mockAuthService.login.mockResolvedValue(mockTokens); + const result = await controller.login(loginDto); + expect(mockAuthService.validateUser).toHaveBeenCalledWith('test', 'password'); + expect(mockAuthService.login).toHaveBeenCalledWith(mockUser); + expect(result).toEqual(mockTokens); + }); + it('should throw UnauthorizedException when credentials are invalid', async () => { + const loginDto = { username: 'test', password: 'wrong' }; + mockAuthService.validateUser.mockResolvedValue(null); + await expect(controller.login(loginDto)).rejects.toThrow(common_1.UnauthorizedException); + }); + }); + describe('register', () => { + it('should register a new user', async () => { + const registerDto = { + username: 'newuser', + password: 'password', + email: 'test@test.com', + display_name: 'Test User', + }; + const mockUser = { user_id: 1, ...registerDto }; + mockAuthService.register.mockResolvedValue(mockUser); + const _result = await controller.register(registerDto); + expect(mockAuthService.register).toHaveBeenCalledWith(registerDto); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxhdXRoXFxhdXRoLmNvbnRyb2xsZXIuc3BlYy50cyIsIm1hcHBpbmdzIjoiOztBQUFBLDZDQUFzRDtBQUN0RCwyQ0FBdUQ7QUFDdkQsdURBQW1EO0FBQ25ELGlEQUE2QztBQUU3QyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFO0lBQzlCLElBQUksVUFBMEIsQ0FBQztJQUMvQixJQUFJLGVBQXFDLENBQUM7SUFFMUMsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ3BCLGVBQWUsR0FBRztZQUNoQixZQUFZLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUN2QixLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNoQixRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNuQixZQUFZLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUN2QixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtTQUNsQixDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQWtCLE1BQU0sY0FBSSxDQUFDLG1CQUFtQixDQUFDO1lBQzNELFdBQVcsRUFBRSxDQUFDLGdDQUFjLENBQUM7WUFDN0IsU0FBUyxFQUFFO2dCQUNUO29CQUNFLE9BQU8sRUFBRSwwQkFBVztvQkFDcEIsUUFBUSxFQUFFLGVBQWU7aUJBQzFCO2FBQ0Y7U0FDRixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFYixVQUFVLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBaUIsZ0NBQWMsQ0FBQyxDQUFDO0lBQzFELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtRQUMzQixNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtRQUNyQixFQUFFLENBQUMsaURBQWlELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDL0QsTUFBTSxRQUFRLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQztZQUM1RCxNQUFNLFFBQVEsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ2xELE1BQU0sVUFBVSxHQUFHO2dCQUNqQixZQUFZLEVBQUUsY0FBYztnQkFDNUIsYUFBYSxFQUFFLGVBQWU7Z0JBQzlCLElBQUksRUFBRSxRQUFRO2FBQ2YsQ0FBQztZQUVELGVBQWUsQ0FBQyxZQUEwQixDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZFLGVBQWUsQ0FBQyxLQUFtQixDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRW5FLE1BQU0sTUFBTSxHQUFHLE1BQU0sVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUVoRCxNQUFNLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDLG9CQUFvQixDQUN2RCxNQUFNLEVBQ04sVUFBVSxDQUNYLENBQUM7WUFDRixNQUFNLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzdELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsaUVBQWlFLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDL0UsTUFBTSxRQUFRLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUN4RCxlQUFlLENBQUMsWUFBMEIsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVwRSxNQUFNLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FDdEQsOEJBQXFCLENBQ3RCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUU7UUFDeEIsRUFBRSxDQUFDLDRCQUE0QixFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzFDLE1BQU0sV0FBVyxHQUFHO2dCQUNsQixRQUFRLEVBQUUsU0FBUztnQkFDbkIsUUFBUSxFQUFFLFVBQVU7Z0JBQ3BCLEtBQUssRUFBRSxlQUFlO2dCQUN0QixZQUFZLEVBQUUsV0FBVzthQUMxQixDQUFDO1lBQ0YsTUFBTSxRQUFRLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsV0FBVyxFQUFFLENBQUM7WUFFL0MsZUFBZSxDQUFDLFFBQXNCLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFcEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxVQUFVLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXZELE1BQU0sQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDckUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXGNvbW1vblxcYXV0aFxcYXV0aC5jb250cm9sbGVyLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVzdCwgVGVzdGluZ01vZHVsZSB9IGZyb20gJ0BuZXN0anMvdGVzdGluZyc7XG5pbXBvcnQgeyBVbmF1dGhvcml6ZWRFeGNlcHRpb24gfSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XG5pbXBvcnQgeyBBdXRoQ29udHJvbGxlciB9IGZyb20gJy4vYXV0aC5jb250cm9sbGVyJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLnNlcnZpY2UnO1xuXG5kZXNjcmliZSgnQXV0aENvbnRyb2xsZXInLCAoKSA9PiB7XG4gIGxldCBjb250cm9sbGVyOiBBdXRoQ29udHJvbGxlcjtcbiAgbGV0IG1vY2tBdXRoU2VydmljZTogUGFydGlhbDxBdXRoU2VydmljZT47XG5cbiAgYmVmb3JlRWFjaChhc3luYyAoKSA9PiB7XG4gICAgbW9ja0F1dGhTZXJ2aWNlID0ge1xuICAgICAgdmFsaWRhdGVVc2VyOiBqZXN0LmZuKCksXG4gICAgICBsb2dpbjogamVzdC5mbigpLFxuICAgICAgcmVnaXN0ZXI6IGplc3QuZm4oKSxcbiAgICAgIHJlZnJlc2hUb2tlbjogamVzdC5mbigpLFxuICAgICAgbG9nb3V0OiBqZXN0LmZuKCksXG4gICAgfTtcblxuICAgIGNvbnN0IG1vZHVsZTogVGVzdGluZ01vZHVsZSA9IGF3YWl0IFRlc3QuY3JlYXRlVGVzdGluZ01vZHVsZSh7XG4gICAgICBjb250cm9sbGVyczogW0F1dGhDb250cm9sbGVyXSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogQXV0aFNlcnZpY2UsXG4gICAgICAgICAgdXNlVmFsdWU6IG1vY2tBdXRoU2VydmljZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSkuY29tcGlsZSgpO1xuXG4gICAgY29udHJvbGxlciA9IG1vZHVsZS5nZXQ8QXV0aENvbnRyb2xsZXI+KEF1dGhDb250cm9sbGVyKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBiZSBkZWZpbmVkJywgKCkgPT4ge1xuICAgIGV4cGVjdChjb250cm9sbGVyKS50b0JlRGVmaW5lZCgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnbG9naW4nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdG9rZW5zIHdoZW4gY3JlZGVudGlhbHMgYXJlIHZhbGlkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbG9naW5EdG8gPSB7IHVzZXJuYW1lOiAndGVzdCcsIHBhc3N3b3JkOiAncGFzc3dvcmQnIH07XG4gICAgICBjb25zdCBtb2NrVXNlciA9IHsgdXNlcl9pZDogMSwgdXNlcm5hbWU6ICd0ZXN0JyB9O1xuICAgICAgY29uc3QgbW9ja1Rva2VucyA9IHtcbiAgICAgICAgYWNjZXNzX3Rva2VuOiAnYWNjZXNzX3Rva2VuJyxcbiAgICAgICAgcmVmcmVzaF90b2tlbjogJ3JlZnJlc2hfdG9rZW4nLFxuICAgICAgICB1c2VyOiBtb2NrVXNlcixcbiAgICAgIH07XG5cbiAgICAgIChtb2NrQXV0aFNlcnZpY2UudmFsaWRhdGVVc2VyIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUobW9ja1VzZXIpO1xuICAgICAgKG1vY2tBdXRoU2VydmljZS5sb2dpbiBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tUb2tlbnMpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb250cm9sbGVyLmxvZ2luKGxvZ2luRHRvKTtcblxuICAgICAgZXhwZWN0KG1vY2tBdXRoU2VydmljZS52YWxpZGF0ZVVzZXIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAndGVzdCcsXG4gICAgICAgICdwYXNzd29yZCdcbiAgICAgICk7XG4gICAgICBleHBlY3QobW9ja0F1dGhTZXJ2aWNlLmxvZ2luKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChtb2NrVXNlcik7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKG1vY2tUb2tlbnMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBVbmF1dGhvcml6ZWRFeGNlcHRpb24gd2hlbiBjcmVkZW50aWFscyBhcmUgaW52YWxpZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGxvZ2luRHRvID0geyB1c2VybmFtZTogJ3Rlc3QnLCBwYXNzd29yZDogJ3dyb25nJyB9O1xuICAgICAgKG1vY2tBdXRoU2VydmljZS52YWxpZGF0ZVVzZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZShudWxsKTtcblxuICAgICAgYXdhaXQgZXhwZWN0KGNvbnRyb2xsZXIubG9naW4obG9naW5EdG8pKS5yZWplY3RzLnRvVGhyb3coXG4gICAgICAgIFVuYXV0aG9yaXplZEV4Y2VwdGlvblxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlZ2lzdGVyJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVnaXN0ZXIgYSBuZXcgdXNlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlZ2lzdGVyRHRvID0ge1xuICAgICAgICB1c2VybmFtZTogJ25ld3VzZXInLFxuICAgICAgICBwYXNzd29yZDogJ3Bhc3N3b3JkJyxcbiAgICAgICAgZW1haWw6ICd0ZXN0QHRlc3QuY29tJyxcbiAgICAgICAgZGlzcGxheV9uYW1lOiAnVGVzdCBVc2VyJyxcbiAgICAgIH07XG4gICAgICBjb25zdCBtb2NrVXNlciA9IHsgdXNlcl9pZDogMSwgLi4ucmVnaXN0ZXJEdG8gfTtcblxuICAgICAgKG1vY2tBdXRoU2VydmljZS5yZWdpc3RlciBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tVc2VyKTtcblxuICAgICAgY29uc3QgX3Jlc3VsdCA9IGF3YWl0IGNvbnRyb2xsZXIucmVnaXN0ZXIocmVnaXN0ZXJEdG8pO1xuXG4gICAgICBleHBlY3QobW9ja0F1dGhTZXJ2aWNlLnJlZ2lzdGVyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChyZWdpc3RlckR0byk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/be/authcontrollerspec_be01d6d478a32ac64cf5ff735bdc6ed3.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/be/authcontrollerspec_be01d6d478a32ac64cf5ff735bdc6ed3.map new file mode 100644 index 0000000..931538a --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/be/authcontrollerspec_be01d6d478a32ac64cf5ff735bdc6ed3.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\auth\\auth.controller.spec.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\auth\\auth.controller.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\nimport { UnauthorizedException } from '@nestjs/common';\nimport { AuthController } from './auth.controller';\nimport { AuthService } from './auth.service';\n\ndescribe('AuthController', () => {\n let controller: AuthController;\n let mockAuthService: Partial;\n\n beforeEach(async () => {\n mockAuthService = {\n validateUser: jest.fn(),\n login: jest.fn(),\n register: jest.fn(),\n refreshToken: jest.fn(),\n logout: jest.fn(),\n };\n\n const module: TestingModule = await Test.createTestingModule({\n controllers: [AuthController],\n providers: [\n {\n provide: AuthService,\n useValue: mockAuthService,\n },\n ],\n }).compile();\n\n controller = module.get(AuthController);\n });\n\n it('should be defined', () => {\n expect(controller).toBeDefined();\n });\n\n describe('login', () => {\n it('should return tokens when credentials are valid', async () => {\n const loginDto = { username: 'test', password: 'password' };\n const mockUser = { user_id: 1, username: 'test' };\n const mockTokens = {\n access_token: 'access_token',\n refresh_token: 'refresh_token',\n user: mockUser,\n };\n\n (mockAuthService.validateUser as jest.Mock).mockResolvedValue(mockUser);\n (mockAuthService.login as jest.Mock).mockResolvedValue(mockTokens);\n\n const result = await controller.login(loginDto);\n\n expect(mockAuthService.validateUser).toHaveBeenCalledWith(\n 'test',\n 'password'\n );\n expect(mockAuthService.login).toHaveBeenCalledWith(mockUser);\n expect(result).toEqual(mockTokens);\n });\n\n it('should throw UnauthorizedException when credentials are invalid', async () => {\n const loginDto = { username: 'test', password: 'wrong' };\n (mockAuthService.validateUser as jest.Mock).mockResolvedValue(null);\n\n await expect(controller.login(loginDto)).rejects.toThrow(\n UnauthorizedException\n );\n });\n });\n\n describe('register', () => {\n it('should register a new user', async () => {\n const registerDto = {\n username: 'newuser',\n password: 'password',\n email: 'test@test.com',\n display_name: 'Test User',\n };\n const mockUser = { user_id: 1, ...registerDto };\n\n (mockAuthService.register as jest.Mock).mockResolvedValue(mockUser);\n\n const _result = await controller.register(registerDto);\n\n expect(mockAuthService.register).toHaveBeenCalledWith(registerDto);\n });\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/be/createcorrespondencedto_bef00686a687b51e0980752a5b6c9571 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/be/createcorrespondencedto_bef00686a687b51e0980752a5b6c9571 new file mode 100644 index 0000000..5cea06a --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/be/createcorrespondencedto_bef00686a687b51e0980752a5b6c9571 @@ -0,0 +1,156 @@ +a1c6979146d5af61f48f6da4287a8e42 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CreateCorrespondenceDto = void 0; +const class_validator_1 = require("class-validator"); +const swagger_1 = require("@nestjs/swagger"); +class CreateCorrespondenceDto { +} +exports.CreateCorrespondenceDto = CreateCorrespondenceDto; +__decorate([ + (0, swagger_1.ApiProperty)({ description: 'Project ID or UUID', example: 1 }), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", Object) +], CreateCorrespondenceDto.prototype, "projectId", void 0); +__decorate([ + (0, swagger_1.ApiProperty)({ description: 'Document Type ID', example: 1 }), + (0, class_validator_1.IsInt)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", Number) +], CreateCorrespondenceDto.prototype, "typeId", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ description: 'Discipline ID', example: 2 }), + (0, class_validator_1.IsInt)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], CreateCorrespondenceDto.prototype, "disciplineId", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ description: 'Sub Type ID', example: 3 }), + (0, class_validator_1.IsInt)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], CreateCorrespondenceDto.prototype, "subTypeId", void 0); +__decorate([ + (0, swagger_1.ApiProperty)({ + description: 'Correspondence Subject', + example: 'Monthly Progress Report', + }), + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], CreateCorrespondenceDto.prototype, "subject", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Body/Content', + example: '

...

', + }), + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], CreateCorrespondenceDto.prototype, "body", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Remarks', + example: 'Note...', + }), + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], CreateCorrespondenceDto.prototype, "remarks", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Due Date', + example: '2025-12-06T00:00:00Z', + }), + (0, class_validator_1.IsDateString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], CreateCorrespondenceDto.prototype, "dueDate", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Correspondence Description', + example: 'Detailed report...', + }), + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], CreateCorrespondenceDto.prototype, "description", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Additional details (JSON)', + example: { key: 'value' }, + }), + (0, class_validator_1.IsObject)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", typeof (_a = typeof Record !== "undefined" && Record) === "function" ? _a : Object) +], CreateCorrespondenceDto.prototype, "details", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ description: 'Is internal document?', default: false }), + (0, class_validator_1.IsBoolean)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Boolean) +], CreateCorrespondenceDto.prototype, "isInternal", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Document Date (วันที่เอกสาร)', + example: '2025-12-06', + }), + (0, class_validator_1.IsDateString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], CreateCorrespondenceDto.prototype, "documentDate", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Issued Date (วันที่ออกเอกสาร) — ใช้จัดเก็บไฟล์ตาม YYYY/MM', + example: '2025-12-06T00:00:00Z', + }), + (0, class_validator_1.IsDateString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], CreateCorrespondenceDto.prototype, "issuedDate", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Received Date (วันที่รับเอกสาร)', + example: '2025-12-06T00:00:00Z', + }), + (0, class_validator_1.IsDateString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], CreateCorrespondenceDto.prototype, "receivedDate", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Attachment temp IDs from upload phase (Two-Phase Storage)', + example: ['uuid-temp-1', 'uuid-temp-2'], + }), + (0, class_validator_1.IsArray)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Array) +], CreateCorrespondenceDto.prototype, "attachmentTempIds", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Originator Organization ID or UUID (for impersonation)', + example: 1, + }), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Object) +], CreateCorrespondenceDto.prototype, "originatorId", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Recipients', + example: [{ organizationId: 1, type: 'TO' }], + }), + (0, class_validator_1.IsArray)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Array) +], CreateCorrespondenceDto.prototype, "recipients", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGR0b1xcY3JlYXRlLWNvcnJlc3BvbmRlbmNlLmR0by50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscURBU3lCO0FBQ3pCLDZDQUFtRTtBQUVuRSxNQUFhLHVCQUF1QjtDQXdIbkM7QUF4SEQsMERBd0hDO0FBckhDO0lBRkMsSUFBQSxxQkFBVyxFQUFDLEVBQUUsV0FBVyxFQUFFLG9CQUFvQixFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5RCxJQUFBLDRCQUFVLEdBQUU7OzBEQUNlO0FBSzVCO0lBSEMsSUFBQSxxQkFBVyxFQUFDLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM1RCxJQUFBLHVCQUFLLEdBQUU7SUFDUCxJQUFBLDRCQUFVLEdBQUU7O3VEQUNHO0FBS2hCO0lBSEMsSUFBQSw2QkFBbUIsRUFBQyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ2pFLElBQUEsdUJBQUssR0FBRTtJQUNQLElBQUEsNEJBQVUsR0FBRTs7NkRBQ1M7QUFLdEI7SUFIQyxJQUFBLDZCQUFtQixFQUFDLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDL0QsSUFBQSx1QkFBSyxHQUFFO0lBQ1AsSUFBQSw0QkFBVSxHQUFFOzswREFDTTtBQVFuQjtJQU5DLElBQUEscUJBQVcsRUFBQztRQUNYLFdBQVcsRUFBRSx3QkFBd0I7UUFDckMsT0FBTyxFQUFFLHlCQUF5QjtLQUNuQyxDQUFDO0lBQ0QsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzt3REFDSTtBQVFqQjtJQU5DLElBQUEsNkJBQW1CLEVBQUM7UUFDbkIsV0FBVyxFQUFFLGNBQWM7UUFDM0IsT0FBTyxFQUFFLFlBQVk7S0FDdEIsQ0FBQztJQUNELElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7cURBQ0M7QUFRZDtJQU5DLElBQUEsNkJBQW1CLEVBQUM7UUFDbkIsV0FBVyxFQUFFLFNBQVM7UUFDdEIsT0FBTyxFQUFFLFNBQVM7S0FDbkIsQ0FBQztJQUNELElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7d0RBQ0k7QUFRakI7SUFOQyxJQUFBLDZCQUFtQixFQUFDO1FBQ25CLFdBQVcsRUFBRSxVQUFVO1FBQ3ZCLE9BQU8sRUFBRSxzQkFBc0I7S0FDaEMsQ0FBQztJQUNELElBQUEsOEJBQVksR0FBRTtJQUNkLElBQUEsNEJBQVUsR0FBRTs7d0RBQ0k7QUFRakI7SUFOQyxJQUFBLDZCQUFtQixFQUFDO1FBQ25CLFdBQVcsRUFBRSw0QkFBNEI7UUFDekMsT0FBTyxFQUFFLG9CQUFvQjtLQUM5QixDQUFDO0lBQ0QsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzs0REFDUTtBQVFyQjtJQU5DLElBQUEsNkJBQW1CLEVBQUM7UUFDbkIsV0FBVyxFQUFFLDJCQUEyQjtRQUN4QyxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFO0tBQzFCLENBQUM7SUFDRCxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7a0RBQ0gsTUFBTSxvQkFBTixNQUFNO3dEQUFrQjtBQUtsQztJQUhDLElBQUEsNkJBQW1CLEVBQUMsRUFBRSxXQUFXLEVBQUUsdUJBQXVCLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQzdFLElBQUEsMkJBQVMsR0FBRTtJQUNYLElBQUEsNEJBQVUsR0FBRTs7MkRBQ1E7QUFRckI7SUFOQyxJQUFBLDZCQUFtQixFQUFDO1FBQ25CLFdBQVcsRUFBRSw4QkFBOEI7UUFDM0MsT0FBTyxFQUFFLFlBQVk7S0FDdEIsQ0FBQztJQUNELElBQUEsOEJBQVksR0FBRTtJQUNkLElBQUEsNEJBQVUsR0FBRTs7NkRBQ1M7QUFRdEI7SUFOQyxJQUFBLDZCQUFtQixFQUFDO1FBQ25CLFdBQVcsRUFBRSwyREFBMkQ7UUFDeEUsT0FBTyxFQUFFLHNCQUFzQjtLQUNoQyxDQUFDO0lBQ0QsSUFBQSw4QkFBWSxHQUFFO0lBQ2QsSUFBQSw0QkFBVSxHQUFFOzsyREFDTztBQVFwQjtJQU5DLElBQUEsNkJBQW1CLEVBQUM7UUFDbkIsV0FBVyxFQUFFLGlDQUFpQztRQUM5QyxPQUFPLEVBQUUsc0JBQXNCO0tBQ2hDLENBQUM7SUFDRCxJQUFBLDhCQUFZLEdBQUU7SUFDZCxJQUFBLDRCQUFVLEdBQUU7OzZEQUNTO0FBUXRCO0lBTkMsSUFBQSw2QkFBbUIsRUFBQztRQUNuQixXQUFXLEVBQUUsMkRBQTJEO1FBQ3hFLE9BQU8sRUFBRSxDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUM7S0FDeEMsQ0FBQztJQUNELElBQUEseUJBQU8sR0FBRTtJQUNULElBQUEsNEJBQVUsR0FBRTs7a0VBQ2dCO0FBUTdCO0lBTEMsSUFBQSw2QkFBbUIsRUFBQztRQUNuQixXQUFXLEVBQUUsd0RBQXdEO1FBQ3JFLE9BQU8sRUFBRSxDQUFDO0tBQ1gsQ0FBQztJQUNELElBQUEsNEJBQVUsR0FBRTs7NkRBQ2tCO0FBUS9CO0lBTkMsSUFBQSw2QkFBbUIsRUFBQztRQUNuQixXQUFXLEVBQUUsWUFBWTtRQUN6QixPQUFPLEVBQUUsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0tBQzdDLENBQUM7SUFDRCxJQUFBLHlCQUFPLEdBQUU7SUFDVCxJQUFBLDRCQUFVLEdBQUU7OzJEQUN5RCIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxjb3JyZXNwb25kZW5jZVxcZHRvXFxjcmVhdGUtY29ycmVzcG9uZGVuY2UuZHRvLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIElzSW50LFxuICBJc1N0cmluZyxcbiAgSXNOb3RFbXB0eSxcbiAgSXNPcHRpb25hbCxcbiAgSXNCb29sZWFuLFxuICBJc09iamVjdCxcbiAgSXNEYXRlU3RyaW5nLFxuICBJc0FycmF5LFxufSBmcm9tICdjbGFzcy12YWxpZGF0b3InO1xuaW1wb3J0IHsgQXBpUHJvcGVydHksIEFwaVByb3BlcnR5T3B0aW9uYWwgfSBmcm9tICdAbmVzdGpzL3N3YWdnZXInO1xuXG5leHBvcnQgY2xhc3MgQ3JlYXRlQ29ycmVzcG9uZGVuY2VEdG8ge1xuICBAQXBpUHJvcGVydHkoeyBkZXNjcmlwdGlvbjogJ1Byb2plY3QgSUQgb3IgVVVJRCcsIGV4YW1wbGU6IDEgfSlcbiAgQElzTm90RW1wdHkoKVxuICBwcm9qZWN0SWQhOiBudW1iZXIgfCBzdHJpbmc7XG5cbiAgQEFwaVByb3BlcnR5KHsgZGVzY3JpcHRpb246ICdEb2N1bWVudCBUeXBlIElEJywgZXhhbXBsZTogMSB9KVxuICBASXNJbnQoKVxuICBASXNOb3RFbXB0eSgpXG4gIHR5cGVJZCE6IG51bWJlcjsgLy8gSUQg4LiC4Lit4LiH4Lib4Lij4Liw4LmA4Lig4LiX4LmA4Lit4LiB4Liq4Liy4LijICjguYDguIrguYjguJkgUkZBLCBMRVRURVIpXG5cbiAgQEFwaVByb3BlcnR5T3B0aW9uYWwoeyBkZXNjcmlwdGlvbjogJ0Rpc2NpcGxpbmUgSUQnLCBleGFtcGxlOiAyIH0pXG4gIEBJc0ludCgpXG4gIEBJc09wdGlvbmFsKClcbiAgZGlzY2lwbGluZUlkPzogbnVtYmVyOyAvLyBbUmVxIDZCXSDguKrguLLguILguLLguIfguLLguJkgKOC5gOC4iuC5iOC4mSBHRU4sIFNUUilcblxuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7IGRlc2NyaXB0aW9uOiAnU3ViIFR5cGUgSUQnLCBleGFtcGxlOiAzIH0pXG4gIEBJc0ludCgpXG4gIEBJc09wdGlvbmFsKClcbiAgc3ViVHlwZUlkPzogbnVtYmVyOyAvLyBbUmVxIDZCXSDguJvguKPguLDguYDguKDguJfguKLguYjguK3guKIgKOC5gOC4iuC5iOC4mSBNQVQsIFNIUCDguKrguLPguKvguKPguLHguJogVHJhbnNtaXR0YWwvUkZBKVxuXG4gIEBBcGlQcm9wZXJ0eSh7XG4gICAgZGVzY3JpcHRpb246ICdDb3JyZXNwb25kZW5jZSBTdWJqZWN0JyxcbiAgICBleGFtcGxlOiAnTW9udGhseSBQcm9ncmVzcyBSZXBvcnQnLFxuICB9KVxuICBASXNTdHJpbmcoKVxuICBASXNOb3RFbXB0eSgpXG4gIHN1YmplY3QhOiBzdHJpbmc7XG5cbiAgQEFwaVByb3BlcnR5T3B0aW9uYWwoe1xuICAgIGRlc2NyaXB0aW9uOiAnQm9keS9Db250ZW50JyxcbiAgICBleGFtcGxlOiAnPHA+Li4uPC9wPicsXG4gIH0pXG4gIEBJc1N0cmluZygpXG4gIEBJc09wdGlvbmFsKClcbiAgYm9keT86IHN0cmluZztcblxuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7XG4gICAgZGVzY3JpcHRpb246ICdSZW1hcmtzJyxcbiAgICBleGFtcGxlOiAnTm90ZS4uLicsXG4gIH0pXG4gIEBJc1N0cmluZygpXG4gIEBJc09wdGlvbmFsKClcbiAgcmVtYXJrcz86IHN0cmluZztcblxuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7XG4gICAgZGVzY3JpcHRpb246ICdEdWUgRGF0ZScsXG4gICAgZXhhbXBsZTogJzIwMjUtMTItMDZUMDA6MDA6MDBaJyxcbiAgfSlcbiAgQElzRGF0ZVN0cmluZygpXG4gIEBJc09wdGlvbmFsKClcbiAgZHVlRGF0ZT86IHN0cmluZztcblxuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7XG4gICAgZGVzY3JpcHRpb246ICdDb3JyZXNwb25kZW5jZSBEZXNjcmlwdGlvbicsXG4gICAgZXhhbXBsZTogJ0RldGFpbGVkIHJlcG9ydC4uLicsXG4gIH0pXG4gIEBJc1N0cmluZygpXG4gIEBJc09wdGlvbmFsKClcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgQEFwaVByb3BlcnR5T3B0aW9uYWwoe1xuICAgIGRlc2NyaXB0aW9uOiAnQWRkaXRpb25hbCBkZXRhaWxzIChKU09OKScsXG4gICAgZXhhbXBsZTogeyBrZXk6ICd2YWx1ZScgfSxcbiAgfSlcbiAgQElzT2JqZWN0KClcbiAgQElzT3B0aW9uYWwoKVxuICBkZXRhaWxzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IC8vIOC4guC5ieC4reC4oeC4ueC4pSBKU09OICjguYDguIrguYjguJkgUkZJIHF1ZXN0aW9uKVxuXG4gIEBBcGlQcm9wZXJ0eU9wdGlvbmFsKHsgZGVzY3JpcHRpb246ICdJcyBpbnRlcm5hbCBkb2N1bWVudD8nLCBkZWZhdWx0OiBmYWxzZSB9KVxuICBASXNCb29sZWFuKClcbiAgQElzT3B0aW9uYWwoKVxuICBpc0ludGVybmFsPzogYm9vbGVhbjtcblxuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7XG4gICAgZGVzY3JpcHRpb246ICdEb2N1bWVudCBEYXRlICjguKfguLHguJnguJfguLXguYjguYDguK3guIHguKrguLLguKMpJyxcbiAgICBleGFtcGxlOiAnMjAyNS0xMi0wNicsXG4gIH0pXG4gIEBJc0RhdGVTdHJpbmcoKVxuICBASXNPcHRpb25hbCgpXG4gIGRvY3VtZW50RGF0ZT86IHN0cmluZztcblxuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7XG4gICAgZGVzY3JpcHRpb246ICdJc3N1ZWQgRGF0ZSAo4Lin4Lix4LiZ4LiX4Li14LmI4Lit4Lit4LiB4LmA4Lit4LiB4Liq4Liy4LijKSDigJQg4LmD4LiK4LmJ4LiI4Lix4LiU4LmA4LiB4LmH4Lia4LmE4Lif4Lil4LmM4LiV4Liy4LihIFlZWVkvTU0nLFxuICAgIGV4YW1wbGU6ICcyMDI1LTEyLTA2VDAwOjAwOjAwWicsXG4gIH0pXG4gIEBJc0RhdGVTdHJpbmcoKVxuICBASXNPcHRpb25hbCgpXG4gIGlzc3VlZERhdGU/OiBzdHJpbmc7XG5cbiAgQEFwaVByb3BlcnR5T3B0aW9uYWwoe1xuICAgIGRlc2NyaXB0aW9uOiAnUmVjZWl2ZWQgRGF0ZSAo4Lin4Lix4LiZ4LiX4Li14LmI4Lij4Lix4Lia4LmA4Lit4LiB4Liq4Liy4LijKScsXG4gICAgZXhhbXBsZTogJzIwMjUtMTItMDZUMDA6MDA6MDBaJyxcbiAgfSlcbiAgQElzRGF0ZVN0cmluZygpXG4gIEBJc09wdGlvbmFsKClcbiAgcmVjZWl2ZWREYXRlPzogc3RyaW5nO1xuXG4gIEBBcGlQcm9wZXJ0eU9wdGlvbmFsKHtcbiAgICBkZXNjcmlwdGlvbjogJ0F0dGFjaG1lbnQgdGVtcCBJRHMgZnJvbSB1cGxvYWQgcGhhc2UgKFR3by1QaGFzZSBTdG9yYWdlKScsXG4gICAgZXhhbXBsZTogWyd1dWlkLXRlbXAtMScsICd1dWlkLXRlbXAtMiddLFxuICB9KVxuICBASXNBcnJheSgpXG4gIEBJc09wdGlvbmFsKClcbiAgYXR0YWNobWVudFRlbXBJZHM/OiBzdHJpbmdbXTtcblxuICAvLyDinIUg4LmA4Lie4Li04LmI4LihIEZpZWxkIOC4quC4s+C4q+C4o+C4seC4miBJbXBlcnNvbmF0aW9uICjguYDguKXguLfguK3guIHguK3guIfguITguYzguIHguKPguJzguLnguYnguKrguYjguIcpXG4gIEBBcGlQcm9wZXJ0eU9wdGlvbmFsKHtcbiAgICBkZXNjcmlwdGlvbjogJ09yaWdpbmF0b3IgT3JnYW5pemF0aW9uIElEIG9yIFVVSUQgKGZvciBpbXBlcnNvbmF0aW9uKScsXG4gICAgZXhhbXBsZTogMSxcbiAgfSlcbiAgQElzT3B0aW9uYWwoKVxuICBvcmlnaW5hdG9ySWQ/OiBudW1iZXIgfCBzdHJpbmc7XG5cbiAgQEFwaVByb3BlcnR5T3B0aW9uYWwoe1xuICAgIGRlc2NyaXB0aW9uOiAnUmVjaXBpZW50cycsXG4gICAgZXhhbXBsZTogW3sgb3JnYW5pemF0aW9uSWQ6IDEsIHR5cGU6ICdUTycgfV0sXG4gIH0pXG4gIEBJc0FycmF5KClcbiAgQElzT3B0aW9uYWwoKVxuICByZWNpcGllbnRzPzogeyBvcmdhbml6YXRpb25JZDogbnVtYmVyIHwgc3RyaW5nOyB0eXBlOiAnVE8nIHwgJ0NDJyB9W107XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/be/createcorrespondencedto_bef00686a687b51e0980752a5b6c9571.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/be/createcorrespondencedto_bef00686a687b51e0980752a5b6c9571.map new file mode 100644 index 0000000..34c3665 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/be/createcorrespondencedto_bef00686a687b51e0980752a5b6c9571.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\create-correspondence.dto.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\create-correspondence.dto.ts"],"sourcesContent":["import {\n IsInt,\n IsString,\n IsNotEmpty,\n IsOptional,\n IsBoolean,\n IsObject,\n IsDateString,\n IsArray,\n} from 'class-validator';\nimport { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';\n\nexport class CreateCorrespondenceDto {\n @ApiProperty({ description: 'Project ID or UUID', example: 1 })\n @IsNotEmpty()\n projectId!: number | string;\n\n @ApiProperty({ description: 'Document Type ID', example: 1 })\n @IsInt()\n @IsNotEmpty()\n typeId!: number; // ID ของประเภทเอกสาร (เช่น RFA, LETTER)\n\n @ApiPropertyOptional({ description: 'Discipline ID', example: 2 })\n @IsInt()\n @IsOptional()\n disciplineId?: number; // [Req 6B] สาขางาน (เช่น GEN, STR)\n\n @ApiPropertyOptional({ description: 'Sub Type ID', example: 3 })\n @IsInt()\n @IsOptional()\n subTypeId?: number; // [Req 6B] ประเภทย่อย (เช่น MAT, SHP สำหรับ Transmittal/RFA)\n\n @ApiProperty({\n description: 'Correspondence Subject',\n example: 'Monthly Progress Report',\n })\n @IsString()\n @IsNotEmpty()\n subject!: string;\n\n @ApiPropertyOptional({\n description: 'Body/Content',\n example: '

...

',\n })\n @IsString()\n @IsOptional()\n body?: string;\n\n @ApiPropertyOptional({\n description: 'Remarks',\n example: 'Note...',\n })\n @IsString()\n @IsOptional()\n remarks?: string;\n\n @ApiPropertyOptional({\n description: 'Due Date',\n example: '2025-12-06T00:00:00Z',\n })\n @IsDateString()\n @IsOptional()\n dueDate?: string;\n\n @ApiPropertyOptional({\n description: 'Correspondence Description',\n example: 'Detailed report...',\n })\n @IsString()\n @IsOptional()\n description?: string;\n\n @ApiPropertyOptional({\n description: 'Additional details (JSON)',\n example: { key: 'value' },\n })\n @IsObject()\n @IsOptional()\n details?: Record; // ข้อมูล JSON (เช่น RFI question)\n\n @ApiPropertyOptional({ description: 'Is internal document?', default: false })\n @IsBoolean()\n @IsOptional()\n isInternal?: boolean;\n\n @ApiPropertyOptional({\n description: 'Document Date (วันที่เอกสาร)',\n example: '2025-12-06',\n })\n @IsDateString()\n @IsOptional()\n documentDate?: string;\n\n @ApiPropertyOptional({\n description: 'Issued Date (วันที่ออกเอกสาร) — ใช้จัดเก็บไฟล์ตาม YYYY/MM',\n example: '2025-12-06T00:00:00Z',\n })\n @IsDateString()\n @IsOptional()\n issuedDate?: string;\n\n @ApiPropertyOptional({\n description: 'Received Date (วันที่รับเอกสาร)',\n example: '2025-12-06T00:00:00Z',\n })\n @IsDateString()\n @IsOptional()\n receivedDate?: string;\n\n @ApiPropertyOptional({\n description: 'Attachment temp IDs from upload phase (Two-Phase Storage)',\n example: ['uuid-temp-1', 'uuid-temp-2'],\n })\n @IsArray()\n @IsOptional()\n attachmentTempIds?: string[];\n\n // ✅ เพิ่ม Field สำหรับ Impersonation (เลือกองค์กรผู้ส่ง)\n @ApiPropertyOptional({\n description: 'Originator Organization ID or UUID (for impersonation)',\n example: 1,\n })\n @IsOptional()\n originatorId?: number | string;\n\n @ApiPropertyOptional({\n description: 'Recipients',\n example: [{ organizationId: 1, type: 'TO' }],\n })\n @IsArray()\n @IsOptional()\n recipients?: { organizationId: number | string; type: 'TO' | 'CC' }[];\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bf/auditdecorator_bf9a30a43b4c7196ee2732450eefc6c2 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bf/auditdecorator_bf9a30a43b4c7196ee2732450eefc6c2 new file mode 100644 index 0000000..2534821 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bf/auditdecorator_bf9a30a43b4c7196ee2732450eefc6c2 @@ -0,0 +1,9 @@ +ada04982f3e0721c905644351f267966 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Audit = exports.AUDIT_KEY = void 0; +const common_1 = require("@nestjs/common"); +exports.AUDIT_KEY = 'audit'; +const Audit = (action, entityType) => (0, common_1.SetMetadata)(exports.AUDIT_KEY, { action, entityType }); +exports.Audit = Audit; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxkZWNvcmF0b3JzXFxhdWRpdC5kZWNvcmF0b3IudHMiLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQTZDO0FBRWhDLFFBQUEsU0FBUyxHQUFHLE9BQU8sQ0FBQztBQU8xQixNQUFNLEtBQUssR0FBRyxDQUFDLE1BQWMsRUFBRSxVQUFtQixFQUFFLEVBQUUsQ0FDM0QsSUFBQSxvQkFBVyxFQUFDLGlCQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztBQURwQyxRQUFBLEtBQUssU0FDK0IiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxkZWNvcmF0b3JzXFxhdWRpdC5kZWNvcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2V0TWV0YWRhdGEgfSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XG5cbmV4cG9ydCBjb25zdCBBVURJVF9LRVkgPSAnYXVkaXQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0TWV0YWRhdGEge1xuICBhY3Rpb246IHN0cmluZzsgLy8g4LiK4Li34LmI4Lit4LiB4Liy4Lij4LiB4Lij4Liw4LiX4LizICjguYDguIrguYjguJkgJ3JmYS5jcmVhdGUnLCAndXNlci5sb2dpbicpXG4gIGVudGl0eVR5cGU/OiBzdHJpbmc7IC8vIOC4iuC4t+C5iOC4rSBFbnRpdHkgKOC5gOC4iuC5iOC4mSAncmZhJywgJ3VzZXInKSAtIOC4luC5ieC4suC5hOC4oeC5iOC4o+C4sOC4muC4uOC4reC4suC4iOC4iOC4sOC4nuC4ouC4suC4ouC4suC4oeC5gOC4lOC4slxufVxuXG5leHBvcnQgY29uc3QgQXVkaXQgPSAoYWN0aW9uOiBzdHJpbmcsIGVudGl0eVR5cGU/OiBzdHJpbmcpID0+XG4gIFNldE1ldGFkYXRhKEFVRElUX0tFWSwgeyBhY3Rpb24sIGVudGl0eVR5cGUgfSk7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bf/auditdecorator_bf9a30a43b4c7196ee2732450eefc6c2.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bf/auditdecorator_bf9a30a43b4c7196ee2732450eefc6c2.map new file mode 100644 index 0000000..d1818a5 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/bf/auditdecorator_bf9a30a43b4c7196ee2732450eefc6c2.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\decorators\\audit.decorator.ts","mappings":";;;AAAA,2CAA6C;AAEhC,QAAA,SAAS,GAAG,OAAO,CAAC;AAO1B,MAAM,KAAK,GAAG,CAAC,MAAc,EAAE,UAAmB,EAAE,EAAE,CAC3D,IAAA,oBAAW,EAAC,iBAAS,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;AADpC,QAAA,KAAK,SAC+B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\decorators\\audit.decorator.ts"],"sourcesContent":["import { SetMetadata } from '@nestjs/common';\n\nexport const AUDIT_KEY = 'audit';\n\nexport interface AuditMetadata {\n action: string; // ชื่อการกระทำ (เช่น 'rfa.create', 'user.login')\n entityType?: string; // ชื่อ Entity (เช่น 'rfa', 'user') - ถ้าไม่ระบุอาจจะพยายามเดา\n}\n\nexport const Audit = (action: string, entityType?: string) =>\n SetMetadata(AUDIT_KEY, { action, entityType });\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c0/correspondenceservicespec_c07b2be49127bf1524290034556fef27 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c0/correspondenceservicespec_c07b2be49127bf1524290034556fef27 new file mode 100644 index 0000000..fd8b435 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c0/correspondenceservicespec_c07b2be49127bf1524290034556fef27 @@ -0,0 +1,625 @@ +8d9fc56a57a84188bfe3664893624510 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const testing_1 = require("@nestjs/testing"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const common_1 = require("@nestjs/common"); +const correspondence_service_1 = require("./correspondence.service"); +const correspondence_entity_1 = require("./entities/correspondence.entity"); +const correspondence_revision_entity_1 = require("./entities/correspondence-revision.entity"); +const correspondence_type_entity_1 = require("./entities/correspondence-type.entity"); +const correspondence_status_entity_1 = require("./entities/correspondence-status.entity"); +const correspondence_reference_entity_1 = require("./entities/correspondence-reference.entity"); +const correspondence_tag_entity_1 = require("./entities/correspondence-tag.entity"); +const organization_entity_1 = require("../organization/entities/organization.entity"); +const correspondence_recipient_entity_1 = require("./entities/correspondence-recipient.entity"); +const correspondence_revision_attachment_entity_1 = require("./entities/correspondence-revision-attachment.entity"); +const document_numbering_service_1 = require("../document-numbering/services/document-numbering.service"); +const json_schema_service_1 = require("../json-schema/json-schema.service"); +const workflow_engine_service_1 = require("../workflow-engine/workflow-engine.service"); +const user_service_1 = require("../user/user.service"); +const search_service_1 = require("../search/search.service"); +const file_storage_service_1 = require("../../common/file-storage/file-storage.service"); +const uuid_resolver_service_1 = require("../../common/services/uuid-resolver.service"); +const notification_service_1 = require("../notification/notification.service"); +describe('CorrespondenceService', () => { + let service; + let numberingService; + let correspondenceRepo; + let revisionRepo; + let testingModule; + let _dataSource; + const createMockRepository = () => ({ + find: jest.fn(), + findOne: jest.fn(), + create: jest.fn(), + save: jest.fn(), + update: jest.fn(), + delete: jest.fn(), + softDelete: jest.fn(), + createQueryBuilder: jest.fn(() => ({ + leftJoinAndSelect: jest.fn().mockReturnThis(), + where: jest.fn().mockReturnThis(), + andWhere: jest.fn().mockReturnThis(), + orderBy: jest.fn().mockReturnThis(), + skip: jest.fn().mockReturnThis(), + take: jest.fn().mockReturnThis(), + getOne: jest.fn().mockResolvedValue(null), + getMany: jest.fn().mockResolvedValue([]), + getManyAndCount: jest.fn().mockResolvedValue([[], 0]), + })), + }); + const mockDataSource = { + createQueryRunner: jest.fn(() => ({ + connect: jest.fn(), + startTransaction: jest.fn(), + commitTransaction: jest.fn(), + rollbackTransaction: jest.fn(), + release: jest.fn(), + manager: { + create: jest.fn(), + save: jest.fn(), + findOne: jest.fn(), + }, + })), + getRepository: jest.fn(() => createMockRepository()), + manager: { + findOne: jest.fn(), + }, + }; + beforeEach(async () => { + testingModule = await testing_1.Test.createTestingModule({ + providers: [ + correspondence_service_1.CorrespondenceService, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_entity_1.Correspondence), + useValue: createMockRepository(), + }, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_revision_entity_1.CorrespondenceRevision), + useValue: createMockRepository(), + }, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_type_entity_1.CorrespondenceType), + useValue: createMockRepository(), + }, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus), + useValue: createMockRepository(), + }, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_reference_entity_1.CorrespondenceReference), + useValue: createMockRepository(), + }, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_tag_entity_1.CorrespondenceTag), + useValue: createMockRepository(), + }, + { + provide: (0, typeorm_1.getRepositoryToken)(organization_entity_1.Organization), + useValue: createMockRepository(), + }, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_recipient_entity_1.CorrespondenceRecipient), + useValue: createMockRepository(), + }, + { + provide: document_numbering_service_1.DocumentNumberingService, + useValue: { + generateNextNumber: jest.fn(), + updateNumberForDraft: jest.fn(), + previewNextNumber: jest.fn(), + }, + }, + { + provide: json_schema_service_1.JsonSchemaService, + useValue: { validate: jest.fn() }, + }, + { + provide: workflow_engine_service_1.WorkflowEngineService, + useValue: { createInstance: jest.fn() }, + }, + { + provide: user_service_1.UserService, + useValue: { + findOne: jest.fn(), + getUserPermissions: jest.fn().mockResolvedValue([]), + }, + }, + { + provide: typeorm_2.DataSource, + useValue: mockDataSource, + }, + { + provide: search_service_1.SearchService, + useValue: { indexDocument: jest.fn() }, + }, + { + provide: file_storage_service_1.FileStorageService, + useValue: { commit: jest.fn().mockResolvedValue([]) }, + }, + { + provide: uuid_resolver_service_1.UuidResolverService, + useValue: { + resolveProjectId: jest.fn().mockResolvedValue(1), + resolveOrganizationId: jest.fn().mockResolvedValue(1), + }, + }, + { + provide: notification_service_1.NotificationService, + useValue: { send: jest.fn().mockResolvedValue(undefined) }, + }, + { + provide: (0, typeorm_1.getRepositoryToken)(correspondence_revision_attachment_entity_1.CorrespondenceRevisionAttachment), + useValue: createMockRepository(), + }, + ], + }).compile(); + service = testingModule.get(correspondence_service_1.CorrespondenceService); + numberingService = testingModule.get(document_numbering_service_1.DocumentNumberingService); + correspondenceRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_entity_1.Correspondence)); + revisionRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_revision_entity_1.CorrespondenceRevision)); + _dataSource = testingModule.get(typeorm_2.DataSource); + }); + it('should be defined', () => { + expect(service).toBeDefined(); + }); + describe('update', () => { + it('should allow non-draft update for org-admin+ permissions', async () => { + const mockUser = { + user_id: 1, + primaryOrganizationId: 10, + }; + const mockRevision = { + id: 100, + correspondenceId: 1, + isCurrent: true, + statusId: 23, + }; + jest + .spyOn(revisionRepo, 'findOne') + .mockResolvedValue(mockRevision); + const statusRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus)); + statusRepo.findOne.mockResolvedValue({ + id: 23, + statusCode: 'SUBOWN', + }); + const userService = testingModule.get(user_service_1.UserService); + userService.getUserPermissions.mockResolvedValue([ + 'correspondence.cancel', + ]); + jest.spyOn(correspondenceRepo, 'findOne').mockResolvedValue({ + id: 1, + publicId: 'corr-uuid-1', + correspondenceNumber: 'CORR-001', + projectId: 1, + createdAt: new Date(), + revisions: [], + }); + await expect(service.update(1, { subject: 'Updated Subject' }, mockUser)).resolves.toBeDefined(); + }); + it('should reject non-draft update for non-admin permissions', async () => { + const mockUser = { + user_id: 2, + primaryOrganizationId: 10, + }; + const mockRevision = { + id: 101, + correspondenceId: 2, + isCurrent: true, + statusId: 23, + }; + jest + .spyOn(revisionRepo, 'findOne') + .mockResolvedValue(mockRevision); + const statusRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus)); + statusRepo.findOne.mockResolvedValue({ + id: 23, + statusCode: 'SUBOWN', + }); + const userService = testingModule.get(user_service_1.UserService); + userService.getUserPermissions.mockResolvedValue([ + 'correspondence.edit', + ]); + await expect(service.update(2, { subject: 'Should Fail' }, mockUser)).rejects.toThrow(common_1.ForbiddenException); + }); + it('should NOT regenerate number if critical fields unchanged', async () => { + const mockUser = { id: 1, primaryOrganizationId: 10 }; + const mockRevision = { + id: 100, + correspondenceId: 1, + isCurrent: true, + statusId: 5, + }; + jest + .spyOn(revisionRepo, 'findOne') + .mockResolvedValue(mockRevision); + const mockCorr = { + id: 1, + projectId: 1, + correspondenceTypeId: 2, + disciplineId: 3, + originatorId: 10, + correspondenceNumber: 'OLD-NUM', + recipients: [{ recipientType: 'TO', recipientOrganizationId: 99 }], + }; + jest + .spyOn(correspondenceRepo, 'findOne') + .mockResolvedValue(mockCorr); + const updateDto = { + projectId: 1, + disciplineId: 3, + }; + await service.update(1, updateDto, mockUser); + expect(numberingService.updateNumberForDraft).not.toHaveBeenCalled(); + }); + it('should regenerate number if Project ID changes', async () => { + const mockUser = { id: 1, primaryOrganizationId: 10 }; + const mockRevision = { + id: 100, + correspondenceId: 1, + isCurrent: true, + statusId: 5, + }; + jest + .spyOn(revisionRepo, 'findOne') + .mockResolvedValue(mockRevision); + const mockCorr = { + id: 1, + projectId: 1, + correspondenceTypeId: 2, + disciplineId: 3, + originatorId: 10, + correspondenceNumber: 'OLD-NUM', + recipients: [{ recipientType: 'TO', recipientOrganizationId: 99 }], + }; + jest + .spyOn(correspondenceRepo, 'findOne') + .mockResolvedValue(mockCorr); + const updateDto = { + projectId: 2, + }; + const uuidResolver = testingModule.get(uuid_resolver_service_1.UuidResolverService); + uuidResolver.resolveProjectId.mockResolvedValue(2); + await service.update(1, updateDto, mockUser); + expect(numberingService.updateNumberForDraft).toHaveBeenCalled(); + }); + it('should regenerate number if Document Type changes', async () => { + const mockUser = { id: 1, primaryOrganizationId: 10 }; + const mockRevision = { + id: 100, + correspondenceId: 1, + isCurrent: true, + statusId: 5, + }; + jest + .spyOn(revisionRepo, 'findOne') + .mockResolvedValue(mockRevision); + const mockCorr = { + id: 1, + projectId: 1, + correspondenceTypeId: 2, + disciplineId: 3, + originatorId: 10, + correspondenceNumber: 'OLD-NUM', + recipients: [{ recipientType: 'TO', recipientOrganizationId: 99 }], + }; + jest + .spyOn(correspondenceRepo, 'findOne') + .mockResolvedValue(mockCorr); + const updateDto = { + typeId: 999, + }; + const typeRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_type_entity_1.CorrespondenceType)); + typeRepo.findOne.mockResolvedValue({ + id: 999, + typeCode: 'NEW-TYPE', + }); + await service.update(1, updateDto, mockUser); + expect(numberingService.updateNumberForDraft).toHaveBeenCalled(); + }); + it('should regenerate number if Recipient Organization changes', async () => { + const mockUser = { id: 1, primaryOrganizationId: 10 }; + const mockRevision = { + id: 100, + correspondenceId: 1, + isCurrent: true, + statusId: 5, + }; + jest + .spyOn(revisionRepo, 'findOne') + .mockResolvedValue(mockRevision); + const mockCorr = { + id: 1, + projectId: 1, + correspondenceTypeId: 2, + disciplineId: 3, + originatorId: 10, + correspondenceNumber: 'OLD-NUM', + recipients: [{ recipientType: 'TO', recipientOrganizationId: 99 }], + }; + jest + .spyOn(correspondenceRepo, 'findOne') + .mockResolvedValue(mockCorr); + // Access DataSource manager for mocking + mockDataSource.manager.findOne.mockResolvedValue({ + id: 88, + organizationCode: 'NEW-ORG', + }); + const updateDto = { + recipients: [{ type: 'TO', organizationId: 88 }], + }; + await service.update(1, updateDto, mockUser); + expect(numberingService.updateNumberForDraft).toHaveBeenCalled(); + }); + }); + describe('create', () => { + it('should allow system.manage_all user without primaryOrganizationId when originatorId is provided', async () => { + const mockUser = { + user_id: 1, + primaryOrganizationId: null, + }; + const createDto = { + projectId: 'project-uuid', + typeId: 1, + subject: 'Test Subject', + originatorId: 'originator-uuid', + recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }], + }; + const userService = testingModule.get(user_service_1.UserService); + const typeRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_type_entity_1.CorrespondenceType)); + const statusRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus)); + const uuidResolver = testingModule.get(uuid_resolver_service_1.UuidResolverService); + userService.findOne.mockResolvedValue({ + user_id: 1, + primaryOrganizationId: null, + }); + userService.getUserPermissions.mockResolvedValue([ + 'system.manage_all', + ]); + uuidResolver.resolveProjectId.mockResolvedValue(100); + uuidResolver.resolveOrganizationId.mockImplementation((value) => { + if (value === 'originator-uuid') + return 10; + if (value === 'recipient-uuid') + return 20; + return 0; + }); + typeRepo.findOne.mockResolvedValue({ + id: 1, + typeCode: 'LTR', + }); + statusRepo.findOne.mockResolvedValue({ + id: 1, + statusCode: 'DRAFT', + }); + numberingService.generateNextNumber.mockResolvedValue({ + number: 'DOC-001', + }); + mockDataSource.manager.findOne + .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' }) + .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' }); + const queryRunner = { + connect: jest.fn(), + startTransaction: jest.fn(), + commitTransaction: jest.fn(), + rollbackTransaction: jest.fn(), + release: jest.fn(), + manager: { + create: jest.fn((_entity, payload) => payload), + save: jest + .fn() + .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' }) + .mockResolvedValueOnce({ id: 1000 }) + .mockResolvedValueOnce([]), + findOne: jest.fn(), + }, + }; + mockDataSource.createQueryRunner.mockReturnValue(queryRunner); + await service.create(createDto, mockUser); + expect(queryRunner.manager.create).toHaveBeenCalledWith(correspondence_entity_1.Correspondence, expect.objectContaining({ originatorId: 10 })); + }); + it('should set revisionLabel to "A" for RFA type', async () => { + const mockUser = { + user_id: 1, + primaryOrganizationId: 10, + }; + const createDto = { + projectId: 'project-uuid', + typeId: 1, + subject: 'Test Subject', + recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }], + }; + const typeRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_type_entity_1.CorrespondenceType)); + const statusRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus)); + const uuidResolver = testingModule.get(uuid_resolver_service_1.UuidResolverService); + uuidResolver.resolveProjectId.mockResolvedValue(100); + uuidResolver.resolveOrganizationId.mockResolvedValue(20); + typeRepo.findOne.mockResolvedValue({ + id: 1, + typeCode: 'RFA', + }); + statusRepo.findOne.mockResolvedValue({ + id: 1, + statusCode: 'DRAFT', + }); + numberingService.generateNextNumber.mockResolvedValue({ + number: 'DOC-001', + }); + mockDataSource.manager.findOne + .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' }) + .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' }); + const queryRunner = { + connect: jest.fn(), + startTransaction: jest.fn(), + commitTransaction: jest.fn(), + rollbackTransaction: jest.fn(), + release: jest.fn(), + manager: { + create: jest.fn((_entity, payload) => payload), + save: jest + .fn() + .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' }) + .mockResolvedValueOnce({ id: 1000 }) + .mockResolvedValueOnce([]), + findOne: jest.fn(), + }, + }; + mockDataSource.createQueryRunner.mockReturnValue(queryRunner); + await service.create(createDto, mockUser); + expect(queryRunner.manager.create).toHaveBeenCalledWith(correspondence_revision_entity_1.CorrespondenceRevision, expect.objectContaining({ revisionLabel: 'A' })); + }); + it('should set revisionLabel to "A" for RFI type', async () => { + const mockUser = { + user_id: 1, + primaryOrganizationId: 10, + }; + const createDto = { + projectId: 'project-uuid', + typeId: 1, + subject: 'Test Subject', + recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }], + }; + const typeRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_type_entity_1.CorrespondenceType)); + const statusRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus)); + const uuidResolver = testingModule.get(uuid_resolver_service_1.UuidResolverService); + uuidResolver.resolveProjectId.mockResolvedValue(100); + uuidResolver.resolveOrganizationId.mockResolvedValue(20); + typeRepo.findOne.mockResolvedValue({ + id: 1, + typeCode: 'RFI', + }); + statusRepo.findOne.mockResolvedValue({ + id: 1, + statusCode: 'DRAFT', + }); + numberingService.generateNextNumber.mockResolvedValue({ + number: 'DOC-001', + }); + mockDataSource.manager.findOne + .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' }) + .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' }); + const queryRunner = { + connect: jest.fn(), + startTransaction: jest.fn(), + commitTransaction: jest.fn(), + rollbackTransaction: jest.fn(), + release: jest.fn(), + manager: { + create: jest.fn((_entity, payload) => payload), + save: jest + .fn() + .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' }) + .mockResolvedValueOnce({ id: 1000 }) + .mockResolvedValueOnce([]), + findOne: jest.fn(), + }, + }; + mockDataSource.createQueryRunner.mockReturnValue(queryRunner); + await service.create(createDto, mockUser); + expect(queryRunner.manager.create).toHaveBeenCalledWith(correspondence_revision_entity_1.CorrespondenceRevision, expect.objectContaining({ revisionLabel: 'A' })); + }); + it('should set revisionLabel to null for LETTER type', async () => { + const mockUser = { + user_id: 1, + primaryOrganizationId: 10, + }; + const createDto = { + projectId: 'project-uuid', + typeId: 1, + subject: 'Test Subject', + recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }], + }; + const typeRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_type_entity_1.CorrespondenceType)); + const statusRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus)); + const uuidResolver = testingModule.get(uuid_resolver_service_1.UuidResolverService); + uuidResolver.resolveProjectId.mockResolvedValue(100); + uuidResolver.resolveOrganizationId.mockResolvedValue(20); + typeRepo.findOne.mockResolvedValue({ + id: 1, + typeCode: 'LETTER', + }); + statusRepo.findOne.mockResolvedValue({ + id: 1, + statusCode: 'DRAFT', + }); + numberingService.generateNextNumber.mockResolvedValue({ + number: 'DOC-001', + }); + mockDataSource.manager.findOne + .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' }) + .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' }); + const queryRunner = { + connect: jest.fn(), + startTransaction: jest.fn(), + commitTransaction: jest.fn(), + rollbackTransaction: jest.fn(), + release: jest.fn(), + manager: { + create: jest.fn((_entity, payload) => payload), + save: jest + .fn() + .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' }) + .mockResolvedValueOnce({ id: 1000 }) + .mockResolvedValueOnce([]), + findOne: jest.fn(), + }, + }; + mockDataSource.createQueryRunner.mockReturnValue(queryRunner); + await service.create(createDto, mockUser); + expect(queryRunner.manager.create).toHaveBeenCalledWith(correspondence_revision_entity_1.CorrespondenceRevision, expect.objectContaining({ revisionLabel: undefined })); + }); + it('should set revisionLabel to undefined for MEMO type', async () => { + const mockUser = { + user_id: 1, + primaryOrganizationId: 10, + }; + const createDto = { + projectId: 'project-uuid', + typeId: 1, + subject: 'Test Subject', + recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }], + }; + const typeRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_type_entity_1.CorrespondenceType)); + const statusRepo = testingModule.get((0, typeorm_1.getRepositoryToken)(correspondence_status_entity_1.CorrespondenceStatus)); + const uuidResolver = testingModule.get(uuid_resolver_service_1.UuidResolverService); + uuidResolver.resolveProjectId.mockResolvedValue(100); + uuidResolver.resolveOrganizationId.mockResolvedValue(20); + typeRepo.findOne.mockResolvedValue({ + id: 1, + typeCode: 'MEMO', + }); + statusRepo.findOne.mockResolvedValue({ + id: 1, + statusCode: 'DRAFT', + }); + numberingService.generateNextNumber.mockResolvedValue({ + number: 'DOC-001', + }); + mockDataSource.manager.findOne + .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' }) + .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' }); + const queryRunner = { + connect: jest.fn(), + startTransaction: jest.fn(), + commitTransaction: jest.fn(), + rollbackTransaction: jest.fn(), + release: jest.fn(), + manager: { + create: jest.fn((_entity, payload) => payload), + save: jest + .fn() + .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' }) + .mockResolvedValueOnce({ id: 1000 }) + .mockResolvedValueOnce([]), + findOne: jest.fn(), + }, + }; + mockDataSource.createQueryRunner.mockReturnValue(queryRunner); + await service.create(createDto, mockUser); + expect(queryRunner.manager.create).toHaveBeenCalledWith(correspondence_revision_entity_1.CorrespondenceRevision, expect.objectContaining({ revisionLabel: undefined })); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGNvcnJlc3BvbmRlbmNlLnNlcnZpY2Uuc3BlYy50cyIsIm1hcHBpbmdzIjoiOztBQUFBLDZDQUFzRDtBQUN0RCw2Q0FBcUQ7QUFDckQscUNBQWlEO0FBQ2pELDJDQUFvRDtBQUNwRCxxRUFBaUU7QUFDakUsNEVBQWtFO0FBQ2xFLDhGQUFtRjtBQUNuRixzRkFBMkU7QUFDM0UsMEZBQStFO0FBQy9FLGdHQUFxRjtBQUNyRixvRkFBeUU7QUFDekUsc0ZBQTRFO0FBQzVFLGdHQUFxRjtBQUNyRixvSEFBd0c7QUFDeEcsMEdBQXFHO0FBQ3JHLDRFQUF1RTtBQUN2RSx3RkFBbUY7QUFDbkYsdURBQW1EO0FBQ25ELDZEQUF5RDtBQUN6RCx5RkFBb0Y7QUFDcEYsdUZBQWtGO0FBQ2xGLCtFQUEyRTtBQUszRSxRQUFRLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO0lBQ3JDLElBQUksT0FBOEIsQ0FBQztJQUNuQyxJQUFJLGdCQUEwQyxDQUFDO0lBQy9DLElBQUksa0JBQThDLENBQUM7SUFDbkQsSUFBSSxZQUFnRCxDQUFDO0lBQ3JELElBQUksYUFBNEIsQ0FBQztJQUNqQyxJQUFJLFdBQXVCLENBQUM7SUFFNUIsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2YsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDbEIsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDakIsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDZixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNqQixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNqQixVQUFVLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNyQixrQkFBa0IsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFD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QzdELFdBQVcsQ0FDWixDQUFDO1lBRUYsTUFBTSxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUUxQyxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxvQkFBb0IsQ0FDckQsdURBQXNCLEVBQ3RCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUN0RCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGNvcnJlc3BvbmRlbmNlXFxjb3JyZXNwb25kZW5jZS5zZXJ2aWNlLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVzdCwgVGVzdGluZ01vZHVsZSB9IGZyb20gJ0BuZXN0anMvdGVzdGluZyc7XHJcbmltcG9ydCB7IGdldFJlcG9zaXRvcnlUb2tlbiB9IGZyb20gJ0BuZXN0anMvdHlwZW9ybSc7XHJcbmltcG9ydCB7IERhdGFTb3VyY2UsIFJlcG9zaXRvcnkgfSBmcm9tICd0eXBlb3JtJztcclxuaW1wb3J0IHsgRm9yYmlkZGVuRXhjZXB0aW9uIH0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVNlcnZpY2UgfSBmcm9tICcuL2NvcnJlc3BvbmRlbmNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZSB9IGZyb20gJy4vZW50aXRpZXMvY29ycmVzcG9uZGVuY2UuZW50aXR5JztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VSZXZpc2lvbiB9IGZyb20gJy4vZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtcmV2aXNpb24uZW50aXR5JztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VUeXBlIH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS10eXBlLmVudGl0eSc7XHJcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlU3RhdHVzIH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS1zdGF0dXMuZW50aXR5JztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VSZWZlcmVuY2UgfSBmcm9tICcuL2VudGl0aWVzL2NvcnJlc3BvbmRlbmNlLXJlZmVyZW5jZS5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVRhZyB9IGZyb20gJy4vZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtdGFnLmVudGl0eSc7XHJcbmltcG9ydCB7IE9yZ2FuaXphdGlvbiB9IGZyb20gJy4uL29yZ2FuaXphdGlvbi9lbnRpdGllcy9vcmdhbml6YXRpb24uZW50aXR5JztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VSZWNpcGllbnQgfSBmcm9tICcuL2VudGl0aWVzL2NvcnJlc3BvbmRlbmNlLXJlY2lwaWVudC5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJldmlzaW9uQXR0YWNobWVudCB9IGZyb20gJy4vZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtcmV2aXNpb24tYXR0YWNobWVudC5lbnRpdHknO1xyXG5pbXBvcnQgeyBEb2N1bWVudE51bWJlcmluZ1NlcnZpY2UgfSBmcm9tICcuLi9kb2N1bWVudC1udW1iZXJpbmcvc2VydmljZXMvZG9jdW1lbnQtbnVtYmVyaW5nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBKc29uU2NoZW1hU2VydmljZSB9IGZyb20gJy4uL2pzb24tc2NoZW1hL2pzb24tc2NoZW1hLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBXb3JrZmxvd0VuZ2luZVNlcnZpY2UgfSBmcm9tICcuLi93b3JrZmxvdy1lbmdpbmUvd29ya2Zsb3ctZW5naW5lLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uL3VzZXIvdXNlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2VhcmNoU2VydmljZSB9IGZyb20gJy4uL3NlYXJjaC9zZWFyY2guc2VydmljZSc7XHJcbmltcG9ydCB7IEZpbGVTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9maWxlLXN0b3JhZ2UvZmlsZS1zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVdWlkUmVzb2x2ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uL3NlcnZpY2VzL3V1aWQtcmVzb2x2ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVcGRhdGVDb3JyZXNwb25kZW5jZUR0byB9IGZyb20gJy4vZHRvL3VwZGF0ZS1jb3JyZXNwb25kZW5jZS5kdG8nO1xyXG5pbXBvcnQgeyBDcmVhdGVDb3JyZXNwb25kZW5jZUR0byB9IGZyb20gJy4vZHRvL2NyZWF0ZS1jb3JyZXNwb25kZW5jZS5kdG8nO1xyXG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vdXNlci9lbnRpdGllcy91c2VyLmVudGl0eSc7XHJcblxyXG5kZXNjcmliZSgnQ29ycmVzcG9uZGVuY2VTZXJ2aWNlJywgKCkgPT4ge1xyXG4gIGxldCBzZXJ2aWNlOiBDb3JyZXNwb25kZW5jZVNlcnZpY2U7XHJcbiAgbGV0IG51bWJlcmluZ1NlcnZpY2U6IERvY3VtZW50TnVtYmVyaW5nU2VydmljZTtcclxuICBsZXQgY29ycmVzcG9uZGVuY2VSZXBvOiBSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlPjtcclxuICBsZXQgcmV2aXNpb25SZXBvOiBSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlUmV2aXNpb24+O1xyXG4gIGxldCB0ZXN0aW5nTW9kdWxlOiBUZXN0aW5nTW9kdWxlO1xyXG4gIGxldCBfZGF0YVNvdXJjZTogRGF0YVNvdXJjZTtcclxuXHJcbiAgY29uc3QgY3JlYXRlTW9ja1JlcG9zaXRvcnkgPSAoKSA9PiAoe1xyXG4gICAgZmluZDogamVzdC5mbigpLFxyXG4gICAgZmluZE9uZTogamVzdC5mbigpLFxyXG4gICAgY3JlYXRlOiBqZXN0LmZuKCksXHJcbiAgICBzYXZlOiBqZXN0LmZuKCksXHJcbiAgICB1cGRhdGU6IGplc3QuZm4oKSxcclxuICAgIGRlbGV0ZTogamVzdC5mbigpLFxyXG4gICAgc29mdERlbGV0ZTogamVzdC5mbigpLFxyXG4gICAgY3JlYXRlUXVlcnlCdWlsZGVyOiBqZXN0LmZuKCgpID0+ICh7XHJcbiAgICAgIGxlZnRKb2luQW5kU2VsZWN0OiBqZXN0LmZuKCkubW9ja1JldHVyblRoaXMoKSxcclxuICAgICAgd2hlcmU6IGplc3QuZm4oKS5tb2NrUmV0dXJuVGhpcygpLFxyXG4gICAgICBhbmRXaGVyZTogamVzdC5mbigpLm1vY2tSZXR1cm5UaGlzKCksXHJcbiAgICAgIG9yZGVyQnk6IGplc3QuZm4oKS5tb2NrUmV0dXJuVGhpcygpLFxyXG4gICAgICBza2lwOiBqZXN0LmZuKCkubW9ja1JldHVyblRoaXMoKSxcclxuICAgICAgdGFrZTogamVzdC5mbigpLm1vY2tSZXR1cm5UaGlzKCksXHJcbiAgICAgIGdldE9uZTogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKG51bGwpLFxyXG4gICAgICBnZXRNYW55OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoW10pLFxyXG4gICAgICBnZXRNYW55QW5kQ291bnQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShbW10sIDBdKSxcclxuICAgIH0pKSxcclxuICB9KTtcclxuXHJcbiAgY29uc3QgbW9ja0RhdGFTb3VyY2UgPSB7XHJcbiAgICBjcmVhdGVRdWVyeVJ1bm5lcjogamVzdC5mbigoKSA9PiAoe1xyXG4gICAgICBjb25uZWN0OiBqZXN0LmZuKCksXHJcbiAgICAgIHN0YXJ0VHJhbnNhY3Rpb246IGplc3QuZm4oKSxcclxuICAgICAgY29tbWl0VHJhbnNhY3Rpb246IGplc3QuZm4oKSxcclxuICAgICAgcm9sbGJhY2tUcmFuc2FjdGlvbjogamVzdC5mbigpLFxyXG4gICAgICByZWxlYXNlOiBqZXN0LmZuKCksXHJcbiAgICAgIG1hbmFnZXI6IHtcclxuICAgICAgICBjcmVhdGU6IGplc3QuZm4oKSxcclxuICAgICAgICBzYXZlOiBqZXN0LmZuKCksXHJcbiAgICAgICAgZmluZE9uZTogamVzdC5mbigpLFxyXG4gICAgICB9LFxyXG4gICAgfSkpLFxyXG4gICAgZ2V0UmVwb3NpdG9yeTogamVzdC5mbigoKSA9PiBjcmVhdGVNb2NrUmVwb3NpdG9yeSgpKSxcclxuICAgIG1hbmFnZXI6IHtcclxuICAgICAgZmluZE9uZTogamVzdC5mbigpLFxyXG4gICAgfSxcclxuICB9O1xyXG5cclxuICBiZWZvcmVFYWNoKGFzeW5jICgpID0+IHtcclxuICAgIHRlc3RpbmdNb2R1bGUgPSBhd2FpdCBUZXN0LmNyZWF0ZVRlc3RpbmdNb2R1bGUoe1xyXG4gICAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICBDb3JyZXNwb25kZW5jZVNlcnZpY2UsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlKSxcclxuICAgICAgICAgIHVzZVZhbHVlOiBjcmVhdGVNb2NrUmVwb3NpdG9yeSgpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlUmV2aXNpb24pLFxyXG4gICAgICAgICAgdXNlVmFsdWU6IGNyZWF0ZU1vY2tSZXBvc2l0b3J5KCksXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm92aWRlOiBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VUeXBlKSxcclxuICAgICAgICAgIHVzZVZhbHVlOiBjcmVhdGVNb2NrUmVwb3NpdG9yeSgpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlU3RhdHVzKSxcclxuICAgICAgICAgIHVzZVZhbHVlOiBjcmVhdGVNb2NrUmVwb3NpdG9yeSgpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlUmVmZXJlbmNlKSxcclxuICAgICAgICAgIHVzZVZhbHVlOiBjcmVhdGVNb2NrUmVwb3NpdG9yeSgpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlVGFnKSxcclxuICAgICAgICAgIHVzZVZhbHVlOiBjcmVhdGVNb2NrUmVwb3NpdG9yeSgpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogZ2V0UmVwb3NpdG9yeVRva2VuKE9yZ2FuaXphdGlvbiksXHJcbiAgICAgICAgICB1c2VWYWx1ZTogY3JlYXRlTW9ja1JlcG9zaXRvcnkoKSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHByb3ZpZGU6IGdldFJlcG9zaXRvcnlUb2tlbihDb3JyZXNwb25kZW5jZVJlY2lwaWVudCksXHJcbiAgICAgICAgICB1c2VWYWx1ZTogY3JlYXRlTW9ja1JlcG9zaXRvcnkoKSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHByb3ZpZGU6IERvY3VtZW50TnVtYmVyaW5nU2VydmljZSxcclxuICAgICAgICAgIHVzZVZhbHVlOiB7XHJcbiAgICAgICAgICAgIGdlbmVyYXRlTmV4dE51bWJlcjogamVzdC5mbigpLFxyXG4gICAgICAgICAgICB1cGRhdGVOdW1iZXJGb3JEcmFmdDogamVzdC5mbigpLFxyXG4gICAgICAgICAgICBwcmV2aWV3TmV4dE51bWJlcjogamVzdC5mbigpLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHByb3ZpZGU6IEpzb25TY2hlbWFTZXJ2aWNlLFxyXG4gICAgICAgICAgdXNlVmFsdWU6IHsgdmFsaWRhdGU6IGplc3QuZm4oKSB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogV29ya2Zsb3dFbmdpbmVTZXJ2aWNlLFxyXG4gICAgICAgICAgdXNlVmFsdWU6IHsgY3JlYXRlSW5zdGFuY2U6IGplc3QuZm4oKSB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogVXNlclNlcnZpY2UsXHJcbiAgICAgICAgICB1c2VWYWx1ZToge1xyXG4gICAgICAgICAgICBmaW5kT25lOiBqZXN0LmZuKCksXHJcbiAgICAgICAgICAgIGdldFVzZXJQZXJtaXNzaW9uczogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKFtdKSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm92aWRlOiBEYXRhU291cmNlLFxyXG4gICAgICAgICAgdXNlVmFsdWU6IG1vY2tEYXRhU291cmNlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogU2VhcmNoU2VydmljZSxcclxuICAgICAgICAgIHVzZVZhbHVlOiB7IGluZGV4RG9jdW1lbnQ6IGplc3QuZm4oKSB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJvdmlkZTogRmlsZVN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgICAgICAgdXNlVmFsdWU6IHsgY29tbWl0OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoW10pIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm92aWRlOiBVdWlkUmVzb2x2ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgdXNlVmFsdWU6IHtcclxuICAgICAgICAgICAgcmVzb2x2ZVByb2plY3RJZDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKDEpLFxyXG4gICAgICAgICAgICByZXNvbHZlT3JnYW5pemF0aW9uSWQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSgxKSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm92aWRlOiBOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgICAgICAgdXNlVmFsdWU6IHsgc2VuZDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZCkgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHByb3ZpZGU6IGdldFJlcG9zaXRvcnlUb2tlbihDb3JyZXNwb25kZW5jZVJldmlzaW9uQXR0YWNobWVudCksXHJcbiAgICAgICAgICB1c2VWYWx1ZTogY3JlYXRlTW9ja1JlcG9zaXRvcnkoKSxcclxuICAgICAgICB9LFxyXG4gICAgICBdLFxyXG4gICAgfSkuY29tcGlsZSgpO1xyXG5cclxuICAgIHNlcnZpY2UgPSB0ZXN0aW5nTW9kdWxlLmdldDxDb3JyZXNwb25kZW5jZVNlcnZpY2U+KENvcnJlc3BvbmRlbmNlU2VydmljZSk7XHJcbiAgICBudW1iZXJpbmdTZXJ2aWNlID0gdGVzdGluZ01vZHVsZS5nZXQ8RG9jdW1lbnROdW1iZXJpbmdTZXJ2aWNlPihcclxuICAgICAgRG9jdW1lbnROdW1iZXJpbmdTZXJ2aWNlXHJcbiAgICApO1xyXG4gICAgY29ycmVzcG9uZGVuY2VSZXBvID0gdGVzdGluZ01vZHVsZS5nZXQ8UmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZT4+KFxyXG4gICAgICBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2UpXHJcbiAgICApO1xyXG4gICAgcmV2aXNpb25SZXBvID0gdGVzdGluZ01vZHVsZS5nZXQ8UmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZVJldmlzaW9uPj4oXHJcbiAgICAgIGdldFJlcG9zaXRvcnlUb2tlbihDb3JyZXNwb25kZW5jZVJldmlzaW9uKVxyXG4gICAgKTtcclxuICAgIF9kYXRhU291cmNlID0gdGVzdGluZ01vZHVsZS5nZXQ8RGF0YVNvdXJjZT4oRGF0YVNvdXJjZSk7XHJcbiAgfSk7XHJcblxyXG4gIGl0KCdzaG91bGQgYmUgZGVmaW5lZCcsICgpID0+IHtcclxuICAgIGV4cGVjdChzZXJ2aWNlKS50b0JlRGVmaW5lZCgpO1xyXG4gIH0pO1xyXG5cclxuICBkZXNjcmliZSgndXBkYXRlJywgKCkgPT4ge1xyXG4gICAgaXQoJ3Nob3VsZCBhbGxvdyBub24tZHJhZnQgdXBkYXRlIGZvciBvcmctYWRtaW4rIHBlcm1pc3Npb25zJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBtb2NrVXNlciA9IHtcclxuICAgICAgICB1c2VyX2lkOiAxLFxyXG4gICAgICAgIHByaW1hcnlPcmdhbml6YXRpb25JZDogMTAsXHJcbiAgICAgIH0gYXMgdW5rbm93biBhcyBVc2VyO1xyXG4gICAgICBjb25zdCBtb2NrUmV2aXNpb24gPSB7XHJcbiAgICAgICAgaWQ6IDEwMCxcclxuICAgICAgICBjb3JyZXNwb25kZW5jZUlkOiAxLFxyXG4gICAgICAgIGlzQ3VycmVudDogdHJ1ZSxcclxuICAgICAgICBzdGF0dXNJZDogMjMsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBqZXN0XHJcbiAgICAgICAgLnNweU9uKHJldmlzaW9uUmVwbywgJ2ZpbmRPbmUnKVxyXG4gICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZShtb2NrUmV2aXNpb24gYXMgdW5rbm93biBhcyBDb3JyZXNwb25kZW5jZVJldmlzaW9uKTtcclxuXHJcbiAgICAgIGNvbnN0IHN0YXR1c1JlcG8gPSB0ZXN0aW5nTW9kdWxlLmdldDxSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlU3RhdHVzPj4oXHJcbiAgICAgICAgZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlU3RhdHVzKVxyXG4gICAgICApO1xyXG4gICAgICAoc3RhdHVzUmVwby5maW5kT25lIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoe1xyXG4gICAgICAgIGlkOiAyMyxcclxuICAgICAgICBzdGF0dXNDb2RlOiAnU1VCT1dOJyxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCB1c2VyU2VydmljZSA9IHRlc3RpbmdNb2R1bGUuZ2V0PFVzZXJTZXJ2aWNlPihVc2VyU2VydmljZSk7XHJcbiAgICAgICh1c2VyU2VydmljZS5nZXRVc2VyUGVybWlzc2lvbnMgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZShbXHJcbiAgICAgICAgJ2NvcnJlc3BvbmRlbmNlLmNhbmNlbCcsXHJcbiAgICAgIF0pO1xyXG5cclxuICAgICAgamVzdC5zcHlPbihjb3JyZXNwb25kZW5jZVJlcG8sICdmaW5kT25lJykubW9ja1Jlc29sdmVkVmFsdWUoe1xyXG4gICAgICAgIGlkOiAxLFxyXG4gICAgICAgIHB1YmxpY0lkOiAnY29yci11dWlkLTEnLFxyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlTnVtYmVyOiAnQ09SUi0wMDEnLFxyXG4gICAgICAgIHByb2plY3RJZDogMSxcclxuICAgICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCksXHJcbiAgICAgICAgcmV2aXNpb25zOiBbXSxcclxuICAgICAgfSBhcyB1bmtub3duIGFzIENvcnJlc3BvbmRlbmNlKTtcclxuXHJcbiAgICAgIGF3YWl0IGV4cGVjdChcclxuICAgICAgICBzZXJ2aWNlLnVwZGF0ZSgxLCB7IHN1YmplY3Q6ICdVcGRhdGVkIFN1YmplY3QnIH0sIG1vY2tVc2VyKVxyXG4gICAgICApLnJlc29sdmVzLnRvQmVEZWZpbmVkKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnc2hvdWxkIHJlamVjdCBub24tZHJhZnQgdXBkYXRlIGZvciBub24tYWRtaW4gcGVybWlzc2lvbnMnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1vY2tVc2VyID0ge1xyXG4gICAgICAgIHVzZXJfaWQ6IDIsXHJcbiAgICAgICAgcHJpbWFyeU9yZ2FuaXphdGlvbklkOiAxMCxcclxuICAgICAgfSBhcyB1bmtub3duIGFzIFVzZXI7XHJcbiAgICAgIGNvbnN0IG1vY2tSZXZpc2lvbiA9IHtcclxuICAgICAgICBpZDogMTAxLFxyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlSWQ6IDIsXHJcbiAgICAgICAgaXNDdXJyZW50OiB0cnVlLFxyXG4gICAgICAgIHN0YXR1c0lkOiAyMyxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGplc3RcclxuICAgICAgICAuc3B5T24ocmV2aXNpb25SZXBvLCAnZmluZE9uZScpXHJcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tSZXZpc2lvbiBhcyB1bmtub3duIGFzIENvcnJlc3BvbmRlbmNlUmV2aXNpb24pO1xyXG5cclxuICAgICAgY29uc3Qgc3RhdHVzUmVwbyA9IHRlc3RpbmdNb2R1bGUuZ2V0PFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VTdGF0dXM+PihcclxuICAgICAgICBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VTdGF0dXMpXHJcbiAgICAgICk7XHJcbiAgICAgIChzdGF0dXNSZXBvLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgaWQ6IDIzLFxyXG4gICAgICAgIHN0YXR1c0NvZGU6ICdTVUJPV04nLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IHVzZXJTZXJ2aWNlID0gdGVzdGluZ01vZHVsZS5nZXQ8VXNlclNlcnZpY2U+KFVzZXJTZXJ2aWNlKTtcclxuICAgICAgKHVzZXJTZXJ2aWNlLmdldFVzZXJQZXJtaXNzaW9ucyBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKFtcclxuICAgICAgICAnY29ycmVzcG9uZGVuY2UuZWRpdCcsXHJcbiAgICAgIF0pO1xyXG5cclxuICAgICAgYXdhaXQgZXhwZWN0KFxyXG4gICAgICAgIHNlcnZpY2UudXBkYXRlKDIsIHsgc3ViamVjdDogJ1Nob3VsZCBGYWlsJyB9LCBtb2NrVXNlcilcclxuICAgICAgKS5yZWplY3RzLnRvVGhyb3coRm9yYmlkZGVuRXhjZXB0aW9uKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdzaG91bGQgTk9UIHJlZ2VuZXJhdGUgbnVtYmVyIGlmIGNyaXRpY2FsIGZpZWxkcyB1bmNoYW5nZWQnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1vY2tVc2VyID0geyBpZDogMSwgcHJpbWFyeU9yZ2FuaXphdGlvbklkOiAxMCB9IGFzIHVua25vd24gYXMgVXNlcjtcclxuICAgICAgY29uc3QgbW9ja1JldmlzaW9uID0ge1xyXG4gICAgICAgIGlkOiAxMDAsXHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VJZDogMSxcclxuICAgICAgICBpc0N1cnJlbnQ6IHRydWUsXHJcbiAgICAgICAgc3RhdHVzSWQ6IDUsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBqZXN0XHJcbiAgICAgICAgLnNweU9uKHJldmlzaW9uUmVwbywgJ2ZpbmRPbmUnKVxyXG4gICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZShtb2NrUmV2aXNpb24gYXMgdW5rbm93biBhcyBDb3JyZXNwb25kZW5jZVJldmlzaW9uKTtcclxuXHJcbiAgICAgIGNvbnN0IG1vY2tDb3JyID0ge1xyXG4gICAgICAgIGlkOiAxLFxyXG4gICAgICAgIHByb2plY3RJZDogMSxcclxuICAgICAgICBjb3JyZXNwb25kZW5jZVR5cGVJZDogMixcclxuICAgICAgICBkaXNjaXBsaW5lSWQ6IDMsXHJcbiAgICAgICAgb3JpZ2luYXRvcklkOiAxMCxcclxuICAgICAgICBjb3JyZXNwb25kZW5jZU51bWJlcjogJ09MRC1OVU0nLFxyXG4gICAgICAgIHJlY2lwaWVudHM6IFt7IHJlY2lwaWVudFR5cGU6ICdUTycsIHJlY2lwaWVudE9yZ2FuaXphdGlvbklkOiA5OSB9XSxcclxuICAgICAgfTtcclxuICAgICAgamVzdFxyXG4gICAgICAgIC5zcHlPbihjb3JyZXNwb25kZW5jZVJlcG8sICdmaW5kT25lJylcclxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWUobW9ja0NvcnIgYXMgdW5rbm93biBhcyBDb3JyZXNwb25kZW5jZSk7XHJcblxyXG4gICAgICBjb25zdCB1cGRhdGVEdG86IFVwZGF0ZUNvcnJlc3BvbmRlbmNlRHRvID0ge1xyXG4gICAgICAgIHByb2plY3RJZDogMSxcclxuICAgICAgICBkaXNjaXBsaW5lSWQ6IDMsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzZXJ2aWNlLnVwZGF0ZSgxLCB1cGRhdGVEdG8sIG1vY2tVc2VyKTtcclxuXHJcbiAgICAgIGV4cGVjdChcclxuICAgICAgICBudW1iZXJpbmdTZXJ2aWNlLnVwZGF0ZU51bWJlckZvckRyYWZ0IGFzIGplc3QuTW9ja1xyXG4gICAgICApLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnc2hvdWxkIHJlZ2VuZXJhdGUgbnVtYmVyIGlmIFByb2plY3QgSUQgY2hhbmdlcycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgbW9ja1VzZXIgPSB7IGlkOiAxLCBwcmltYXJ5T3JnYW5pemF0aW9uSWQ6IDEwIH0gYXMgdW5rbm93biBhcyBVc2VyO1xyXG4gICAgICBjb25zdCBtb2NrUmV2aXNpb24gPSB7XHJcbiAgICAgICAgaWQ6IDEwMCxcclxuICAgICAgICBjb3JyZXNwb25kZW5jZUlkOiAxLFxyXG4gICAgICAgIGlzQ3VycmVudDogdHJ1ZSxcclxuICAgICAgICBzdGF0dXNJZDogNSxcclxuICAgICAgfTtcclxuICAgICAgamVzdFxyXG4gICAgICAgIC5zcHlPbihyZXZpc2lvblJlcG8sICdmaW5kT25lJylcclxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWUobW9ja1JldmlzaW9uIGFzIHVua25vd24gYXMgQ29ycmVzcG9uZGVuY2VSZXZpc2lvbik7XHJcblxyXG4gICAgICBjb25zdCBtb2NrQ29yciA9IHtcclxuICAgICAgICBpZDogMSxcclxuICAgICAgICBwcm9qZWN0SWQ6IDEsXHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VUeXBlSWQ6IDIsXHJcbiAgICAgICAgZGlzY2lwbGluZUlkOiAzLFxyXG4gICAgICAgIG9yaWdpbmF0b3JJZDogMTAsXHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VOdW1iZXI6ICdPTEQtTlVNJyxcclxuICAgICAgICByZWNpcGllbnRzOiBbeyByZWNpcGllbnRUeXBlOiAnVE8nLCByZWNpcGllbnRPcmdhbml6YXRpb25JZDogOTkgfV0sXHJcbiAgICAgIH07XHJcbiAgICAgIGplc3RcclxuICAgICAgICAuc3B5T24oY29ycmVzcG9uZGVuY2VSZXBvLCAnZmluZE9uZScpXHJcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tDb3JyIGFzIHVua25vd24gYXMgQ29ycmVzcG9uZGVuY2UpO1xyXG5cclxuICAgICAgY29uc3QgdXBkYXRlRHRvOiBVcGRhdGVDb3JyZXNwb25kZW5jZUR0byA9IHtcclxuICAgICAgICBwcm9qZWN0SWQ6IDIsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCB1dWlkUmVzb2x2ZXIgPVxyXG4gICAgICAgIHRlc3RpbmdNb2R1bGUuZ2V0PFV1aWRSZXNvbHZlclNlcnZpY2U+KFV1aWRSZXNvbHZlclNlcnZpY2UpO1xyXG4gICAgICAodXVpZFJlc29sdmVyLnJlc29sdmVQcm9qZWN0SWQgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSgyKTtcclxuXHJcbiAgICAgIGF3YWl0IHNlcnZpY2UudXBkYXRlKDEsIHVwZGF0ZUR0bywgbW9ja1VzZXIpO1xyXG5cclxuICAgICAgZXhwZWN0KFxyXG4gICAgICAgIG51bWJlcmluZ1NlcnZpY2UudXBkYXRlTnVtYmVyRm9yRHJhZnQgYXMgamVzdC5Nb2NrXHJcbiAgICAgICkudG9IYXZlQmVlbkNhbGxlZCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ3Nob3VsZCByZWdlbmVyYXRlIG51bWJlciBpZiBEb2N1bWVudCBUeXBlIGNoYW5nZXMnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1vY2tVc2VyID0geyBpZDogMSwgcHJpbWFyeU9yZ2FuaXphdGlvbklkOiAxMCB9IGFzIHVua25vd24gYXMgVXNlcjtcclxuICAgICAgY29uc3QgbW9ja1JldmlzaW9uID0ge1xyXG4gICAgICAgIGlkOiAxMDAsXHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VJZDogMSxcclxuICAgICAgICBpc0N1cnJlbnQ6IHRydWUsXHJcbiAgICAgICAgc3RhdHVzSWQ6IDUsXHJcbiAgICAgIH07XHJcbiAgICAgIGplc3RcclxuICAgICAgICAuc3B5T24ocmV2aXNpb25SZXBvLCAnZmluZE9uZScpXHJcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tSZXZpc2lvbiBhcyB1bmtub3duIGFzIENvcnJlc3BvbmRlbmNlUmV2aXNpb24pO1xyXG5cclxuICAgICAgY29uc3QgbW9ja0NvcnIgPSB7XHJcbiAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgcHJvamVjdElkOiAxLFxyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlVHlwZUlkOiAyLFxyXG4gICAgICAgIGRpc2NpcGxpbmVJZDogMyxcclxuICAgICAgICBvcmlnaW5hdG9ySWQ6IDEwLFxyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlTnVtYmVyOiAnT0xELU5VTScsXHJcbiAgICAgICAgcmVjaXBpZW50czogW3sgcmVjaXBpZW50VHlwZTogJ1RPJywgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQ6IDk5IH1dLFxyXG4gICAgICB9O1xyXG4gICAgICBqZXN0XHJcbiAgICAgICAgLnNweU9uKGNvcnJlc3BvbmRlbmNlUmVwbywgJ2ZpbmRPbmUnKVxyXG4gICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZShtb2NrQ29yciBhcyB1bmtub3duIGFzIENvcnJlc3BvbmRlbmNlKTtcclxuXHJcbiAgICAgIGNvbnN0IHVwZGF0ZUR0bzogVXBkYXRlQ29ycmVzcG9uZGVuY2VEdG8gPSB7XHJcbiAgICAgICAgdHlwZUlkOiA5OTksXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCB0eXBlUmVwbyA9IHRlc3RpbmdNb2R1bGUuZ2V0PFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VUeXBlPj4oXHJcbiAgICAgICAgZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlVHlwZSlcclxuICAgICAgKTtcclxuICAgICAgKHR5cGVSZXBvLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgaWQ6IDk5OSxcclxuICAgICAgICB0eXBlQ29kZTogJ05FVy1UWVBFJyxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBhd2FpdCBzZXJ2aWNlLnVwZGF0ZSgxLCB1cGRhdGVEdG8sIG1vY2tVc2VyKTtcclxuXHJcbiAgICAgIGV4cGVjdChcclxuICAgICAgICBudW1iZXJpbmdTZXJ2aWNlLnVwZGF0ZU51bWJlckZvckRyYWZ0IGFzIGplc3QuTW9ja1xyXG4gICAgICApLnRvSGF2ZUJlZW5DYWxsZWQoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdzaG91bGQgcmVnZW5lcmF0ZSBudW1iZXIgaWYgUmVjaXBpZW50IE9yZ2FuaXphdGlvbiBjaGFuZ2VzJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBtb2NrVXNlciA9IHsgaWQ6IDEsIHByaW1hcnlPcmdhbml6YXRpb25JZDogMTAgfSBhcyB1bmtub3duIGFzIFVzZXI7XHJcbiAgICAgIGNvbnN0IG1vY2tSZXZpc2lvbiA9IHtcclxuICAgICAgICBpZDogMTAwLFxyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlSWQ6IDEsXHJcbiAgICAgICAgaXNDdXJyZW50OiB0cnVlLFxyXG4gICAgICAgIHN0YXR1c0lkOiA1LFxyXG4gICAgICB9O1xyXG4gICAgICBqZXN0XHJcbiAgICAgICAgLnNweU9uKHJldmlzaW9uUmVwbywgJ2ZpbmRPbmUnKVxyXG4gICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZShtb2NrUmV2aXNpb24gYXMgdW5rbm93biBhcyBDb3JyZXNwb25kZW5jZVJldmlzaW9uKTtcclxuXHJcbiAgICAgIGNvbnN0IG1vY2tDb3JyID0ge1xyXG4gICAgICAgIGlkOiAxLFxyXG4gICAgICAgIHByb2plY3RJZDogMSxcclxuICAgICAgICBjb3JyZXNwb25kZW5jZVR5cGVJZDogMixcclxuICAgICAgICBkaXNjaXBsaW5lSWQ6IDMsXHJcbiAgICAgICAgb3JpZ2luYXRvcklkOiAxMCxcclxuICAgICAgICBjb3JyZXNwb25kZW5jZU51bWJlcjogJ09MRC1OVU0nLFxyXG4gICAgICAgIHJlY2lwaWVudHM6IFt7IHJlY2lwaWVudFR5cGU6ICdUTycsIHJlY2lwaWVudE9yZ2FuaXphdGlvbklkOiA5OSB9XSxcclxuICAgICAgfTtcclxuICAgICAgamVzdFxyXG4gICAgICAgIC5zcHlPbihjb3JyZXNwb25kZW5jZVJlcG8sICdmaW5kT25lJylcclxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWUobW9ja0NvcnIgYXMgdW5rbm93biBhcyBDb3JyZXNwb25kZW5jZSk7XHJcblxyXG4gICAgICAvLyBBY2Nlc3MgRGF0YVNvdXJjZSBtYW5hZ2VyIGZvciBtb2NraW5nXHJcbiAgICAgIG1vY2tEYXRhU291cmNlLm1hbmFnZXIuZmluZE9uZS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgaWQ6IDg4LFxyXG4gICAgICAgIG9yZ2FuaXphdGlvbkNvZGU6ICdORVctT1JHJyxcclxuICAgICAgfSBhcyB1bmtub3duIGFzIE9yZ2FuaXphdGlvbik7XHJcblxyXG4gICAgICBjb25zdCB1cGRhdGVEdG86IFVwZGF0ZUNvcnJlc3BvbmRlbmNlRHRvID0ge1xyXG4gICAgICAgIHJlY2lwaWVudHM6IFt7IHR5cGU6ICdUTycsIG9yZ2FuaXphdGlvbklkOiA4OCB9XSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGF3YWl0IHNlcnZpY2UudXBkYXRlKDEsIHVwZGF0ZUR0bywgbW9ja1VzZXIpO1xyXG5cclxuICAgICAgZXhwZWN0KFxyXG4gICAgICAgIG51bWJlcmluZ1NlcnZpY2UudXBkYXRlTnVtYmVyRm9yRHJhZnQgYXMgamVzdC5Nb2NrXHJcbiAgICAgICkudG9IYXZlQmVlbkNhbGxlZCgpO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcblxyXG4gIGRlc2NyaWJlKCdjcmVhdGUnLCAoKSA9PiB7XHJcbiAgICBpdCgnc2hvdWxkIGFsbG93IHN5c3RlbS5tYW5hZ2VfYWxsIHVzZXIgd2l0aG91dCBwcmltYXJ5T3JnYW5pemF0aW9uSWQgd2hlbiBvcmlnaW5hdG9ySWQgaXMgcHJvdmlkZWQnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1vY2tVc2VyID0ge1xyXG4gICAgICAgIHVzZXJfaWQ6IDEsXHJcbiAgICAgICAgcHJpbWFyeU9yZ2FuaXphdGlvbklkOiBudWxsLFxyXG4gICAgICB9IGFzIHVua25vd24gYXMgVXNlcjtcclxuXHJcbiAgICAgIGNvbnN0IGNyZWF0ZUR0bzogQ3JlYXRlQ29ycmVzcG9uZGVuY2VEdG8gPSB7XHJcbiAgICAgICAgcHJvamVjdElkOiAncHJvamVjdC11dWlkJyxcclxuICAgICAgICB0eXBlSWQ6IDEsXHJcbiAgICAgICAgc3ViamVjdDogJ1Rlc3QgU3ViamVjdCcsXHJcbiAgICAgICAgb3JpZ2luYXRvcklkOiAnb3JpZ2luYXRvci11dWlkJyxcclxuICAgICAgICByZWNpcGllbnRzOiBbeyBvcmdhbml6YXRpb25JZDogJ3JlY2lwaWVudC11dWlkJywgdHlwZTogJ1RPJyB9XSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHVzZXJTZXJ2aWNlID0gdGVzdGluZ01vZHVsZS5nZXQ8VXNlclNlcnZpY2U+KFVzZXJTZXJ2aWNlKTtcclxuICAgICAgY29uc3QgdHlwZVJlcG8gPSB0ZXN0aW5nTW9kdWxlLmdldDxSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlVHlwZT4+KFxyXG4gICAgICAgIGdldFJlcG9zaXRvcnlUb2tlbihDb3JyZXNwb25kZW5jZVR5cGUpXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IHN0YXR1c1JlcG8gPSB0ZXN0aW5nTW9kdWxlLmdldDxSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlU3RhdHVzPj4oXHJcbiAgICAgICAgZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlU3RhdHVzKVxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCB1dWlkUmVzb2x2ZXIgPVxyXG4gICAgICAgIHRlc3RpbmdNb2R1bGUuZ2V0PFV1aWRSZXNvbHZlclNlcnZpY2U+KFV1aWRSZXNvbHZlclNlcnZpY2UpO1xyXG5cclxuICAgICAgKHVzZXJTZXJ2aWNlLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgdXNlcl9pZDogMSxcclxuICAgICAgICBwcmltYXJ5T3JnYW5pemF0aW9uSWQ6IG51bGwsXHJcbiAgICAgIH0pO1xyXG4gICAgICAodXNlclNlcnZpY2UuZ2V0VXNlclBlcm1pc3Npb25zIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoW1xyXG4gICAgICAgICdzeXN0ZW0ubWFuYWdlX2FsbCcsXHJcbiAgICAgIF0pO1xyXG5cclxuICAgICAgKHV1aWRSZXNvbHZlci5yZXNvbHZlUHJvamVjdElkIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoMTAwKTtcclxuICAgICAgKHV1aWRSZXNvbHZlci5yZXNvbHZlT3JnYW5pemF0aW9uSWQgYXMgamVzdC5Nb2NrKS5tb2NrSW1wbGVtZW50YXRpb24oXHJcbiAgICAgICAgKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJ29yaWdpbmF0b3ItdXVpZCcpIHJldHVybiAxMDtcclxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJ3JlY2lwaWVudC11dWlkJykgcmV0dXJuIDIwO1xyXG4gICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG5cclxuICAgICAgKHR5cGVSZXBvLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgdHlwZUNvZGU6ICdMVFInLFxyXG4gICAgICB9KTtcclxuICAgICAgKHN0YXR1c1JlcG8uZmluZE9uZSBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHtcclxuICAgICAgICBpZDogMSxcclxuICAgICAgICBzdGF0dXNDb2RlOiAnRFJBRlQnLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIChudW1iZXJpbmdTZXJ2aWNlLmdlbmVyYXRlTmV4dE51bWJlciBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHtcclxuICAgICAgICBudW1iZXI6ICdET0MtMDAxJyxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBtb2NrRGF0YVNvdXJjZS5tYW5hZ2VyLmZpbmRPbmVcclxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHsgaWQ6IDEwLCBvcmdhbml6YXRpb25Db2RlOiAnT1JHJyB9KVxyXG4gICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBpZDogMjAsIG9yZ2FuaXphdGlvbkNvZGU6ICdSRUMnIH0pO1xyXG5cclxuICAgICAgY29uc3QgcXVlcnlSdW5uZXIgPSB7XHJcbiAgICAgICAgY29ubmVjdDogamVzdC5mbigpLFxyXG4gICAgICAgIHN0YXJ0VHJhbnNhY3Rpb246IGplc3QuZm4oKSxcclxuICAgICAgICBjb21taXRUcmFuc2FjdGlvbjogamVzdC5mbigpLFxyXG4gICAgICAgIHJvbGxiYWNrVHJhbnNhY3Rpb246IGplc3QuZm4oKSxcclxuICAgICAgICByZWxlYXNlOiBqZXN0LmZuKCksXHJcbiAgICAgICAgbWFuYWdlcjoge1xyXG4gICAgICAgICAgY3JlYXRlOiBqZXN0LmZuKFxyXG4gICAgICAgICAgICAoX2VudGl0eTogdW5rbm93biwgcGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHBheWxvYWRcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICBzYXZlOiBqZXN0XHJcbiAgICAgICAgICAgIC5mbigpXHJcbiAgICAgICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBpZDogOTk5LCBwdWJsaWNJZDogJ2NvcnItdXVpZCcgfSlcclxuICAgICAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IGlkOiAxMDAwIH0pXHJcbiAgICAgICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoW10pLFxyXG4gICAgICAgICAgZmluZE9uZTogamVzdC5mbigpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICAobW9ja0RhdGFTb3VyY2UuY3JlYXRlUXVlcnlSdW5uZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmV0dXJuVmFsdWUoXHJcbiAgICAgICAgcXVlcnlSdW5uZXJcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGF3YWl0IHNlcnZpY2UuY3JlYXRlKGNyZWF0ZUR0bywgbW9ja1VzZXIpO1xyXG5cclxuICAgICAgZXhwZWN0KHF1ZXJ5UnVubmVyLm1hbmFnZXIuY3JlYXRlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcclxuICAgICAgICBDb3JyZXNwb25kZW5jZSxcclxuICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IG9yaWdpbmF0b3JJZDogMTAgfSlcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdzaG91bGQgc2V0IHJldmlzaW9uTGFiZWwgdG8gXCJBXCIgZm9yIFJGQSB0eXBlJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBtb2NrVXNlciA9IHtcclxuICAgICAgICB1c2VyX2lkOiAxLFxyXG4gICAgICAgIHByaW1hcnlPcmdhbml6YXRpb25JZDogMTAsXHJcbiAgICAgIH0gYXMgdW5rbm93biBhcyBVc2VyO1xyXG5cclxuICAgICAgY29uc3QgY3JlYXRlRHRvOiBDcmVhdGVDb3JyZXNwb25kZW5jZUR0byA9IHtcclxuICAgICAgICBwcm9qZWN0SWQ6ICdwcm9qZWN0LXV1aWQnLFxyXG4gICAgICAgIHR5cGVJZDogMSxcclxuICAgICAgICBzdWJqZWN0OiAnVGVzdCBTdWJqZWN0JyxcclxuICAgICAgICByZWNpcGllbnRzOiBbeyBvcmdhbml6YXRpb25JZDogJ3JlY2lwaWVudC11dWlkJywgdHlwZTogJ1RPJyB9XSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHR5cGVSZXBvID0gdGVzdGluZ01vZHVsZS5nZXQ8UmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZVR5cGU+PihcclxuICAgICAgICBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VUeXBlKVxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBzdGF0dXNSZXBvID0gdGVzdGluZ01vZHVsZS5nZXQ8UmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZVN0YXR1cz4+KFxyXG4gICAgICAgIGdldFJlcG9zaXRvcnlUb2tlbihDb3JyZXNwb25kZW5jZVN0YXR1cylcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgdXVpZFJlc29sdmVyID1cclxuICAgICAgICB0ZXN0aW5nTW9kdWxlLmdldDxVdWlkUmVzb2x2ZXJTZXJ2aWNlPihVdWlkUmVzb2x2ZXJTZXJ2aWNlKTtcclxuXHJcbiAgICAgICh1dWlkUmVzb2x2ZXIucmVzb2x2ZVByb2plY3RJZCBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKDEwMCk7XHJcbiAgICAgICh1dWlkUmVzb2x2ZXIucmVzb2x2ZU9yZ2FuaXphdGlvbklkIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoMjApO1xyXG5cclxuICAgICAgKHR5cGVSZXBvLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgdHlwZUNvZGU6ICdSRkEnLFxyXG4gICAgICB9KTtcclxuICAgICAgKHN0YXR1c1JlcG8uZmluZE9uZSBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHtcclxuICAgICAgICBpZDogMSxcclxuICAgICAgICBzdGF0dXNDb2RlOiAnRFJBRlQnLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIChudW1iZXJpbmdTZXJ2aWNlLmdlbmVyYXRlTmV4dE51bWJlciBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHtcclxuICAgICAgICBudW1iZXI6ICdET0MtMDAxJyxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBtb2NrRGF0YVNvdXJjZS5tYW5hZ2VyLmZpbmRPbmVcclxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHsgaWQ6IDEwLCBvcmdhbml6YXRpb25Db2RlOiAnT1JHJyB9KVxyXG4gICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBpZDogMjAsIG9yZ2FuaXphdGlvbkNvZGU6ICdSRUMnIH0pO1xyXG5cclxuICAgICAgY29uc3QgcXVlcnlSdW5uZXIgPSB7XHJcbiAgICAgICAgY29ubmVjdDogamVzdC5mbigpLFxyXG4gICAgICAgIHN0YXJ0VHJhbnNhY3Rpb246IGplc3QuZm4oKSxcclxuICAgICAgICBjb21taXRUcmFuc2FjdGlvbjogamVzdC5mbigpLFxyXG4gICAgICAgIHJvbGxiYWNrVHJhbnNhY3Rpb246IGplc3QuZm4oKSxcclxuICAgICAgICByZWxlYXNlOiBqZXN0LmZuKCksXHJcbiAgICAgICAgbWFuYWdlcjoge1xyXG4gICAgICAgICAgY3JlYXRlOiBqZXN0LmZuKFxyXG4gICAgICAgICAgICAoX2VudGl0eTogdW5rbm93biwgcGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHBheWxvYWRcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICBzYXZlOiBqZXN0XHJcbiAgICAgICAgICAgIC5mbigpXHJcbiAgICAgICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBpZDogOTk5LCBwdWJsaWNJZDogJ2NvcnItdXVpZCcgfSlcclxuICAgICAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IGlkOiAxMDAwIH0pXHJcbiAgICAgICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoW10pLFxyXG4gICAgICAgICAgZmluZE9uZTogamVzdC5mbigpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICAobW9ja0RhdGFTb3VyY2UuY3JlYXRlUXVlcnlSdW5uZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmV0dXJuVmFsdWUoXHJcbiAgICAgICAgcXVlcnlSdW5uZXJcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGF3YWl0IHNlcnZpY2UuY3JlYXRlKGNyZWF0ZUR0bywgbW9ja1VzZXIpO1xyXG5cclxuICAgICAgZXhwZWN0KHF1ZXJ5UnVubmVyLm1hbmFnZXIuY3JlYXRlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcclxuICAgICAgICBDb3JyZXNwb25kZW5jZVJldmlzaW9uLFxyXG4gICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgcmV2aXNpb25MYWJlbDogJ0EnIH0pXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnc2hvdWxkIHNldCByZXZpc2lvbkxhYmVsIHRvIFwiQVwiIGZvciBSRkkgdHlwZScsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgbW9ja1VzZXIgPSB7XHJcbiAgICAgICAgdXNlcl9pZDogMSxcclxuICAgICAgICBwcmltYXJ5T3JnYW5pemF0aW9uSWQ6IDEwLFxyXG4gICAgICB9IGFzIHVua25vd24gYXMgVXNlcjtcclxuXHJcbiAgICAgIGNvbnN0IGNyZWF0ZUR0bzogQ3JlYXRlQ29ycmVzcG9uZGVuY2VEdG8gPSB7XHJcbiAgICAgICAgcHJvamVjdElkOiAncHJvamVjdC11dWlkJyxcclxuICAgICAgICB0eXBlSWQ6IDEsXHJcbiAgICAgICAgc3ViamVjdDogJ1Rlc3QgU3ViamVjdCcsXHJcbiAgICAgICAgcmVjaXBpZW50czogW3sgb3JnYW5pemF0aW9uSWQ6ICdyZWNpcGllbnQtdXVpZCcsIHR5cGU6ICdUTycgfV0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCB0eXBlUmVwbyA9IHRlc3RpbmdNb2R1bGUuZ2V0PFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VUeXBlPj4oXHJcbiAgICAgICAgZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlVHlwZSlcclxuICAgICAgKTtcclxuICAgICAgY29uc3Qgc3RhdHVzUmVwbyA9IHRlc3RpbmdNb2R1bGUuZ2V0PFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VTdGF0dXM+PihcclxuICAgICAgICBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VTdGF0dXMpXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IHV1aWRSZXNvbHZlciA9XHJcbiAgICAgICAgdGVzdGluZ01vZHVsZS5nZXQ8VXVpZFJlc29sdmVyU2VydmljZT4oVXVpZFJlc29sdmVyU2VydmljZSk7XHJcblxyXG4gICAgICAodXVpZFJlc29sdmVyLnJlc29sdmVQcm9qZWN0SWQgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSgxMDApO1xyXG4gICAgICAodXVpZFJlc29sdmVyLnJlc29sdmVPcmdhbml6YXRpb25JZCBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKDIwKTtcclxuXHJcbiAgICAgICh0eXBlUmVwby5maW5kT25lIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoe1xyXG4gICAgICAgIGlkOiAxLFxyXG4gICAgICAgIHR5cGVDb2RlOiAnUkZJJyxcclxuICAgICAgfSk7XHJcbiAgICAgIChzdGF0dXNSZXBvLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgc3RhdHVzQ29kZTogJ0RSQUZUJyxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAobnVtYmVyaW5nU2VydmljZS5nZW5lcmF0ZU5leHROdW1iZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgbnVtYmVyOiAnRE9DLTAwMScsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgbW9ja0RhdGFTb3VyY2UubWFuYWdlci5maW5kT25lXHJcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IGlkOiAxMCwgb3JnYW5pemF0aW9uQ29kZTogJ09SRycgfSlcclxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHsgaWQ6IDIwLCBvcmdhbml6YXRpb25Db2RlOiAnUkVDJyB9KTtcclxuXHJcbiAgICAgIGNvbnN0IHF1ZXJ5UnVubmVyID0ge1xyXG4gICAgICAgIGNvbm5lY3Q6IGplc3QuZm4oKSxcclxuICAgICAgICBzdGFydFRyYW5zYWN0aW9uOiBqZXN0LmZuKCksXHJcbiAgICAgICAgY29tbWl0VHJhbnNhY3Rpb246IGplc3QuZm4oKSxcclxuICAgICAgICByb2xsYmFja1RyYW5zYWN0aW9uOiBqZXN0LmZuKCksXHJcbiAgICAgICAgcmVsZWFzZTogamVzdC5mbigpLFxyXG4gICAgICAgIG1hbmFnZXI6IHtcclxuICAgICAgICAgIGNyZWF0ZTogamVzdC5mbihcclxuICAgICAgICAgICAgKF9lbnRpdHk6IHVua25vd24sIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBwYXlsb2FkXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICAgc2F2ZTogamVzdFxyXG4gICAgICAgICAgICAuZm4oKVxyXG4gICAgICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHsgaWQ6IDk5OSwgcHVibGljSWQ6ICdjb3JyLXV1aWQnIH0pXHJcbiAgICAgICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBpZDogMTAwMCB9KVxyXG4gICAgICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKFtdKSxcclxuICAgICAgICAgIGZpbmRPbmU6IGplc3QuZm4oKSxcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgKG1vY2tEYXRhU291cmNlLmNyZWF0ZVF1ZXJ5UnVubmVyIGFzIGplc3QuTW9jaykubW9ja1JldHVyblZhbHVlKFxyXG4gICAgICAgIHF1ZXJ5UnVubmVyXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBhd2FpdCBzZXJ2aWNlLmNyZWF0ZShjcmVhdGVEdG8sIG1vY2tVc2VyKTtcclxuXHJcbiAgICAgIGV4cGVjdChxdWVyeVJ1bm5lci5tYW5hZ2VyLmNyZWF0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgQ29ycmVzcG9uZGVuY2VSZXZpc2lvbixcclxuICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IHJldmlzaW9uTGFiZWw6ICdBJyB9KVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ3Nob3VsZCBzZXQgcmV2aXNpb25MYWJlbCB0byBudWxsIGZvciBMRVRURVIgdHlwZScsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgbW9ja1VzZXIgPSB7XHJcbiAgICAgICAgdXNlcl9pZDogMSxcclxuICAgICAgICBwcmltYXJ5T3JnYW5pemF0aW9uSWQ6IDEwLFxyXG4gICAgICB9IGFzIHVua25vd24gYXMgVXNlcjtcclxuXHJcbiAgICAgIGNvbnN0IGNyZWF0ZUR0bzogQ3JlYXRlQ29ycmVzcG9uZGVuY2VEdG8gPSB7XHJcbiAgICAgICAgcHJvamVjdElkOiAncHJvamVjdC11dWlkJyxcclxuICAgICAgICB0eXBlSWQ6IDEsXHJcbiAgICAgICAgc3ViamVjdDogJ1Rlc3QgU3ViamVjdCcsXHJcbiAgICAgICAgcmVjaXBpZW50czogW3sgb3JnYW5pemF0aW9uSWQ6ICdyZWNpcGllbnQtdXVpZCcsIHR5cGU6ICdUTycgfV0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCB0eXBlUmVwbyA9IHRlc3RpbmdNb2R1bGUuZ2V0PFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VUeXBlPj4oXHJcbiAgICAgICAgZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlVHlwZSlcclxuICAgICAgKTtcclxuICAgICAgY29uc3Qgc3RhdHVzUmVwbyA9IHRlc3RpbmdNb2R1bGUuZ2V0PFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VTdGF0dXM+PihcclxuICAgICAgICBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VTdGF0dXMpXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IHV1aWRSZXNvbHZlciA9XHJcbiAgICAgICAgdGVzdGluZ01vZHVsZS5nZXQ8VXVpZFJlc29sdmVyU2VydmljZT4oVXVpZFJlc29sdmVyU2VydmljZSk7XHJcblxyXG4gICAgICAodXVpZFJlc29sdmVyLnJlc29sdmVQcm9qZWN0SWQgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSgxMDApO1xyXG4gICAgICAodXVpZFJlc29sdmVyLnJlc29sdmVPcmdhbml6YXRpb25JZCBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKDIwKTtcclxuXHJcbiAgICAgICh0eXBlUmVwby5maW5kT25lIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoe1xyXG4gICAgICAgIGlkOiAxLFxyXG4gICAgICAgIHR5cGVDb2RlOiAnTEVUVEVSJyxcclxuICAgICAgfSk7XHJcbiAgICAgIChzdGF0dXNSZXBvLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgc3RhdHVzQ29kZTogJ0RSQUZUJyxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAobnVtYmVyaW5nU2VydmljZS5nZW5lcmF0ZU5leHROdW1iZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XHJcbiAgICAgICAgbnVtYmVyOiAnRE9DLTAwMScsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgbW9ja0RhdGFTb3VyY2UubWFuYWdlci5maW5kT25lXHJcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IGlkOiAxMCwgb3JnYW5pemF0aW9uQ29kZTogJ09SRycgfSlcclxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHsgaWQ6IDIwLCBvcmdhbml6YXRpb25Db2RlOiAnUkVDJyB9KTtcclxuXHJcbiAgICAgIGNvbnN0IHF1ZXJ5UnVubmVyID0ge1xyXG4gICAgICAgIGNvbm5lY3Q6IGplc3QuZm4oKSxcclxuICAgICAgICBzdGFydFRyYW5zYWN0aW9uOiBqZXN0LmZuKCksXHJcbiAgICAgICAgY29tbWl0VHJhbnNhY3Rpb246IGplc3QuZm4oKSxcclxuICAgICAgICByb2xsYmFja1RyYW5zYWN0aW9uOiBqZXN0LmZuKCksXHJcbiAgICAgICAgcmVsZWFzZTogamVzdC5mbigpLFxyXG4gICAgICAgIG1hbmFnZXI6IHtcclxuICAgICAgICAgIGNyZWF0ZTogamVzdC5mbihcclxuICAgICAgICAgICAgKF9lbnRpdHk6IHVua25vd24sIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBwYXlsb2FkXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICAgc2F2ZTogamVzdFxyXG4gICAgICAgICAgICAuZm4oKVxyXG4gICAgICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHsgaWQ6IDk5OSwgcHVibGljSWQ6ICdjb3JyLXV1aWQnIH0pXHJcbiAgICAgICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBpZDogMTAwMCB9KVxyXG4gICAgICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKFtdKSxcclxuICAgICAgICAgIGZpbmRPbmU6IGplc3QuZm4oKSxcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgKG1vY2tEYXRhU291cmNlLmNyZWF0ZVF1ZXJ5UnVubmVyIGFzIGplc3QuTW9jaykubW9ja1JldHVyblZhbHVlKFxyXG4gICAgICAgIHF1ZXJ5UnVubmVyXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBhd2FpdCBzZXJ2aWNlLmNyZWF0ZShjcmVhdGVEdG8sIG1vY2tVc2VyKTtcclxuXHJcbiAgICAgIGV4cGVjdChxdWVyeVJ1bm5lci5tYW5hZ2VyLmNyZWF0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXHJcbiAgICAgICAgQ29ycmVzcG9uZGVuY2VSZXZpc2lvbixcclxuICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IHJldmlzaW9uTGFiZWw6IHVuZGVmaW5lZCB9KVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ3Nob3VsZCBzZXQgcmV2aXNpb25MYWJlbCB0byB1bmRlZmluZWQgZm9yIE1FTU8gdHlwZScsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgbW9ja1VzZXIgPSB7XHJcbiAgICAgICAgdXNlcl9pZDogMSxcclxuICAgICAgICBwcmltYXJ5T3JnYW5pemF0aW9uSWQ6IDEwLFxyXG4gICAgICB9IGFzIHVua25vd24gYXMgVXNlcjtcclxuXHJcbiAgICAgIGNvbnN0IGNyZWF0ZUR0bzogQ3JlYXRlQ29ycmVzcG9uZGVuY2VEdG8gPSB7XHJcbiAgICAgICAgcHJvamVjdElkOiAncHJvamVjdC11dWlkJyxcclxuICAgICAgICB0eXBlSWQ6IDEsXHJcbiAgICAgICAgc3ViamVjdDogJ1Rlc3QgU3ViamVjdCcsXHJcbiAgICAgICAgcmVjaXBpZW50czogW3sgb3JnYW5pemF0aW9uSWQ6ICdyZWNpcGllbnQtdXVpZCcsIHR5cGU6ICdUTycgfV0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCB0eXBlUmVwbyA9IHRlc3RpbmdNb2R1bGUuZ2V0PFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VUeXBlPj4oXHJcbiAgICAgICAgZ2V0UmVwb3NpdG9yeVRva2VuKENvcnJlc3BvbmRlbmNlVHlwZSlcclxuICAgICAgKTtcclxuICAgICAgY29uc3Qgc3RhdHVzUmVwbyA9IHRlc3RpbmdNb2R1bGUuZ2V0PFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VTdGF0dXM+PihcclxuICAgICAgICBnZXRSZXBvc2l0b3J5VG9rZW4oQ29ycmVzcG9uZGVuY2VTdGF0dXMpXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IHV1aWRSZXNvbHZlciA9XHJcbiAgICAgICAgdGVzdGluZ01vZHVsZS5nZXQ8VXVpZFJlc29sdmVyU2VydmljZT4oVXVpZFJlc29sdmVyU2VydmljZSk7XHJcblxyXG4gICAgICAodXVpZFJlc29sdmVyLnJlc29sdmVQcm9qZWN0SWQgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSgxMDApO1xyXG4gICAgICAodXVpZFJlc29sdmVyLnJlc29sdmVPcmdhbml6YXRpb25JZCBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKDIwKTtcclxuXHJcbiAgICAgICh0eXBlUmVwby5maW5kT25lIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoe1xyXG4gICAgICAgIGlkOiAxLFxyXG4gICAgICAgIHR5cGVDb2RlOiAnTUVNTycsXHJcbiAgICAgIH0pO1xyXG4gICAgICAoc3RhdHVzUmVwby5maW5kT25lIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoe1xyXG4gICAgICAgIGlkOiAxLFxyXG4gICAgICAgIHN0YXR1c0NvZGU6ICdEUkFGVCcsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgKG51bWJlcmluZ1NlcnZpY2UuZ2VuZXJhdGVOZXh0TnVtYmVyIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUoe1xyXG4gICAgICAgIG51bWJlcjogJ0RPQy0wMDEnLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIG1vY2tEYXRhU291cmNlLm1hbmFnZXIuZmluZE9uZVxyXG4gICAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBpZDogMTAsIG9yZ2FuaXphdGlvbkNvZGU6ICdPUkcnIH0pXHJcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IGlkOiAyMCwgb3JnYW5pemF0aW9uQ29kZTogJ1JFQycgfSk7XHJcblxyXG4gICAgICBjb25zdCBxdWVyeVJ1bm5lciA9IHtcclxuICAgICAgICBjb25uZWN0OiBqZXN0LmZuKCksXHJcbiAgICAgICAgc3RhcnRUcmFuc2FjdGlvbjogamVzdC5mbigpLFxyXG4gICAgICAgIGNvbW1pdFRyYW5zYWN0aW9uOiBqZXN0LmZuKCksXHJcbiAgICAgICAgcm9sbGJhY2tUcmFuc2FjdGlvbjogamVzdC5mbigpLFxyXG4gICAgICAgIHJlbGVhc2U6IGplc3QuZm4oKSxcclxuICAgICAgICBtYW5hZ2VyOiB7XHJcbiAgICAgICAgICBjcmVhdGU6IGplc3QuZm4oXHJcbiAgICAgICAgICAgIChfZW50aXR5OiB1bmtub3duLCBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gcGF5bG9hZFxyXG4gICAgICAgICAgKSxcclxuICAgICAgICAgIHNhdmU6IGplc3RcclxuICAgICAgICAgICAgLmZuKClcclxuICAgICAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IGlkOiA5OTksIHB1YmxpY0lkOiAnY29yci11dWlkJyB9KVxyXG4gICAgICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHsgaWQ6IDEwMDAgfSlcclxuICAgICAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZShbXSksXHJcbiAgICAgICAgICBmaW5kT25lOiBqZXN0LmZuKCksXHJcbiAgICAgICAgfSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIChtb2NrRGF0YVNvdXJjZS5jcmVhdGVRdWVyeVJ1bm5lciBhcyBqZXN0Lk1vY2spLm1vY2tSZXR1cm5WYWx1ZShcclxuICAgICAgICBxdWVyeVJ1bm5lclxyXG4gICAgICApO1xyXG5cclxuICAgICAgYXdhaXQgc2VydmljZS5jcmVhdGUoY3JlYXRlRHRvLCBtb2NrVXNlcik7XHJcblxyXG4gICAgICBleHBlY3QocXVlcnlSdW5uZXIubWFuYWdlci5jcmVhdGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxyXG4gICAgICAgIENvcnJlc3BvbmRlbmNlUmV2aXNpb24sXHJcbiAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyByZXZpc2lvbkxhYmVsOiB1bmRlZmluZWQgfSlcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59KTtcclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c0/correspondenceservicespec_c07b2be49127bf1524290034556fef27.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c0/correspondenceservicespec_c07b2be49127bf1524290034556fef27.map new file mode 100644 index 0000000..b9c6331 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c0/correspondenceservicespec_c07b2be49127bf1524290034556fef27.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.service.spec.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.service.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\r\nimport { getRepositoryToken } from '@nestjs/typeorm';\r\nimport { DataSource, Repository } from 'typeorm';\r\nimport { ForbiddenException } from '@nestjs/common';\r\nimport { CorrespondenceService } from './correspondence.service';\r\nimport { Correspondence } from './entities/correspondence.entity';\r\nimport { CorrespondenceRevision } from './entities/correspondence-revision.entity';\r\nimport { CorrespondenceType } from './entities/correspondence-type.entity';\r\nimport { CorrespondenceStatus } from './entities/correspondence-status.entity';\r\nimport { CorrespondenceReference } from './entities/correspondence-reference.entity';\r\nimport { CorrespondenceTag } from './entities/correspondence-tag.entity';\r\nimport { Organization } from '../organization/entities/organization.entity';\r\nimport { CorrespondenceRecipient } from './entities/correspondence-recipient.entity';\r\nimport { CorrespondenceRevisionAttachment } from './entities/correspondence-revision-attachment.entity';\r\nimport { DocumentNumberingService } from '../document-numbering/services/document-numbering.service';\r\nimport { JsonSchemaService } from '../json-schema/json-schema.service';\r\nimport { WorkflowEngineService } from '../workflow-engine/workflow-engine.service';\r\nimport { UserService } from '../user/user.service';\r\nimport { SearchService } from '../search/search.service';\r\nimport { FileStorageService } from '../../common/file-storage/file-storage.service';\r\nimport { UuidResolverService } from '../../common/services/uuid-resolver.service';\r\nimport { NotificationService } from '../notification/notification.service';\r\nimport { UpdateCorrespondenceDto } from './dto/update-correspondence.dto';\r\nimport { CreateCorrespondenceDto } from './dto/create-correspondence.dto';\r\nimport { User } from '../user/entities/user.entity';\r\n\r\ndescribe('CorrespondenceService', () => {\r\n let service: CorrespondenceService;\r\n let numberingService: DocumentNumberingService;\r\n let correspondenceRepo: Repository;\r\n let revisionRepo: Repository;\r\n let testingModule: TestingModule;\r\n let _dataSource: DataSource;\r\n\r\n const createMockRepository = () => ({\r\n find: jest.fn(),\r\n findOne: jest.fn(),\r\n create: jest.fn(),\r\n save: jest.fn(),\r\n update: jest.fn(),\r\n delete: jest.fn(),\r\n softDelete: jest.fn(),\r\n createQueryBuilder: jest.fn(() => ({\r\n leftJoinAndSelect: jest.fn().mockReturnThis(),\r\n where: jest.fn().mockReturnThis(),\r\n andWhere: jest.fn().mockReturnThis(),\r\n orderBy: jest.fn().mockReturnThis(),\r\n skip: jest.fn().mockReturnThis(),\r\n take: jest.fn().mockReturnThis(),\r\n getOne: jest.fn().mockResolvedValue(null),\r\n getMany: jest.fn().mockResolvedValue([]),\r\n getManyAndCount: jest.fn().mockResolvedValue([[], 0]),\r\n })),\r\n });\r\n\r\n const mockDataSource = {\r\n createQueryRunner: jest.fn(() => ({\r\n connect: jest.fn(),\r\n startTransaction: jest.fn(),\r\n commitTransaction: jest.fn(),\r\n rollbackTransaction: jest.fn(),\r\n release: jest.fn(),\r\n manager: {\r\n create: jest.fn(),\r\n save: jest.fn(),\r\n findOne: jest.fn(),\r\n },\r\n })),\r\n getRepository: jest.fn(() => createMockRepository()),\r\n manager: {\r\n findOne: jest.fn(),\r\n },\r\n };\r\n\r\n beforeEach(async () => {\r\n testingModule = await Test.createTestingModule({\r\n providers: [\r\n CorrespondenceService,\r\n {\r\n provide: getRepositoryToken(Correspondence),\r\n useValue: createMockRepository(),\r\n },\r\n {\r\n provide: getRepositoryToken(CorrespondenceRevision),\r\n useValue: createMockRepository(),\r\n },\r\n {\r\n provide: getRepositoryToken(CorrespondenceType),\r\n useValue: createMockRepository(),\r\n },\r\n {\r\n provide: getRepositoryToken(CorrespondenceStatus),\r\n useValue: createMockRepository(),\r\n },\r\n {\r\n provide: getRepositoryToken(CorrespondenceReference),\r\n useValue: createMockRepository(),\r\n },\r\n {\r\n provide: getRepositoryToken(CorrespondenceTag),\r\n useValue: createMockRepository(),\r\n },\r\n {\r\n provide: getRepositoryToken(Organization),\r\n useValue: createMockRepository(),\r\n },\r\n {\r\n provide: getRepositoryToken(CorrespondenceRecipient),\r\n useValue: createMockRepository(),\r\n },\r\n {\r\n provide: DocumentNumberingService,\r\n useValue: {\r\n generateNextNumber: jest.fn(),\r\n updateNumberForDraft: jest.fn(),\r\n previewNextNumber: jest.fn(),\r\n },\r\n },\r\n {\r\n provide: JsonSchemaService,\r\n useValue: { validate: jest.fn() },\r\n },\r\n {\r\n provide: WorkflowEngineService,\r\n useValue: { createInstance: jest.fn() },\r\n },\r\n {\r\n provide: UserService,\r\n useValue: {\r\n findOne: jest.fn(),\r\n getUserPermissions: jest.fn().mockResolvedValue([]),\r\n },\r\n },\r\n {\r\n provide: DataSource,\r\n useValue: mockDataSource,\r\n },\r\n {\r\n provide: SearchService,\r\n useValue: { indexDocument: jest.fn() },\r\n },\r\n {\r\n provide: FileStorageService,\r\n useValue: { commit: jest.fn().mockResolvedValue([]) },\r\n },\r\n {\r\n provide: UuidResolverService,\r\n useValue: {\r\n resolveProjectId: jest.fn().mockResolvedValue(1),\r\n resolveOrganizationId: jest.fn().mockResolvedValue(1),\r\n },\r\n },\r\n {\r\n provide: NotificationService,\r\n useValue: { send: jest.fn().mockResolvedValue(undefined) },\r\n },\r\n {\r\n provide: getRepositoryToken(CorrespondenceRevisionAttachment),\r\n useValue: createMockRepository(),\r\n },\r\n ],\r\n }).compile();\r\n\r\n service = testingModule.get(CorrespondenceService);\r\n numberingService = testingModule.get(\r\n DocumentNumberingService\r\n );\r\n correspondenceRepo = testingModule.get>(\r\n getRepositoryToken(Correspondence)\r\n );\r\n revisionRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceRevision)\r\n );\r\n _dataSource = testingModule.get(DataSource);\r\n });\r\n\r\n it('should be defined', () => {\r\n expect(service).toBeDefined();\r\n });\r\n\r\n describe('update', () => {\r\n it('should allow non-draft update for org-admin+ permissions', async () => {\r\n const mockUser = {\r\n user_id: 1,\r\n primaryOrganizationId: 10,\r\n } as unknown as User;\r\n const mockRevision = {\r\n id: 100,\r\n correspondenceId: 1,\r\n isCurrent: true,\r\n statusId: 23,\r\n };\r\n\r\n jest\r\n .spyOn(revisionRepo, 'findOne')\r\n .mockResolvedValue(mockRevision as unknown as CorrespondenceRevision);\r\n\r\n const statusRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceStatus)\r\n );\r\n (statusRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 23,\r\n statusCode: 'SUBOWN',\r\n });\r\n\r\n const userService = testingModule.get(UserService);\r\n (userService.getUserPermissions as jest.Mock).mockResolvedValue([\r\n 'correspondence.cancel',\r\n ]);\r\n\r\n jest.spyOn(correspondenceRepo, 'findOne').mockResolvedValue({\r\n id: 1,\r\n publicId: 'corr-uuid-1',\r\n correspondenceNumber: 'CORR-001',\r\n projectId: 1,\r\n createdAt: new Date(),\r\n revisions: [],\r\n } as unknown as Correspondence);\r\n\r\n await expect(\r\n service.update(1, { subject: 'Updated Subject' }, mockUser)\r\n ).resolves.toBeDefined();\r\n });\r\n\r\n it('should reject non-draft update for non-admin permissions', async () => {\r\n const mockUser = {\r\n user_id: 2,\r\n primaryOrganizationId: 10,\r\n } as unknown as User;\r\n const mockRevision = {\r\n id: 101,\r\n correspondenceId: 2,\r\n isCurrent: true,\r\n statusId: 23,\r\n };\r\n\r\n jest\r\n .spyOn(revisionRepo, 'findOne')\r\n .mockResolvedValue(mockRevision as unknown as CorrespondenceRevision);\r\n\r\n const statusRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceStatus)\r\n );\r\n (statusRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 23,\r\n statusCode: 'SUBOWN',\r\n });\r\n\r\n const userService = testingModule.get(UserService);\r\n (userService.getUserPermissions as jest.Mock).mockResolvedValue([\r\n 'correspondence.edit',\r\n ]);\r\n\r\n await expect(\r\n service.update(2, { subject: 'Should Fail' }, mockUser)\r\n ).rejects.toThrow(ForbiddenException);\r\n });\r\n\r\n it('should NOT regenerate number if critical fields unchanged', async () => {\r\n const mockUser = { id: 1, primaryOrganizationId: 10 } as unknown as User;\r\n const mockRevision = {\r\n id: 100,\r\n correspondenceId: 1,\r\n isCurrent: true,\r\n statusId: 5,\r\n };\r\n\r\n jest\r\n .spyOn(revisionRepo, 'findOne')\r\n .mockResolvedValue(mockRevision as unknown as CorrespondenceRevision);\r\n\r\n const mockCorr = {\r\n id: 1,\r\n projectId: 1,\r\n correspondenceTypeId: 2,\r\n disciplineId: 3,\r\n originatorId: 10,\r\n correspondenceNumber: 'OLD-NUM',\r\n recipients: [{ recipientType: 'TO', recipientOrganizationId: 99 }],\r\n };\r\n jest\r\n .spyOn(correspondenceRepo, 'findOne')\r\n .mockResolvedValue(mockCorr as unknown as Correspondence);\r\n\r\n const updateDto: UpdateCorrespondenceDto = {\r\n projectId: 1,\r\n disciplineId: 3,\r\n };\r\n\r\n await service.update(1, updateDto, mockUser);\r\n\r\n expect(\r\n numberingService.updateNumberForDraft as jest.Mock\r\n ).not.toHaveBeenCalled();\r\n });\r\n\r\n it('should regenerate number if Project ID changes', async () => {\r\n const mockUser = { id: 1, primaryOrganizationId: 10 } as unknown as User;\r\n const mockRevision = {\r\n id: 100,\r\n correspondenceId: 1,\r\n isCurrent: true,\r\n statusId: 5,\r\n };\r\n jest\r\n .spyOn(revisionRepo, 'findOne')\r\n .mockResolvedValue(mockRevision as unknown as CorrespondenceRevision);\r\n\r\n const mockCorr = {\r\n id: 1,\r\n projectId: 1,\r\n correspondenceTypeId: 2,\r\n disciplineId: 3,\r\n originatorId: 10,\r\n correspondenceNumber: 'OLD-NUM',\r\n recipients: [{ recipientType: 'TO', recipientOrganizationId: 99 }],\r\n };\r\n jest\r\n .spyOn(correspondenceRepo, 'findOne')\r\n .mockResolvedValue(mockCorr as unknown as Correspondence);\r\n\r\n const updateDto: UpdateCorrespondenceDto = {\r\n projectId: 2,\r\n };\r\n\r\n const uuidResolver =\r\n testingModule.get(UuidResolverService);\r\n (uuidResolver.resolveProjectId as jest.Mock).mockResolvedValue(2);\r\n\r\n await service.update(1, updateDto, mockUser);\r\n\r\n expect(\r\n numberingService.updateNumberForDraft as jest.Mock\r\n ).toHaveBeenCalled();\r\n });\r\n\r\n it('should regenerate number if Document Type changes', async () => {\r\n const mockUser = { id: 1, primaryOrganizationId: 10 } as unknown as User;\r\n const mockRevision = {\r\n id: 100,\r\n correspondenceId: 1,\r\n isCurrent: true,\r\n statusId: 5,\r\n };\r\n jest\r\n .spyOn(revisionRepo, 'findOne')\r\n .mockResolvedValue(mockRevision as unknown as CorrespondenceRevision);\r\n\r\n const mockCorr = {\r\n id: 1,\r\n projectId: 1,\r\n correspondenceTypeId: 2,\r\n disciplineId: 3,\r\n originatorId: 10,\r\n correspondenceNumber: 'OLD-NUM',\r\n recipients: [{ recipientType: 'TO', recipientOrganizationId: 99 }],\r\n };\r\n jest\r\n .spyOn(correspondenceRepo, 'findOne')\r\n .mockResolvedValue(mockCorr as unknown as Correspondence);\r\n\r\n const updateDto: UpdateCorrespondenceDto = {\r\n typeId: 999,\r\n };\r\n\r\n const typeRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceType)\r\n );\r\n (typeRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 999,\r\n typeCode: 'NEW-TYPE',\r\n });\r\n\r\n await service.update(1, updateDto, mockUser);\r\n\r\n expect(\r\n numberingService.updateNumberForDraft as jest.Mock\r\n ).toHaveBeenCalled();\r\n });\r\n\r\n it('should regenerate number if Recipient Organization changes', async () => {\r\n const mockUser = { id: 1, primaryOrganizationId: 10 } as unknown as User;\r\n const mockRevision = {\r\n id: 100,\r\n correspondenceId: 1,\r\n isCurrent: true,\r\n statusId: 5,\r\n };\r\n jest\r\n .spyOn(revisionRepo, 'findOne')\r\n .mockResolvedValue(mockRevision as unknown as CorrespondenceRevision);\r\n\r\n const mockCorr = {\r\n id: 1,\r\n projectId: 1,\r\n correspondenceTypeId: 2,\r\n disciplineId: 3,\r\n originatorId: 10,\r\n correspondenceNumber: 'OLD-NUM',\r\n recipients: [{ recipientType: 'TO', recipientOrganizationId: 99 }],\r\n };\r\n jest\r\n .spyOn(correspondenceRepo, 'findOne')\r\n .mockResolvedValue(mockCorr as unknown as Correspondence);\r\n\r\n // Access DataSource manager for mocking\r\n mockDataSource.manager.findOne.mockResolvedValue({\r\n id: 88,\r\n organizationCode: 'NEW-ORG',\r\n } as unknown as Organization);\r\n\r\n const updateDto: UpdateCorrespondenceDto = {\r\n recipients: [{ type: 'TO', organizationId: 88 }],\r\n };\r\n\r\n await service.update(1, updateDto, mockUser);\r\n\r\n expect(\r\n numberingService.updateNumberForDraft as jest.Mock\r\n ).toHaveBeenCalled();\r\n });\r\n });\r\n\r\n describe('create', () => {\r\n it('should allow system.manage_all user without primaryOrganizationId when originatorId is provided', async () => {\r\n const mockUser = {\r\n user_id: 1,\r\n primaryOrganizationId: null,\r\n } as unknown as User;\r\n\r\n const createDto: CreateCorrespondenceDto = {\r\n projectId: 'project-uuid',\r\n typeId: 1,\r\n subject: 'Test Subject',\r\n originatorId: 'originator-uuid',\r\n recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }],\r\n };\r\n\r\n const userService = testingModule.get(UserService);\r\n const typeRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceType)\r\n );\r\n const statusRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceStatus)\r\n );\r\n const uuidResolver =\r\n testingModule.get(UuidResolverService);\r\n\r\n (userService.findOne as jest.Mock).mockResolvedValue({\r\n user_id: 1,\r\n primaryOrganizationId: null,\r\n });\r\n (userService.getUserPermissions as jest.Mock).mockResolvedValue([\r\n 'system.manage_all',\r\n ]);\r\n\r\n (uuidResolver.resolveProjectId as jest.Mock).mockResolvedValue(100);\r\n (uuidResolver.resolveOrganizationId as jest.Mock).mockImplementation(\r\n (value: number | string) => {\r\n if (value === 'originator-uuid') return 10;\r\n if (value === 'recipient-uuid') return 20;\r\n return 0;\r\n }\r\n );\r\n\r\n (typeRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n typeCode: 'LTR',\r\n });\r\n (statusRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n statusCode: 'DRAFT',\r\n });\r\n\r\n (numberingService.generateNextNumber as jest.Mock).mockResolvedValue({\r\n number: 'DOC-001',\r\n });\r\n\r\n mockDataSource.manager.findOne\r\n .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' })\r\n .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' });\r\n\r\n const queryRunner = {\r\n connect: jest.fn(),\r\n startTransaction: jest.fn(),\r\n commitTransaction: jest.fn(),\r\n rollbackTransaction: jest.fn(),\r\n release: jest.fn(),\r\n manager: {\r\n create: jest.fn(\r\n (_entity: unknown, payload: Record) => payload\r\n ),\r\n save: jest\r\n .fn()\r\n .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' })\r\n .mockResolvedValueOnce({ id: 1000 })\r\n .mockResolvedValueOnce([]),\r\n findOne: jest.fn(),\r\n },\r\n };\r\n\r\n (mockDataSource.createQueryRunner as jest.Mock).mockReturnValue(\r\n queryRunner\r\n );\r\n\r\n await service.create(createDto, mockUser);\r\n\r\n expect(queryRunner.manager.create).toHaveBeenCalledWith(\r\n Correspondence,\r\n expect.objectContaining({ originatorId: 10 })\r\n );\r\n });\r\n\r\n it('should set revisionLabel to \"A\" for RFA type', async () => {\r\n const mockUser = {\r\n user_id: 1,\r\n primaryOrganizationId: 10,\r\n } as unknown as User;\r\n\r\n const createDto: CreateCorrespondenceDto = {\r\n projectId: 'project-uuid',\r\n typeId: 1,\r\n subject: 'Test Subject',\r\n recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }],\r\n };\r\n\r\n const typeRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceType)\r\n );\r\n const statusRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceStatus)\r\n );\r\n const uuidResolver =\r\n testingModule.get(UuidResolverService);\r\n\r\n (uuidResolver.resolveProjectId as jest.Mock).mockResolvedValue(100);\r\n (uuidResolver.resolveOrganizationId as jest.Mock).mockResolvedValue(20);\r\n\r\n (typeRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n typeCode: 'RFA',\r\n });\r\n (statusRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n statusCode: 'DRAFT',\r\n });\r\n\r\n (numberingService.generateNextNumber as jest.Mock).mockResolvedValue({\r\n number: 'DOC-001',\r\n });\r\n\r\n mockDataSource.manager.findOne\r\n .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' })\r\n .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' });\r\n\r\n const queryRunner = {\r\n connect: jest.fn(),\r\n startTransaction: jest.fn(),\r\n commitTransaction: jest.fn(),\r\n rollbackTransaction: jest.fn(),\r\n release: jest.fn(),\r\n manager: {\r\n create: jest.fn(\r\n (_entity: unknown, payload: Record) => payload\r\n ),\r\n save: jest\r\n .fn()\r\n .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' })\r\n .mockResolvedValueOnce({ id: 1000 })\r\n .mockResolvedValueOnce([]),\r\n findOne: jest.fn(),\r\n },\r\n };\r\n\r\n (mockDataSource.createQueryRunner as jest.Mock).mockReturnValue(\r\n queryRunner\r\n );\r\n\r\n await service.create(createDto, mockUser);\r\n\r\n expect(queryRunner.manager.create).toHaveBeenCalledWith(\r\n CorrespondenceRevision,\r\n expect.objectContaining({ revisionLabel: 'A' })\r\n );\r\n });\r\n\r\n it('should set revisionLabel to \"A\" for RFI type', async () => {\r\n const mockUser = {\r\n user_id: 1,\r\n primaryOrganizationId: 10,\r\n } as unknown as User;\r\n\r\n const createDto: CreateCorrespondenceDto = {\r\n projectId: 'project-uuid',\r\n typeId: 1,\r\n subject: 'Test Subject',\r\n recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }],\r\n };\r\n\r\n const typeRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceType)\r\n );\r\n const statusRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceStatus)\r\n );\r\n const uuidResolver =\r\n testingModule.get(UuidResolverService);\r\n\r\n (uuidResolver.resolveProjectId as jest.Mock).mockResolvedValue(100);\r\n (uuidResolver.resolveOrganizationId as jest.Mock).mockResolvedValue(20);\r\n\r\n (typeRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n typeCode: 'RFI',\r\n });\r\n (statusRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n statusCode: 'DRAFT',\r\n });\r\n\r\n (numberingService.generateNextNumber as jest.Mock).mockResolvedValue({\r\n number: 'DOC-001',\r\n });\r\n\r\n mockDataSource.manager.findOne\r\n .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' })\r\n .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' });\r\n\r\n const queryRunner = {\r\n connect: jest.fn(),\r\n startTransaction: jest.fn(),\r\n commitTransaction: jest.fn(),\r\n rollbackTransaction: jest.fn(),\r\n release: jest.fn(),\r\n manager: {\r\n create: jest.fn(\r\n (_entity: unknown, payload: Record) => payload\r\n ),\r\n save: jest\r\n .fn()\r\n .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' })\r\n .mockResolvedValueOnce({ id: 1000 })\r\n .mockResolvedValueOnce([]),\r\n findOne: jest.fn(),\r\n },\r\n };\r\n\r\n (mockDataSource.createQueryRunner as jest.Mock).mockReturnValue(\r\n queryRunner\r\n );\r\n\r\n await service.create(createDto, mockUser);\r\n\r\n expect(queryRunner.manager.create).toHaveBeenCalledWith(\r\n CorrespondenceRevision,\r\n expect.objectContaining({ revisionLabel: 'A' })\r\n );\r\n });\r\n\r\n it('should set revisionLabel to null for LETTER type', async () => {\r\n const mockUser = {\r\n user_id: 1,\r\n primaryOrganizationId: 10,\r\n } as unknown as User;\r\n\r\n const createDto: CreateCorrespondenceDto = {\r\n projectId: 'project-uuid',\r\n typeId: 1,\r\n subject: 'Test Subject',\r\n recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }],\r\n };\r\n\r\n const typeRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceType)\r\n );\r\n const statusRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceStatus)\r\n );\r\n const uuidResolver =\r\n testingModule.get(UuidResolverService);\r\n\r\n (uuidResolver.resolveProjectId as jest.Mock).mockResolvedValue(100);\r\n (uuidResolver.resolveOrganizationId as jest.Mock).mockResolvedValue(20);\r\n\r\n (typeRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n typeCode: 'LETTER',\r\n });\r\n (statusRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n statusCode: 'DRAFT',\r\n });\r\n\r\n (numberingService.generateNextNumber as jest.Mock).mockResolvedValue({\r\n number: 'DOC-001',\r\n });\r\n\r\n mockDataSource.manager.findOne\r\n .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' })\r\n .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' });\r\n\r\n const queryRunner = {\r\n connect: jest.fn(),\r\n startTransaction: jest.fn(),\r\n commitTransaction: jest.fn(),\r\n rollbackTransaction: jest.fn(),\r\n release: jest.fn(),\r\n manager: {\r\n create: jest.fn(\r\n (_entity: unknown, payload: Record) => payload\r\n ),\r\n save: jest\r\n .fn()\r\n .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' })\r\n .mockResolvedValueOnce({ id: 1000 })\r\n .mockResolvedValueOnce([]),\r\n findOne: jest.fn(),\r\n },\r\n };\r\n\r\n (mockDataSource.createQueryRunner as jest.Mock).mockReturnValue(\r\n queryRunner\r\n );\r\n\r\n await service.create(createDto, mockUser);\r\n\r\n expect(queryRunner.manager.create).toHaveBeenCalledWith(\r\n CorrespondenceRevision,\r\n expect.objectContaining({ revisionLabel: undefined })\r\n );\r\n });\r\n\r\n it('should set revisionLabel to undefined for MEMO type', async () => {\r\n const mockUser = {\r\n user_id: 1,\r\n primaryOrganizationId: 10,\r\n } as unknown as User;\r\n\r\n const createDto: CreateCorrespondenceDto = {\r\n projectId: 'project-uuid',\r\n typeId: 1,\r\n subject: 'Test Subject',\r\n recipients: [{ organizationId: 'recipient-uuid', type: 'TO' }],\r\n };\r\n\r\n const typeRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceType)\r\n );\r\n const statusRepo = testingModule.get>(\r\n getRepositoryToken(CorrespondenceStatus)\r\n );\r\n const uuidResolver =\r\n testingModule.get(UuidResolverService);\r\n\r\n (uuidResolver.resolveProjectId as jest.Mock).mockResolvedValue(100);\r\n (uuidResolver.resolveOrganizationId as jest.Mock).mockResolvedValue(20);\r\n\r\n (typeRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n typeCode: 'MEMO',\r\n });\r\n (statusRepo.findOne as jest.Mock).mockResolvedValue({\r\n id: 1,\r\n statusCode: 'DRAFT',\r\n });\r\n\r\n (numberingService.generateNextNumber as jest.Mock).mockResolvedValue({\r\n number: 'DOC-001',\r\n });\r\n\r\n mockDataSource.manager.findOne\r\n .mockResolvedValueOnce({ id: 10, organizationCode: 'ORG' })\r\n .mockResolvedValueOnce({ id: 20, organizationCode: 'REC' });\r\n\r\n const queryRunner = {\r\n connect: jest.fn(),\r\n startTransaction: jest.fn(),\r\n commitTransaction: jest.fn(),\r\n rollbackTransaction: jest.fn(),\r\n release: jest.fn(),\r\n manager: {\r\n create: jest.fn(\r\n (_entity: unknown, payload: Record) => payload\r\n ),\r\n save: jest\r\n .fn()\r\n .mockResolvedValueOnce({ id: 999, publicId: 'corr-uuid' })\r\n .mockResolvedValueOnce({ id: 1000 })\r\n .mockResolvedValueOnce([]),\r\n findOne: jest.fn(),\r\n },\r\n };\r\n\r\n (mockDataSource.createQueryRunner as jest.Mock).mockReturnValue(\r\n queryRunner\r\n );\r\n\r\n await service.create(createDto, mockUser);\r\n\r\n expect(queryRunner.manager.create).toHaveBeenCalledWith(\r\n CorrespondenceRevision,\r\n expect.objectContaining({ revisionLabel: undefined })\r\n );\r\n });\r\n });\r\n});\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c1/userservice_c15380ec5ccdd36a7c9db129b5db65c9 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c1/userservice_c15380ec5ccdd36a7c9db129b5db65c9 new file mode 100644 index 0000000..b720f77 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c1/userservice_c15380ec5ccdd36a7c9db129b5db65c9 @@ -0,0 +1,281 @@ +199ca3404cc2265cf1026f59bf4df336 +"use strict"; +// File: src/modules/user/user.service.ts +// บันทึกการแก้ไข: แก้ไข Error TS1272 โดยใช้ 'import type' สำหรับ Cache interface (T1.3) +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UserService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const cache_manager_1 = require("@nestjs/cache-manager"); +const bcrypt = __importStar(require("bcrypt")); +const user_entity_1 = require("./entities/user.entity"); +const role_entity_1 = require("./entities/role.entity"); +const permission_entity_1 = require("./entities/permission.entity"); +const uuid_resolver_service_1 = require("../../common/services/uuid-resolver.service"); +let UserService = class UserService { + constructor(usersRepository, roleRepository, permissionRepository, cacheManager, uuidResolver) { + this.usersRepository = usersRepository; + this.roleRepository = roleRepository; + this.permissionRepository = permissionRepository; + this.cacheManager = cacheManager; + this.uuidResolver = uuidResolver; + } + // 1. สร้างผู้ใช้ (Hash Password ก่อนบันทึก) + async create(createUserDto) { + const salt = await bcrypt.genSalt(); + const hashedPassword = await bcrypt.hash(createUserDto.password, salt); + // ADR-019: Resolve UUID→INT for primaryOrganizationId + const resolvedOrgId = createUserDto.primaryOrganizationId + ? await this.uuidResolver.resolveOrganizationId(createUserDto.primaryOrganizationId) + : undefined; + const newUser = this.usersRepository.create({ + ...createUserDto, + primaryOrganizationId: resolvedOrgId, + password: hashedPassword, + }); + try { + return await this.usersRepository.save(newUser); + } + catch (error) { + const dbError = error; + if (dbError.code === 'ER_DUP_ENTRY') { + throw new common_1.ConflictException('Username or Email already exists'); + } + throw error; + } + } + // 2. ดึงข้อมูลทั้งหมด (Search & Pagination) + async findAll(params) { + const { search, roleId, primaryOrganizationId, page = 1, limit = 100, } = params || {}; + // Create query builder + const query = this.usersRepository + .createQueryBuilder('user') + .leftJoinAndSelect('user.preference', 'preference') // Optional + .leftJoinAndSelect('user.assignments', 'assignments') + .leftJoinAndSelect('assignments.role', 'role') + .leftJoinAndSelect('user.organization', 'organization') // [FIX] Required for primaryOrganizationPublicId getter (ADR-019) + .select([ + 'user.user_id', + 'user.publicId', + 'user.username', + 'user.email', + 'user.firstName', + 'user.lastName', + 'user.lineId', + 'user.isActive', + 'user.createdAt', + 'user.updatedAt', + 'assignments.id', + 'role.roleId', + 'role.roleName', + 'organization.publicId', // [FIX] Expose org UUID for getter (ADR-019) + ]); + // Apply Filters + if (search) { + query.andWhere('(user.username LIKE :search OR user.email LIKE :search OR user.firstName LIKE :search OR user.lastName LIKE :search)', { search: `%${search}%` }); + } + if (primaryOrganizationId) { + // ADR-019: Resolve UUID→INT for filtering + const resolvedOrgId = await this.uuidResolver.resolveOrganizationId(primaryOrganizationId); + query.andWhere('user.primaryOrganizationId = :orgId', { + orgId: resolvedOrgId, + }); + } + if (roleId) { + query.andWhere('role.roleId = :roleId', { roleId }); + } + // Pagination + query.skip((page - 1) * limit).take(limit); + const [data, total] = await query.getManyAndCount(); + return { + data, + total, + page, + limit, + totalPages: Math.ceil(total / limit), + }; + } + // 3. ดึงข้อมูลรายคน + async findOne(id) { + const user = await this.usersRepository.findOne({ + where: { user_id: id }, + relations: [ + 'preference', + 'assignments', + 'assignments.role', + 'assignments.role.permissions', // [FIX] Required for RBAC AbilityFactory + 'organization', // [FIX] Required for primaryOrganizationPublicId getter (ADR-019) + ], + }); + if (!user) { + throw new common_1.NotFoundException(`User with ID ${id} not found`); + } + return user; + } + async findOneByUuid(publicId) { + const user = await this.usersRepository.findOne({ + where: { publicId }, + relations: [ + 'preference', + 'assignments', + 'assignments.role', + 'assignments.role.permissions', + 'organization', // [FIX] Required for primaryOrganizationPublicId getter (ADR-019) + ], + }); + if (!user) { + throw new common_1.NotFoundException(`User with publicId ${publicId} not found`); + } + return user; + } + async findOneByUsername(username) { + return this.usersRepository.findOne({ where: { username } }); + } + // 4. แก้ไขข้อมูล + async update(uuid, updateUserDto) { + const user = await this.findOneByUuid(uuid); + if (updateUserDto.password) { + const salt = await bcrypt.genSalt(); + updateUserDto.password = await bcrypt.hash(updateUserDto.password, salt); + } + // ADR-019: Resolve UUID→INT for primaryOrganizationId before merge + const resolvedDto = { ...updateUserDto }; + if (updateUserDto.primaryOrganizationId !== undefined) { + resolvedDto.primaryOrganizationId = + await this.uuidResolver.resolveOrganizationId(updateUserDto.primaryOrganizationId); + } + const updatedUser = this.usersRepository.merge(user, resolvedDto); + const savedUser = await this.usersRepository.save(updatedUser); + // ⚠️ สำคัญ: เมื่อมีการแก้ไขข้อมูล User ต้องเคลียร์ Cache สิทธิ์เสมอ + await this.clearUserCache(user.user_id); + return savedUser; + } + // 5. ลบผู้ใช้ (Soft Delete) + async remove(uuid) { + const user = await this.findOneByUuid(uuid); + const result = await this.usersRepository.softDelete(user.user_id); + if (result.affected === 0) { + throw new common_1.NotFoundException(`User with UUID ${uuid} not found`); + } + // เคลียร์ Cache เมื่อลบ + await this.clearUserCache(user.user_id); + } + async findDocControlIdByOrg(organizationId) { + const user = await this.usersRepository.findOne({ + where: { primaryOrganizationId: organizationId }, + }); + return user ? user.user_id : null; + } + /** + * ✅ ดึงสิทธิ์ (Permission) โดยใช้ Caching Strategy + * TTL: 30 นาที (ตาม Requirement 6.5.2) + */ + async getUserPermissions(userId) { + const cacheKey = `permissions:user:${userId}`; + // 1. ลองดึงจาก Cache ก่อน + const cachedPermissions = await this.cacheManager.get(cacheKey); + if (cachedPermissions) { + return cachedPermissions; + } + // 2. ถ้าไม่มีใน Cache ให้ Query จาก DB (View: v_user_all_permissions) + const permissions = await this.usersRepository.query(`SELECT permission_name FROM v_user_all_permissions WHERE user_id = ?`, [ + userId, + ]); + const permissionList = permissions.map((row) => row.permission_name); + // 3. บันทึกลง Cache (TTL 1800 วินาที = 30 นาที) + await this.cacheManager.set(cacheKey, permissionList, 1800 * 1000); + return permissionList; + } + // --- Roles & Permissions (Helper for Admin/UI) --- + async findAllRoles() { + return this.roleRepository.find({ relations: ['permissions'] }); + } + async findAllPermissions() { + return this.permissionRepository.find(); + } + async updateRolePermissions(roleId, permissionIds) { + const role = await this.roleRepository.findOne({ + where: { roleId }, + relations: ['permissions'], + }); + if (!role) { + throw new common_1.NotFoundException(`Role ID ${roleId} not found`); + } + // Load permissions entities + const permissions = []; + if (permissionIds.length > 0) { + // Note: findByIds is deprecated in newer TypeORM, uses In() instead + // but if current version supports it or using a simplified query: + const perms = await this.permissionRepository + .createQueryBuilder('p') + .where('p.permissionId IN (:...ids)', { ids: permissionIds }) + .getMany(); + permissions.push(...perms); + } + role.permissions = permissions; + return this.roleRepository.save(role); + } + /** + * Helper สำหรับล้าง Cache เมื่อมีการเปลี่ยนแปลงสิทธิ์หรือบทบาท + */ + async clearUserCache(userId) { + await this.cacheManager.del(`permissions:user:${userId}`); + } +}; +exports.UserService = UserService; +exports.UserService = UserService = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(user_entity_1.User)), + __param(1, (0, typeorm_1.InjectRepository)(role_entity_1.Role)), + __param(2, (0, typeorm_1.InjectRepository)(permission_entity_1.Permission)), + __param(3, (0, common_1.Inject)(cache_manager_1.CACHE_MANAGER)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object, typeof (_b = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _b : Object, typeof (_c = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _c : Object, Object, typeof (_d = typeof uuid_resolver_service_1.UuidResolverService !== "undefined" && uuid_resolver_service_1.UuidResolverService) === "function" ? _d : Object]) +], UserService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcdXNlclxcdXNlci5zZXJ2aWNlLnRzIiwibWFwcGluZ3MiOiI7QUFBQSx5Q0FBeUM7QUFDekMsd0ZBQXdGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRXhGLDJDQUt3QjtBQUN4Qiw2Q0FBbUQ7QUFDbkQscUNBQXFDO0FBQ3JDLHlEQUFzRDtBQUV0RCwrQ0FBaUM7QUFDakMsd0RBQThDO0FBQzlDLHdEQUE4QztBQUM5QyxvRUFBMEQ7QUFJMUQsdUZBQWtGO0FBRzNFLElBQU0sV0FBVyxHQUFqQixNQUFNLFdBQVc7SUFDdEIsWUFFVSxlQUFpQyxFQUVqQyxjQUFnQyxFQUVoQyxvQkFBNEMsRUFDckIsWUFBbUIsRUFDMUMsWUFBaUM7UUFOakMsb0JBQWUsR0FBZixlQUFlLENBQWtCO1FBRWpDLG1CQUFjLEdBQWQsY0FBYyxDQUFrQjtRQUVoQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXdCO1FBQ3JCLGlCQUFZLEdBQVosWUFBWSxDQUFPO1FBQzFDLGlCQUFZLEdBQVosWUFBWSxDQUFxQjtJQUN4QyxDQUFDO0lBRUosNENBQTRDO0lBQzVDLEtBQUssQ0FBQyxNQUFNLENBQUMsYUFBNEI7UUFDdkMsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEMsTUFBTSxjQUFjLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFdkUsc0RBQXNEO1FBQ3RELE1BQU0sYUFBYSxHQUFHLGFBQWEsQ0FBQyxxQkFBcUI7WUFDdkQsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FDM0MsYUFBYSxDQUFDLHFCQUFxQixDQUNwQztZQUNILENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFZCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQztZQUMxQyxHQUFHLGFBQWE7WUFDaEIscUJBQXFCLEVBQUUsYUFBYTtZQUNwQyxRQUFRLEVBQUUsY0FBYztTQUN6QixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7WUFDeEIsTUFBTSxPQUFPLEdBQUcsS0FBMEIsQ0FBQztZQUMzQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sSUFBSSwwQkFBaUIsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1lBQ2xFLENBQUM7WUFDRCxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQsNENBQTRDO0lBQzVDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBc0I7UUFPbEMsTUFBTSxFQUNKLE1BQU0sRUFDTixNQUFNLEVBQ04scUJBQXFCLEVBQ3JCLElBQUksR0FBRyxDQUFDLEVBQ1IsS0FBSyxHQUFHLEdBQUcsR0FDWixHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFFakIsdUJBQXVCO1FBQ3ZCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlO2FBQy9CLGtCQUFrQixDQUFDLE1BQU0sQ0FBQzthQUMxQixpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxZQUFZLENBQUMsQ0FBQyxXQUFXO2FBQzlELGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLGFBQWEsQ0FBQzthQUNwRCxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUM7YUFDN0MsaUJBQWlCLENBQUMsbUJBQW1CLEVBQUUsY0FBYyxDQUFDLENBQUMsa0VBQWtFO2FBQ3pILE1BQU0sQ0FBQztZQUNOLGNBQWM7WUFDZCxlQUFlO1lBQ2YsZUFBZTtZQUNmLFlBQVk7WUFDWixnQkFBZ0I7WUFDaEIsZUFBZTtZQUNmLGFBQWE7WUFDYixlQUFlO1lBQ2YsZ0JBQWdCO1lBQ2hCLGdCQUFnQjtZQUNoQixnQkFBZ0I7WUFDaEIsYUFBYTtZQUNiLGVBQWU7WUFDZix1QkFBdUIsRUFBRSw2Q0FBNkM7U0FDdkUsQ0FBQyxDQUFDO1FBRUwsZ0JBQWdCO1FBQ2hCLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxLQUFLLENBQUMsUUFBUSxDQUNaLHNIQUFzSCxFQUN0SCxFQUFFLE1BQU0sRUFBRSxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQzFCLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1lBQzFCLDBDQUEwQztZQUMxQyxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQ2pFLHFCQUFxQixDQUN0QixDQUFDO1lBQ0YsS0FBSyxDQUFDLFFBQVEsQ0FBQyxxQ0FBcUMsRUFBRTtnQkFDcEQsS0FBSyxFQUFFLGFBQWE7YUFDckIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxLQUFLLENBQUMsUUFBUSxDQUFDLHVCQUF1QixFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBRUQsYUFBYTtRQUNiLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTNDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFcEQsT0FBTztZQUNMLElBQUk7WUFDSixLQUFLO1lBQ0wsSUFBSTtZQUNKLEtBQUs7WUFDTCxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQ3JDLENBQUM7SUFDSixDQUFDO0lBRUQsb0JBQW9CO0lBQ3BCLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBVTtRQUN0QixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDO1lBQzlDLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7WUFDdEIsU0FBUyxFQUFFO2dCQUNULFlBQVk7Z0JBQ1osYUFBYTtnQkFDYixrQkFBa0I7Z0JBQ2xCLDhCQUE4QixFQUFFLHlDQUF5QztnQkFDekUsY0FBYyxFQUFFLGtFQUFrRTthQUNuRjtTQUNGLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE1BQU0sSUFBSSwwQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxRQUFnQjtRQUNsQyxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDO1lBQzlDLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRTtZQUNuQixTQUFTLEVBQUU7Z0JBQ1QsWUFBWTtnQkFDWixhQUFhO2dCQUNiLGtCQUFrQjtnQkFDbEIsOEJBQThCO2dCQUM5QixjQUFjLEVBQUUsa0VBQWtFO2FBQ25GO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLDBCQUFpQixDQUFDLHNCQUFzQixRQUFRLFlBQVksQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBZ0I7UUFDdEMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsaUJBQWlCO0lBQ2pCLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBWSxFQUFFLGFBQTRCO1FBQ3JELE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU1QyxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNwQyxhQUFhLENBQUMsUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFFRCxtRUFBbUU7UUFDbkUsTUFBTSxXQUFXLEdBQTRCLEVBQUUsR0FBRyxhQUFhLEVBQUUsQ0FBQztRQUNsRSxJQUFJLGFBQWEsQ0FBQyxxQkFBcUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0RCxXQUFXLENBQUMscUJBQXFCO2dCQUMvQixNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQzNDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FDcEMsQ0FBQztRQUNOLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FDNUMsSUFBSSxFQUNKLFdBQTRCLENBQzdCLENBQUM7UUFDRixNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRS9ELG9FQUFvRTtRQUNwRSxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXhDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCw0QkFBNEI7SUFDNUIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFZO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVuRSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLDBCQUFpQixDQUFDLGtCQUFrQixJQUFJLFlBQVksQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFDRCx3QkFBd0I7UUFDeEIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsS0FBSyxDQUFDLHFCQUFxQixDQUFDLGNBQXNCO1FBQ2hELE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUM7WUFDOUMsS0FBSyxFQUFFLEVBQUUscUJBQXFCLEVBQUUsY0FBYyxFQUFFO1NBQ2pELENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUFjO1FBQ3JDLE1BQU0sUUFBUSxHQUFHLG9CQUFvQixNQUFNLEVBQUUsQ0FBQztRQUU5QywwQkFBMEI7UUFDMUIsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFXLFFBQVEsQ0FBQyxDQUFDO1FBQzFFLElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUN0QixPQUFPLGlCQUFpQixDQUFDO1FBQzNCLENBQUM7UUFFRCxzRUFBc0U7UUFDdEUsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FFbEQsc0VBQXNFLEVBQUU7WUFDeEUsTUFBTTtTQUNQLENBQUMsQ0FBQztRQUVILE1BQU0sY0FBYyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUVyRSxnREFBZ0Q7UUFDaEQsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsY0FBYyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQztRQUVuRSxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRUQsb0RBQW9EO0lBRXBELEtBQUssQ0FBQyxZQUFZO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELEtBQUssQ0FBQyxrQkFBa0I7UUFDdEIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVELEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxNQUFjLEVBQUUsYUFBdUI7UUFDakUsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztZQUM3QyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUU7WUFDakIsU0FBUyxFQUFFLENBQUMsYUFBYSxDQUFDO1NBQzNCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE1BQU0sSUFBSSwwQkFBaUIsQ0FBQyxXQUFXLE1BQU0sWUFBWSxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUVELDRCQUE0QjtRQUM1QixNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzdCLG9FQUFvRTtZQUNwRSxrRUFBa0U7WUFDbEUsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CO2lCQUMxQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUM7aUJBQ3ZCLEtBQUssQ0FBQyw2QkFBNkIsRUFBRSxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsQ0FBQztpQkFDNUQsT0FBTyxFQUFFLENBQUM7WUFDYixXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFjO1FBQ2pDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsb0JBQW9CLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDNUQsQ0FBQztDQUNGLENBQUE7QUF2Ulksa0NBQVc7c0JBQVgsV0FBVztJQUR2QixJQUFBLG1CQUFVLEdBQUU7SUFHUixXQUFBLElBQUEsMEJBQWdCLEVBQUMsa0JBQUksQ0FBQyxDQUFBO0lBRXRCLFdBQUEsSUFBQSwwQkFBZ0IsRUFBQyxrQkFBSSxDQUFDLENBQUE7SUFFdEIsV0FBQSxJQUFBLDBCQUFnQixFQUFDLDhCQUFVLENBQUMsQ0FBQTtJQUU1QixXQUFBLElBQUEsZUFBTSxFQUFDLDZCQUFhLENBQUMsQ0FBQTt5REFMRyxvQkFBVSxvQkFBVixvQkFBVSxvREFFWCxvQkFBVSxvQkFBVixvQkFBVSxvREFFSixvQkFBVSxvQkFBVixvQkFBVSw0REFFbEIsMkNBQW1CLG9CQUFuQiwyQ0FBbUI7R0FUaEMsV0FBVyxDQXVSdkIiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcdXNlclxcdXNlci5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9tb2R1bGVzL3VzZXIvdXNlci5zZXJ2aWNlLnRzXHJcbi8vIOC4muC4seC4meC4l+C4tuC4geC4geC4suC4o+C5geC4geC5ieC5hOC4gjog4LmB4LiB4LmJ4LmE4LiCIEVycm9yIFRTMTI3MiDguYLguJTguKLguYPguIrguYkgJ2ltcG9ydCB0eXBlJyDguKrguLPguKvguKPguLHguJogQ2FjaGUgaW50ZXJmYWNlIChUMS4zKVxyXG5cclxuaW1wb3J0IHtcclxuICBJbmplY3RhYmxlLFxyXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxyXG4gIENvbmZsaWN0RXhjZXB0aW9uLFxyXG4gIEluamVjdCxcclxufSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XHJcbmltcG9ydCB7IEluamVjdFJlcG9zaXRvcnkgfSBmcm9tICdAbmVzdGpzL3R5cGVvcm0nO1xyXG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSAndHlwZW9ybSc7XHJcbmltcG9ydCB7IENBQ0hFX01BTkFHRVIgfSBmcm9tICdAbmVzdGpzL2NhY2hlLW1hbmFnZXInO1xyXG5pbXBvcnQgdHlwZSB7IENhY2hlIH0gZnJvbSAnY2FjaGUtbWFuYWdlcic7IC8vIOKchSBGSVg6IOC5gOC4nuC4tOC5iOC4oSAndHlwZScg4LiV4Lij4LiH4LiZ4Li14LmJXHJcbmltcG9ydCAqIGFzIGJjcnlwdCBmcm9tICdiY3J5cHQnO1xyXG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi9lbnRpdGllcy91c2VyLmVudGl0eSc7XHJcbmltcG9ydCB7IFJvbGUgfSBmcm9tICcuL2VudGl0aWVzL3JvbGUuZW50aXR5JztcclxuaW1wb3J0IHsgUGVybWlzc2lvbiB9IGZyb20gJy4vZW50aXRpZXMvcGVybWlzc2lvbi5lbnRpdHknO1xyXG5pbXBvcnQgeyBDcmVhdGVVc2VyRHRvIH0gZnJvbSAnLi9kdG8vY3JlYXRlLXVzZXIuZHRvJztcclxuaW1wb3J0IHsgVXBkYXRlVXNlckR0byB9IGZyb20gJy4vZHRvL3VwZGF0ZS11c2VyLmR0byc7XHJcbmltcG9ydCB7IFNlYXJjaFVzZXJEdG8gfSBmcm9tICcuL2R0by9zZWFyY2gtdXNlci5kdG8nO1xyXG5pbXBvcnQgeyBVdWlkUmVzb2x2ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uL3NlcnZpY2VzL3V1aWQtcmVzb2x2ZXIuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBVc2VyU2VydmljZSB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShVc2VyKVxyXG4gICAgcHJpdmF0ZSB1c2Vyc1JlcG9zaXRvcnk6IFJlcG9zaXRvcnk8VXNlcj4sXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShSb2xlKVxyXG4gICAgcHJpdmF0ZSByb2xlUmVwb3NpdG9yeTogUmVwb3NpdG9yeTxSb2xlPixcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KFBlcm1pc3Npb24pXHJcbiAgICBwcml2YXRlIHBlcm1pc3Npb25SZXBvc2l0b3J5OiBSZXBvc2l0b3J5PFBlcm1pc3Npb24+LFxyXG4gICAgQEluamVjdChDQUNIRV9NQU5BR0VSKSBwcml2YXRlIGNhY2hlTWFuYWdlcjogQ2FjaGUsXHJcbiAgICBwcml2YXRlIHV1aWRSZXNvbHZlcjogVXVpZFJlc29sdmVyU2VydmljZVxyXG4gICkge31cclxuXHJcbiAgLy8gMS4g4Liq4Lij4LmJ4Liy4LiH4Lic4Li54LmJ4LmD4LiK4LmJIChIYXNoIFBhc3N3b3JkIOC4geC5iOC4reC4meC4muC4seC4meC4l+C4tuC4gSlcclxuICBhc3luYyBjcmVhdGUoY3JlYXRlVXNlckR0bzogQ3JlYXRlVXNlckR0byk6IFByb21pc2U8VXNlcj4ge1xyXG4gICAgY29uc3Qgc2FsdCA9IGF3YWl0IGJjcnlwdC5nZW5TYWx0KCk7XHJcbiAgICBjb25zdCBoYXNoZWRQYXNzd29yZCA9IGF3YWl0IGJjcnlwdC5oYXNoKGNyZWF0ZVVzZXJEdG8ucGFzc3dvcmQsIHNhbHQpO1xyXG5cclxuICAgIC8vIEFEUi0wMTk6IFJlc29sdmUgVVVJROKGkklOVCBmb3IgcHJpbWFyeU9yZ2FuaXphdGlvbklkXHJcbiAgICBjb25zdCByZXNvbHZlZE9yZ0lkID0gY3JlYXRlVXNlckR0by5wcmltYXJ5T3JnYW5pemF0aW9uSWRcclxuICAgICAgPyBhd2FpdCB0aGlzLnV1aWRSZXNvbHZlci5yZXNvbHZlT3JnYW5pemF0aW9uSWQoXHJcbiAgICAgICAgICBjcmVhdGVVc2VyRHRvLnByaW1hcnlPcmdhbml6YXRpb25JZFxyXG4gICAgICAgIClcclxuICAgICAgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgY29uc3QgbmV3VXNlciA9IHRoaXMudXNlcnNSZXBvc2l0b3J5LmNyZWF0ZSh7XHJcbiAgICAgIC4uLmNyZWF0ZVVzZXJEdG8sXHJcbiAgICAgIHByaW1hcnlPcmdhbml6YXRpb25JZDogcmVzb2x2ZWRPcmdJZCxcclxuICAgICAgcGFzc3dvcmQ6IGhhc2hlZFBhc3N3b3JkLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXNlcnNSZXBvc2l0b3J5LnNhdmUobmV3VXNlcik7XHJcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xyXG4gICAgICBjb25zdCBkYkVycm9yID0gZXJyb3IgYXMgeyBjb2RlPzogc3RyaW5nIH07XHJcbiAgICAgIGlmIChkYkVycm9yLmNvZGUgPT09ICdFUl9EVVBfRU5UUlknKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IENvbmZsaWN0RXhjZXB0aW9uKCdVc2VybmFtZSBvciBFbWFpbCBhbHJlYWR5IGV4aXN0cycpO1xyXG4gICAgICB9XHJcbiAgICAgIHRocm93IGVycm9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gMi4g4LiU4Li24LiH4LiC4LmJ4Lit4Lih4Li54Lil4LiX4Lix4LmJ4LiH4Lir4Lih4LiUIChTZWFyY2ggJiBQYWdpbmF0aW9uKVxyXG4gIGFzeW5jIGZpbmRBbGwocGFyYW1zPzogU2VhcmNoVXNlckR0byk6IFByb21pc2U8e1xyXG4gICAgZGF0YTogVXNlcltdO1xyXG4gICAgdG90YWw6IG51bWJlcjtcclxuICAgIHBhZ2U6IG51bWJlcjtcclxuICAgIGxpbWl0OiBudW1iZXI7XHJcbiAgICB0b3RhbFBhZ2VzOiBudW1iZXI7XHJcbiAgfT4ge1xyXG4gICAgY29uc3Qge1xyXG4gICAgICBzZWFyY2gsXHJcbiAgICAgIHJvbGVJZCxcclxuICAgICAgcHJpbWFyeU9yZ2FuaXphdGlvbklkLFxyXG4gICAgICBwYWdlID0gMSxcclxuICAgICAgbGltaXQgPSAxMDAsXHJcbiAgICB9ID0gcGFyYW1zIHx8IHt9O1xyXG5cclxuICAgIC8vIENyZWF0ZSBxdWVyeSBidWlsZGVyXHJcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMudXNlcnNSZXBvc2l0b3J5XHJcbiAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoJ3VzZXInKVxyXG4gICAgICAubGVmdEpvaW5BbmRTZWxlY3QoJ3VzZXIucHJlZmVyZW5jZScsICdwcmVmZXJlbmNlJykgLy8gT3B0aW9uYWxcclxuICAgICAgLmxlZnRKb2luQW5kU2VsZWN0KCd1c2VyLmFzc2lnbm1lbnRzJywgJ2Fzc2lnbm1lbnRzJylcclxuICAgICAgLmxlZnRKb2luQW5kU2VsZWN0KCdhc3NpZ25tZW50cy5yb2xlJywgJ3JvbGUnKVxyXG4gICAgICAubGVmdEpvaW5BbmRTZWxlY3QoJ3VzZXIub3JnYW5pemF0aW9uJywgJ29yZ2FuaXphdGlvbicpIC8vIFtGSVhdIFJlcXVpcmVkIGZvciBwcmltYXJ5T3JnYW5pemF0aW9uUHVibGljSWQgZ2V0dGVyIChBRFItMDE5KVxyXG4gICAgICAuc2VsZWN0KFtcclxuICAgICAgICAndXNlci51c2VyX2lkJyxcclxuICAgICAgICAndXNlci5wdWJsaWNJZCcsXHJcbiAgICAgICAgJ3VzZXIudXNlcm5hbWUnLFxyXG4gICAgICAgICd1c2VyLmVtYWlsJyxcclxuICAgICAgICAndXNlci5maXJzdE5hbWUnLFxyXG4gICAgICAgICd1c2VyLmxhc3ROYW1lJyxcclxuICAgICAgICAndXNlci5saW5lSWQnLFxyXG4gICAgICAgICd1c2VyLmlzQWN0aXZlJyxcclxuICAgICAgICAndXNlci5jcmVhdGVkQXQnLFxyXG4gICAgICAgICd1c2VyLnVwZGF0ZWRBdCcsXHJcbiAgICAgICAgJ2Fzc2lnbm1lbnRzLmlkJyxcclxuICAgICAgICAncm9sZS5yb2xlSWQnLFxyXG4gICAgICAgICdyb2xlLnJvbGVOYW1lJyxcclxuICAgICAgICAnb3JnYW5pemF0aW9uLnB1YmxpY0lkJywgLy8gW0ZJWF0gRXhwb3NlIG9yZyBVVUlEIGZvciBnZXR0ZXIgKEFEUi0wMTkpXHJcbiAgICAgIF0pO1xyXG5cclxuICAgIC8vIEFwcGx5IEZpbHRlcnNcclxuICAgIGlmIChzZWFyY2gpIHtcclxuICAgICAgcXVlcnkuYW5kV2hlcmUoXHJcbiAgICAgICAgJyh1c2VyLnVzZXJuYW1lIExJS0UgOnNlYXJjaCBPUiB1c2VyLmVtYWlsIExJS0UgOnNlYXJjaCBPUiB1c2VyLmZpcnN0TmFtZSBMSUtFIDpzZWFyY2ggT1IgdXNlci5sYXN0TmFtZSBMSUtFIDpzZWFyY2gpJyxcclxuICAgICAgICB7IHNlYXJjaDogYCUke3NlYXJjaH0lYCB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHByaW1hcnlPcmdhbml6YXRpb25JZCkge1xyXG4gICAgICAvLyBBRFItMDE5OiBSZXNvbHZlIFVVSUTihpJJTlQgZm9yIGZpbHRlcmluZ1xyXG4gICAgICBjb25zdCByZXNvbHZlZE9yZ0lkID0gYXdhaXQgdGhpcy51dWlkUmVzb2x2ZXIucmVzb2x2ZU9yZ2FuaXphdGlvbklkKFxyXG4gICAgICAgIHByaW1hcnlPcmdhbml6YXRpb25JZFxyXG4gICAgICApO1xyXG4gICAgICBxdWVyeS5hbmRXaGVyZSgndXNlci5wcmltYXJ5T3JnYW5pemF0aW9uSWQgPSA6b3JnSWQnLCB7XHJcbiAgICAgICAgb3JnSWQ6IHJlc29sdmVkT3JnSWQsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyb2xlSWQpIHtcclxuICAgICAgcXVlcnkuYW5kV2hlcmUoJ3JvbGUucm9sZUlkID0gOnJvbGVJZCcsIHsgcm9sZUlkIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFBhZ2luYXRpb25cclxuICAgIHF1ZXJ5LnNraXAoKHBhZ2UgLSAxKSAqIGxpbWl0KS50YWtlKGxpbWl0KTtcclxuXHJcbiAgICBjb25zdCBbZGF0YSwgdG90YWxdID0gYXdhaXQgcXVlcnkuZ2V0TWFueUFuZENvdW50KCk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZGF0YSxcclxuICAgICAgdG90YWwsXHJcbiAgICAgIHBhZ2UsXHJcbiAgICAgIGxpbWl0LFxyXG4gICAgICB0b3RhbFBhZ2VzOiBNYXRoLmNlaWwodG90YWwgLyBsaW1pdCksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLy8gMy4g4LiU4Li24LiH4LiC4LmJ4Lit4Lih4Li54Lil4Lij4Liy4Lii4LiE4LiZXHJcbiAgYXN5bmMgZmluZE9uZShpZDogbnVtYmVyKTogUHJvbWlzZTxVc2VyPiB7XHJcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy51c2Vyc1JlcG9zaXRvcnkuZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7IHVzZXJfaWQ6IGlkIH0sXHJcbiAgICAgIHJlbGF0aW9uczogW1xyXG4gICAgICAgICdwcmVmZXJlbmNlJyxcclxuICAgICAgICAnYXNzaWdubWVudHMnLFxyXG4gICAgICAgICdhc3NpZ25tZW50cy5yb2xlJyxcclxuICAgICAgICAnYXNzaWdubWVudHMucm9sZS5wZXJtaXNzaW9ucycsIC8vIFtGSVhdIFJlcXVpcmVkIGZvciBSQkFDIEFiaWxpdHlGYWN0b3J5XHJcbiAgICAgICAgJ29yZ2FuaXphdGlvbicsIC8vIFtGSVhdIFJlcXVpcmVkIGZvciBwcmltYXJ5T3JnYW5pemF0aW9uUHVibGljSWQgZ2V0dGVyIChBRFItMDE5KVxyXG4gICAgICBdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCF1c2VyKSB7XHJcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgVXNlciB3aXRoIElEICR7aWR9IG5vdCBmb3VuZGApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB1c2VyO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmluZE9uZUJ5VXVpZChwdWJsaWNJZDogc3RyaW5nKTogUHJvbWlzZTxVc2VyPiB7XHJcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy51c2Vyc1JlcG9zaXRvcnkuZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7IHB1YmxpY0lkIH0sXHJcbiAgICAgIHJlbGF0aW9uczogW1xyXG4gICAgICAgICdwcmVmZXJlbmNlJyxcclxuICAgICAgICAnYXNzaWdubWVudHMnLFxyXG4gICAgICAgICdhc3NpZ25tZW50cy5yb2xlJyxcclxuICAgICAgICAnYXNzaWdubWVudHMucm9sZS5wZXJtaXNzaW9ucycsXHJcbiAgICAgICAgJ29yZ2FuaXphdGlvbicsIC8vIFtGSVhdIFJlcXVpcmVkIGZvciBwcmltYXJ5T3JnYW5pemF0aW9uUHVibGljSWQgZ2V0dGVyIChBRFItMDE5KVxyXG4gICAgICBdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCF1c2VyKSB7XHJcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgVXNlciB3aXRoIHB1YmxpY0lkICR7cHVibGljSWR9IG5vdCBmb3VuZGApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB1c2VyO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmluZE9uZUJ5VXNlcm5hbWUodXNlcm5hbWU6IHN0cmluZyk6IFByb21pc2U8VXNlciB8IG51bGw+IHtcclxuICAgIHJldHVybiB0aGlzLnVzZXJzUmVwb3NpdG9yeS5maW5kT25lKHsgd2hlcmU6IHsgdXNlcm5hbWUgfSB9KTtcclxuICB9XHJcblxyXG4gIC8vIDQuIOC5geC4geC5ieC5hOC4guC4guC5ieC4reC4oeC4ueC4pVxyXG4gIGFzeW5jIHVwZGF0ZSh1dWlkOiBzdHJpbmcsIHVwZGF0ZVVzZXJEdG86IFVwZGF0ZVVzZXJEdG8pOiBQcm9taXNlPFVzZXI+IHtcclxuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmZpbmRPbmVCeVV1aWQodXVpZCk7XHJcblxyXG4gICAgaWYgKHVwZGF0ZVVzZXJEdG8ucGFzc3dvcmQpIHtcclxuICAgICAgY29uc3Qgc2FsdCA9IGF3YWl0IGJjcnlwdC5nZW5TYWx0KCk7XHJcbiAgICAgIHVwZGF0ZVVzZXJEdG8ucGFzc3dvcmQgPSBhd2FpdCBiY3J5cHQuaGFzaCh1cGRhdGVVc2VyRHRvLnBhc3N3b3JkLCBzYWx0KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBRFItMDE5OiBSZXNvbHZlIFVVSUTihpJJTlQgZm9yIHByaW1hcnlPcmdhbml6YXRpb25JZCBiZWZvcmUgbWVyZ2VcclxuICAgIGNvbnN0IHJlc29sdmVkRHRvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgLi4udXBkYXRlVXNlckR0byB9O1xyXG4gICAgaWYgKHVwZGF0ZVVzZXJEdG8ucHJpbWFyeU9yZ2FuaXphdGlvbklkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmVzb2x2ZWREdG8ucHJpbWFyeU9yZ2FuaXphdGlvbklkID1cclxuICAgICAgICBhd2FpdCB0aGlzLnV1aWRSZXNvbHZlci5yZXNvbHZlT3JnYW5pemF0aW9uSWQoXHJcbiAgICAgICAgICB1cGRhdGVVc2VyRHRvLnByaW1hcnlPcmdhbml6YXRpb25JZFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdXBkYXRlZFVzZXIgPSB0aGlzLnVzZXJzUmVwb3NpdG9yeS5tZXJnZShcclxuICAgICAgdXNlcixcclxuICAgICAgcmVzb2x2ZWREdG8gYXMgUGFydGlhbDxVc2VyPlxyXG4gICAgKTtcclxuICAgIGNvbnN0IHNhdmVkVXNlciA9IGF3YWl0IHRoaXMudXNlcnNSZXBvc2l0b3J5LnNhdmUodXBkYXRlZFVzZXIpO1xyXG5cclxuICAgIC8vIOKaoO+4jyDguKrguLPguITguLHguI06IOC5gOC4oeC4t+C5iOC4reC4oeC4teC4geC4suC4o+C5geC4geC5ieC5hOC4guC4guC5ieC4reC4oeC4ueC4pSBVc2VyIOC4leC5ieC4reC4h+C5gOC4hOC4peC4teC4ouC4o+C5jCBDYWNoZSDguKrguLTguJfguJjguLTguYzguYDguKrguKHguK1cclxuICAgIGF3YWl0IHRoaXMuY2xlYXJVc2VyQ2FjaGUodXNlci51c2VyX2lkKTtcclxuXHJcbiAgICByZXR1cm4gc2F2ZWRVc2VyO1xyXG4gIH1cclxuXHJcbiAgLy8gNS4g4Lil4Lia4Lic4Li54LmJ4LmD4LiK4LmJIChTb2Z0IERlbGV0ZSlcclxuICBhc3luYyByZW1vdmUodXVpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5maW5kT25lQnlVdWlkKHV1aWQpO1xyXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy51c2Vyc1JlcG9zaXRvcnkuc29mdERlbGV0ZSh1c2VyLnVzZXJfaWQpO1xyXG5cclxuICAgIGlmIChyZXN1bHQuYWZmZWN0ZWQgPT09IDApIHtcclxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBVc2VyIHdpdGggVVVJRCAke3V1aWR9IG5vdCBmb3VuZGApO1xyXG4gICAgfVxyXG4gICAgLy8g4LmA4LiE4Lil4Li14Lii4Lij4LmMIENhY2hlIOC5gOC4oeC4t+C5iOC4reC4peC4mlxyXG4gICAgYXdhaXQgdGhpcy5jbGVhclVzZXJDYWNoZSh1c2VyLnVzZXJfaWQpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmluZERvY0NvbnRyb2xJZEJ5T3JnKG9yZ2FuaXphdGlvbklkOiBudW1iZXIpOiBQcm9taXNlPG51bWJlciB8IG51bGw+IHtcclxuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLnVzZXJzUmVwb3NpdG9yeS5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgcHJpbWFyeU9yZ2FuaXphdGlvbklkOiBvcmdhbml6YXRpb25JZCB9LFxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdXNlciA/IHVzZXIudXNlcl9pZCA6IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDinIUg4LiU4Li24LiH4Liq4Li04LiX4LiY4Li04LmMIChQZXJtaXNzaW9uKSDguYLguJTguKLguYPguIrguYkgQ2FjaGluZyBTdHJhdGVneVxyXG4gICAqIFRUTDogMzAg4LiZ4Liy4LiX4Li1ICjguJXguLLguKEgUmVxdWlyZW1lbnQgNi41LjIpXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0VXNlclBlcm1pc3Npb25zKHVzZXJJZDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xyXG4gICAgY29uc3QgY2FjaGVLZXkgPSBgcGVybWlzc2lvbnM6dXNlcjoke3VzZXJJZH1gO1xyXG5cclxuICAgIC8vIDEuIOC4peC4reC4h+C4lOC4tuC4h+C4iOC4suC4gSBDYWNoZSDguIHguYjguK3guJlcclxuICAgIGNvbnN0IGNhY2hlZFBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy5jYWNoZU1hbmFnZXIuZ2V0PHN0cmluZ1tdPihjYWNoZUtleSk7XHJcbiAgICBpZiAoY2FjaGVkUGVybWlzc2lvbnMpIHtcclxuICAgICAgcmV0dXJuIGNhY2hlZFBlcm1pc3Npb25zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDIuIOC4luC5ieC4suC5hOC4oeC5iOC4oeC4teC5g+C4mSBDYWNoZSDguYPguKvguYkgUXVlcnkg4LiI4Liy4LiBIERCIChWaWV3OiB2X3VzZXJfYWxsX3Blcm1pc3Npb25zKVxyXG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSBhd2FpdCB0aGlzLnVzZXJzUmVwb3NpdG9yeS5xdWVyeTxcclxuICAgICAgeyBwZXJtaXNzaW9uX25hbWU6IHN0cmluZyB9W11cclxuICAgID4oYFNFTEVDVCBwZXJtaXNzaW9uX25hbWUgRlJPTSB2X3VzZXJfYWxsX3Blcm1pc3Npb25zIFdIRVJFIHVzZXJfaWQgPSA/YCwgW1xyXG4gICAgICB1c2VySWQsXHJcbiAgICBdKTtcclxuXHJcbiAgICBjb25zdCBwZXJtaXNzaW9uTGlzdCA9IHBlcm1pc3Npb25zLm1hcCgocm93KSA9PiByb3cucGVybWlzc2lvbl9uYW1lKTtcclxuXHJcbiAgICAvLyAzLiDguJrguLHguJnguJfguLbguIHguKXguIcgQ2FjaGUgKFRUTCAxODAwIOC4p+C4tOC4meC4suC4l+C4tSA9IDMwIOC4meC4suC4l+C4tSlcclxuICAgIGF3YWl0IHRoaXMuY2FjaGVNYW5hZ2VyLnNldChjYWNoZUtleSwgcGVybWlzc2lvbkxpc3QsIDE4MDAgKiAxMDAwKTtcclxuXHJcbiAgICByZXR1cm4gcGVybWlzc2lvbkxpc3Q7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0gUm9sZXMgJiBQZXJtaXNzaW9ucyAoSGVscGVyIGZvciBBZG1pbi9VSSkgLS0tXHJcblxyXG4gIGFzeW5jIGZpbmRBbGxSb2xlcygpOiBQcm9taXNlPFJvbGVbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucm9sZVJlcG9zaXRvcnkuZmluZCh7IHJlbGF0aW9uczogWydwZXJtaXNzaW9ucyddIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmluZEFsbFBlcm1pc3Npb25zKCk6IFByb21pc2U8UGVybWlzc2lvbltdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9uUmVwb3NpdG9yeS5maW5kKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGRhdGVSb2xlUGVybWlzc2lvbnMocm9sZUlkOiBudW1iZXIsIHBlcm1pc3Npb25JZHM6IG51bWJlcltdKSB7XHJcbiAgICBjb25zdCByb2xlID0gYXdhaXQgdGhpcy5yb2xlUmVwb3NpdG9yeS5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgcm9sZUlkIH0sXHJcbiAgICAgIHJlbGF0aW9uczogWydwZXJtaXNzaW9ucyddLFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCFyb2xlKSB7XHJcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgUm9sZSBJRCAke3JvbGVJZH0gbm90IGZvdW5kYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTG9hZCBwZXJtaXNzaW9ucyBlbnRpdGllc1xyXG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSBbXTtcclxuICAgIGlmIChwZXJtaXNzaW9uSWRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgLy8gTm90ZTogZmluZEJ5SWRzIGlzIGRlcHJlY2F0ZWQgaW4gbmV3ZXIgVHlwZU9STSwgdXNlcyBJbigpIGluc3RlYWRcclxuICAgICAgLy8gYnV0IGlmIGN1cnJlbnQgdmVyc2lvbiBzdXBwb3J0cyBpdCBvciB1c2luZyBhIHNpbXBsaWZpZWQgcXVlcnk6XHJcbiAgICAgIGNvbnN0IHBlcm1zID0gYXdhaXQgdGhpcy5wZXJtaXNzaW9uUmVwb3NpdG9yeVxyXG4gICAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoJ3AnKVxyXG4gICAgICAgIC53aGVyZSgncC5wZXJtaXNzaW9uSWQgSU4gKDouLi5pZHMpJywgeyBpZHM6IHBlcm1pc3Npb25JZHMgfSlcclxuICAgICAgICAuZ2V0TWFueSgpO1xyXG4gICAgICBwZXJtaXNzaW9ucy5wdXNoKC4uLnBlcm1zKTtcclxuICAgIH1cclxuXHJcbiAgICByb2xlLnBlcm1pc3Npb25zID0gcGVybWlzc2lvbnM7XHJcbiAgICByZXR1cm4gdGhpcy5yb2xlUmVwb3NpdG9yeS5zYXZlKHJvbGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGVscGVyIOC4quC4s+C4q+C4o+C4seC4muC4peC5ieC4suC4hyBDYWNoZSDguYDguKHguLfguYjguK3guKHguLXguIHguLLguKPguYDguJvguKXguLXguYjguKLguJnguYHguJvguKXguIfguKrguLTguJfguJjguLTguYzguKvguKPguLfguK3guJrguJfguJrguLLguJdcclxuICAgKi9cclxuICBhc3luYyBjbGVhclVzZXJDYWNoZSh1c2VySWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5jYWNoZU1hbmFnZXIuZGVsKGBwZXJtaXNzaW9uczp1c2VyOiR7dXNlcklkfWApO1xyXG4gIH1cclxufVxyXG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c1/userservice_c15380ec5ccdd36a7c9db129b5db65c9.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c1/userservice_c15380ec5ccdd36a7c9db129b5db65c9.map new file mode 100644 index 0000000..d4e5743 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c1/userservice_c15380ec5ccdd36a7c9db129b5db65c9.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\user.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\user.service.ts"],"sourcesContent":["// File: src/modules/user/user.service.ts\r\n// บันทึกการแก้ไข: แก้ไข Error TS1272 โดยใช้ 'import type' สำหรับ Cache interface (T1.3)\r\n\r\nimport {\r\n Injectable,\r\n NotFoundException,\r\n ConflictException,\r\n Inject,\r\n} from '@nestjs/common';\r\nimport { InjectRepository } from '@nestjs/typeorm';\r\nimport { Repository } from 'typeorm';\r\nimport { CACHE_MANAGER } from '@nestjs/cache-manager';\r\nimport type { Cache } from 'cache-manager'; // ✅ FIX: เพิ่ม 'type' ตรงนี้\r\nimport * as bcrypt from 'bcrypt';\r\nimport { User } from './entities/user.entity';\r\nimport { Role } from './entities/role.entity';\r\nimport { Permission } from './entities/permission.entity';\r\nimport { CreateUserDto } from './dto/create-user.dto';\r\nimport { UpdateUserDto } from './dto/update-user.dto';\r\nimport { SearchUserDto } from './dto/search-user.dto';\r\nimport { UuidResolverService } from '../../common/services/uuid-resolver.service';\r\n\r\n@Injectable()\r\nexport class UserService {\r\n constructor(\r\n @InjectRepository(User)\r\n private usersRepository: Repository,\r\n @InjectRepository(Role)\r\n private roleRepository: Repository,\r\n @InjectRepository(Permission)\r\n private permissionRepository: Repository,\r\n @Inject(CACHE_MANAGER) private cacheManager: Cache,\r\n private uuidResolver: UuidResolverService\r\n ) {}\r\n\r\n // 1. สร้างผู้ใช้ (Hash Password ก่อนบันทึก)\r\n async create(createUserDto: CreateUserDto): Promise {\r\n const salt = await bcrypt.genSalt();\r\n const hashedPassword = await bcrypt.hash(createUserDto.password, salt);\r\n\r\n // ADR-019: Resolve UUID→INT for primaryOrganizationId\r\n const resolvedOrgId = createUserDto.primaryOrganizationId\r\n ? await this.uuidResolver.resolveOrganizationId(\r\n createUserDto.primaryOrganizationId\r\n )\r\n : undefined;\r\n\r\n const newUser = this.usersRepository.create({\r\n ...createUserDto,\r\n primaryOrganizationId: resolvedOrgId,\r\n password: hashedPassword,\r\n });\r\n\r\n try {\r\n return await this.usersRepository.save(newUser);\r\n } catch (error: unknown) {\r\n const dbError = error as { code?: string };\r\n if (dbError.code === 'ER_DUP_ENTRY') {\r\n throw new ConflictException('Username or Email already exists');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n // 2. ดึงข้อมูลทั้งหมด (Search & Pagination)\r\n async findAll(params?: SearchUserDto): Promise<{\r\n data: User[];\r\n total: number;\r\n page: number;\r\n limit: number;\r\n totalPages: number;\r\n }> {\r\n const {\r\n search,\r\n roleId,\r\n primaryOrganizationId,\r\n page = 1,\r\n limit = 100,\r\n } = params || {};\r\n\r\n // Create query builder\r\n const query = this.usersRepository\r\n .createQueryBuilder('user')\r\n .leftJoinAndSelect('user.preference', 'preference') // Optional\r\n .leftJoinAndSelect('user.assignments', 'assignments')\r\n .leftJoinAndSelect('assignments.role', 'role')\r\n .leftJoinAndSelect('user.organization', 'organization') // [FIX] Required for primaryOrganizationPublicId getter (ADR-019)\r\n .select([\r\n 'user.user_id',\r\n 'user.publicId',\r\n 'user.username',\r\n 'user.email',\r\n 'user.firstName',\r\n 'user.lastName',\r\n 'user.lineId',\r\n 'user.isActive',\r\n 'user.createdAt',\r\n 'user.updatedAt',\r\n 'assignments.id',\r\n 'role.roleId',\r\n 'role.roleName',\r\n 'organization.publicId', // [FIX] Expose org UUID for getter (ADR-019)\r\n ]);\r\n\r\n // Apply Filters\r\n if (search) {\r\n query.andWhere(\r\n '(user.username LIKE :search OR user.email LIKE :search OR user.firstName LIKE :search OR user.lastName LIKE :search)',\r\n { search: `%${search}%` }\r\n );\r\n }\r\n\r\n if (primaryOrganizationId) {\r\n // ADR-019: Resolve UUID→INT for filtering\r\n const resolvedOrgId = await this.uuidResolver.resolveOrganizationId(\r\n primaryOrganizationId\r\n );\r\n query.andWhere('user.primaryOrganizationId = :orgId', {\r\n orgId: resolvedOrgId,\r\n });\r\n }\r\n\r\n if (roleId) {\r\n query.andWhere('role.roleId = :roleId', { roleId });\r\n }\r\n\r\n // Pagination\r\n query.skip((page - 1) * limit).take(limit);\r\n\r\n const [data, total] = await query.getManyAndCount();\r\n\r\n return {\r\n data,\r\n total,\r\n page,\r\n limit,\r\n totalPages: Math.ceil(total / limit),\r\n };\r\n }\r\n\r\n // 3. ดึงข้อมูลรายคน\r\n async findOne(id: number): Promise {\r\n const user = await this.usersRepository.findOne({\r\n where: { user_id: id },\r\n relations: [\r\n 'preference',\r\n 'assignments',\r\n 'assignments.role',\r\n 'assignments.role.permissions', // [FIX] Required for RBAC AbilityFactory\r\n 'organization', // [FIX] Required for primaryOrganizationPublicId getter (ADR-019)\r\n ],\r\n });\r\n\r\n if (!user) {\r\n throw new NotFoundException(`User with ID ${id} not found`);\r\n }\r\n\r\n return user;\r\n }\r\n\r\n async findOneByUuid(publicId: string): Promise {\r\n const user = await this.usersRepository.findOne({\r\n where: { publicId },\r\n relations: [\r\n 'preference',\r\n 'assignments',\r\n 'assignments.role',\r\n 'assignments.role.permissions',\r\n 'organization', // [FIX] Required for primaryOrganizationPublicId getter (ADR-019)\r\n ],\r\n });\r\n\r\n if (!user) {\r\n throw new NotFoundException(`User with publicId ${publicId} not found`);\r\n }\r\n\r\n return user;\r\n }\r\n\r\n async findOneByUsername(username: string): Promise {\r\n return this.usersRepository.findOne({ where: { username } });\r\n }\r\n\r\n // 4. แก้ไขข้อมูล\r\n async update(uuid: string, updateUserDto: UpdateUserDto): Promise {\r\n const user = await this.findOneByUuid(uuid);\r\n\r\n if (updateUserDto.password) {\r\n const salt = await bcrypt.genSalt();\r\n updateUserDto.password = await bcrypt.hash(updateUserDto.password, salt);\r\n }\r\n\r\n // ADR-019: Resolve UUID→INT for primaryOrganizationId before merge\r\n const resolvedDto: Record = { ...updateUserDto };\r\n if (updateUserDto.primaryOrganizationId !== undefined) {\r\n resolvedDto.primaryOrganizationId =\r\n await this.uuidResolver.resolveOrganizationId(\r\n updateUserDto.primaryOrganizationId\r\n );\r\n }\r\n\r\n const updatedUser = this.usersRepository.merge(\r\n user,\r\n resolvedDto as Partial\r\n );\r\n const savedUser = await this.usersRepository.save(updatedUser);\r\n\r\n // ⚠️ สำคัญ: เมื่อมีการแก้ไขข้อมูล User ต้องเคลียร์ Cache สิทธิ์เสมอ\r\n await this.clearUserCache(user.user_id);\r\n\r\n return savedUser;\r\n }\r\n\r\n // 5. ลบผู้ใช้ (Soft Delete)\r\n async remove(uuid: string): Promise {\r\n const user = await this.findOneByUuid(uuid);\r\n const result = await this.usersRepository.softDelete(user.user_id);\r\n\r\n if (result.affected === 0) {\r\n throw new NotFoundException(`User with UUID ${uuid} not found`);\r\n }\r\n // เคลียร์ Cache เมื่อลบ\r\n await this.clearUserCache(user.user_id);\r\n }\r\n\r\n async findDocControlIdByOrg(organizationId: number): Promise {\r\n const user = await this.usersRepository.findOne({\r\n where: { primaryOrganizationId: organizationId },\r\n });\r\n return user ? user.user_id : null;\r\n }\r\n\r\n /**\r\n * ✅ ดึงสิทธิ์ (Permission) โดยใช้ Caching Strategy\r\n * TTL: 30 นาที (ตาม Requirement 6.5.2)\r\n */\r\n async getUserPermissions(userId: number): Promise {\r\n const cacheKey = `permissions:user:${userId}`;\r\n\r\n // 1. ลองดึงจาก Cache ก่อน\r\n const cachedPermissions = await this.cacheManager.get(cacheKey);\r\n if (cachedPermissions) {\r\n return cachedPermissions;\r\n }\r\n\r\n // 2. ถ้าไม่มีใน Cache ให้ Query จาก DB (View: v_user_all_permissions)\r\n const permissions = await this.usersRepository.query<\r\n { permission_name: string }[]\r\n >(`SELECT permission_name FROM v_user_all_permissions WHERE user_id = ?`, [\r\n userId,\r\n ]);\r\n\r\n const permissionList = permissions.map((row) => row.permission_name);\r\n\r\n // 3. บันทึกลง Cache (TTL 1800 วินาที = 30 นาที)\r\n await this.cacheManager.set(cacheKey, permissionList, 1800 * 1000);\r\n\r\n return permissionList;\r\n }\r\n\r\n // --- Roles & Permissions (Helper for Admin/UI) ---\r\n\r\n async findAllRoles(): Promise {\r\n return this.roleRepository.find({ relations: ['permissions'] });\r\n }\r\n\r\n async findAllPermissions(): Promise {\r\n return this.permissionRepository.find();\r\n }\r\n\r\n async updateRolePermissions(roleId: number, permissionIds: number[]) {\r\n const role = await this.roleRepository.findOne({\r\n where: { roleId },\r\n relations: ['permissions'],\r\n });\r\n\r\n if (!role) {\r\n throw new NotFoundException(`Role ID ${roleId} not found`);\r\n }\r\n\r\n // Load permissions entities\r\n const permissions = [];\r\n if (permissionIds.length > 0) {\r\n // Note: findByIds is deprecated in newer TypeORM, uses In() instead\r\n // but if current version supports it or using a simplified query:\r\n const perms = await this.permissionRepository\r\n .createQueryBuilder('p')\r\n .where('p.permissionId IN (:...ids)', { ids: permissionIds })\r\n .getMany();\r\n permissions.push(...perms);\r\n }\r\n\r\n role.permissions = permissions;\r\n return this.roleRepository.save(role);\r\n }\r\n\r\n /**\r\n * Helper สำหรับล้าง Cache เมื่อมีการเปลี่ยนแปลงสิทธิ์หรือบทบาท\r\n */\r\n async clearUserCache(userId: number): Promise {\r\n await this.cacheManager.del(`permissions:user:${userId}`);\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c3/enqueuemigrationdto_c324a9895fd4c321ed46e358d6e90f1f b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c3/enqueuemigrationdto_c324a9895fd4c321ed46e358d6e90f1f new file mode 100644 index 0000000..c3affad --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c3/enqueuemigrationdto_c324a9895fd4c321ed46e358d6e90f1f @@ -0,0 +1,108 @@ +b59cb411d4f0e298d3ac75c2d063cc28 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EnqueueMigrationDto = void 0; +const class_validator_1 = require("class-validator"); +class EnqueueMigrationDto { +} +exports.EnqueueMigrationDto = EnqueueMigrationDto; +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], EnqueueMigrationDto.prototype, "documentNumber", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], EnqueueMigrationDto.prototype, "subject", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], EnqueueMigrationDto.prototype, "originalSubject", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], EnqueueMigrationDto.prototype, "body", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], EnqueueMigrationDto.prototype, "category", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], EnqueueMigrationDto.prototype, "aiSummary", void 0); +__decorate([ + (0, class_validator_1.IsNumber)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], EnqueueMigrationDto.prototype, "projectId", void 0); +__decorate([ + (0, class_validator_1.IsNumber)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], EnqueueMigrationDto.prototype, "senderOrgId", void 0); +__decorate([ + (0, class_validator_1.IsNumber)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], EnqueueMigrationDto.prototype, "receiverOrgId", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], EnqueueMigrationDto.prototype, "issuedDate", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], EnqueueMigrationDto.prototype, "receivedDate", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], EnqueueMigrationDto.prototype, "remarks", void 0); +__decorate([ + (0, class_validator_1.IsArray)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Array) +], EnqueueMigrationDto.prototype, "extractedTags", void 0); +__decorate([ + (0, class_validator_1.IsOptional)(), + __metadata("design:type", typeof (_a = typeof Record !== "undefined" && Record) === "function" ? _a : Object) +], EnqueueMigrationDto.prototype, "details", void 0); +__decorate([ + (0, class_validator_1.IsNumber)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], EnqueueMigrationDto.prototype, "tempAttachmentId", void 0); +__decorate([ + (0, class_validator_1.IsBoolean)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Boolean) +], EnqueueMigrationDto.prototype, "isValid", void 0); +__decorate([ + (0, class_validator_1.IsNumber)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], EnqueueMigrationDto.prototype, "confidence", void 0); +__decorate([ + (0, class_validator_1.IsArray)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Array) +], EnqueueMigrationDto.prototype, "aiIssues", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxkdG9cXGVucXVldWUtbWlncmF0aW9uLmR0by50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscURBT3lCO0FBRXpCLE1BQWEsbUJBQW1CO0NBdUUvQjtBQXZFRCxrREF1RUM7QUFwRUM7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7OzJEQUNXO0FBSXhCO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOztvREFDSTtBQUlqQjtJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7NERBQ1k7QUFJekI7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7O2lEQUNDO0FBSWQ7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7O3FEQUNLO0FBSWxCO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOztzREFDTTtBQUluQjtJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7c0RBQ007QUFJbkI7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7O3dEQUNRO0FBSXJCO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzswREFDVTtBQUl2QjtJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7dURBQ087QUFJcEI7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7O3lEQUNTO0FBSXRCO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOztvREFDSTtBQUlqQjtJQUZDLElBQUEseUJBQU8sR0FBRTtJQUNULElBQUEsNEJBQVUsR0FBRTs7MERBQzRCO0FBR3pDO0lBREMsSUFBQSw0QkFBVSxHQUFFO2tEQUNILE1BQU0sb0JBQU4sTUFBTTtvREFBa0I7QUFJbEM7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7OzZEQUNhO0FBSTFCO0lBRkMsSUFBQSwyQkFBUyxHQUFFO0lBQ1gsSUFBQSw0QkFBVSxHQUFFOztvREFDSztBQUlsQjtJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7dURBQ087QUFJcEI7SUFGQyxJQUFBLHlCQUFPLEdBQUU7SUFDVCxJQUFBLDRCQUFVLEdBQUU7O3FEQUN3QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxtaWdyYXRpb25cXGR0b1xcZW5xdWV1ZS1taWdyYXRpb24uZHRvLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgSXNTdHJpbmcsXHJcbiAgSXNOb3RFbXB0eSxcclxuICBJc09wdGlvbmFsLFxyXG4gIElzTnVtYmVyLFxyXG4gIElzQm9vbGVhbixcclxuICBJc0FycmF5LFxyXG59IGZyb20gJ2NsYXNzLXZhbGlkYXRvcic7XHJcblxyXG5leHBvcnQgY2xhc3MgRW5xdWV1ZU1pZ3JhdGlvbkR0byB7XHJcbiAgQElzU3RyaW5nKClcclxuICBASXNOb3RFbXB0eSgpXHJcbiAgZG9jdW1lbnROdW1iZXIhOiBzdHJpbmc7XHJcblxyXG4gIEBJc1N0cmluZygpXHJcbiAgQElzT3B0aW9uYWwoKVxyXG4gIHN1YmplY3Q/OiBzdHJpbmc7XHJcblxyXG4gIEBJc1N0cmluZygpXHJcbiAgQElzT3B0aW9uYWwoKVxyXG4gIG9yaWdpbmFsU3ViamVjdD86IHN0cmluZztcclxuXHJcbiAgQElzU3RyaW5nKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgYm9keT86IHN0cmluZztcclxuXHJcbiAgQElzU3RyaW5nKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgY2F0ZWdvcnk/OiBzdHJpbmc7XHJcblxyXG4gIEBJc1N0cmluZygpXHJcbiAgQElzT3B0aW9uYWwoKVxyXG4gIGFpU3VtbWFyeT86IHN0cmluZztcclxuXHJcbiAgQElzTnVtYmVyKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgcHJvamVjdElkPzogbnVtYmVyO1xyXG5cclxuICBASXNOdW1iZXIoKVxyXG4gIEBJc09wdGlvbmFsKClcclxuICBzZW5kZXJPcmdJZD86IG51bWJlcjtcclxuXHJcbiAgQElzTnVtYmVyKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgcmVjZWl2ZXJPcmdJZD86IG51bWJlcjtcclxuXHJcbiAgQElzU3RyaW5nKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgaXNzdWVkRGF0ZT86IHN0cmluZztcclxuXHJcbiAgQElzU3RyaW5nKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgcmVjZWl2ZWREYXRlPzogc3RyaW5nO1xyXG5cclxuICBASXNTdHJpbmcoKVxyXG4gIEBJc09wdGlvbmFsKClcclxuICByZW1hcmtzPzogc3RyaW5nO1xyXG5cclxuICBASXNBcnJheSgpXHJcbiAgQElzT3B0aW9uYWwoKVxyXG4gIGV4dHJhY3RlZFRhZ3M/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+W107XHJcblxyXG4gIEBJc09wdGlvbmFsKClcclxuICBkZXRhaWxzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcblxyXG4gIEBJc051bWJlcigpXHJcbiAgQElzT3B0aW9uYWwoKVxyXG4gIHRlbXBBdHRhY2htZW50SWQ/OiBudW1iZXI7XHJcblxyXG4gIEBJc0Jvb2xlYW4oKVxyXG4gIEBJc09wdGlvbmFsKClcclxuICBpc1ZhbGlkPzogYm9vbGVhbjtcclxuXHJcbiAgQElzTnVtYmVyKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgY29uZmlkZW5jZT86IG51bWJlcjtcclxuXHJcbiAgQElzQXJyYXkoKVxyXG4gIEBJc09wdGlvbmFsKClcclxuICBhaUlzc3Vlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XHJcbn1cclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c3/enqueuemigrationdto_c324a9895fd4c321ed46e358d6e90f1f.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c3/enqueuemigrationdto_c324a9895fd4c321ed46e358d6e90f1f.map new file mode 100644 index 0000000..1dcfb87 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c3/enqueuemigrationdto_c324a9895fd4c321ed46e358d6e90f1f.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\dto\\enqueue-migration.dto.ts","mappings":";;;;;;;;;;;;;AAAA,qDAOyB;AAEzB,MAAa,mBAAmB;CAuE/B;AAvED,kDAuEC;AApEC;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;2DACW;AAIxB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;oDACI;AAIjB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;4DACY;AAIzB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;iDACC;AAId;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;qDACK;AAIlB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;sDACM;AAInB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;sDACM;AAInB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;wDACQ;AAIrB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;0DACU;AAIvB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;uDACO;AAIpB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;yDACS;AAItB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;oDACI;AAIjB;IAFC,IAAA,yBAAO,GAAE;IACT,IAAA,4BAAU,GAAE;;0DAC4B;AAGzC;IADC,IAAA,4BAAU,GAAE;kDACH,MAAM,oBAAN,MAAM;oDAAkB;AAIlC;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;6DACa;AAI1B;IAFC,IAAA,2BAAS,GAAE;IACX,IAAA,4BAAU,GAAE;;oDACK;AAIlB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;uDACO;AAIpB;IAFC,IAAA,yBAAO,GAAE;IACT,IAAA,4BAAU,GAAE;;qDACwB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\dto\\enqueue-migration.dto.ts"],"sourcesContent":["import {\r\n IsString,\r\n IsNotEmpty,\r\n IsOptional,\r\n IsNumber,\r\n IsBoolean,\r\n IsArray,\r\n} from 'class-validator';\r\n\r\nexport class EnqueueMigrationDto {\r\n @IsString()\r\n @IsNotEmpty()\r\n documentNumber!: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n subject?: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n originalSubject?: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n body?: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n category?: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n aiSummary?: string;\r\n\r\n @IsNumber()\r\n @IsOptional()\r\n projectId?: number;\r\n\r\n @IsNumber()\r\n @IsOptional()\r\n senderOrgId?: number;\r\n\r\n @IsNumber()\r\n @IsOptional()\r\n receiverOrgId?: number;\r\n\r\n @IsString()\r\n @IsOptional()\r\n issuedDate?: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n receivedDate?: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n remarks?: string;\r\n\r\n @IsArray()\r\n @IsOptional()\r\n extractedTags?: Record[];\r\n\r\n @IsOptional()\r\n details?: Record;\r\n\r\n @IsNumber()\r\n @IsOptional()\r\n tempAttachmentId?: number;\r\n\r\n @IsBoolean()\r\n @IsOptional()\r\n isValid?: boolean;\r\n\r\n @IsNumber()\r\n @IsOptional()\r\n confidence?: number;\r\n\r\n @IsArray()\r\n @IsOptional()\r\n aiIssues?: Record[];\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c4/bulkcanceldto_c47afaa1afa58700a68f20020409a608 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c4/bulkcanceldto_c47afaa1afa58700a68f20020409a608 new file mode 100644 index 0000000..9b27ba1 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c4/bulkcanceldto_c47afaa1afa58700a68f20020409a608 @@ -0,0 +1,29 @@ +0dddd1ba96dd9d62bf4bdec40b2cf10d +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BulkCancelDto = void 0; +const class_validator_1 = require("class-validator"); +class BulkCancelDto { +} +exports.BulkCancelDto = BulkCancelDto; +__decorate([ + (0, class_validator_1.IsArray)(), + (0, class_validator_1.ArrayMinSize)(1), + (0, class_validator_1.IsUUID)('all', { each: true }), + __metadata("design:type", Array) +], BulkCancelDto.prototype, "uuids", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.MinLength)(3), + __metadata("design:type", String) +], BulkCancelDto.prototype, "reason", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGR0b1xcYnVsay1jYW5jZWwuZHRvLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLHFEQU15QjtBQUV6QixNQUFhLGFBQWE7Q0FTekI7QUFURCxzQ0FTQztBQUxDO0lBSEMsSUFBQSx5QkFBTyxHQUFFO0lBQ1QsSUFBQSw4QkFBWSxFQUFDLENBQUMsQ0FBQztJQUNmLElBQUEsd0JBQU0sRUFBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7OzRDQUNiO0FBSWpCO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSwyQkFBUyxFQUFDLENBQUMsQ0FBQzs7NkNBQ0ciLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGR0b1xcYnVsay1jYW5jZWwuZHRvLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgSXNBcnJheSxcclxuICBJc1N0cmluZyxcclxuICBJc1VVSUQsXHJcbiAgTWluTGVuZ3RoLFxyXG4gIEFycmF5TWluU2l6ZSxcclxufSBmcm9tICdjbGFzcy12YWxpZGF0b3InO1xyXG5cclxuZXhwb3J0IGNsYXNzIEJ1bGtDYW5jZWxEdG8ge1xyXG4gIEBJc0FycmF5KClcclxuICBAQXJyYXlNaW5TaXplKDEpXHJcbiAgQElzVVVJRCgnYWxsJywgeyBlYWNoOiB0cnVlIH0pXHJcbiAgdXVpZHMhOiBzdHJpbmdbXTtcclxuXHJcbiAgQElzU3RyaW5nKClcclxuICBATWluTGVuZ3RoKDMpXHJcbiAgcmVhc29uITogc3RyaW5nO1xyXG59XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c4/bulkcanceldto_c47afaa1afa58700a68f20020409a608.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c4/bulkcanceldto_c47afaa1afa58700a68f20020409a608.map new file mode 100644 index 0000000..f2ec4ff --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c4/bulkcanceldto_c47afaa1afa58700a68f20020409a608.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\bulk-cancel.dto.ts","mappings":";;;;;;;;;;;;AAAA,qDAMyB;AAEzB,MAAa,aAAa;CASzB;AATD,sCASC;AALC;IAHC,IAAA,yBAAO,GAAE;IACT,IAAA,8BAAY,EAAC,CAAC,CAAC;IACf,IAAA,wBAAM,EAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;4CACb;AAIjB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,2BAAS,EAAC,CAAC,CAAC;;6CACG","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\bulk-cancel.dto.ts"],"sourcesContent":["import {\r\n IsArray,\r\n IsString,\r\n IsUUID,\r\n MinLength,\r\n ArrayMinSize,\r\n} from 'class-validator';\r\n\r\nexport class BulkCancelDto {\r\n @IsArray()\r\n @ArrayMinSize(1)\r\n @IsUUID('all', { each: true })\r\n uuids!: string[];\r\n\r\n @IsString()\r\n @MinLength(3)\r\n reason!: string;\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c5/workflowdslschema_c5cabd3031f97b9263a01c5f89cb3919 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c5/workflowdslschema_c5cabd3031f97b9263a01c5f89cb3919 new file mode 100644 index 0000000..209d48a --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c5/workflowdslschema_c5cabd3031f97b9263a01c5f89cb3919 @@ -0,0 +1,177 @@ +411a67a13f336eca21179de534d0fa4a +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RFA_WORKFLOW_EXAMPLE = exports.WorkflowDslSchema = exports.TransitionSchema = exports.EffectSchema = exports.GuardSchema = void 0; +const zod_1 = require("zod"); +/** + * Zod Schema สำหรับ Workflow DSL + * ตาม ADR-001: Unified Workflow Engine + */ +// Guard Schema +exports.GuardSchema = zod_1.z.object({ + type: zod_1.z.enum(['permission', 'condition', 'script']), + config: zod_1.z.record(zod_1.z.string(), zod_1.z.any()), +}); +// Effect Schema +exports.EffectSchema = zod_1.z.object({ + type: zod_1.z.enum([ + 'update_status', + 'send_email', + 'send_line', + 'create_notification', + 'assign_user', + 'update_field', + ]), + config: zod_1.z.record(zod_1.z.string(), zod_1.z.any()), +}); +// Transition Schema +exports.TransitionSchema = zod_1.z.object({ + from: zod_1.z.string(), + to: zod_1.z.string(), + trigger: zod_1.z.string(), + label: zod_1.z.string().optional(), + guards: zod_1.z.array(exports.GuardSchema).optional(), + effects: zod_1.z.array(exports.EffectSchema).optional(), +}); +// Main Workflow DSL Schema +exports.WorkflowDslSchema = zod_1.z.object({ + name: zod_1.z.string().min(1, 'Workflow name is required'), + version: zod_1.z + .string() + .regex(/^\d+\.\d+(\.\d+)?$/, 'Version must be semver format (e.g., 1.0.0)'), + description: zod_1.z.string().optional(), + states: zod_1.z.array(zod_1.z.string()).min(1, 'At least one state is required'), + initialState: zod_1.z.string(), + finalStates: zod_1.z + .array(zod_1.z.string()) + .min(1, 'At least one final state is required'), + transitions: zod_1.z + .array(exports.TransitionSchema) + .min(1, 'At least one transition is required'), + metadata: zod_1.z.record(zod_1.z.string(), zod_1.z.any()).optional(), +}); +/** + * ตัวอย่าง RFA Workflow DSL + */ +exports.RFA_WORKFLOW_EXAMPLE = { + name: 'RFA_APPROVAL', + version: '1.0.0', + description: 'Request for Approval workflow for construction projects', + states: [ + 'DRAFT', + 'SUBMITTED', + 'UNDER_REVIEW', + 'APPROVED', + 'REJECTED', + 'REVISED', + ], + initialState: 'DRAFT', + finalStates: ['APPROVED', 'REJECTED'], + transitions: [ + { + from: 'DRAFT', + to: 'SUBMITTED', + trigger: 'SUBMIT', + label: 'Submit for approval', + guards: [ + { + type: 'permission', + config: { permission: 'rfa.submit' }, + }, + ], + effects: [ + { + type: 'update_status', + config: { status: 'SUBMITTED' }, + }, + { + type: 'send_email', + config: { + to: 'reviewer@example.com', + template: 'rfa_submitted', + }, + }, + ], + }, + { + from: 'SUBMITTED', + to: 'UNDER_REVIEW', + trigger: 'START_REVIEW', + label: 'Start review', + guards: [ + { + type: 'permission', + config: { permission: 'rfa.review' }, + }, + ], + }, + { + from: 'UNDER_REVIEW', + to: 'APPROVED', + trigger: 'APPROVE', + label: 'Approve', + guards: [ + { + type: 'permission', + config: { permission: 'rfa.approve' }, + }, + ], + effects: [ + { + type: 'update_status', + config: { status: 'APPROVED' }, + }, + { + type: 'create_notification', + config: { + message: 'RFA has been approved', + type: 'success', + }, + }, + ], + }, + { + from: 'UNDER_REVIEW', + to: 'REJECTED', + trigger: 'REJECT', + label: 'Reject', + guards: [ + { + type: 'permission', + config: { permission: 'rfa.approve' }, + }, + ], + effects: [ + { + type: 'update_status', + config: { status: 'REJECTED' }, + }, + ], + }, + { + from: 'UNDER_REVIEW', + to: 'REVISED', + trigger: 'REQUEST_REVISION', + label: 'Request revision', + effects: [ + { + type: 'create_notification', + config: { + message: 'Please revise and resubmit', + }, + }, + ], + }, + { + from: 'REVISED', + to: 'SUBMITTED', + trigger: 'RESUBMIT', + label: 'Resubmit after revision', + }, + ], + metadata: { + documentType: 'RFA', + estimatedDuration: '5 days', + }, +}; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcd29ya2Zsb3ctZW5naW5lXFxkc2xcXHdvcmtmbG93LWRzbC5zY2hlbWEudHMiLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQXdCO0FBRXhCOzs7R0FHRztBQUVILGVBQWU7QUFDRixRQUFBLFdBQVcsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2xDLElBQUksRUFBRSxPQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNuRCxNQUFNLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsT0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0NBQ3RDLENBQUMsQ0FBQztBQUlILGdCQUFnQjtBQUNILFFBQUEsWUFBWSxHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUM7SUFDbkMsSUFBSSxFQUFFLE9BQUMsQ0FBQyxJQUFJLENBQUM7UUFDWCxlQUFlO1FBQ2YsWUFBWTtRQUNaLFdBQVc7UUFDWCxxQkFBcUI7UUFDckIsYUFBYTtRQUNiLGNBQWM7S0FDZixDQUFDO0lBQ0YsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQUMsT0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLE9BQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztDQUN0QyxDQUFDLENBQUM7QUFJSCxvQkFBb0I7QUFDUCxRQUFBLGdCQUFnQixHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUM7SUFDdkMsSUFBSSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7SUFDaEIsRUFBRSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7SUFDZCxPQUFPLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtJQUNuQixLQUFLLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUM1QixNQUFNLEVBQUUsT0FBQyxDQUFDLEtBQUssQ0FBQyxtQkFBVyxDQUFDLENBQUMsUUFBUSxFQUFF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c3JjXFxtb2R1bGVzXFx3b3JrZmxvdy1lbmdpbmVcXGRzbFxcd29ya2Zsb3ctZHNsLnNjaGVtYS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuLyoqXG4gKiBab2QgU2NoZW1hIOC4quC4s+C4q+C4o+C4seC4miBXb3JrZmxvdyBEU0xcbiAqIOC4leC4suC4oSBBRFItMDAxOiBVbmlmaWVkIFdvcmtmbG93IEVuZ2luZVxuICovXG5cbi8vIEd1YXJkIFNjaGVtYVxuZXhwb3J0IGNvbnN0IEd1YXJkU2NoZW1hID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmVudW0oWydwZXJtaXNzaW9uJywgJ2NvbmRpdGlvbicsICdzY3JpcHQnXSksXG4gIGNvbmZpZzogei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSksXG59KTtcblxuZXhwb3J0IHR5cGUgV29ya2Zsb3dHdWFyZCA9IHouaW5mZXI8dHlwZW9mIEd1YXJkU2NoZW1hPjtcblxuLy8gRWZmZWN0IFNjaGVtYVxuZXhwb3J0IGNvbnN0IEVmZmVjdFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5lbnVtKFtcbiAgICAndXBkYXRlX3N0YXR1cycsXG4gICAgJ3NlbmRfZW1haWwnLFxuICAgICdzZW5kX2xpbmUnLFxuICAgICdjcmVhdGVfbm90aWZpY2F0aW9uJyxcbiAgICAnYXNzaWduX3VzZXInLFxuICAgICd1cGRhdGVfZmllbGQnLFxuICBdKSxcbiAgY29uZmlnOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKSxcbn0pO1xuXG5leHBvcnQgdHlwZSBXb3JrZmxvd0VmZmVjdCA9IHouaW5mZXI8dHlwZW9mIEVmZmVjdFNjaGVtYT47XG5cbi8vIFRyYW5zaXRpb24gU2NoZW1hXG5leHBvcnQgY29uc3QgVHJhbnNpdGlvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgZnJvbTogei5zdHJpbmcoKSxcbiAgdG86IHouc3RyaW5nKCksXG4gIHRyaWdnZXI6IHouc3RyaW5nKCksXG4gIGxhYmVsOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGd1YXJkczogei5hcnJheShHdWFyZFNjaGVtYSkub3B0aW9uYWwoKSxcbiAgZWZmZWN0czogei5hcnJheShFZmZlY3RTY2hlbWEpLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IHR5cGUgV29ya2Zsb3dUcmFuc2l0aW9uID0gei5pbmZlcjx0eXBlb2YgVHJhbnNpdGlvblNjaGVtYT47XG5cbi8vIE1haW4gV29ya2Zsb3cgRFNMIFNjaGVtYVxuZXhwb3J0IGNvbnN0IFdvcmtmbG93RHNsU2NoZW1hID0gei5vYmplY3Qoe1xuICBuYW1lOiB6LnN0cmluZygpLm1pbigxLCAnV29ya2Zsb3cgbmFtZSBpcyByZXF1aXJlZCcpLFxuICB2ZXJzaW9uOiB6XG4gICAgLnN0cmluZygpXG4gICAgLnJlZ2V4KC9eXFxkK1xcLlxcZCsoXFwuXFxkKyk/JC8sICdWZXJzaW9uIG11c3QgYmUgc2VtdmVyIGZvcm1hdCAoZS5nLiwgMS4wLjApJyksXG4gIGRlc2NyaXB0aW9uOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG5cbiAgc3RhdGVzOiB6LmFycmF5KHouc3RyaW5nKCkpLm1pbigxLCAnQXQgbGVhc3Qgb25lIHN0YXRlIGlzIHJlcXVpcmVkJyksXG5cbiAgaW5pdGlhbFN0YXRlOiB6LnN0cmluZygpLFxuXG4gIGZpbmFsU3RhdGVzOiB6XG4gICAgLmFycmF5KHouc3RyaW5nKCkpXG4gICAgLm1pbigxLCAnQXQgbGVhc3Qgb25lIGZpbmFsIHN0YXRlIGlzIHJlcXVpcmVkJyksXG5cbiAgdHJhbnNpdGlvbnM6IHpcbiAgICAuYXJyYXkoVHJhbnNpdGlvblNjaGVtYSlcbiAgICAubWluKDEsICdBdCBsZWFzdCBvbmUgdHJhbnNpdGlvbiBpcyByZXF1aXJlZCcpLFxuXG4gIG1ldGFkYXRhOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKS5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCB0eXBlIFdvcmtmbG93RHNsID0gei5pbmZlcjx0eXBlb2YgV29ya2Zsb3dEc2xTY2hlbWE+O1xuXG4vKipcbiAqIOC4leC4seC4p+C4reC4ouC5iOC4suC4hyBSRkEgV29ya2Zsb3cgRFNMXG4gKi9cbmV4cG9ydCBjb25zdCBSRkFfV09SS0ZMT1dfRVhBTVBMRTogV29ya2Zsb3dEc2wgPSB7XG4gIG5hbWU6ICdSRkFfQVBQUk9WQUwnLFxuICB2ZXJzaW9uOiAnMS4wLjAnLFxuICBkZXNjcmlwdGlvbjogJ1JlcXVlc3QgZm9yIEFwcHJvdmFsIHdvcmtmbG93IGZvciBjb25zdHJ1Y3Rpb24gcHJvamVjdHMnLFxuICBzdGF0ZXM6IFtcbiAgICAnRFJBRlQnLFxuICAgICdTVUJNSVRURUQnLFxuICAgICdVTkRFUl9SRVZJRVcnLFxuICAgICdBUFBST1ZFRCcsXG4gICAgJ1JFSkVDVEVEJyxcbiAgICAnUkVWSVNFRCcsXG4gIF0sXG4gIGluaXRpYWxTdGF0ZTogJ0RSQUZUJyxcbiAgZmluYWxTdGF0ZXM6IFsnQVBQUk9WRUQnLCAnUkVKRUNURUQnXSxcbiAgdHJhbnNpdGlvbnM6IFtcbiAgICB7XG4gICAgICBmcm9tOiAnRFJBRlQnLFxuICAgICAgdG86ICdTVUJNSVRURUQnLFxuICAgICAgdHJpZ2dlcjogJ1NVQk1JVCcsXG4gICAgICBsYWJlbDogJ1N1Ym1pdCBmb3IgYXBwcm92YWwnLFxuICAgICAgZ3VhcmRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncGVybWlzc2lvbicsXG4gICAgICAgICAgY29uZmlnOiB7IHBlcm1pc3Npb246ICdyZmEuc3VibWl0JyB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGVmZmVjdHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICd1cGRhdGVfc3RhdHVzJyxcbiAgICAgICAgICBjb25maWc6IHsgc3RhdHVzOiAnU1VCTUlUVEVEJyB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3NlbmRfZW1haWwnLFxuICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgdG86ICdyZXZpZXdlckBleGFtcGxlLmNvbScsXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJ3JmYV9zdWJtaXR0ZWQnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgZnJvbTogJ1NVQk1JVFRFRCcsXG4gICAgICB0bzogJ1VOREVSX1JFVklFVycsXG4gICAgICB0cmlnZ2VyOiAnU1RBUlRfUkVWSUVXJyxcbiAgICAgIGxhYmVsOiAnU3RhcnQgcmV2aWV3JyxcbiAgICAgIGd1YXJkczogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3Blcm1pc3Npb24nLFxuICAgICAgICAgIGNvbmZpZzogeyBwZXJtaXNzaW9uOiAncmZhLnJldmlldycgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBmcm9tOiAnVU5ERVJfUkVWSUVXJyxcbiAgICAgIHRvOiAnQVBQUk9WRUQnLFxuICAgICAgdHJpZ2dlcjogJ0FQUFJPVkUnLFxuICAgICAgbGFiZWw6ICdBcHByb3ZlJyxcbiAgICAgIGd1YXJkczogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3Blcm1pc3Npb24nLFxuICAgICAgICAgIGNvbmZpZzogeyBwZXJtaXNzaW9uOiAncmZhLmFwcHJvdmUnIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgZWZmZWN0czogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3VwZGF0ZV9zdGF0dXMnLFxuICAgICAgICAgIGNvbmZpZzogeyBzdGF0dXM6ICdBUFBST1ZFRCcgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdjcmVhdGVfbm90aWZpY2F0aW9uJyxcbiAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdSRkEgaGFzIGJlZW4gYXBwcm92ZWQnLFxuICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgZnJvbTogJ1VOREVSX1JFVklFVycsXG4gICAgICB0bzogJ1JFSkVDVEVEJyxcbiAgICAgIHRyaWdnZXI6ICdSRUpFQ1QnLFxuICAgICAgbGFiZWw6ICdSZWplY3QnLFxuICAgICAgZ3VhcmRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncGVybWlzc2lvbicsXG4gICAgICAgICAgY29uZmlnOiB7IHBlcm1pc3Npb246ICdyZmEuYXBwcm92ZScgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBlZmZlY3RzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAndXBkYXRlX3N0YXR1cycsXG4gICAgICAgICAgY29uZmlnOiB7IHN0YXR1czogJ1JFSkVDVEVEJyB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGZyb206ICdVTkRFUl9SRVZJRVcnLFxuICAgICAgdG86ICdSRVZJU0VEJyxcbiAgICAgIHRyaWdnZXI6ICdSRVFVRVNUX1JFVklTSU9OJyxcbiAgICAgIGxhYmVsOiAnUmVxdWVzdCByZXZpc2lvbicsXG4gICAgICBlZmZlY3RzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnY3JlYXRlX25vdGlmaWNhdGlvbicsXG4gICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICBtZXNzYWdlOiAnUGxlYXNlIHJldmlzZSBhbmQgcmVzdWJtaXQnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgZnJvbTogJ1JFVklTRUQnLFxuICAgICAgdG86ICdTVUJNSVRURUQnLFxuICAgICAgdHJpZ2dlcjogJ1JFU1VCTUlUJyxcbiAgICAgIGxhYmVsOiAnUmVzdWJtaXQgYWZ0ZXIgcmV2aXNpb24nLFxuICAgIH0sXG4gIF0sXG4gIG1ldGFkYXRhOiB7XG4gICAgZG9jdW1lbnRUeXBlOiAnUkZBJyxcbiAgICBlc3RpbWF0ZWREdXJhdGlvbjogJzUgZGF5cycsXG4gIH0sXG59O1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c5/workflowdslschema_c5cabd3031f97b9263a01c5f89cb3919.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c5/workflowdslschema_c5cabd3031f97b9263a01c5f89cb3919.map new file mode 100644 index 0000000..d86c819 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c5/workflowdslschema_c5cabd3031f97b9263a01c5f89cb3919.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\dsl\\workflow-dsl.schema.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\dsl\\workflow-dsl.schema.ts"],"sourcesContent":["import { z } from 'zod';\n\n/**\n * Zod Schema สำหรับ Workflow DSL\n * ตาม ADR-001: Unified Workflow Engine\n */\n\n// Guard Schema\nexport const GuardSchema = z.object({\n type: z.enum(['permission', 'condition', 'script']),\n config: z.record(z.string(), z.any()),\n});\n\nexport type WorkflowGuard = z.infer;\n\n// Effect Schema\nexport const EffectSchema = z.object({\n type: z.enum([\n 'update_status',\n 'send_email',\n 'send_line',\n 'create_notification',\n 'assign_user',\n 'update_field',\n ]),\n config: z.record(z.string(), z.any()),\n});\n\nexport type WorkflowEffect = z.infer;\n\n// Transition Schema\nexport const TransitionSchema = z.object({\n from: z.string(),\n to: z.string(),\n trigger: z.string(),\n label: z.string().optional(),\n guards: z.array(GuardSchema).optional(),\n effects: z.array(EffectSchema).optional(),\n});\n\nexport type WorkflowTransition = z.infer;\n\n// Main Workflow DSL Schema\nexport const WorkflowDslSchema = z.object({\n name: z.string().min(1, 'Workflow name is required'),\n version: z\n .string()\n .regex(/^\\d+\\.\\d+(\\.\\d+)?$/, 'Version must be semver format (e.g., 1.0.0)'),\n description: z.string().optional(),\n\n states: z.array(z.string()).min(1, 'At least one state is required'),\n\n initialState: z.string(),\n\n finalStates: z\n .array(z.string())\n .min(1, 'At least one final state is required'),\n\n transitions: z\n .array(TransitionSchema)\n .min(1, 'At least one transition is required'),\n\n metadata: z.record(z.string(), z.any()).optional(),\n});\n\nexport type WorkflowDsl = z.infer;\n\n/**\n * ตัวอย่าง RFA Workflow DSL\n */\nexport const RFA_WORKFLOW_EXAMPLE: WorkflowDsl = {\n name: 'RFA_APPROVAL',\n version: '1.0.0',\n description: 'Request for Approval workflow for construction projects',\n states: [\n 'DRAFT',\n 'SUBMITTED',\n 'UNDER_REVIEW',\n 'APPROVED',\n 'REJECTED',\n 'REVISED',\n ],\n initialState: 'DRAFT',\n finalStates: ['APPROVED', 'REJECTED'],\n transitions: [\n {\n from: 'DRAFT',\n to: 'SUBMITTED',\n trigger: 'SUBMIT',\n label: 'Submit for approval',\n guards: [\n {\n type: 'permission',\n config: { permission: 'rfa.submit' },\n },\n ],\n effects: [\n {\n type: 'update_status',\n config: { status: 'SUBMITTED' },\n },\n {\n type: 'send_email',\n config: {\n to: 'reviewer@example.com',\n template: 'rfa_submitted',\n },\n },\n ],\n },\n {\n from: 'SUBMITTED',\n to: 'UNDER_REVIEW',\n trigger: 'START_REVIEW',\n label: 'Start review',\n guards: [\n {\n type: 'permission',\n config: { permission: 'rfa.review' },\n },\n ],\n },\n {\n from: 'UNDER_REVIEW',\n to: 'APPROVED',\n trigger: 'APPROVE',\n label: 'Approve',\n guards: [\n {\n type: 'permission',\n config: { permission: 'rfa.approve' },\n },\n ],\n effects: [\n {\n type: 'update_status',\n config: { status: 'APPROVED' },\n },\n {\n type: 'create_notification',\n config: {\n message: 'RFA has been approved',\n type: 'success',\n },\n },\n ],\n },\n {\n from: 'UNDER_REVIEW',\n to: 'REJECTED',\n trigger: 'REJECT',\n label: 'Reject',\n guards: [\n {\n type: 'permission',\n config: { permission: 'rfa.approve' },\n },\n ],\n effects: [\n {\n type: 'update_status',\n config: { status: 'REJECTED' },\n },\n ],\n },\n {\n from: 'UNDER_REVIEW',\n to: 'REVISED',\n trigger: 'REQUEST_REVISION',\n label: 'Request revision',\n effects: [\n {\n type: 'create_notification',\n config: {\n message: 'Please revise and resubmit',\n },\n },\n ],\n },\n {\n from: 'REVISED',\n to: 'SUBMITTED',\n trigger: 'RESUBMIT',\n label: 'Resubmit after revision',\n },\n ],\n metadata: {\n documentType: 'RFA',\n estimatedDuration: '5 days',\n },\n};\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c7/updatecorrespondencedto_c7dbe840ed42bce7da58582be522689e b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c7/updatecorrespondencedto_c7dbe840ed42bce7da58582be522689e new file mode 100644 index 0000000..33525d4 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c7/updatecorrespondencedto_c7dbe840ed42bce7da58582be522689e @@ -0,0 +1,10 @@ +3f303250fff028a002627814751b5293 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UpdateCorrespondenceDto = void 0; +const swagger_1 = require("@nestjs/swagger"); +const create_correspondence_dto_1 = require("./create-correspondence.dto"); +class UpdateCorrespondenceDto extends (0, swagger_1.PartialType)(create_correspondence_dto_1.CreateCorrespondenceDto) { +} +exports.UpdateCorrespondenceDto = UpdateCorrespondenceDto; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGR0b1xcdXBkYXRlLWNvcnJlc3BvbmRlbmNlLmR0by50cyIsIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBOEM7QUFDOUMsMkVBQXNFO0FBRXRFLE1BQWEsdUJBQXdCLFNBQVEsSUFBQSxxQkFBVyxFQUN0RCxtREFBdUIsQ0FDeEI7Q0FBRztBQUZKLDBEQUVJIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGNvcnJlc3BvbmRlbmNlXFxkdG9cXHVwZGF0ZS1jb3JyZXNwb25kZW5jZS5kdG8udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGFydGlhbFR5cGUgfSBmcm9tICdAbmVzdGpzL3N3YWdnZXInO1xuaW1wb3J0IHsgQ3JlYXRlQ29ycmVzcG9uZGVuY2VEdG8gfSBmcm9tICcuL2NyZWF0ZS1jb3JyZXNwb25kZW5jZS5kdG8nO1xuXG5leHBvcnQgY2xhc3MgVXBkYXRlQ29ycmVzcG9uZGVuY2VEdG8gZXh0ZW5kcyBQYXJ0aWFsVHlwZShcbiAgQ3JlYXRlQ29ycmVzcG9uZGVuY2VEdG9cbikge31cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c7/updatecorrespondencedto_c7dbe840ed42bce7da58582be522689e.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c7/updatecorrespondencedto_c7dbe840ed42bce7da58582be522689e.map new file mode 100644 index 0000000..3351160 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c7/updatecorrespondencedto_c7dbe840ed42bce7da58582be522689e.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\update-correspondence.dto.ts","mappings":";;;AAAA,6CAA8C;AAC9C,2EAAsE;AAEtE,MAAa,uBAAwB,SAAQ,IAAA,qBAAW,EACtD,mDAAuB,CACxB;CAAG;AAFJ,0DAEI","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\update-correspondence.dto.ts"],"sourcesContent":["import { PartialType } from '@nestjs/swagger';\nimport { CreateCorrespondenceDto } from './create-correspondence.dto';\n\nexport class UpdateCorrespondenceDto extends PartialType(\n CreateCorrespondenceDto\n) {}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c9/rfaapprovecodeentity_c9dcda1258d518107c11cd89006e9742 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c9/rfaapprovecodeentity_c9dcda1258d518107c11cd89006e9742 new file mode 100644 index 0000000..2eb6d6e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c9/rfaapprovecodeentity_c9dcda1258d518107c11cd89006e9742 @@ -0,0 +1,45 @@ +a0270716512918f9ee7c4efee47d37ba +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RfaApproveCode = void 0; +const typeorm_1 = require("typeorm"); +let RfaApproveCode = class RfaApproveCode { +}; +exports.RfaApproveCode = RfaApproveCode; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], RfaApproveCode.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'approve_code', length: 20, unique: true }), + __metadata("design:type", String) +], RfaApproveCode.prototype, "approveCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'approve_name', length: 100 }), + __metadata("design:type", String) +], RfaApproveCode.prototype, "approveName", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], RfaApproveCode.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sort_order', default: 0 }), + __metadata("design:type", Number) +], RfaApproveCode.prototype, "sortOrder", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true }), + __metadata("design:type", Boolean) +], RfaApproveCode.prototype, "isActive", void 0); +exports.RfaApproveCode = RfaApproveCode = __decorate([ + (0, typeorm_1.Entity)('rfa_approve_codes') +], RfaApproveCode); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccmZhXFxlbnRpdGllc1xccmZhLWFwcHJvdmUtY29kZS5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEscUNBQWlFO0FBRzFELElBQU0sY0FBYyxHQUFwQixNQUFNLGNBQWM7Q0FrQjFCLENBQUE7QUFsQlksd0NBQWM7QUFFekI7SUFEQyxJQUFBLGdDQUFzQixHQUFFOzswQ0FDYjtBQUdaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7bURBQ3RDO0FBR3JCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7O21EQUN6QjtBQUdyQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzttREFDcEI7QUFHckI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7aURBQ3hCO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7O2dEQUMxQjt5QkFqQlIsY0FBYztJQUQxQixJQUFBLGdCQUFNLEVBQUMsbUJBQW1CLENBQUM7R0FDZixjQUFjLENBa0IxQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxyZmFcXGVudGl0aWVzXFxyZmEtYXBwcm92ZS1jb2RlLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHksIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sIENvbHVtbiB9IGZyb20gJ3R5cGVvcm0nO1xuXG5ARW50aXR5KCdyZmFfYXBwcm92ZV9jb2RlcycpXG5leHBvcnQgY2xhc3MgUmZhQXBwcm92ZUNvZGUge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIGlkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnYXBwcm92ZV9jb2RlJywgbGVuZ3RoOiAyMCwgdW5pcXVlOiB0cnVlIH0pXG4gIGFwcHJvdmVDb2RlITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnYXBwcm92ZV9uYW1lJywgbGVuZ3RoOiAxMDAgfSlcbiAgYXBwcm92ZU5hbWUhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdzb3J0X29yZGVyJywgZGVmYXVsdDogMCB9KVxuICBzb3J0T3JkZXIhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdpc19hY3RpdmUnLCBkZWZhdWx0OiB0cnVlIH0pXG4gIGlzQWN0aXZlITogYm9vbGVhbjtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c9/rfaapprovecodeentity_c9dcda1258d518107c11cd89006e9742.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c9/rfaapprovecodeentity_c9dcda1258d518107c11cd89006e9742.map new file mode 100644 index 0000000..06f4aca --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/c9/rfaapprovecodeentity_c9dcda1258d518107c11cd89006e9742.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-approve-code.entity.ts","mappings":";;;;;;;;;;;;AAAA,qCAAiE;AAG1D,IAAM,cAAc,GAApB,MAAM,cAAc;CAkB1B,CAAA;AAlBY,wCAAc;AAEzB;IADC,IAAA,gCAAsB,GAAE;;0CACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;mDACtC;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;mDACzB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;mDACpB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;iDACxB;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;gDAC1B;yBAjBR,cAAc;IAD1B,IAAA,gBAAM,EAAC,mBAAmB,CAAC;GACf,cAAc,CAkB1B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-approve-code.entity.ts"],"sourcesContent":["import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';\n\n@Entity('rfa_approve_codes')\nexport class RfaApproveCode {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'approve_code', length: 20, unique: true })\n approveCode!: string;\n\n @Column({ name: 'approve_name', length: 100 })\n approveName!: string;\n\n @Column({ type: 'text', nullable: true })\n description?: string;\n\n @Column({ name: 'sort_order', default: 0 })\n sortOrder!: number;\n\n @Column({ name: 'is_active', default: true })\n isActive!: boolean;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d0/createmigrationerrordto_d08805f6bb42c0b63831872da96be2f9 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d0/createmigrationerrordto_d08805f6bb42c0b63831872da96be2f9 new file mode 100644 index 0000000..adc8170 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d0/createmigrationerrordto_d08805f6bb42c0b63831872da96be2f9 @@ -0,0 +1,46 @@ +8bb7fdaff06a8f8552c678ad1cb9c886 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CreateMigrationErrorDto = void 0; +const class_validator_1 = require("class-validator"); +const migration_error_entity_1 = require("../entities/migration-error.entity"); +class CreateMigrationErrorDto { +} +exports.CreateMigrationErrorDto = CreateMigrationErrorDto; +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], CreateMigrationErrorDto.prototype, "batchId", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], CreateMigrationErrorDto.prototype, "documentNumber", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + (0, class_validator_1.IsEnum)(migration_error_entity_1.MigrationErrorType), + __metadata("design:type", typeof (_a = typeof migration_error_entity_1.MigrationErrorType !== "undefined" && migration_error_entity_1.MigrationErrorType) === "function" ? _a : Object) +], CreateMigrationErrorDto.prototype, "errorType", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], CreateMigrationErrorDto.prototype, "errorMessage", void 0); +__decorate([ + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], CreateMigrationErrorDto.prototype, "rawAiResponse", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxkdG9cXGNyZWF0ZS1taWdyYXRpb24tZXJyb3IuZHRvLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFBK0Q7QUFDL0QsK0VBQXdFO0FBRXhFLE1BQWEsdUJBQXVCO0NBcUJuQztBQXJCRCwwREFxQkM7QUFsQkM7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7O3dEQUNJO0FBSWpCO0lBRkMsSUFBQSwwQkFBUSxHQUFFO0lBQ1YsSUFBQSw0QkFBVSxHQUFFOzsrREFDVztBQUt4QjtJQUhDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTtJQUNaLElBQUEsd0JBQU0sRUFBQywyQ0FBa0IsQ0FBQztrREFDZiwyQ0FBa0Isb0JBQWxCLDJDQUFrQjswREFBQztBQUkvQjtJQUZDLElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7NkRBQ1M7QUFJdEI7SUFGQyxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7OzhEQUNVIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXG1pZ3JhdGlvblxcZHRvXFxjcmVhdGUtbWlncmF0aW9uLWVycm9yLmR0by50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJc1N0cmluZywgSXNPcHRpb25hbCwgSXNFbnVtIH0gZnJvbSAnY2xhc3MtdmFsaWRhdG9yJztcclxuaW1wb3J0IHsgTWlncmF0aW9uRXJyb3JUeXBlIH0gZnJvbSAnLi4vZW50aXRpZXMvbWlncmF0aW9uLWVycm9yLmVudGl0eSc7XHJcblxyXG5leHBvcnQgY2xhc3MgQ3JlYXRlTWlncmF0aW9uRXJyb3JEdG8ge1xyXG4gIEBJc1N0cmluZygpXHJcbiAgQElzT3B0aW9uYWwoKVxyXG4gIGJhdGNoSWQ/OiBzdHJpbmc7XHJcblxyXG4gIEBJc1N0cmluZygpXHJcbiAgQElzT3B0aW9uYWwoKVxyXG4gIGRvY3VtZW50TnVtYmVyPzogc3RyaW5nO1xyXG5cclxuICBASXNTdHJpbmcoKVxyXG4gIEBJc09wdGlvbmFsKClcclxuICBASXNFbnVtKE1pZ3JhdGlvbkVycm9yVHlwZSlcclxuICBlcnJvclR5cGU/OiBNaWdyYXRpb25FcnJvclR5cGU7XHJcblxyXG4gIEBJc1N0cmluZygpXHJcbiAgQElzT3B0aW9uYWwoKVxyXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcclxuXHJcbiAgQElzU3RyaW5nKClcclxuICBASXNPcHRpb25hbCgpXHJcbiAgcmF3QWlSZXNwb25zZT86IHN0cmluZztcclxufVxyXG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d0/createmigrationerrordto_d08805f6bb42c0b63831872da96be2f9.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d0/createmigrationerrordto_d08805f6bb42c0b63831872da96be2f9.map new file mode 100644 index 0000000..83167c3 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d0/createmigrationerrordto_d08805f6bb42c0b63831872da96be2f9.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\dto\\create-migration-error.dto.ts","mappings":";;;;;;;;;;;;;AAAA,qDAA+D;AAC/D,+EAAwE;AAExE,MAAa,uBAAuB;CAqBnC;AArBD,0DAqBC;AAlBC;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;wDACI;AAIjB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;+DACW;AAKxB;IAHC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAM,EAAC,2CAAkB,CAAC;kDACf,2CAAkB,oBAAlB,2CAAkB;0DAAC;AAI/B;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;6DACS;AAItB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;8DACU","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\dto\\create-migration-error.dto.ts"],"sourcesContent":["import { IsString, IsOptional, IsEnum } from 'class-validator';\r\nimport { MigrationErrorType } from '../entities/migration-error.entity';\r\n\r\nexport class CreateMigrationErrorDto {\r\n @IsString()\r\n @IsOptional()\r\n batchId?: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n documentNumber?: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n @IsEnum(MigrationErrorType)\r\n errorType?: MigrationErrorType;\r\n\r\n @IsString()\r\n @IsOptional()\r\n errorMessage?: string;\r\n\r\n @IsString()\r\n @IsOptional()\r\n rawAiResponse?: string;\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d2/refreshtokenentity_d2abd8834c5a4b20225977edc2b18a0f b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d2/refreshtokenentity_d2abd8834c5a4b20225977edc2b18a0f new file mode 100644 index 0000000..dd99852 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d2/refreshtokenentity_d2abd8834c5a4b20225977edc2b18a0f @@ -0,0 +1,60 @@ +6262498f7a2d69edbdffbd9828e34069 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RefreshToken = void 0; +const typeorm_1 = require("typeorm"); +const user_entity_1 = require("../../../modules/user/entities/user.entity"); +let RefreshToken = class RefreshToken { +}; +exports.RefreshToken = RefreshToken; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)({ name: 'token_id' }), + __metadata("design:type", Number) +], RefreshToken.prototype, "tokenId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'user_id' }), + __metadata("design:type", Number) +], RefreshToken.prototype, "userId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'token_hash', length: 255 }), + __metadata("design:type", String) +], RefreshToken.prototype, "tokenHash", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'expires_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], RefreshToken.prototype, "expiresAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_revoked', default: false }), + __metadata("design:type", Boolean) +], RefreshToken.prototype, "isRevoked", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], RefreshToken.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], RefreshToken.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'replaced_by_token', nullable: true, length: 255 }), + __metadata("design:type", String) +], RefreshToken.prototype, "replacedByToken", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User, { onDelete: 'CASCADE' }), + (0, typeorm_1.JoinColumn)({ name: 'user_id' }), + __metadata("design:type", typeof (_d = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _d : Object) +], RefreshToken.prototype, "user", void 0); +exports.RefreshToken = RefreshToken = __decorate([ + (0, typeorm_1.Entity)('refresh_tokens') +], RefreshToken); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxhdXRoXFxlbnRpdGllc1xccmVmcmVzaC10b2tlbi5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFDQVFpQjtBQUNqQiw0RUFBa0U7QUFHM0QsSUFBTSxZQUFZLEdBQWxCLE1BQU0sWUFBWTtDQTZCeEIsQ0FBQTtBQTdCWSxvQ0FBWTtBQUV2QjtJQURDLElBQUEsZ0NBQXNCLEVBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUM7OzZDQUM1QjtBQUdqQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7NENBQ1o7QUFHaEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7K0NBQ3pCO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUNuQixJQUFJLG9CQUFKLElBQUk7K0NBQUM7QUFHakI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQzs7K0NBQzNCO0FBR3BCO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDN0IsSUFBSSxvQkFBSixJQUFJOytDQUFDO0FBR2pCO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDN0IsSUFBSSxvQkFBSixJQUFJOytDQUFDO0FBR2pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOztxREFDMUM7QUFLekI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsa0JBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUM5QyxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7a0RBQ3pCLGtCQUFJLG9CQUFKLGtCQUFJOzBDQUFDO3VCQTVCRCxZQUFZO0lBRHhCLElBQUEsZ0JBQU0sRUFBQyxnQkFBZ0IsQ0FBQztHQUNaLFlBQVksQ0E2QnhCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXGNvbW1vblxcYXV0aFxcZW50aXRpZXNcXHJlZnJlc2gtdG9rZW4uZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVudGl0eSxcbiAgQ29sdW1uLFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBDcmVhdGVEYXRlQ29sdW1uLFxuICBVcGRhdGVEYXRlQ29sdW1uLFxuICBNYW55VG9PbmUsXG4gIEpvaW5Db2x1bW4sXG59IGZyb20gJ3R5cGVvcm0nO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uLy4uL21vZHVsZXMvdXNlci9lbnRpdGllcy91c2VyLmVudGl0eSc7XG5cbkBFbnRpdHkoJ3JlZnJlc2hfdG9rZW5zJylcbmV4cG9ydCBjbGFzcyBSZWZyZXNoVG9rZW4ge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbih7IG5hbWU6ICd0b2tlbl9pZCcgfSlcbiAgdG9rZW5JZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3VzZXJfaWQnIH0pXG4gIHVzZXJJZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3Rva2VuX2hhc2gnLCBsZW5ndGg6IDI1NSB9KVxuICB0b2tlbkhhc2ghOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdleHBpcmVzX2F0JyB9KVxuICBleHBpcmVzQXQhOiBEYXRlO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXNfcmV2b2tlZCcsIGRlZmF1bHQ6IGZhbHNlIH0pXG4gIGlzUmV2b2tlZCE6IGJvb2xlYW47XG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxuICB1cGRhdGVkQXQhOiBEYXRlO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmVwbGFjZWRfYnlfdG9rZW4nLCBudWxsYWJsZTogdHJ1ZSwgbGVuZ3RoOiAyNTUgfSlcbiAgcmVwbGFjZWRCeVRva2VuPzogc3RyaW5nOyAvLyBGb3Igcm90YXRpb24gc3VwcG9ydFxuXG4gIC8vIFJlbGF0aW9uc1xuICBATWFueVRvT25lKCgpID0+IFVzZXIsIHsgb25EZWxldGU6ICdDQVNDQURFJyB9KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICd1c2VyX2lkJyB9KVxuICB1c2VyPzogVXNlcjtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d2/refreshtokenentity_d2abd8834c5a4b20225977edc2b18a0f.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d2/refreshtokenentity_d2abd8834c5a4b20225977edc2b18a0f.map new file mode 100644 index 0000000..27cc364 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d2/refreshtokenentity_d2abd8834c5a4b20225977edc2b18a0f.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\auth\\entities\\refresh-token.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAQiB;AACjB,4EAAkE;AAG3D,IAAM,YAAY,GAAlB,MAAM,YAAY;CA6BxB,CAAA;AA7BY,oCAAY;AAEvB;IADC,IAAA,gCAAsB,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;;6CAC5B;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;4CACZ;AAGhB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;+CACzB;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACnB,IAAI,oBAAJ,IAAI;+CAAC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;+CAC3B;AAGpB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;+CAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;+CAAC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;qDAC1C;AAKzB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC9C,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;kDACzB,kBAAI,oBAAJ,kBAAI;0CAAC;uBA5BD,YAAY;IADxB,IAAA,gBAAM,EAAC,gBAAgB,CAAC;GACZ,YAAY,CA6BxB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\auth\\entities\\refresh-token.entity.ts"],"sourcesContent":["import {\n Entity,\n Column,\n PrimaryGeneratedColumn,\n CreateDateColumn,\n UpdateDateColumn,\n ManyToOne,\n JoinColumn,\n} from 'typeorm';\nimport { User } from '../../../modules/user/entities/user.entity';\n\n@Entity('refresh_tokens')\nexport class RefreshToken {\n @PrimaryGeneratedColumn({ name: 'token_id' })\n tokenId!: number;\n\n @Column({ name: 'user_id' })\n userId!: number;\n\n @Column({ name: 'token_hash', length: 255 })\n tokenHash!: string;\n\n @Column({ name: 'expires_at' })\n expiresAt!: Date;\n\n @Column({ name: 'is_revoked', default: false })\n isRevoked!: boolean;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n @Column({ name: 'replaced_by_token', nullable: true, length: 255 })\n replacedByToken?: string; // For rotation support\n\n // Relations\n @ManyToOne(() => User, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'user_id' })\n user?: User;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d2/stringify_d2cd26e64927689c4a6f754c87f57dac b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d2/stringify_d2cd26e64927689c4a6f754c87f57dac new file mode 100644 index 0000000..beafec3 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d2/stringify_d2cd26e64927689c4a6f754c87f57dac @@ -0,0 +1,41 @@ +afa5059cd7fe10c0f288acc5605d84a7 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.unsafeStringify = void 0; +const validate_js_1 = require("./validate.js"); +const byteToHex = []; +for (let i = 0; i < 256; ++i) { + byteToHex.push((i + 0x100).toString(16).slice(1)); +} +function unsafeStringify(arr, offset = 0) { + return (byteToHex[arr[offset + 0]] + + byteToHex[arr[offset + 1]] + + byteToHex[arr[offset + 2]] + + byteToHex[arr[offset + 3]] + + '-' + + byteToHex[arr[offset + 4]] + + byteToHex[arr[offset + 5]] + + '-' + + byteToHex[arr[offset + 6]] + + byteToHex[arr[offset + 7]] + + '-' + + byteToHex[arr[offset + 8]] + + byteToHex[arr[offset + 9]] + + '-' + + byteToHex[arr[offset + 10]] + + byteToHex[arr[offset + 11]] + + byteToHex[arr[offset + 12]] + + byteToHex[arr[offset + 13]] + + byteToHex[arr[offset + 14]] + + byteToHex[arr[offset + 15]]).toLowerCase(); +} +exports.unsafeStringify = unsafeStringify; +function stringify(arr, offset = 0) { + const uuid = unsafeStringify(arr, offset); + if (!(0, validate_js_1.default)(uuid)) { + throw TypeError('Stringified UUID is invalid'); + } + return uuid; +} +exports.default = stringify; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcc3RyaW5naWZ5LmpzIiwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUNiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlELE9BQU8sQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFDakMsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztBQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDM0IsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUNELFNBQVMsZUFBZSxDQUFDLEdBQUcsRUFBRSxNQUFNLEdBQUcsQ0FBQztJQUNwQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUIsR0FBRztRQUNILFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLEdBQUc7UUFDSCxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxQixTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxQixHQUFHO1FBQ0gsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUIsR0FBRztRQUNILFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUNuRCxDQUFDO0FBQ0QsT0FBTyxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7QUFDMUMsU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFLE1BQU0sR0FBRyxDQUFDO0lBQzlCLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDMUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sU0FBUyxDQUFDLDZCQUE2QixDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2hCLENBQUM7QUFDRCxPQUFPLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcbm9kZV9tb2R1bGVzXFwucG5wbVxcdXVpZEAxMS4xLjBcXG5vZGVfbW9kdWxlc1xcdXVpZFxcZGlzdFxcY2pzXFxzdHJpbmdpZnkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnVuc2FmZVN0cmluZ2lmeSA9IHZvaWQgMDtcbmNvbnN0IHZhbGlkYXRlX2pzXzEgPSByZXF1aXJlKFwiLi92YWxpZGF0ZS5qc1wiKTtcbmNvbnN0IGJ5dGVUb0hleCA9IFtdO1xuZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgIGJ5dGVUb0hleC5wdXNoKChpICsgMHgxMDApLnRvU3RyaW5nKDE2KS5zbGljZSgxKSk7XG59XG5mdW5jdGlvbiB1bnNhZmVTdHJpbmdpZnkoYXJyLCBvZmZzZXQgPSAwKSB7XG4gICAgcmV0dXJuIChieXRlVG9IZXhbYXJyW29mZnNldCArIDBdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMV1dICtcbiAgICAgICAgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAyXV0gK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDNdXSArXG4gICAgICAgICctJyArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNF1dICtcbiAgICAgICAgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA1XV0gK1xuICAgICAgICAnLScgK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDZdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgN11dICtcbiAgICAgICAgJy0nICtcbiAgICAgICAgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA4XV0gK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDldXSArXG4gICAgICAgICctJyArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTBdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTFdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTJdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTNdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTRdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTVdXSkudG9Mb3dlckNhc2UoKTtcbn1cbmV4cG9ydHMudW5zYWZlU3RyaW5naWZ5ID0gdW5zYWZlU3RyaW5naWZ5O1xuZnVuY3Rpb24gc3RyaW5naWZ5KGFyciwgb2Zmc2V0ID0gMCkge1xuICAgIGNvbnN0IHV1aWQgPSB1bnNhZmVTdHJpbmdpZnkoYXJyLCBvZmZzZXQpO1xuICAgIGlmICghKDAsIHZhbGlkYXRlX2pzXzEuZGVmYXVsdCkodXVpZCkpIHtcbiAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHV1aWQ7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBzdHJpbmdpZnk7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d2/stringify_d2cd26e64927689c4a6f754c87f57dac.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d2/stringify_d2cd26e64927689c4a6f754c87f57dac.map new file mode 100644 index 0000000..13ff460 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d2/stringify_d2cd26e64927689c4a6f754c87f57dac.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\stringify.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,OAAO,CAAC,eAAe,GAAG,KAAK,CAAC,CAAC;AACjC,MAAM,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAC/C,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;IAC3B,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AACD,SAAS,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC;IACpC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9B,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1B,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1B,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1B,GAAG;QACH,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1B,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1B,GAAG;QACH,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1B,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1B,GAAG;QACH,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1B,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1B,GAAG;QACH,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QAC3B,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QAC3B,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QAC3B,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QAC3B,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QAC3B,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AACnD,CAAC;AACD,OAAO,CAAC,eAAe,GAAG,eAAe,CAAC;AAC1C,SAAS,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC;IAC9B,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,SAAS,CAAC,6BAA6B,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\stringify.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.unsafeStringify = void 0;\nconst validate_js_1 = require(\"./validate.js\");\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nfunction unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nexports.unsafeStringify = unsafeStringify;\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!(0, validate_js_1.default)(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexports.default = stringify;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d3/authservicespec_d358f3290538fb6a6a5cec29846eacd5 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d3/authservicespec_d358f3290538fb6a6a5cec29846eacd5 new file mode 100644 index 0000000..dec6862 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d3/authservicespec_d358f3290538fb6a6a5cec29846eacd5 @@ -0,0 +1,240 @@ +5b868d3430e297b9bb5574d385c594ba +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +// Mock bcrypt at top level +jest.mock('bcrypt', () => ({ + compare: jest.fn(), + hash: jest.fn().mockResolvedValue('hashedpassword'), + genSalt: jest.fn().mockResolvedValue('salt'), +})); +const testing_1 = require("@nestjs/testing"); +const auth_service_1 = require("./auth.service"); +const user_service_1 = require("../../modules/user/user.service"); +const jwt_1 = require("@nestjs/jwt"); +const config_1 = require("@nestjs/config"); +const cache_manager_1 = require("@nestjs/cache-manager"); +const typeorm_1 = require("@nestjs/typeorm"); +const user_entity_1 = require("../../modules/user/entities/user.entity"); +const refresh_token_entity_1 = require("./entities/refresh-token.entity"); +const common_1 = require("@nestjs/common"); +const bcrypt = __importStar(require("bcrypt")); +describe('AuthService', () => { + let service; + let userService; + let _jwtService; + let _tokenRepo; + const mockUser = { + user_id: 1, + username: 'testuser', + password: 'hashedpassword', + primaryOrganizationId: 1, + }; + const mockQueryBuilder = { + addSelect: jest.fn().mockReturnThis(), + leftJoinAndSelect: jest.fn().mockReturnThis(), + where: jest.fn().mockReturnThis(), + getOne: jest.fn().mockResolvedValue(mockUser), + }; + const mockUserRepo = { + createQueryBuilder: jest.fn().mockReturnValue(mockQueryBuilder), + }; + const mockTokenRepo = { + create: jest.fn(), + save: jest.fn(), + findOne: jest.fn(), + update: jest.fn(), + }; + beforeEach(async () => { + // Reset bcrypt mocks + bcrypt.compare.mockResolvedValue(true); + const module = await testing_1.Test.createTestingModule({ + providers: [ + auth_service_1.AuthService, + { + provide: user_service_1.UserService, + useValue: { + findOneByUsername: jest.fn(), + create: jest.fn(), + findOne: jest.fn(), + }, + }, + { + provide: jwt_1.JwtService, + useValue: { + signAsync: jest.fn().mockResolvedValue('jwt_token'), + decode: jest.fn(), + }, + }, + { + provide: config_1.ConfigService, + useValue: { + get: jest.fn().mockImplementation((key) => { + if (key.includes('EXPIRATION')) + return '1h'; + return 'secret'; + }), + }, + }, + { + provide: cache_manager_1.CACHE_MANAGER, + useValue: { + set: jest.fn(), + }, + }, + { + provide: (0, typeorm_1.getRepositoryToken)(user_entity_1.User), + useValue: mockUserRepo, + }, + { + provide: (0, typeorm_1.getRepositoryToken)(refresh_token_entity_1.RefreshToken), + useValue: mockTokenRepo, + }, + ], + }).compile(); + service = module.get(auth_service_1.AuthService); + userService = module.get(user_service_1.UserService); + _jwtService = module.get(jwt_1.JwtService); + _tokenRepo = module.get((0, typeorm_1.getRepositoryToken)(refresh_token_entity_1.RefreshToken)); + }); + afterEach(() => { + jest.clearAllMocks(); + }); + it('should be defined', () => { + expect(service).toBeDefined(); + }); + describe('validateUser', () => { + it('should return user without password if validation succeeds', async () => { + const result = await service.validateUser('testuser', 'password'); + expect(result).toBeDefined(); + expect(result).not.toHaveProperty('password'); + expect(result.username).toBe('testuser'); + }); + it('should return null if user not found', async () => { + mockQueryBuilder.getOne.mockResolvedValueOnce(null); + const result = await service.validateUser('unknown', 'password'); + expect(result).toBeNull(); + }); + it('should return null if password mismatch', async () => { + bcrypt.compare.mockResolvedValueOnce(false); + const result = await service.validateUser('testuser', 'wrongpassword'); + expect(result).toBeNull(); + }); + }); + describe('login', () => { + it('should return access and refresh tokens', async () => { + mockTokenRepo.create.mockReturnValue({ id: 1 }); + mockTokenRepo.save.mockResolvedValue({ id: 1 }); + const result = await service.login(mockUser); + expect(result).toHaveProperty('access_token'); + expect(result).toHaveProperty('refresh_token'); + expect(mockTokenRepo.save).toHaveBeenCalled(); + }); + }); + describe('register', () => { + it('should register a new user', async () => { + userService.findOneByUsername.mockResolvedValue(null); + userService.create.mockResolvedValue(mockUser); + const dto = { + username: 'newuser', + password: 'password', + email: 'test@example.com', + firstName: 'Test', + lastName: 'User', + }; + const result = await service.register(dto); + const createMock = userService.create; + expect(result).toBeDefined(); + expect(createMock).toHaveBeenCalled(); + }); + }); + describe('refreshToken', () => { + it('should return new tokens if valid', async () => { + const mockStoredToken = { + tokenHash: 'somehash', + isRevoked: false, + expiresAt: new Date(Date.now() + 10000), + }; + mockTokenRepo.findOne.mockResolvedValue(mockStoredToken); + userService.findOne.mockResolvedValue(mockUser); + const result = await service.refreshToken(1, 'valid_refresh_token'); + expect(result.access_token).toBeDefined(); + expect(result.refresh_token).toBeDefined(); + // Should mark old token as revoked + expect(mockTokenRepo.save).toHaveBeenCalledWith(expect.objectContaining({ isRevoked: true })); + }); + it('should throw UnauthorizedException if token revoked', async () => { + const mockStoredToken = { + tokenHash: 'somehash', + isRevoked: true, + expiresAt: new Date(Date.now() + 10000), + }; + mockTokenRepo.findOne.mockResolvedValue(mockStoredToken); + await expect(service.refreshToken(1, 'revoked_token')).rejects.toThrow(common_1.UnauthorizedException); + }); + it('should allow refresh within 30s grace period if already revoked', async () => { + const updatedAt = new Date(Date.now() - 5000); // 5 seconds ago + const mockStoredToken = { + tokenHash: 'somehash', + isRevoked: true, + updatedAt: updatedAt, + replacedByToken: 'new_token_hash', + expiresAt: new Date(Date.now() + 10000), + }; + mockTokenRepo.findOne.mockResolvedValue(mockStoredToken); + userService.findOne.mockResolvedValue(mockUser); + mockTokenRepo.create.mockReturnValue({ token_id: 2 }); + mockTokenRepo.save.mockResolvedValue({ token_id: 2 }); + const result = await service.refreshToken(1, 'valid_refresh_token'); + expect(result.access_token).toBeDefined(); + expect(result.refresh_token).toBeDefined(); + // Should not call revokeAllUserTokens + expect(mockTokenRepo.update).not.toHaveBeenCalled(); + }); + it('should throw UnauthorizedException if token revoked more than 30s ago', async () => { + const updatedAt = new Date(Date.now() - 35000); // 35 seconds ago + const mockStoredToken = { + tokenHash: 'somehash', + isRevoked: true, + updatedAt: updatedAt, + replacedByToken: 'new_token_hash', + expiresAt: new Date(Date.now() + 10000), + }; + mockTokenRepo.findOne.mockResolvedValue(mockStoredToken); + await expect(service.refreshToken(1, 'revoked_token')).rejects.toThrow(common_1.UnauthorizedException); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxhdXRoXFxhdXRoLnNlcnZpY2Uuc3BlYy50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVlBLDJCQUEyQjtBQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3pCLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO0lBQ2xCLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUM7SUFDbkQsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7Q0FDN0MsQ0FBQyxDQUFDLENBQUM7QUFqQkosNkNBQXNEO0FBQ3RELGlEQUE2QztBQUM3QyxrRUFBOEQ7QUFDOUQscUNBQXlDO0FBQ3pDLDJDQUErQztBQUMvQyx5REFBc0Q7QUFDdEQsNkNBQXFEO0FBQ3JELHlFQUErRDtBQUMvRCwwRUFBK0Q7QUFFL0QsMkNBQXVEO0FBU3ZELCtDQUFpQztBQUVqQyxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtJQUMzQixJQUFJLE9BQW9CLENBQUM7SUFDekIsSUFBSSxXQUF3QixDQUFDO0lBQzdCLElBQUksV0FBdUIsQ0FBQztJQUM1QixJQUFJLFVBQW9DLENBQUM7SUFFekMsTUFBTSxRQUFRLEdBQUc7UUFDZixPQUFPLEVBQUUsQ0FBQztRQUNWLFFBQVEsRUFBRSxVQUFVO1FBQ3BCLFFBQVEsRUFBRSxnQkFBZ0I7UUFDMUIscUJBQXFCLEVBQUUsQ0FBQztLQUN6QixDQUFDO0lBRUYsTUFBTSxnQkFBZ0IsR0FBRztRQUN2QixTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLGNBQWMsRUFBRTtRQUNyQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsY0FBYyxFQUFFO1FBQzdDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsY0FBYyxFQUFFO1FBQ2pDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDO0tBQzlDLENBQUM7SUFFRixNQUFNLFlBQVksR0FBRztRQUNuQixrQkFBa0IsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDO0tBQ2hFLENBQUM7SUFFRixNQUFNLGFBQWEsR0FBRztRQUNwQixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNqQixJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNmLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2xCLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO0tBQ2xCLENBQUM7SUFFRixVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDcEIscUJBQXFCO1FBQ3BCLE1BQU0sQ0FBQyxPQUFxQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRELE1BQU0sTUFBTSxHQUFrQixNQUFNLGNBQUksQ0FBQyxtQkFBbUIsQ0FBQztZQUMzRCxTQUFTLEVBQUU7Z0JBQ1QsMEJBQVc7Z0JBQ1g7b0JBQ0UsT0FBTyxFQUFFLDBCQUFXO29CQUNwQixRQUFRLEVBQUU7d0JBQ1IsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTt3QkFDNUIsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7d0JBQ2pCLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO3FCQUNuQjtpQkFDRjtnQkFDRDtvQkFDRSxPQUFPLEVBQUUsZ0JBQVU7b0JBQ25CLFFBQVEsRUFBRTt3QkFDUixTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQzt3QkFDbkQsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7cUJBQ2xCO2lCQUNGO2dCQUNEO29CQUNFLE9BQU8sRUFBRSxzQkFBYTtvQkFDdEIsUUFBUSxFQUFFO3dCQUNSLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxHQUFXLEVBQUUsRUFBRTs0QkFDaEQsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztnQ0FBRSxPQUFPLElBQUksQ0FBQzs0QkFDNUMsT0FBTyxRQUFRLENBQUM7d0JBQ2xCLENBQUMsQ0FBQztxQkFDSDtpQkFDRjtnQkFDRDtvQkFDRSxPQUFPLEVBQUUsNkJBQWE7b0JBQ3RCLFFBQVEsRUFBRTt3QkFDUixHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtxQkFDZjtpQkFDRjtnQkFDRDtvQkFDRSxPQUFPLEVBQUUsSUFBQSw0QkFBa0IsRUFBQyxrQkFBSSxDQUFDO29CQUNqQyxRQUFRLEVBQUUsWUFBWTtpQkFDdkI7Z0JBQ0Q7b0JBQ0UsT0FBTyxFQUFFLElBQUEsNEJBQWtCLEVBQUMsbUNBQVksQ0FBQztvQkFDekMsUUFBUSxFQUFFLGFBQWE7aUJBQ3hCO2FBQ0Y7U0FDRixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFYixPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBYywwQkFBVyxDQUFDLENBQUM7UUFDL0MsV0FBVyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQWMsMEJBQVcsQ0FBQyxDQUFDO1FBQ25ELFdBQVcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFhLGdCQUFVLENBQUMsQ0FBQztRQUNqRCxVQUFVLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFBLDRCQUFrQixFQUFDLG1DQUFZLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUMsQ0FBQyxDQUFDO0lBRUgsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNiLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUU7UUFDM0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7UUFDNUIsRUFBRSxDQUFDLDREQUE0RCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzFFLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDbEUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sQ0FBQyxNQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHNDQUFzQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3BELGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwRCxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ2pFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUN0RCxNQUFNLENBQUMsT0FBcUIsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzRCxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQ3ZFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDckIsRUFBRSxDQUFDLHlDQUF5QyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3ZELGFBQWEsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEQsYUFBYSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRWhELE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFnQixDQUFDLENBQUM7WUFFckQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM5QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQy9DLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUU7UUFDeEIsRUFBRSxDQUFDLDRCQUE0QixFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3pDLFdBQVcsQ0FBQyxpQkFBK0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwRSxXQUFXLENBQUMsTUFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUU5RCxNQUFNLEdBQUcsR0FBRztnQkFDVixRQUFRLEVBQUUsU0FBUztnQkFDbkIsUUFBUSxFQUFFLFVBQVU7Z0JBQ3BCLEtBQUssRUFBRSxrQkFBa0I7Z0JBQ3pCLFNBQVMsRUFBRSxNQUFNO2dCQUNqQixRQUFRLEVBQUUsTUFBTTthQUNqQixDQUFDO1lBRUYsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxNQUFtQixDQUFDO1lBQ25ELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM3QixNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7UUFDNUIsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2pELE1BQU0sZUFBZSxHQUFHO2dCQUN0QixTQUFTLEVBQUUsVUFBVTtnQkFDckIsU0FBUyxFQUFFLEtBQUs7Z0JBQ2hCLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDO2FBQ3hDLENBQUM7WUFDRixhQUFhLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3hELFdBQVcsQ0FBQyxPQUFxQixDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRS9ELE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztZQUVwRSxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDM0MsbUNBQW1DO1lBQ25DLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsb0JBQW9CLENBQzdDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUM3QyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMscURBQXFELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbkUsTUFBTSxlQUFlLEdBQUc7Z0JBQ3RCLFNBQVMsRUFBRSxVQUFVO2dCQUNyQixTQUFTLEVBQUUsSUFBSTtnQkFDZixTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQzthQUN4QyxDQUFDO1lBQ0YsYUFBYSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUV6RCxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQ3BFLDhCQUFxQixDQUN0QixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsaUVBQWlFLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDL0UsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCO1lBQy9ELE1BQU0sZUFBZSxHQUFHO2dCQUN0QixTQUFTLEVBQUUsVUFBVTtnQkFDckIsU0FBUyxFQUFFLElBQUk7Z0JBQ2YsU0FBUyxFQUFFLFNBQVM7Z0JBQ3BCLGVBQWUsRUFBRSxnQkFBZ0I7Z0JBQ2pDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDO2FBQ3hDLENBQUM7WUFDRixhQUFhLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3hELFdBQVcsQ0FBQyxPQUFxQixDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9ELGFBQWEsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEQsYUFBYSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRXRELE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztZQUVwRSxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDM0Msc0NBQXNDO1lBQ3RDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsdUVBQXVFLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDckYsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsaUJBQWlCO1lBQ2pFLE1BQU0sZUFBZSxHQUFHO2dCQUN0QixTQUFTLEVBQUUsVUFBVTtnQkFDckIsU0FBUyxFQUFFLElBQUk7Z0JBQ2YsU0FBUyxFQUFFLFNBQVM7Z0JBQ3BCLGVBQWUsRUFBRSxnQkFBZ0I7Z0JBQ2pDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDO2FBQ3hDLENBQUM7WUFDRixhQUFhLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBRXpELE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FDcEUsOEJBQXFCLENBQ3RCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxhdXRoXFxhdXRoLnNlcnZpY2Uuc3BlYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZXN0LCBUZXN0aW5nTW9kdWxlIH0gZnJvbSAnQG5lc3Rqcy90ZXN0aW5nJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9tb2R1bGVzL3VzZXIvdXNlci5zZXJ2aWNlJztcbmltcG9ydCB7IEp3dFNlcnZpY2UgfSBmcm9tICdAbmVzdGpzL2p3dCc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnQG5lc3Rqcy9jb25maWcnO1xuaW1wb3J0IHsgQ0FDSEVfTUFOQUdFUiB9IGZyb20gJ0BuZXN0anMvY2FjaGUtbWFuYWdlcic7XG5pbXBvcnQgeyBnZXRSZXBvc2l0b3J5VG9rZW4gfSBmcm9tICdAbmVzdGpzL3R5cGVvcm0nO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL21vZHVsZXMvdXNlci9lbnRpdGllcy91c2VyLmVudGl0eSc7XG5pbXBvcnQgeyBSZWZyZXNoVG9rZW4gfSBmcm9tICcuL2VudGl0aWVzL3JlZnJlc2gtdG9rZW4uZW50aXR5JztcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFVuYXV0aG9yaXplZEV4Y2VwdGlvbiB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcblxuLy8gTW9jayBiY3J5cHQgYXQgdG9wIGxldmVsXG5qZXN0Lm1vY2soJ2JjcnlwdCcsICgpID0+ICh7XG4gIGNvbXBhcmU6IGplc3QuZm4oKSxcbiAgaGFzaDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKCdoYXNoZWRwYXNzd29yZCcpLFxuICBnZW5TYWx0OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoJ3NhbHQnKSxcbn0pKTtcblxuaW1wb3J0ICogYXMgYmNyeXB0IGZyb20gJ2JjcnlwdCc7XG5cbmRlc2NyaWJlKCdBdXRoU2VydmljZScsICgpID0+IHtcbiAgbGV0IHNlcnZpY2U6IEF1dGhTZXJ2aWNlO1xuICBsZXQgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlO1xuICBsZXQgX2p3dFNlcnZpY2U6IEp3dFNlcnZpY2U7XG4gIGxldCBfdG9rZW5SZXBvOiBSZXBvc2l0b3J5PFJlZnJlc2hUb2tlbj47XG5cbiAgY29uc3QgbW9ja1VzZXIgPSB7XG4gICAgdXNlcl9pZDogMSxcbiAgICB1c2VybmFtZTogJ3Rlc3R1c2VyJyxcbiAgICBwYXNzd29yZDogJ2hhc2hlZHBhc3N3b3JkJyxcbiAgICBwcmltYXJ5T3JnYW5pemF0aW9uSWQ6IDEsXG4gIH07XG5cbiAgY29uc3QgbW9ja1F1ZXJ5QnVpbGRlciA9IHtcbiAgICBhZGRTZWxlY3Q6IGplc3QuZm4oKS5tb2NrUmV0dXJuVGhpcygpLFxuICAgIGxlZnRKb2luQW5kU2VsZWN0OiBqZXN0LmZuKCkubW9ja1JldHVyblRoaXMoKSxcbiAgICB3aGVyZTogamVzdC5mbigpLm1vY2tSZXR1cm5UaGlzKCksXG4gICAgZ2V0T25lOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUobW9ja1VzZXIpLFxuICB9O1xuXG4gIGNvbnN0IG1vY2tVc2VyUmVwbyA9IHtcbiAgICBjcmVhdGVRdWVyeUJ1aWxkZXI6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUobW9ja1F1ZXJ5QnVpbGRlciksXG4gIH07XG5cbiAgY29uc3QgbW9ja1Rva2VuUmVwbyA9IHtcbiAgICBjcmVhdGU6IGplc3QuZm4oKSxcbiAgICBzYXZlOiBqZXN0LmZuKCksXG4gICAgZmluZE9uZTogamVzdC5mbigpLFxuICAgIHVwZGF0ZTogamVzdC5mbigpLFxuICB9O1xuXG4gIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgIC8vIFJlc2V0IGJjcnlwdCBtb2Nrc1xuICAgIChiY3J5cHQuY29tcGFyZSBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHRydWUpO1xuXG4gICAgY29uc3QgbW9kdWxlOiBUZXN0aW5nTW9kdWxlID0gYXdhaXQgVGVzdC5jcmVhdGVUZXN0aW5nTW9kdWxlKHtcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICBBdXRoU2VydmljZSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IFVzZXJTZXJ2aWNlLFxuICAgICAgICAgIHVzZVZhbHVlOiB7XG4gICAgICAgICAgICBmaW5kT25lQnlVc2VybmFtZTogamVzdC5mbigpLFxuICAgICAgICAgICAgY3JlYXRlOiBqZXN0LmZuKCksXG4gICAgICAgICAgICBmaW5kT25lOiBqZXN0LmZuKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IEp3dFNlcnZpY2UsXG4gICAgICAgICAgdXNlVmFsdWU6IHtcbiAgICAgICAgICAgIHNpZ25Bc3luYzogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKCdqd3RfdG9rZW4nKSxcbiAgICAgICAgICAgIGRlY29kZTogamVzdC5mbigpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBDb25maWdTZXJ2aWNlLFxuICAgICAgICAgIHVzZVZhbHVlOiB7XG4gICAgICAgICAgICBnZXQ6IGplc3QuZm4oKS5tb2NrSW1wbGVtZW50YXRpb24oKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChrZXkuaW5jbHVkZXMoJ0VYUElSQVRJT04nKSkgcmV0dXJuICcxaCc7XG4gICAgICAgICAgICAgIHJldHVybiAnc2VjcmV0JztcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBDQUNIRV9NQU5BR0VSLFxuICAgICAgICAgIHVzZVZhbHVlOiB7XG4gICAgICAgICAgICBzZXQ6IGplc3QuZm4oKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogZ2V0UmVwb3NpdG9yeVRva2VuKFVzZXIpLFxuICAgICAgICAgIHVzZVZhbHVlOiBtb2NrVXNlclJlcG8sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBnZXRSZXBvc2l0b3J5VG9rZW4oUmVmcmVzaFRva2VuKSxcbiAgICAgICAgICB1c2VWYWx1ZTogbW9ja1Rva2VuUmVwbyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSkuY29tcGlsZSgpO1xuXG4gICAgc2VydmljZSA9IG1vZHVsZS5nZXQ8QXV0aFNlcnZpY2U+KEF1dGhTZXJ2aWNlKTtcbiAgICB1c2VyU2VydmljZSA9IG1vZHVsZS5nZXQ8VXNlclNlcnZpY2U+KFVzZXJTZXJ2aWNlKTtcbiAgICBfand0U2VydmljZSA9IG1vZHVsZS5nZXQ8Snd0U2VydmljZT4oSnd0U2VydmljZSk7XG4gICAgX3Rva2VuUmVwbyA9IG1vZHVsZS5nZXQoZ2V0UmVwb3NpdG9yeVRva2VuKFJlZnJlc2hUb2tlbikpO1xuICB9KTtcblxuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIGplc3QuY2xlYXJBbGxNb2NrcygpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJlIGRlZmluZWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHNlcnZpY2UpLnRvQmVEZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2YWxpZGF0ZVVzZXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdXNlciB3aXRob3V0IHBhc3N3b3JkIGlmIHZhbGlkYXRpb24gc3VjY2VlZHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXJ2aWNlLnZhbGlkYXRlVXNlcigndGVzdHVzZXInLCAncGFzc3dvcmQnKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QocmVzdWx0KS5ub3QudG9IYXZlUHJvcGVydHkoJ3Bhc3N3b3JkJyk7XG4gICAgICBleHBlY3QocmVzdWx0IS51c2VybmFtZSkudG9CZSgndGVzdHVzZXInKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgaWYgdXNlciBub3QgZm91bmQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBtb2NrUXVlcnlCdWlsZGVyLmdldE9uZS5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UobnVsbCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXJ2aWNlLnZhbGlkYXRlVXNlcigndW5rbm93bicsICdwYXNzd29yZCcpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZU51bGwoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgaWYgcGFzc3dvcmQgbWlzbWF0Y2gnLCBhc3luYyAoKSA9PiB7XG4gICAgICAoYmNyeXB0LmNvbXBhcmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoZmFsc2UpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VydmljZS52YWxpZGF0ZVVzZXIoJ3Rlc3R1c2VyJywgJ3dyb25ncGFzc3dvcmQnKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdsb2dpbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhY2Nlc3MgYW5kIHJlZnJlc2ggdG9rZW5zJywgYXN5bmMgKCkgPT4ge1xuICAgICAgbW9ja1Rva2VuUmVwby5jcmVhdGUubW9ja1JldHVyblZhbHVlKHsgaWQ6IDEgfSk7XG4gICAgICBtb2NrVG9rZW5SZXBvLnNhdmUubW9ja1Jlc29sdmVkVmFsdWUoeyBpZDogMSB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VydmljZS5sb2dpbihtb2NrVXNlciBhcyBVc2VyKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9IYXZlUHJvcGVydHkoJ2FjY2Vzc190b2tlbicpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9IYXZlUHJvcGVydHkoJ3JlZnJlc2hfdG9rZW4nKTtcbiAgICAgIGV4cGVjdChtb2NrVG9rZW5SZXBvLnNhdmUpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlZ2lzdGVyJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVnaXN0ZXIgYSBuZXcgdXNlcicsIGFzeW5jICgpID0+IHtcbiAgICAgICh1c2VyU2VydmljZS5maW5kT25lQnlVc2VybmFtZSBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKG51bGwpO1xuICAgICAgKHVzZXJTZXJ2aWNlLmNyZWF0ZSBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tVc2VyKTtcblxuICAgICAgY29uc3QgZHRvID0ge1xuICAgICAgICB1c2VybmFtZTogJ25ld3VzZXInLFxuICAgICAgICBwYXNzd29yZDogJ3Bhc3N3b3JkJyxcbiAgICAgICAgZW1haWw6ICd0ZXN0QGV4YW1wbGUuY29tJyxcbiAgICAgICAgZmlyc3ROYW1lOiAnVGVzdCcsXG4gICAgICAgIGxhc3ROYW1lOiAnVXNlcicsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXJ2aWNlLnJlZ2lzdGVyKGR0byk7XG4gICAgICBjb25zdCBjcmVhdGVNb2NrID0gdXNlclNlcnZpY2UuY3JlYXRlIGFzIGplc3QuTW9jaztcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QoY3JlYXRlTW9jaykudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVmcmVzaFRva2VuJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIG5ldyB0b2tlbnMgaWYgdmFsaWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBtb2NrU3RvcmVkVG9rZW4gPSB7XG4gICAgICAgIHRva2VuSGFzaDogJ3NvbWVoYXNoJyxcbiAgICAgICAgaXNSZXZva2VkOiBmYWxzZSxcbiAgICAgICAgZXhwaXJlc0F0OiBuZXcgRGF0ZShEYXRlLm5vdygpICsgMTAwMDApLFxuICAgICAgfTtcbiAgICAgIG1vY2tUb2tlblJlcG8uZmluZE9uZS5tb2NrUmVzb2x2ZWRWYWx1ZShtb2NrU3RvcmVkVG9rZW4pO1xuICAgICAgKHVzZXJTZXJ2aWNlLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZShtb2NrVXNlcik7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlcnZpY2UucmVmcmVzaFRva2VuKDEsICd2YWxpZF9yZWZyZXNoX3Rva2VuJyk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQuYWNjZXNzX3Rva2VuKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHJlc3VsdC5yZWZyZXNoX3Rva2VuKS50b0JlRGVmaW5lZCgpO1xuICAgICAgLy8gU2hvdWxkIG1hcmsgb2xkIHRva2VuIGFzIHJldm9rZWRcbiAgICAgIGV4cGVjdChtb2NrVG9rZW5SZXBvLnNhdmUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IGlzUmV2b2tlZDogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgVW5hdXRob3JpemVkRXhjZXB0aW9uIGlmIHRva2VuIHJldm9rZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBtb2NrU3RvcmVkVG9rZW4gPSB7XG4gICAgICAgIHRva2VuSGFzaDogJ3NvbWVoYXNoJyxcbiAgICAgICAgaXNSZXZva2VkOiB0cnVlLFxuICAgICAgICBleHBpcmVzQXQ6IG5ldyBEYXRlKERhdGUubm93KCkgKyAxMDAwMCksXG4gICAgICB9O1xuICAgICAgbW9ja1Rva2VuUmVwby5maW5kT25lLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tTdG9yZWRUb2tlbik7XG5cbiAgICAgIGF3YWl0IGV4cGVjdChzZXJ2aWNlLnJlZnJlc2hUb2tlbigxLCAncmV2b2tlZF90b2tlbicpKS5yZWplY3RzLnRvVGhyb3coXG4gICAgICAgIFVuYXV0aG9yaXplZEV4Y2VwdGlvblxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWxsb3cgcmVmcmVzaCB3aXRoaW4gMzBzIGdyYWNlIHBlcmlvZCBpZiBhbHJlYWR5IHJldm9rZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVkQXQgPSBuZXcgRGF0ZShEYXRlLm5vdygpIC0gNTAwMCk7IC8vIDUgc2Vjb25kcyBhZ29cbiAgICAgIGNvbnN0IG1vY2tTdG9yZWRUb2tlbiA9IHtcbiAgICAgICAgdG9rZW5IYXNoOiAnc29tZWhhc2gnLFxuICAgICAgICBpc1Jldm9rZWQ6IHRydWUsXG4gICAgICAgIHVwZGF0ZWRBdDogdXBkYXRlZEF0LFxuICAgICAgICByZXBsYWNlZEJ5VG9rZW46ICduZXdfdG9rZW5faGFzaCcsXG4gICAgICAgIGV4cGlyZXNBdDogbmV3IERhdGUoRGF0ZS5ub3coKSArIDEwMDAwKSxcbiAgICAgIH07XG4gICAgICBtb2NrVG9rZW5SZXBvLmZpbmRPbmUubW9ja1Jlc29sdmVkVmFsdWUobW9ja1N0b3JlZFRva2VuKTtcbiAgICAgICh1c2VyU2VydmljZS5maW5kT25lIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUobW9ja1VzZXIpO1xuICAgICAgbW9ja1Rva2VuUmVwby5jcmVhdGUubW9ja1JldHVyblZhbHVlKHsgdG9rZW5faWQ6IDIgfSk7XG4gICAgICBtb2NrVG9rZW5SZXBvLnNhdmUubW9ja1Jlc29sdmVkVmFsdWUoeyB0b2tlbl9pZDogMiB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VydmljZS5yZWZyZXNoVG9rZW4oMSwgJ3ZhbGlkX3JlZnJlc2hfdG9rZW4nKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdC5hY2Nlc3NfdG9rZW4pLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QocmVzdWx0LnJlZnJlc2hfdG9rZW4pLnRvQmVEZWZpbmVkKCk7XG4gICAgICAvLyBTaG91bGQgbm90IGNhbGwgcmV2b2tlQWxsVXNlclRva2Vuc1xuICAgICAgZXhwZWN0KG1vY2tUb2tlblJlcG8udXBkYXRlKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBVbmF1dGhvcml6ZWRFeGNlcHRpb24gaWYgdG9rZW4gcmV2b2tlZCBtb3JlIHRoYW4gMzBzIGFnbycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRBdCA9IG5ldyBEYXRlKERhdGUubm93KCkgLSAzNTAwMCk7IC8vIDM1IHNlY29uZHMgYWdvXG4gICAgICBjb25zdCBtb2NrU3RvcmVkVG9rZW4gPSB7XG4gICAgICAgIHRva2VuSGFzaDogJ3NvbWVoYXNoJyxcbiAgICAgICAgaXNSZXZva2VkOiB0cnVlLFxuICAgICAgICB1cGRhdGVkQXQ6IHVwZGF0ZWRBdCxcbiAgICAgICAgcmVwbGFjZWRCeVRva2VuOiAnbmV3X3Rva2VuX2hhc2gnLFxuICAgICAgICBleHBpcmVzQXQ6IG5ldyBEYXRlKERhdGUubm93KCkgKyAxMDAwMCksXG4gICAgICB9O1xuICAgICAgbW9ja1Rva2VuUmVwby5maW5kT25lLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tTdG9yZWRUb2tlbik7XG5cbiAgICAgIGF3YWl0IGV4cGVjdChzZXJ2aWNlLnJlZnJlc2hUb2tlbigxLCAncmV2b2tlZF90b2tlbicpKS5yZWplY3RzLnRvVGhyb3coXG4gICAgICAgIFVuYXV0aG9yaXplZEV4Y2VwdGlvblxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d3/authservicespec_d358f3290538fb6a6a5cec29846eacd5.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d3/authservicespec_d358f3290538fb6a6a5cec29846eacd5.map new file mode 100644 index 0000000..f2ec78f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d3/authservicespec_d358f3290538fb6a6a5cec29846eacd5.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\auth\\auth.service.spec.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\auth\\auth.service.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\nimport { AuthService } from './auth.service';\nimport { UserService } from '../../modules/user/user.service';\nimport { JwtService } from '@nestjs/jwt';\nimport { ConfigService } from '@nestjs/config';\nimport { CACHE_MANAGER } from '@nestjs/cache-manager';\nimport { getRepositoryToken } from '@nestjs/typeorm';\nimport { User } from '../../modules/user/entities/user.entity';\nimport { RefreshToken } from './entities/refresh-token.entity';\nimport { Repository } from 'typeorm';\nimport { UnauthorizedException } from '@nestjs/common';\n\n// Mock bcrypt at top level\njest.mock('bcrypt', () => ({\n compare: jest.fn(),\n hash: jest.fn().mockResolvedValue('hashedpassword'),\n genSalt: jest.fn().mockResolvedValue('salt'),\n}));\n\nimport * as bcrypt from 'bcrypt';\n\ndescribe('AuthService', () => {\n let service: AuthService;\n let userService: UserService;\n let _jwtService: JwtService;\n let _tokenRepo: Repository;\n\n const mockUser = {\n user_id: 1,\n username: 'testuser',\n password: 'hashedpassword',\n primaryOrganizationId: 1,\n };\n\n const mockQueryBuilder = {\n addSelect: jest.fn().mockReturnThis(),\n leftJoinAndSelect: jest.fn().mockReturnThis(),\n where: jest.fn().mockReturnThis(),\n getOne: jest.fn().mockResolvedValue(mockUser),\n };\n\n const mockUserRepo = {\n createQueryBuilder: jest.fn().mockReturnValue(mockQueryBuilder),\n };\n\n const mockTokenRepo = {\n create: jest.fn(),\n save: jest.fn(),\n findOne: jest.fn(),\n update: jest.fn(),\n };\n\n beforeEach(async () => {\n // Reset bcrypt mocks\n (bcrypt.compare as jest.Mock).mockResolvedValue(true);\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n AuthService,\n {\n provide: UserService,\n useValue: {\n findOneByUsername: jest.fn(),\n create: jest.fn(),\n findOne: jest.fn(),\n },\n },\n {\n provide: JwtService,\n useValue: {\n signAsync: jest.fn().mockResolvedValue('jwt_token'),\n decode: jest.fn(),\n },\n },\n {\n provide: ConfigService,\n useValue: {\n get: jest.fn().mockImplementation((key: string) => {\n if (key.includes('EXPIRATION')) return '1h';\n return 'secret';\n }),\n },\n },\n {\n provide: CACHE_MANAGER,\n useValue: {\n set: jest.fn(),\n },\n },\n {\n provide: getRepositoryToken(User),\n useValue: mockUserRepo,\n },\n {\n provide: getRepositoryToken(RefreshToken),\n useValue: mockTokenRepo,\n },\n ],\n }).compile();\n\n service = module.get(AuthService);\n userService = module.get(UserService);\n _jwtService = module.get(JwtService);\n _tokenRepo = module.get(getRepositoryToken(RefreshToken));\n });\n\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n it('should be defined', () => {\n expect(service).toBeDefined();\n });\n\n describe('validateUser', () => {\n it('should return user without password if validation succeeds', async () => {\n const result = await service.validateUser('testuser', 'password');\n expect(result).toBeDefined();\n expect(result).not.toHaveProperty('password');\n expect(result!.username).toBe('testuser');\n });\n\n it('should return null if user not found', async () => {\n mockQueryBuilder.getOne.mockResolvedValueOnce(null);\n const result = await service.validateUser('unknown', 'password');\n expect(result).toBeNull();\n });\n\n it('should return null if password mismatch', async () => {\n (bcrypt.compare as jest.Mock).mockResolvedValueOnce(false);\n const result = await service.validateUser('testuser', 'wrongpassword');\n expect(result).toBeNull();\n });\n });\n\n describe('login', () => {\n it('should return access and refresh tokens', async () => {\n mockTokenRepo.create.mockReturnValue({ id: 1 });\n mockTokenRepo.save.mockResolvedValue({ id: 1 });\n\n const result = await service.login(mockUser as User);\n\n expect(result).toHaveProperty('access_token');\n expect(result).toHaveProperty('refresh_token');\n expect(mockTokenRepo.save).toHaveBeenCalled();\n });\n });\n\n describe('register', () => {\n it('should register a new user', async () => {\n (userService.findOneByUsername as jest.Mock).mockResolvedValue(null);\n (userService.create as jest.Mock).mockResolvedValue(mockUser);\n\n const dto = {\n username: 'newuser',\n password: 'password',\n email: 'test@example.com',\n firstName: 'Test',\n lastName: 'User',\n };\n\n const result = await service.register(dto);\n const createMock = userService.create as jest.Mock;\n expect(result).toBeDefined();\n expect(createMock).toHaveBeenCalled();\n });\n });\n\n describe('refreshToken', () => {\n it('should return new tokens if valid', async () => {\n const mockStoredToken = {\n tokenHash: 'somehash',\n isRevoked: false,\n expiresAt: new Date(Date.now() + 10000),\n };\n mockTokenRepo.findOne.mockResolvedValue(mockStoredToken);\n (userService.findOne as jest.Mock).mockResolvedValue(mockUser);\n\n const result = await service.refreshToken(1, 'valid_refresh_token');\n\n expect(result.access_token).toBeDefined();\n expect(result.refresh_token).toBeDefined();\n // Should mark old token as revoked\n expect(mockTokenRepo.save).toHaveBeenCalledWith(\n expect.objectContaining({ isRevoked: true })\n );\n });\n\n it('should throw UnauthorizedException if token revoked', async () => {\n const mockStoredToken = {\n tokenHash: 'somehash',\n isRevoked: true,\n expiresAt: new Date(Date.now() + 10000),\n };\n mockTokenRepo.findOne.mockResolvedValue(mockStoredToken);\n\n await expect(service.refreshToken(1, 'revoked_token')).rejects.toThrow(\n UnauthorizedException\n );\n });\n\n it('should allow refresh within 30s grace period if already revoked', async () => {\n const updatedAt = new Date(Date.now() - 5000); // 5 seconds ago\n const mockStoredToken = {\n tokenHash: 'somehash',\n isRevoked: true,\n updatedAt: updatedAt,\n replacedByToken: 'new_token_hash',\n expiresAt: new Date(Date.now() + 10000),\n };\n mockTokenRepo.findOne.mockResolvedValue(mockStoredToken);\n (userService.findOne as jest.Mock).mockResolvedValue(mockUser);\n mockTokenRepo.create.mockReturnValue({ token_id: 2 });\n mockTokenRepo.save.mockResolvedValue({ token_id: 2 });\n\n const result = await service.refreshToken(1, 'valid_refresh_token');\n\n expect(result.access_token).toBeDefined();\n expect(result.refresh_token).toBeDefined();\n // Should not call revokeAllUserTokens\n expect(mockTokenRepo.update).not.toHaveBeenCalled();\n });\n\n it('should throw UnauthorizedException if token revoked more than 30s ago', async () => {\n const updatedAt = new Date(Date.now() - 35000); // 35 seconds ago\n const mockStoredToken = {\n tokenHash: 'somehash',\n isRevoked: true,\n updatedAt: updatedAt,\n replacedByToken: 'new_token_hash',\n expiresAt: new Date(Date.now() + 10000),\n };\n mockTokenRepo.findOne.mockResolvedValue(mockStoredToken);\n\n await expect(service.refreshToken(1, 'revoked_token')).rejects.toThrow(\n UnauthorizedException\n );\n });\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/appcontrollerspec_d48812f9f2031cb8a9251911e95fef18 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/appcontrollerspec_d48812f9f2031cb8a9251911e95fef18 new file mode 100644 index 0000000..c655da7 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/appcontrollerspec_d48812f9f2031cb8a9251911e95fef18 @@ -0,0 +1,22 @@ +a1a29402cd0924f920ca68e4d7e56e6b +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const testing_1 = require("@nestjs/testing"); +const app_controller_1 = require("./app.controller"); +const app_service_1 = require("./app.service"); +describe('AppController', () => { + let appController; + beforeEach(async () => { + const app = await testing_1.Test.createTestingModule({ + controllers: [app_controller_1.AppController], + providers: [app_service_1.AppService], + }).compile(); + appController = app.get(app_controller_1.AppController); + }); + describe('root', () => { + it('should return "Hello World!"', () => { + expect(appController.getHello()).toBe('Hello World!'); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcYXBwLmNvbnRyb2xsZXIuc3BlYy50cyIsIm1hcHBpbmdzIjoiOztBQUFBLDZDQUFzRDtBQUN0RCxxREFBaUQ7QUFDakQsK0NBQTJDO0FBRTNDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFO0lBQzdCLElBQUksYUFBNEIsQ0FBQztJQUVqQyxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDcEIsTUFBTSxHQUFHLEdBQWtCLE1BQU0sY0FBSSxDQUFDLG1CQUFtQixDQUFDO1lBQ3hELFdBQVcsRUFBRSxDQUFDLDhCQUFhLENBQUM7WUFDNUIsU0FBUyxFQUFFLENBQUMsd0JBQVUsQ0FBQztTQUN4QixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFYixhQUFhLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBZ0IsOEJBQWEsQ0FBQyxDQUFDO0lBQ3hELENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7UUFDcEIsRUFBRSxDQUFDLDhCQUE4QixFQUFFLEdBQUcsRUFBRTtZQUN0QyxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3hELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxhcHAuY29udHJvbGxlci5zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlc3QsIFRlc3RpbmdNb2R1bGUgfSBmcm9tICdAbmVzdGpzL3Rlc3RpbmcnO1xuaW1wb3J0IHsgQXBwQ29udHJvbGxlciB9IGZyb20gJy4vYXBwLmNvbnRyb2xsZXInO1xuaW1wb3J0IHsgQXBwU2VydmljZSB9IGZyb20gJy4vYXBwLnNlcnZpY2UnO1xuXG5kZXNjcmliZSgnQXBwQ29udHJvbGxlcicsICgpID0+IHtcbiAgbGV0IGFwcENvbnRyb2xsZXI6IEFwcENvbnRyb2xsZXI7XG5cbiAgYmVmb3JlRWFjaChhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYXBwOiBUZXN0aW5nTW9kdWxlID0gYXdhaXQgVGVzdC5jcmVhdGVUZXN0aW5nTW9kdWxlKHtcbiAgICAgIGNvbnRyb2xsZXJzOiBbQXBwQ29udHJvbGxlcl0sXG4gICAgICBwcm92aWRlcnM6IFtBcHBTZXJ2aWNlXSxcbiAgICB9KS5jb21waWxlKCk7XG5cbiAgICBhcHBDb250cm9sbGVyID0gYXBwLmdldDxBcHBDb250cm9sbGVyPihBcHBDb250cm9sbGVyKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Jvb3QnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gXCJIZWxsbyBXb3JsZCFcIicsICgpID0+IHtcbiAgICAgIGV4cGVjdChhcHBDb250cm9sbGVyLmdldEhlbGxvKCkpLnRvQmUoJ0hlbGxvIFdvcmxkIScpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/appcontrollerspec_d48812f9f2031cb8a9251911e95fef18.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/appcontrollerspec_d48812f9f2031cb8a9251911e95fef18.map new file mode 100644 index 0000000..9a69979 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/appcontrollerspec_d48812f9f2031cb8a9251911e95fef18.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\app.controller.spec.ts","mappings":";;AAAA,6CAAsD;AACtD,qDAAiD;AACjD,+CAA2C;AAE3C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,aAA4B,CAAC;IAEjC,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,GAAG,GAAkB,MAAM,cAAI,CAAC,mBAAmB,CAAC;YACxD,WAAW,EAAE,CAAC,8BAAa,CAAC;YAC5B,SAAS,EAAE,CAAC,wBAAU,CAAC;SACxB,CAAC,CAAC,OAAO,EAAE,CAAC;QAEb,aAAa,GAAG,GAAG,CAAC,GAAG,CAAgB,8BAAa,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;QACpB,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\app.controller.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\nimport { AppController } from './app.controller';\nimport { AppService } from './app.service';\n\ndescribe('AppController', () => {\n let appController: AppController;\n\n beforeEach(async () => {\n const app: TestingModule = await Test.createTestingModule({\n controllers: [AppController],\n providers: [AppService],\n }).compile();\n\n appController = app.get(AppController);\n });\n\n describe('root', () => {\n it('should return \"Hello World!\"', () => {\n expect(appController.getHello()).toBe('Hello World!');\n });\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/asbuiltdrawingentity_d4d4692454e74d45cfa5b98b15dca8e3 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/asbuiltdrawingentity_d4d4692454e74d45cfa5b98b15dca8e3 new file mode 100644 index 0000000..c892321 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/asbuiltdrawingentity_d4d4692454e74d45cfa5b98b15dca8e3 @@ -0,0 +1,92 @@ +57fc1daa36d939e71954c042b0b1280a +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e, _f, _g; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AsBuiltDrawing = void 0; +const typeorm_1 = require("typeorm"); +const project_entity_1 = require("../../project/entities/project.entity"); +const asbuilt_drawing_revision_entity_1 = require("./asbuilt-drawing-revision.entity"); +const user_entity_1 = require("../../user/entities/user.entity"); +const shop_drawing_main_category_entity_1 = require("./shop-drawing-main-category.entity"); +const shop_drawing_sub_category_entity_1 = require("./shop-drawing-sub-category.entity"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const class_transformer_1 = require("class-transformer"); +let AsBuiltDrawing = class AsBuiltDrawing extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.AsBuiltDrawing = AsBuiltDrawing; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], AsBuiltDrawing.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id' }), + __metadata("design:type", Number) +], AsBuiltDrawing.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'drawing_number', length: 100, unique: true }), + __metadata("design:type", String) +], AsBuiltDrawing.prototype, "drawingNumber", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'main_category_id' }), + __metadata("design:type", Number) +], AsBuiltDrawing.prototype, "mainCategoryId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sub_category_id' }), + __metadata("design:type", Number) +], AsBuiltDrawing.prototype, "subCategoryId", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], AsBuiltDrawing.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], AsBuiltDrawing.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.DeleteDateColumn)({ name: 'deleted_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], AsBuiltDrawing.prototype, "deletedAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'updated_by', nullable: true }), + __metadata("design:type", Number) +], AsBuiltDrawing.prototype, "updatedBy", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => project_entity_1.Project), + (0, typeorm_1.JoinColumn)({ name: 'project_id' }), + __metadata("design:type", typeof (_d = typeof project_entity_1.Project !== "undefined" && project_entity_1.Project) === "function" ? _d : Object) +], AsBuiltDrawing.prototype, "project", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => shop_drawing_main_category_entity_1.ShopDrawingMainCategory), + (0, typeorm_1.JoinColumn)({ name: 'main_category_id' }), + __metadata("design:type", typeof (_e = typeof shop_drawing_main_category_entity_1.ShopDrawingMainCategory !== "undefined" && shop_drawing_main_category_entity_1.ShopDrawingMainCategory) === "function" ? _e : Object) +], AsBuiltDrawing.prototype, "mainCategory", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => shop_drawing_sub_category_entity_1.ShopDrawingSubCategory), + (0, typeorm_1.JoinColumn)({ name: 'sub_category_id' }), + __metadata("design:type", typeof (_f = typeof shop_drawing_sub_category_entity_1.ShopDrawingSubCategory !== "undefined" && shop_drawing_sub_category_entity_1.ShopDrawingSubCategory) === "function" ? _f : Object) +], AsBuiltDrawing.prototype, "subCategory", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'updated_by' }), + __metadata("design:type", typeof (_g = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _g : Object) +], AsBuiltDrawing.prototype, "updater", void 0); +__decorate([ + (0, typeorm_1.OneToMany)(() => asbuilt_drawing_revision_entity_1.AsBuiltDrawingRevision, (revision) => revision.asBuiltDrawing, { + cascade: true, + }), + __metadata("design:type", Array) +], AsBuiltDrawing.prototype, "revisions", void 0); +exports.AsBuiltDrawing = AsBuiltDrawing = __decorate([ + (0, typeorm_1.Entity)('asbuilt_drawings') +], AsBuiltDrawing); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXGFzYnVpbHQtZHJhd2luZy5lbnRpdHkudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHFDQVVpQjtBQUNqQiwwRUFBZ0U7QUFDaEUsdUZBQTJFO0FBQzNFLGlFQUF1RDtBQUN2RCwyRkFBOEU7QUFDOUUseUZBQTRFO0FBQzVFLGdGQUEyRTtBQUMzRSx5REFBNEM7QUFHckMsSUFBTSxjQUFjLEdBQXBCLE1BQU0sY0FBZSxTQUFRLGlDQUFjO0NBc0RqRCxDQUFBO0FBdERZLHdDQUFjO0FBR3pCO0lBRkMsSUFBQSxnQ0FBc0IsR0FBRTtJQUN4QixJQUFBLDJCQUFPLEdBQUU7OzBDQUNFO0FBR1o7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7O2lEQUNaO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDOztxREFDdkM7QUFHdkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQzs7c0RBQ2I7QUFHeEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQzs7cURBQ2I7QUFHdkI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7aURBQUM7QUFHakI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7aURBQUM7QUFHakI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7aURBQUM7QUFHakI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7aURBQzVCO0FBS25CO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLHdCQUFPLENBQUM7SUFDeEIsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUN6Qix3QkFBTyxvQkFBUCx3QkFBTzsrQ0FBQztBQUlsQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQywyREFBdUIsQ0FBQztJQUN4QyxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztrREFDMUIsMkRBQXVCLG9CQUF2QiwyREFBdUI7b0RBQUM7QUFJdkM7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMseURBQXNCLENBQUM7SUFDdkMsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUM7a0RBQzFCLHlEQUFzQixvQkFBdEIseURBQXNCO21EQUFDO0FBSXJDO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFJLENBQUM7SUFDckIsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUN6QixrQkFBSSxvQkFBSixrQkFBSTsrQ0FBQztBQVNmO0lBUEMsSUFBQSxtQkFBUyxFQUNSLEdBQUcsRUFBRSxDQUFDLHdEQUFzQixFQUM1QixDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFDckM7UUFDRSxPQUFPLEVBQUUsSUFBSTtLQUNkLENBQ0Y7O2lEQUNvQzt5QkFyRDFCLGNBQWM7SUFEMUIsSUFBQSxnQkFBTSxFQUFDLGtCQUFrQixDQUFDO0dBQ2QsY0FBYyxDQXNEMUIiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXGFzYnVpbHQtZHJhd2luZy5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW50aXR5LFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBDb2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIFVwZGF0ZURhdGVDb2x1bW4sXG4gIERlbGV0ZURhdGVDb2x1bW4sXG4gIE1hbnlUb09uZSxcbiAgT25lVG9NYW55LFxuICBKb2luQ29sdW1uLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0L2VudGl0aWVzL3Byb2plY3QuZW50aXR5JztcbmltcG9ydCB7IEFzQnVpbHREcmF3aW5nUmV2aXNpb24gfSBmcm9tICcuL2FzYnVpbHQtZHJhd2luZy1yZXZpc2lvbi5lbnRpdHknO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL3VzZXIvZW50aXRpZXMvdXNlci5lbnRpdHknO1xuaW1wb3J0IHsgU2hvcERyYXdpbmdNYWluQ2F0ZWdvcnkgfSBmcm9tICcuL3Nob3AtZHJhd2luZy1tYWluLWNhdGVnb3J5LmVudGl0eSc7XG5pbXBvcnQgeyBTaG9wRHJhd2luZ1N1YkNhdGVnb3J5IH0gZnJvbSAnLi9zaG9wLWRyYXdpbmctc3ViLWNhdGVnb3J5LmVudGl0eSc7XG5pbXBvcnQgeyBVdWlkQmFzZUVudGl0eSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9lbnRpdGllcy91dWlkLWJhc2UuZW50aXR5JztcbmltcG9ydCB7IEV4Y2x1ZGUgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XG5cbkBFbnRpdHkoJ2FzYnVpbHRfZHJhd2luZ3MnKVxuZXhwb3J0IGNsYXNzIEFzQnVpbHREcmF3aW5nIGV4dGVuZHMgVXVpZEJhc2VFbnRpdHkge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIEBFeGNsdWRlKClcbiAgaWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdwcm9qZWN0X2lkJyB9KVxuICBwcm9qZWN0SWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdkcmF3aW5nX251bWJlcicsIGxlbmd0aDogMTAwLCB1bmlxdWU6IHRydWUgfSlcbiAgZHJhd2luZ051bWJlciE6IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ21haW5fY2F0ZWdvcnlfaWQnIH0pXG4gIG1haW5DYXRlZ29yeUlkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnc3ViX2NhdGVnb3J5X2lkJyB9KVxuICBzdWJDYXRlZ29yeUlkITogbnVtYmVyO1xuXG4gIEBDcmVhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYXQnIH0pXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG5cbiAgQFVwZGF0ZURhdGVDb2x1bW4oeyBuYW1lOiAndXBkYXRlZF9hdCcgfSlcbiAgdXBkYXRlZEF0ITogRGF0ZTtcblxuICBARGVsZXRlRGF0ZUNvbHVtbih7IG5hbWU6ICdkZWxldGVkX2F0JyB9KVxuICBkZWxldGVkQXQ/OiBEYXRlO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAndXBkYXRlZF9ieScsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHVwZGF0ZWRCeT86IG51bWJlcjtcblxuICAvLyBSZWxhdGlvbnNcbiAgQE1hbnlUb09uZSgoKSA9PiBQcm9qZWN0KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdwcm9qZWN0X2lkJyB9KVxuICBwcm9qZWN0ITogUHJvamVjdDtcblxuICBATWFueVRvT25lKCgpID0+IFNob3BEcmF3aW5nTWFpbkNhdGVnb3J5KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdtYWluX2NhdGVnb3J5X2lkJyB9KVxuICBtYWluQ2F0ZWdvcnkhOiBTaG9wRHJhd2luZ01haW5DYXRlZ29yeTtcblxuICBATWFueVRvT25lKCgpID0+IFNob3BEcmF3aW5nU3ViQ2F0ZWdvcnkpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3N1Yl9jYXRlZ29yeV9pZCcgfSlcbiAgc3ViQ2F0ZWdvcnkhOiBTaG9wRHJhd2luZ1N1YkNhdGVnb3J5O1xuXG4gIEBNYW55VG9PbmUoKCkgPT4gVXNlcilcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAndXBkYXRlZF9ieScgfSlcbiAgdXBkYXRlcj86IFVzZXI7XG5cbiAgQE9uZVRvTWFueShcbiAgICAoKSA9PiBBc0J1aWx0RHJhd2luZ1JldmlzaW9uLFxuICAgIChyZXZpc2lvbikgPT4gcmV2aXNpb24uYXNCdWlsdERyYXdpbmcsXG4gICAge1xuICAgICAgY2FzY2FkZTogdHJ1ZSxcbiAgICB9XG4gIClcbiAgcmV2aXNpb25zITogQXNCdWlsdERyYXdpbmdSZXZpc2lvbltdO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/asbuiltdrawingentity_d4d4692454e74d45cfa5b98b15dca8e3.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/asbuiltdrawingentity_d4d4692454e74d45cfa5b98b15dca8e3.map new file mode 100644 index 0000000..26a8cd8 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/asbuiltdrawingentity_d4d4692454e74d45cfa5b98b15dca8e3.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\asbuilt-drawing.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAUiB;AACjB,0EAAgE;AAChE,uFAA2E;AAC3E,iEAAuD;AACvD,2FAA8E;AAC9E,yFAA4E;AAC5E,gFAA2E;AAC3E,yDAA4C;AAGrC,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,iCAAc;CAsDjD,CAAA;AAtDY,wCAAc;AAGzB;IAFC,IAAA,gCAAsB,GAAE;IACxB,IAAA,2BAAO,GAAE;;0CACE;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;iDACZ;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;qDACvC;AAGvB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;;sDACb;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;;qDACb;AAGvB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;iDAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;iDAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;iDAAC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iDAC5B;AAKnB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wBAAO,CAAC;IACxB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,wBAAO,oBAAP,wBAAO;+CAAC;AAIlB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,2DAAuB,CAAC;IACxC,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;kDAC1B,2DAAuB,oBAAvB,2DAAuB;oDAAC;AAIvC;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,yDAAsB,CAAC;IACvC,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;kDAC1B,yDAAsB,oBAAtB,yDAAsB;mDAAC;AAIrC;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,CAAC;IACrB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,kBAAI,oBAAJ,kBAAI;+CAAC;AASf;IAPC,IAAA,mBAAS,EACR,GAAG,EAAE,CAAC,wDAAsB,EAC5B,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,cAAc,EACrC;QACE,OAAO,EAAE,IAAI;KACd,CACF;;iDACoC;yBArD1B,cAAc;IAD1B,IAAA,gBAAM,EAAC,kBAAkB,CAAC;GACd,cAAc,CAsD1B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\asbuilt-drawing.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n UpdateDateColumn,\n DeleteDateColumn,\n ManyToOne,\n OneToMany,\n JoinColumn,\n} from 'typeorm';\nimport { Project } from '../../project/entities/project.entity';\nimport { AsBuiltDrawingRevision } from './asbuilt-drawing-revision.entity';\nimport { User } from '../../user/entities/user.entity';\nimport { ShopDrawingMainCategory } from './shop-drawing-main-category.entity';\nimport { ShopDrawingSubCategory } from './shop-drawing-sub-category.entity';\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\nimport { Exclude } from 'class-transformer';\n\n@Entity('asbuilt_drawings')\nexport class AsBuiltDrawing extends UuidBaseEntity {\n @PrimaryGeneratedColumn()\n @Exclude()\n id!: number;\n\n @Column({ name: 'project_id' })\n projectId!: number;\n\n @Column({ name: 'drawing_number', length: 100, unique: true })\n drawingNumber!: string;\n\n @Column({ name: 'main_category_id' })\n mainCategoryId!: number;\n\n @Column({ name: 'sub_category_id' })\n subCategoryId!: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n @DeleteDateColumn({ name: 'deleted_at' })\n deletedAt?: Date;\n\n @Column({ name: 'updated_by', nullable: true })\n updatedBy?: number;\n\n // Relations\n @ManyToOne(() => Project)\n @JoinColumn({ name: 'project_id' })\n project!: Project;\n\n @ManyToOne(() => ShopDrawingMainCategory)\n @JoinColumn({ name: 'main_category_id' })\n mainCategory!: ShopDrawingMainCategory;\n\n @ManyToOne(() => ShopDrawingSubCategory)\n @JoinColumn({ name: 'sub_category_id' })\n subCategory!: ShopDrawingSubCategory;\n\n @ManyToOne(() => User)\n @JoinColumn({ name: 'updated_by' })\n updater?: User;\n\n @OneToMany(\n () => AsBuiltDrawingRevision,\n (revision) => revision.asBuiltDrawing,\n {\n cascade: true,\n }\n )\n revisions!: AsBuiltDrawingRevision[];\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/userpreferenceentity_d4265ce3bf2f4d9f69fac10e9f68acd5 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/userpreferenceentity_d4265ce3bf2f4d9f69fac10e9f68acd5 new file mode 100644 index 0000000..a23b671 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/userpreferenceentity_d4265ce3bf2f4d9f69fac10e9f68acd5 @@ -0,0 +1,54 @@ +5a8455555fc5390c39364feb1bafb80f +"use strict"; +// File: src/modules/user/entities/user-preference.entity.ts +// บันทึกการแก้ไข: Entity สำหรับเก็บการตั้งค่าส่วนตัวของผู้ใช้ แยกจากตาราง Users (T1.3) +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UserPreference = void 0; +const typeorm_1 = require("typeorm"); +const user_entity_1 = require("./user.entity"); +let UserPreference = class UserPreference { +}; +exports.UserPreference = UserPreference; +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'user_id' }), + __metadata("design:type", Number) +], UserPreference.prototype, "userId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'notify_email', default: true }), + __metadata("design:type", Boolean) +], UserPreference.prototype, "notifyEmail", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'notify_line', default: true }), + __metadata("design:type", Boolean) +], UserPreference.prototype, "notifyLine", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'digest_mode', default: false }), + __metadata("design:type", Boolean) +], UserPreference.prototype, "digestMode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'ui_theme', default: 'light', length: 20 }), + __metadata("design:type", String) +], UserPreference.prototype, "uiTheme", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], UserPreference.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.OneToOne)(() => user_entity_1.User, (user) => user.preference, { onDelete: 'CASCADE' }), + (0, typeorm_1.JoinColumn)({ name: 'user_id' }), + __metadata("design:type", typeof (_b = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _b : Object) +], UserPreference.prototype, "user", void 0); +exports.UserPreference = UserPreference = __decorate([ + (0, typeorm_1.Entity)('user_preferences') +], UserPreference); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcdXNlclxcZW50aXRpZXNcXHVzZXItcHJlZmVyZW5jZS5lbnRpdHkudHMiLCJtYXBwaW5ncyI6IjtBQUFBLDREQUE0RDtBQUM1RCx1RkFBdUY7Ozs7Ozs7Ozs7Ozs7QUFFdkYscUNBT2lCO0FBQ2pCLCtDQUFxQztBQUc5QixJQUFNLGNBQWMsR0FBcEIsTUFBTSxjQUFjO0NBdUIxQixDQUFBO0FBdkJZLHdDQUFjO0FBRXpCO0lBREMsSUFBQSx1QkFBYSxFQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOzs4Q0FDbkI7QUFHaEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7bURBQzFCO0FBR3RCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7O2tEQUMxQjtBQUdyQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDOztrREFDM0I7QUFHckI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDOzsrQ0FDMUM7QUFHakI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7aURBQUM7QUFLakI7SUFGQyxJQUFBLGtCQUFRLEVBQUMsR0FBRyxFQUFFLENBQUMsa0JBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUN4RSxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7a0RBQ3pCLGtCQUFJLG9CQUFKLGtCQUFJOzRDQUFDO3lCQXRCRCxjQUFjO0lBRDFCLElBQUEsZ0JBQU0sRUFBQyxrQkFBa0IsQ0FBQztHQUNkLGNBQWMsQ0F1QjFCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXHVzZXJcXGVudGl0aWVzXFx1c2VyLXByZWZlcmVuY2UuZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9tb2R1bGVzL3VzZXIvZW50aXRpZXMvdXNlci1wcmVmZXJlbmNlLmVudGl0eS50c1xuLy8g4Lia4Lix4LiZ4LiX4Li24LiB4LiB4Liy4Lij4LmB4LiB4LmJ4LmE4LiCOiBFbnRpdHkg4Liq4Liz4Lir4Lij4Lix4Lia4LmA4LiB4LmH4Lia4LiB4Liy4Lij4LiV4Lix4LmJ4LiH4LiE4LmI4Liy4Liq4LmI4Lin4LiZ4LiV4Lix4Lin4LiC4Lit4LiH4Lic4Li54LmJ4LmD4LiK4LmJIOC5geC4ouC4geC4iOC4suC4geC4leC4suC4o+C4suC4hyBVc2VycyAoVDEuMylcblxuaW1wb3J0IHtcbiAgRW50aXR5LFxuICBDb2x1bW4sXG4gIFByaW1hcnlDb2x1bW4sXG4gIFVwZGF0ZURhdGVDb2x1bW4sXG4gIE9uZVRvT25lLFxuICBKb2luQ29sdW1uLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuL3VzZXIuZW50aXR5JztcblxuQEVudGl0eSgndXNlcl9wcmVmZXJlbmNlcycpXG5leHBvcnQgY2xhc3MgVXNlclByZWZlcmVuY2Uge1xuICBAUHJpbWFyeUNvbHVtbih7IG5hbWU6ICd1c2VyX2lkJyB9KVxuICB1c2VySWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdub3RpZnlfZW1haWwnLCBkZWZhdWx0OiB0cnVlIH0pXG4gIG5vdGlmeUVtYWlsITogYm9vbGVhbjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ25vdGlmeV9saW5lJywgZGVmYXVsdDogdHJ1ZSB9KVxuICBub3RpZnlMaW5lITogYm9vbGVhbjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2RpZ2VzdF9tb2RlJywgZGVmYXVsdDogZmFsc2UgfSlcbiAgZGlnZXN0TW9kZSE6IGJvb2xlYW47IC8vIOC4o+C4seC4muC5geC4iOC5ieC4h+C5gOC4leC4t+C4reC4meC5geC4muC4muC4o+C4p+C4oSAoRGlnZXN0KSDguYHguJfguJkgUmVhbC10aW1lXG5cbiAgQENvbHVtbih7IG5hbWU6ICd1aV90aGVtZScsIGRlZmF1bHQ6ICdsaWdodCcsIGxlbmd0aDogMjAgfSlcbiAgdWlUaGVtZSE6IHN0cmluZztcblxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxuICB1cGRhdGVkQXQhOiBEYXRlO1xuXG4gIC8vIC0tLSBSZWxhdGlvbiAtLS1cbiAgQE9uZVRvT25lKCgpID0+IFVzZXIsICh1c2VyKSA9PiB1c2VyLnByZWZlcmVuY2UsIHsgb25EZWxldGU6ICdDQVNDQURFJyB9KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICd1c2VyX2lkJyB9KVxuICB1c2VyITogVXNlcjtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/userpreferenceentity_d4265ce3bf2f4d9f69fac10e9f68acd5.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/userpreferenceentity_d4265ce3bf2f4d9f69fac10e9f68acd5.map new file mode 100644 index 0000000..9ec2687 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d4/userpreferenceentity_d4265ce3bf2f4d9f69fac10e9f68acd5.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\entities\\user-preference.entity.ts","mappings":";AAAA,4DAA4D;AAC5D,uFAAuF;;;;;;;;;;;;;AAEvF,qCAOiB;AACjB,+CAAqC;AAG9B,IAAM,cAAc,GAApB,MAAM,cAAc;CAuB1B,CAAA;AAvBY,wCAAc;AAEzB;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;8CACnB;AAGhB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;mDAC1B;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;kDAC1B;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;kDAC3B;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;+CAC1C;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;iDAAC;AAKjB;IAFC,IAAA,kBAAQ,EAAC,GAAG,EAAE,CAAC,kBAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACxE,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;kDACzB,kBAAI,oBAAJ,kBAAI;4CAAC;yBAtBD,cAAc;IAD1B,IAAA,gBAAM,EAAC,kBAAkB,CAAC;GACd,cAAc,CAuB1B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\entities\\user-preference.entity.ts"],"sourcesContent":["// File: src/modules/user/entities/user-preference.entity.ts\n// บันทึกการแก้ไข: Entity สำหรับเก็บการตั้งค่าส่วนตัวของผู้ใช้ แยกจากตาราง Users (T1.3)\n\nimport {\n Entity,\n Column,\n PrimaryColumn,\n UpdateDateColumn,\n OneToOne,\n JoinColumn,\n} from 'typeorm';\nimport { User } from './user.entity';\n\n@Entity('user_preferences')\nexport class UserPreference {\n @PrimaryColumn({ name: 'user_id' })\n userId!: number;\n\n @Column({ name: 'notify_email', default: true })\n notifyEmail!: boolean;\n\n @Column({ name: 'notify_line', default: true })\n notifyLine!: boolean;\n\n @Column({ name: 'digest_mode', default: false })\n digestMode!: boolean; // รับแจ้งเตือนแบบรวม (Digest) แทน Real-time\n\n @Column({ name: 'ui_theme', default: 'light', length: 20 })\n uiTheme!: string;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n // --- Relation ---\n @OneToOne(() => User, (user) => user.preference, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'user_id' })\n user!: User;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d5/correspondenceworkflowservice_d594806472d229cf8c80ddadf6ae4d7e b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d5/correspondenceworkflowservice_d594806472d229cf8c80ddadf6ae4d7e new file mode 100644 index 0000000..9e487ea --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d5/correspondenceworkflowservice_d594806472d229cf8c80ddadf6ae4d7e @@ -0,0 +1,160 @@ +2a9abde98c43717692db5ea0d6457b89 +"use strict"; +// File: src/modules/correspondence/correspondence-workflow.service.ts +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var CorrespondenceWorkflowService_1; +var _a, _b, _c, _d, _e, _f, _g, _h; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceWorkflowService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const workflow_engine_service_1 = require("../workflow-engine/workflow-engine.service"); +const correspondence_revision_entity_1 = require("./entities/correspondence-revision.entity"); +const correspondence_status_entity_1 = require("./entities/correspondence-status.entity"); +const correspondence_entity_1 = require("./entities/correspondence.entity"); +const correspondence_recipient_entity_1 = require("./entities/correspondence-recipient.entity"); +const notification_service_1 = require("../notification/notification.service"); +const user_service_1 = require("../user/user.service"); +let CorrespondenceWorkflowService = CorrespondenceWorkflowService_1 = class CorrespondenceWorkflowService { + constructor(workflowEngine, correspondenceRepo, revisionRepo, statusRepo, recipientRepo, dataSource, notificationService, userService) { + this.workflowEngine = workflowEngine; + this.correspondenceRepo = correspondenceRepo; + this.revisionRepo = revisionRepo; + this.statusRepo = statusRepo; + this.recipientRepo = recipientRepo; + this.dataSource = dataSource; + this.notificationService = notificationService; + this.userService = userService; + this.logger = new common_1.Logger(CorrespondenceWorkflowService_1.name); + this.WORKFLOW_CODE = 'CORRESPONDENCE_FLOW_V1'; + } + async submitWorkflow(correspondenceId, userId, userRoles, // [FIX] Added roles for DSL requirements check + note) { + const queryRunner = this.dataSource.createQueryRunner(); + await queryRunner.connect(); + await queryRunner.startTransaction(); + try { + const revision = await this.revisionRepo.findOne({ + // ✅ FIX: CamelCase (correspondenceId, isCurrent) + where: { correspondenceId: correspondenceId, isCurrent: true }, + relations: ['correspondence'], + }); + if (!revision) { + throw new common_1.NotFoundException(`Correspondence Revision for ID ${correspondenceId} not found`); + } + // ✅ FIX: Check undefined before access + if (!revision.correspondence) { + throw new common_1.NotFoundException(`Correspondence relation not found`); + } + const context = { + // ✅ FIX: CamelCase (projectId, correspondenceTypeId) + projectId: revision.correspondence.projectId, + typeId: revision.correspondence.correspondenceTypeId, + ownerId: userId, + amount: 0, + priority: 'NORMAL', + }; + const instance = await this.workflowEngine.createInstance(this.WORKFLOW_CODE, 'correspondence_revision', revision.id.toString(), context); + const transitionResult = await this.workflowEngine.processTransition(instance.id, 'SUBMIT', userId, note || 'Initial Submission', { roles: userRoles } // [FIX] Pass roles for DSL requirements check + ); + await this.syncStatus(revision, transitionResult.nextState, queryRunner); + await queryRunner.commitTransaction(); + // Notify TO recipient org users (fire-and-forget) + const corrForNotify = revision.correspondence; + if (corrForNotify) { + void this.recipientRepo + .find({ + where: { + correspondenceId: corrForNotify.id, + recipientType: 'TO', + }, + }) + .then(async (recipients) => { + for (const r of recipients) { + const targetUserId = await this.userService.findDocControlIdByOrg(r.recipientOrganizationId); + if (targetUserId) { + await this.notificationService.send({ + userId: targetUserId, + title: 'New Correspondence Received', + message: `${corrForNotify.correspondenceNumber} has been submitted to your organization.`, + type: 'EMAIL', + entityType: 'correspondence', + entityId: revision.correspondenceId, + link: `/correspondences/${corrForNotify.publicId}`, + }); + } + } + }) + .catch((err) => this.logger.warn(`Submit notification failed: ${err.message}`)); + } + return { + instanceId: instance.id, + currentState: transitionResult.nextState, + }; + } + catch (error) { + await queryRunner.rollbackTransaction(); + this.logger.error(`Failed to submit workflow: ${String(error)}`); + throw error; + } + finally { + await queryRunner.release(); + } + } + async processAction(instanceId, userId, dto) { + const result = await this.workflowEngine.processTransition(instanceId, dto.action, userId, dto.comment, dto.payload); + // ✅ FIX: Method exists now + const instance = await this.workflowEngine.getInstanceById(instanceId); + if (instance && instance.entityType === 'correspondence_revision') { + const revision = await this.revisionRepo.findOne({ + where: { id: Number(instance.entityId) }, + }); + if (revision) { + await this.syncStatus(revision, result.nextState); + } + } + return result; + } + async syncStatus(revision, workflowState, queryRunner) { + const statusMap = { + DRAFT: 'DRAFT', + IN_REVIEW: 'SUBOWN', + APPROVED: 'CLBOWN', + REJECTED: 'CCBOWN', + }; + const targetCode = statusMap[workflowState] || 'DRAFT'; + const status = await this.statusRepo.findOne({ + where: { statusCode: targetCode }, // ✅ FIX: CamelCase + }); + if (status) { + // ✅ FIX: CamelCase (correspondenceStatusId) + revision.statusId = status.id; + const manager = queryRunner + ? queryRunner.manager + : this.revisionRepo.manager; + await manager.save(revision); + } + } +}; +exports.CorrespondenceWorkflowService = CorrespondenceWorkflowService; +exports.CorrespondenceWorkflowService = CorrespondenceWorkflowService = CorrespondenceWorkflowService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(1, (0, typeorm_1.InjectRepository)(correspondence_entity_1.Correspondence)), + __param(2, (0, typeorm_1.InjectRepository)(correspondence_revision_entity_1.CorrespondenceRevision)), + __param(3, (0, typeorm_1.InjectRepository)(correspondence_status_entity_1.CorrespondenceStatus)), + __param(4, (0, typeorm_1.InjectRepository)(correspondence_recipient_entity_1.CorrespondenceRecipient)), + __metadata("design:paramtypes", [typeof (_a = typeof workflow_engine_service_1.WorkflowEngineService !== "undefined" && workflow_engine_service_1.WorkflowEngineService) === "function" ? _a : Object, typeof (_b = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _b : Object, typeof (_c = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _c : Object, typeof (_d = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _d : Object, typeof (_e = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _e : Object, typeof (_f = typeof typeorm_2.DataSource !== "undefined" && typeorm_2.DataSource) === "function" ? _f : Object, typeof (_g = typeof notification_service_1.NotificationService !== "undefined" && notification_service_1.NotificationService) === "function" ? _g : Object, typeof (_h = typeof user_service_1.UserService !== "undefined" && user_service_1.UserService) === "function" ? _h : Object]) +], CorrespondenceWorkflowService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGNvcnJlc3BvbmRlbmNlLXdvcmtmbG93LnNlcnZpY2UudHMiLCJtYXBwaW5ncyI6IjtBQUFBLHNFQUFzRTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFdEUsMkNBQXVFO0FBQ3ZFLDZDQUFtRDtBQUNuRCxxQ0FBaUQ7QUFHakQsd0ZBQW1GO0FBQ25GLDhGQUFtRjtBQUNuRiwwRkFBK0U7QUFDL0UsNEVBQWtFO0FBQ2xFLGdHQUFxRjtBQUNyRiwrRUFBMkU7QUFDM0UsdURBQW1EO0FBRzVDLElBQU0sNkJBQTZCLHFDQUFuQyxNQUFNLDZCQUE2QjtJQUl4QyxZQUNtQixjQUFxQyxFQUV0RCxrQkFBK0QsRUFFL0QsWUFBaUUsRUFFakUsVUFBNkQsRUFFN0QsYUFBbUUsRUFDbEQsVUFBc0IsRUFDdEIsbUJBQXdDLEVBQ3hDLFdBQXdCO1FBWHhCLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtRQUVyQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQTRCO1FBRTlDLGlCQUFZLEdBQVosWUFBWSxDQUFvQztRQUVoRCxlQUFVLEdBQVYsVUFBVSxDQUFrQztRQUU1QyxrQkFBYSxHQUFiLGFBQWEsQ0FBcUM7UUFDbEQsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBZjFCLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQywrQkFBNkIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxrQkFBYSxHQUFHLHdCQUF3QixDQUFDO0lBZXZELENBQUM7SUFFSixLQUFLLENBQUMsY0FBYyxDQUNsQixnQkFBd0IsRUFDeEIsTUFBYyxFQUNkLFNBQW1CLEVBQUUsK0NBQStDO0lBQ3BFLElBQWE7UUFFYixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDeEQsTUFBTSxXQUFXLENBQUMsT0FB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V0FBQSxJQUFBLDBCQUFnQixFQUFDLHVEQUFzQixDQUFDLENBQUE7SUFFeEMsV0FBQSxJQUFBLDBCQUFnQixFQUFDLG1EQUFvQixDQUFDLENBQUE7SUFFdEMsV0FBQSxJQUFBLDBCQUFnQixFQUFDLHlEQUF1QixDQUFDLENBQUE7eURBUFQsK0NBQXFCLG9CQUFyQiwrQ0FBcUIsb0RBRWpCLG9CQUFVLG9CQUFWLG9CQUFVLG9EQUVoQixvQkFBVSxvQkFBVixvQkFBVSxvREFFWixvQkFBVSxvQkFBVixvQkFBVSxvREFFUCxvQkFBVSxvQkFBVixvQkFBVSxvREFDYixvQkFBVSxvQkFBVixvQkFBVSxvREFDRCwwQ0FBbUIsb0JBQW5CLDBDQUFtQixvREFDM0IsMEJBQVcsb0JBQVgsMEJBQVc7R0FoQmhDLDZCQUE2QixDQWlMekMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGNvcnJlc3BvbmRlbmNlLXdvcmtmbG93LnNlcnZpY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRmlsZTogc3JjL21vZHVsZXMvY29ycmVzcG9uZGVuY2UvY29ycmVzcG9uZGVuY2Utd29ya2Zsb3cuc2VydmljZS50c1xyXG5cclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgTG9nZ2VyLCBOb3RGb3VuZEV4Y2VwdGlvbiB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcclxuaW1wb3J0IHsgSW5qZWN0UmVwb3NpdG9yeSB9IGZyb20gJ0BuZXN0anMvdHlwZW9ybSc7XHJcbmltcG9ydCB7IERhdGFTb3VyY2UsIFJlcG9zaXRvcnkgfSBmcm9tICd0eXBlb3JtJztcclxuXHJcbmltcG9ydCB7IFdvcmtmbG93VHJhbnNpdGlvbkR0byB9IGZyb20gJy4uL3dvcmtmbG93LWVuZ2luZS9kdG8vd29ya2Zsb3ctdHJhbnNpdGlvbi5kdG8nO1xyXG5pbXBvcnQgeyBXb3JrZmxvd0VuZ2luZVNlcnZpY2UgfSBmcm9tICcuLi93b3JrZmxvdy1lbmdpbmUvd29ya2Zsb3ctZW5naW5lLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJldmlzaW9uIH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS1yZXZpc2lvbi5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVN0YXR1cyB9IGZyb20gJy4vZW50aXRpZXMvY29ycmVzcG9uZGVuY2Utc3RhdHVzLmVudGl0eSc7XHJcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlIH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJlY2lwaWVudCB9IGZyb20gJy4vZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtcmVjaXBpZW50LmVudGl0eSc7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uL3VzZXIvdXNlci5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIENvcnJlc3BvbmRlbmNlV29ya2Zsb3dTZXJ2aWNlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoQ29ycmVzcG9uZGVuY2VXb3JrZmxvd1NlcnZpY2UubmFtZSk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBXT1JLRkxPV19DT0RFID0gJ0NPUlJFU1BPTkRFTkNFX0ZMT1dfVjEnO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgd29ya2Zsb3dFbmdpbmU6IFdvcmtmbG93RW5naW5lU2VydmljZSxcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KENvcnJlc3BvbmRlbmNlKVxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb3JyZXNwb25kZW5jZVJlcG86IFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2U+LFxyXG4gICAgQEluamVjdFJlcG9zaXRvcnkoQ29ycmVzcG9uZGVuY2VSZXZpc2lvbilcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmV2aXNpb25SZXBvOiBSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlUmV2aXNpb24+LFxyXG4gICAgQEluamVjdFJlcG9zaXRvcnkoQ29ycmVzcG9uZGVuY2VTdGF0dXMpXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXR1c1JlcG86IFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VTdGF0dXM+LFxyXG4gICAgQEluamVjdFJlcG9zaXRvcnkoQ29ycmVzcG9uZGVuY2VSZWNpcGllbnQpXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlY2lwaWVudFJlcG86IFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VSZWNpcGllbnQ+LFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBkYXRhU291cmNlOiBEYXRhU291cmNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB1c2VyU2VydmljZTogVXNlclNlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIGFzeW5jIHN1Ym1pdFdvcmtmbG93KFxyXG4gICAgY29ycmVzcG9uZGVuY2VJZDogbnVtYmVyLFxyXG4gICAgdXNlcklkOiBudW1iZXIsXHJcbiAgICB1c2VyUm9sZXM6IHN0cmluZ1tdLCAvLyBbRklYXSBBZGRlZCByb2xlcyBmb3IgRFNMIHJlcXVpcmVtZW50cyBjaGVja1xyXG4gICAgbm90ZT86IHN0cmluZ1xyXG4gICkge1xyXG4gICAgY29uc3QgcXVlcnlSdW5uZXIgPSB0aGlzLmRhdGFTb3VyY2UuY3JlYXRlUXVlcnlSdW5uZXIoKTtcclxuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbm5lY3QoKTtcclxuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXZpc2lvbiA9IGF3YWl0IHRoaXMucmV2aXNpb25SZXBvLmZpbmRPbmUoe1xyXG4gICAgICAgIC8vIOKchSBGSVg6IENhbWVsQ2FzZSAoY29ycmVzcG9uZGVuY2VJZCwgaXNDdXJyZW50KVxyXG4gICAgICAgIHdoZXJlOiB7IGNvcnJlc3BvbmRlbmNlSWQ6IGNvcnJlc3BvbmRlbmNlSWQsIGlzQ3VycmVudDogdHJ1ZSB9LFxyXG4gICAgICAgIHJlbGF0aW9uczogWydjb3JyZXNwb25kZW5jZSddLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmICghcmV2aXNpb24pIHtcclxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oXHJcbiAgICAgICAgICBgQ29ycmVzcG9uZGVuY2UgUmV2aXNpb24gZm9yIElEICR7Y29ycmVzcG9uZGVuY2VJZH0gbm90IGZvdW5kYFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIOKchSBGSVg6IENoZWNrIHVuZGVmaW5lZCBiZWZvcmUgYWNjZXNzXHJcbiAgICAgIGlmICghcmV2aXNpb24uY29ycmVzcG9uZGVuY2UpIHtcclxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oYENvcnJlc3BvbmRlbmNlIHJlbGF0aW9uIG5vdCBmb3VuZGApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBjb250ZXh0ID0ge1xyXG4gICAgICAgIC8vIOKchSBGSVg6IENhbWVsQ2FzZSAocHJvamVjdElkLCBjb3JyZXNwb25kZW5jZVR5cGVJZClcclxuICAgICAgICBwcm9qZWN0SWQ6IHJldmlzaW9uLmNvcnJlc3BvbmRlbmNlLnByb2plY3RJZCxcclxuICAgICAgICB0eXBlSWQ6IHJldmlzaW9uLmNvcnJlc3BvbmRlbmNlLmNvcnJlc3BvbmRlbmNlVHlwZUlkLFxyXG4gICAgICAgIG93bmVySWQ6IHVzZXJJZCxcclxuICAgICAgICBhbW91bnQ6IDAsXHJcbiAgICAgICAgcHJpb3JpdHk6ICdOT1JNQUwnLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCB0aGlzLndvcmtmbG93RW5naW5lLmNyZWF0ZUluc3RhbmNlKFxyXG4gICAgICAgIHRoaXMuV09SS0ZMT1dfQ09ERSxcclxuICAgICAgICAnY29ycmVzcG9uZGVuY2VfcmV2aXNpb24nLFxyXG4gICAgICAgIHJldmlzaW9uLmlkLnRvU3RyaW5nKCksXHJcbiAgICAgICAgY29udGV4dFxyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3QgdHJhbnNpdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMud29ya2Zsb3dFbmdpbmUucHJvY2Vzc1RyYW5zaXRpb24oXHJcbiAgICAgICAgaW5zdGFuY2UuaWQsXHJcbiAgICAgICAgJ1NVQk1JVCcsXHJcbiAgICAgICAgdXNlcklkLFxyXG4gICAgICAgIG5vdGUgfHwgJ0luaXRpYWwgU3VibWlzc2lvbicsXHJcbiAgICAgICAgeyByb2xlczogdXNlclJvbGVzIH0gLy8gW0ZJWF0gUGFzcyByb2xlcyBmb3IgRFNMIHJlcXVpcmVtZW50cyBjaGVja1xyXG4gICAgICApO1xyXG5cclxuICAgICAgYXdhaXQgdGhpcy5zeW5jU3RhdHVzKHJldmlzaW9uLCB0cmFuc2l0aW9uUmVzdWx0Lm5leHRTdGF0ZSwgcXVlcnlSdW5uZXIpO1xyXG5cclxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKTtcclxuXHJcbiAgICAgIC8vIE5vdGlmeSBUTyByZWNpcGllbnQgb3JnIHVzZXJzIChmaXJlLWFuZC1mb3JnZXQpXHJcbiAgICAgIGNvbnN0IGNvcnJGb3JOb3RpZnkgPSByZXZpc2lvbi5jb3JyZXNwb25kZW5jZTtcclxuICAgICAgaWYgKGNvcnJGb3JOb3RpZnkpIHtcclxuICAgICAgICB2b2lkIHRoaXMucmVjaXBpZW50UmVwb1xyXG4gICAgICAgICAgLmZpbmQoe1xyXG4gICAgICAgICAgICB3aGVyZToge1xyXG4gICAgICAgICAgICAgIGNvcnJlc3BvbmRlbmNlSWQ6IGNvcnJGb3JOb3RpZnkuaWQsXHJcbiAgICAgICAgICAgICAgcmVjaXBpZW50VHlwZTogJ1RPJyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICAudGhlbihhc3luYyAocmVjaXBpZW50cykgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHIgb2YgcmVjaXBpZW50cykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHRhcmdldFVzZXJJZCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZmluZERvY0NvbnRyb2xJZEJ5T3JnKFxyXG4gICAgICAgICAgICAgICAgci5yZWNpcGllbnRPcmdhbml6YXRpb25JZFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgaWYgKHRhcmdldFVzZXJJZCkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnNlbmQoe1xyXG4gICAgICAgICAgICAgICAgICB1c2VySWQ6IHRhcmdldFVzZXJJZCxcclxuICAgICAgICAgICAgICAgICAgdGl0bGU6ICdOZXcgQ29ycmVzcG9uZGVuY2UgUmVjZWl2ZWQnLFxyXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgJHtjb3JyRm9yTm90aWZ5LmNvcnJlc3BvbmRlbmNlTnVtYmVyfSBoYXMgYmVlbiBzdWJtaXR0ZWQgdG8geW91ciBvcmdhbml6YXRpb24uYCxcclxuICAgICAgICAgICAgICAgICAgdHlwZTogJ0VNQUlMJyxcclxuICAgICAgICAgICAgICAgICAgZW50aXR5VHlwZTogJ2NvcnJlc3BvbmRlbmNlJyxcclxuICAgICAgICAgICAgICAgICAgZW50aXR5SWQ6IHJldmlzaW9uLmNvcnJlc3BvbmRlbmNlSWQsXHJcbiAgICAgICAgICAgICAgICAgIGxpbms6IGAvY29ycmVzcG9uZGVuY2VzLyR7Y29yckZvck5vdGlmeS5wdWJsaWNJZH1gLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLmNhdGNoKChlcnI6IEVycm9yKSA9PlxyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBTdWJtaXQgbm90aWZpY2F0aW9uIGZhaWxlZDogJHtlcnIubWVzc2FnZX1gKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBpbnN0YW5jZUlkOiBpbnN0YW5jZS5pZCxcclxuICAgICAgICBjdXJyZW50U3RhdGU6IHRyYW5zaXRpb25SZXN1bHQubmV4dFN0YXRlLFxyXG4gICAgICB9O1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucm9sbGJhY2tUcmFuc2FjdGlvbigpO1xyXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHN1Ym1pdCB3b3JrZmxvdzogJHtTdHJpbmcoZXJyb3IpfWApO1xyXG4gICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJlbGVhc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHByb2Nlc3NBY3Rpb24oXHJcbiAgICBpbnN0YW5jZUlkOiBzdHJpbmcsXHJcbiAgICB1c2VySWQ6IG51bWJlcixcclxuICAgIGR0bzogV29ya2Zsb3dUcmFuc2l0aW9uRHRvXHJcbiAgKSB7XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLndvcmtmbG93RW5naW5lLnByb2Nlc3NUcmFuc2l0aW9uKFxyXG4gICAgICBpbnN0YW5jZUlkLFxyXG4gICAgICBkdG8uYWN0aW9uLFxyXG4gICAgICB1c2VySWQsXHJcbiAgICAgIGR0by5jb21tZW50LFxyXG4gICAgICBkdG8ucGF5bG9hZFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyDinIUgRklYOiBNZXRob2QgZXhpc3RzIG5vd1xyXG4gICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCB0aGlzLndvcmtmbG93RW5naW5lLmdldEluc3RhbmNlQnlJZChpbnN0YW5jZUlkKTtcclxuXHJcbiAgICBpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2UuZW50aXR5VHlwZSA9PT0gJ2NvcnJlc3BvbmRlbmNlX3JldmlzaW9uJykge1xyXG4gICAgICBjb25zdCByZXZpc2lvbiA9IGF3YWl0IHRoaXMucmV2aXNpb25SZXBvLmZpbmRPbmUoe1xyXG4gICAgICAgIHdoZXJlOiB7IGlkOiBOdW1iZXIoaW5zdGFuY2UuZW50aXR5SWQpIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAocmV2aXNpb24pIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnN5bmNTdGF0dXMocmV2aXNpb24sIHJlc3VsdC5uZXh0U3RhdGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc3luY1N0YXR1cyhcclxuICAgIHJldmlzaW9uOiBDb3JyZXNwb25kZW5jZVJldmlzaW9uLFxyXG4gICAgd29ya2Zsb3dTdGF0ZTogc3RyaW5nLFxyXG4gICAgcXVlcnlSdW5uZXI/OiBpbXBvcnQoJ3R5cGVvcm0nKS5RdWVyeVJ1bm5lclxyXG4gICkge1xyXG4gICAgY29uc3Qgc3RhdHVzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gICAgICBEUkFGVDogJ0RSQUZUJyxcclxuICAgICAgSU5fUkVWSUVXOiAnU1VCT1dOJyxcclxuICAgICAgQVBQUk9WRUQ6ICdDTEJPV04nLFxyXG4gICAgICBSRUpFQ1RFRDogJ0NDQk9XTicsXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHRhcmdldENvZGUgPSBzdGF0dXNNYXBbd29ya2Zsb3dTdGF0ZV0gfHwgJ0RSQUZUJztcclxuXHJcbiAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLnN0YXR1c1JlcG8uZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7IHN0YXR1c0NvZGU6IHRhcmdldENvZGUgfSwgLy8g4pyFIEZJWDogQ2FtZWxDYXNlXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoc3RhdHVzKSB7XHJcbiAgICAgIC8vIOKchSBGSVg6IENhbWVsQ2FzZSAoY29ycmVzcG9uZGVuY2VTdGF0dXNJZClcclxuICAgICAgcmV2aXNpb24uc3RhdHVzSWQgPSBzdGF0dXMuaWQ7XHJcblxyXG4gICAgICBjb25zdCBtYW5hZ2VyID0gcXVlcnlSdW5uZXJcclxuICAgICAgICA/IHF1ZXJ5UnVubmVyLm1hbmFnZXJcclxuICAgICAgICA6IHRoaXMucmV2aXNpb25SZXBvLm1hbmFnZXI7XHJcbiAgICAgIGF3YWl0IG1hbmFnZXIuc2F2ZShyZXZpc2lvbik7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d5/correspondenceworkflowservice_d594806472d229cf8c80ddadf6ae4d7e.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d5/correspondenceworkflowservice_d594806472d229cf8c80ddadf6ae4d7e.map new file mode 100644 index 0000000..d43a31d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d5/correspondenceworkflowservice_d594806472d229cf8c80ddadf6ae4d7e.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence-workflow.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence-workflow.service.ts"],"sourcesContent":["// File: src/modules/correspondence/correspondence-workflow.service.ts\r\n\r\nimport { Injectable, Logger, NotFoundException } from '@nestjs/common';\r\nimport { InjectRepository } from '@nestjs/typeorm';\r\nimport { DataSource, Repository } from 'typeorm';\r\n\r\nimport { WorkflowTransitionDto } from '../workflow-engine/dto/workflow-transition.dto';\r\nimport { WorkflowEngineService } from '../workflow-engine/workflow-engine.service';\r\nimport { CorrespondenceRevision } from './entities/correspondence-revision.entity';\r\nimport { CorrespondenceStatus } from './entities/correspondence-status.entity';\r\nimport { Correspondence } from './entities/correspondence.entity';\r\nimport { CorrespondenceRecipient } from './entities/correspondence-recipient.entity';\r\nimport { NotificationService } from '../notification/notification.service';\r\nimport { UserService } from '../user/user.service';\r\n\r\n@Injectable()\r\nexport class CorrespondenceWorkflowService {\r\n private readonly logger = new Logger(CorrespondenceWorkflowService.name);\r\n private readonly WORKFLOW_CODE = 'CORRESPONDENCE_FLOW_V1';\r\n\r\n constructor(\r\n private readonly workflowEngine: WorkflowEngineService,\r\n @InjectRepository(Correspondence)\r\n private readonly correspondenceRepo: Repository,\r\n @InjectRepository(CorrespondenceRevision)\r\n private readonly revisionRepo: Repository,\r\n @InjectRepository(CorrespondenceStatus)\r\n private readonly statusRepo: Repository,\r\n @InjectRepository(CorrespondenceRecipient)\r\n private readonly recipientRepo: Repository,\r\n private readonly dataSource: DataSource,\r\n private readonly notificationService: NotificationService,\r\n private readonly userService: UserService\r\n ) {}\r\n\r\n async submitWorkflow(\r\n correspondenceId: number,\r\n userId: number,\r\n userRoles: string[], // [FIX] Added roles for DSL requirements check\r\n note?: string\r\n ) {\r\n const queryRunner = this.dataSource.createQueryRunner();\r\n await queryRunner.connect();\r\n await queryRunner.startTransaction();\r\n\r\n try {\r\n const revision = await this.revisionRepo.findOne({\r\n // ✅ FIX: CamelCase (correspondenceId, isCurrent)\r\n where: { correspondenceId: correspondenceId, isCurrent: true },\r\n relations: ['correspondence'],\r\n });\r\n\r\n if (!revision) {\r\n throw new NotFoundException(\r\n `Correspondence Revision for ID ${correspondenceId} not found`\r\n );\r\n }\r\n\r\n // ✅ FIX: Check undefined before access\r\n if (!revision.correspondence) {\r\n throw new NotFoundException(`Correspondence relation not found`);\r\n }\r\n\r\n const context = {\r\n // ✅ FIX: CamelCase (projectId, correspondenceTypeId)\r\n projectId: revision.correspondence.projectId,\r\n typeId: revision.correspondence.correspondenceTypeId,\r\n ownerId: userId,\r\n amount: 0,\r\n priority: 'NORMAL',\r\n };\r\n\r\n const instance = await this.workflowEngine.createInstance(\r\n this.WORKFLOW_CODE,\r\n 'correspondence_revision',\r\n revision.id.toString(),\r\n context\r\n );\r\n\r\n const transitionResult = await this.workflowEngine.processTransition(\r\n instance.id,\r\n 'SUBMIT',\r\n userId,\r\n note || 'Initial Submission',\r\n { roles: userRoles } // [FIX] Pass roles for DSL requirements check\r\n );\r\n\r\n await this.syncStatus(revision, transitionResult.nextState, queryRunner);\r\n\r\n await queryRunner.commitTransaction();\r\n\r\n // Notify TO recipient org users (fire-and-forget)\r\n const corrForNotify = revision.correspondence;\r\n if (corrForNotify) {\r\n void this.recipientRepo\r\n .find({\r\n where: {\r\n correspondenceId: corrForNotify.id,\r\n recipientType: 'TO',\r\n },\r\n })\r\n .then(async (recipients) => {\r\n for (const r of recipients) {\r\n const targetUserId = await this.userService.findDocControlIdByOrg(\r\n r.recipientOrganizationId\r\n );\r\n if (targetUserId) {\r\n await this.notificationService.send({\r\n userId: targetUserId,\r\n title: 'New Correspondence Received',\r\n message: `${corrForNotify.correspondenceNumber} has been submitted to your organization.`,\r\n type: 'EMAIL',\r\n entityType: 'correspondence',\r\n entityId: revision.correspondenceId,\r\n link: `/correspondences/${corrForNotify.publicId}`,\r\n });\r\n }\r\n }\r\n })\r\n .catch((err: Error) =>\r\n this.logger.warn(`Submit notification failed: ${err.message}`)\r\n );\r\n }\r\n\r\n return {\r\n instanceId: instance.id,\r\n currentState: transitionResult.nextState,\r\n };\r\n } catch (error) {\r\n await queryRunner.rollbackTransaction();\r\n this.logger.error(`Failed to submit workflow: ${String(error)}`);\r\n throw error;\r\n } finally {\r\n await queryRunner.release();\r\n }\r\n }\r\n\r\n async processAction(\r\n instanceId: string,\r\n userId: number,\r\n dto: WorkflowTransitionDto\r\n ) {\r\n const result = await this.workflowEngine.processTransition(\r\n instanceId,\r\n dto.action,\r\n userId,\r\n dto.comment,\r\n dto.payload\r\n );\r\n\r\n // ✅ FIX: Method exists now\r\n const instance = await this.workflowEngine.getInstanceById(instanceId);\r\n\r\n if (instance && instance.entityType === 'correspondence_revision') {\r\n const revision = await this.revisionRepo.findOne({\r\n where: { id: Number(instance.entityId) },\r\n });\r\n if (revision) {\r\n await this.syncStatus(revision, result.nextState);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private async syncStatus(\r\n revision: CorrespondenceRevision,\r\n workflowState: string,\r\n queryRunner?: import('typeorm').QueryRunner\r\n ) {\r\n const statusMap: Record = {\r\n DRAFT: 'DRAFT',\r\n IN_REVIEW: 'SUBOWN',\r\n APPROVED: 'CLBOWN',\r\n REJECTED: 'CCBOWN',\r\n };\r\n\r\n const targetCode = statusMap[workflowState] || 'DRAFT';\r\n\r\n const status = await this.statusRepo.findOne({\r\n where: { statusCode: targetCode }, // ✅ FIX: CamelCase\r\n });\r\n\r\n if (status) {\r\n // ✅ FIX: CamelCase (correspondenceStatusId)\r\n revision.statusId = status.id;\r\n\r\n const manager = queryRunner\r\n ? queryRunner.manager\r\n : this.revisionRepo.manager;\r\n await manager.save(revision);\r\n }\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d5/filestorageservicespec_d5167b4d60ea5a3678045fd966d840bb b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d5/filestorageservicespec_d5167b4d60ea5a3678045fd966d840bb new file mode 100644 index 0000000..0be2c7e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d5/filestorageservicespec_d5167b4d60ea5a3678045fd966d840bb @@ -0,0 +1,152 @@ +06ad524aab753b4a7379bf0e3f9293a7 +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +// Mock fs-extra +jest.mock('fs-extra'); +const testing_1 = require("@nestjs/testing"); +const file_storage_service_1 = require("./file-storage.service"); +const typeorm_1 = require("@nestjs/typeorm"); +const attachment_entity_1 = require("./entities/attachment.entity"); +const config_1 = require("@nestjs/config"); +const fs = __importStar(require("fs-extra")); +const common_1 = require("@nestjs/common"); +describe('FileStorageService', () => { + let service; + let attachmentRepo; + const mockAttachment = { + id: 1, + originalFilename: 'test.pdf', + storedFilename: 'uuid.pdf', + filePath: '/permanent/2024/12/uuid.pdf', + fileSize: 1024, + uploadedByUserId: 1, + }; + const mockFile = { + originalname: 'test.pdf', + mimetype: 'application/pdf', + size: 1024, + buffer: Buffer.from('test-content'), + }; + beforeEach(async () => { + const module = await testing_1.Test.createTestingModule({ + providers: [ + file_storage_service_1.FileStorageService, + { + provide: (0, typeorm_1.getRepositoryToken)(attachment_entity_1.Attachment), + useValue: { + create: jest.fn().mockReturnValue(mockAttachment), + save: jest.fn().mockResolvedValue(mockAttachment), + find: jest.fn(), + findOne: jest.fn(), + remove: jest.fn(), + }, + }, + { + provide: config_1.ConfigService, + useValue: { + get: jest.fn((key) => { + if (key === 'NODE_ENV') + return 'test'; + return null; + }), + }, + }, + ], + }).compile(); + service = module.get(file_storage_service_1.FileStorageService); + attachmentRepo = module.get((0, typeorm_1.getRepositoryToken)(attachment_entity_1.Attachment)); + jest.clearAllMocks(); + fs.ensureDirSync.mockReturnValue(true); + fs.writeFile.mockResolvedValue(undefined); + fs.pathExists.mockResolvedValue(true); + fs.move.mockResolvedValue(undefined); + fs.remove.mockResolvedValue(undefined); + fs.readFile.mockResolvedValue(Buffer.from('test')); + fs.stat.mockResolvedValue({ size: 1024 }); + fs.ensureDir.mockResolvedValue(undefined); + }); + it('should be defined', () => { + expect(service).toBeDefined(); + }); + describe('upload', () => { + it('should save file to temp and create DB record', async () => { + const result = await service.upload(mockFile, 1); + expect(fs.writeFile).toHaveBeenCalled(); + expect(attachmentRepo.create).toHaveBeenCalled(); + expect(attachmentRepo.save).toHaveBeenCalled(); + expect(result).toBeDefined(); + }); + it('should throw BadRequestException if write fails', async () => { + fs.writeFile.mockRejectedValueOnce(new Error('Write error')); + await expect(service.upload(mockFile, 1)).rejects.toThrow(common_1.BadRequestException); + }); + }); + describe('commit', () => { + it('should move files to permanent storage', async () => { + const tempIds = ['uuid-1']; + const mockAttachments = [ + { + ...mockAttachment, + isTemporary: true, + tempId: 'uuid-1', + filePath: '/temp/uuid.pdf', + }, + ]; + attachmentRepo.find.mockResolvedValue(mockAttachments); + await service.commit(tempIds); + expect(fs.ensureDir).toHaveBeenCalled(); + expect(fs.move).toHaveBeenCalled(); + expect(attachmentRepo.save).toHaveBeenCalled(); + }); + it('should show warning if file counts mismatch', async () => { + attachmentRepo.find.mockResolvedValue([]); + await expect(service.commit(['uuid-1'])).rejects.toThrow(common_1.NotFoundException); + }); + }); + describe('delete', () => { + it('should delete file if user owns it', async () => { + attachmentRepo.findOne.mockResolvedValue(mockAttachment); + await service.delete(1, 1); + expect(fs.remove).toHaveBeenCalled(); + expect(attachmentRepo.remove).toHaveBeenCalled(); + }); + it('should throw ForbiddenException if user does not own file', async () => { + attachmentRepo.findOne.mockResolvedValue(mockAttachment); + await expect(service.delete(1, 999)).rejects.toThrow(common_1.ForbiddenException); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxmaWxlLXN0b3JhZ2VcXGZpbGUtc3RvcmFnZS5zZXJ2aWNlLnNwZWMudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFhQSxnQkFBZ0I7QUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztBQWR0Qiw2Q0FBc0Q7QUFDdEQsaUVBQTREO0FBQzVELDZDQUFxRDtBQUNyRCxvRUFBMEQ7QUFDMUQsMkNBQStDO0FBQy9DLDZDQUErQjtBQUMvQiwyQ0FJd0I7QUFNeEIsUUFBUSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtJQUNsQyxJQUFJLE9BQTJCLENBQUM7SUFDaEMsSUFBSSxjQUFzQyxDQUFDO0lBRTNDLE1BQU0sY0FBYyxHQUFHO1FBQ3JCLEVBQUUsRUFBRSxDQUFDO1FBQ0wsZ0JBQWdCLEVBQUUsVUFBVTtRQUM1QixjQUFjLEVBQUUsVUFBVTtRQUMxQixRQUFRLEVBQUUsNkJBQTZCO1FBQ3ZDLFFBQVEsRUFBRSxJQUFJO1FBQ2QsZ0JBQWdCLEVBQUUsQ0FBQztLQUNOLENBQUM7SUFFaEIsTUFBTSxRQUFRLEdBQUc7UUFDZixZQUFZLEVBQUUsVUFBVTtRQUN4QixRQUFRLEVBQUUsaUJBQWlCO1FBQzNCLElBQUksRUFBRSxJQUFJO1FBQ1YsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO0tBQ2IsQ0FBQztJQUV6QixVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDcEIsTUFBTSxNQUFNLEdBQWtCLE1BQU0sY0FBSSxDQUFDLG1CQUFtQixDQUFDO1lBQzNELFNBQVMsRUFBRTtnQkFDVCx5Q0FBa0I7Z0JBQ2xCO29CQUNFLE9BQU8sRUFBRSxJQUFBLDRCQUFrQixFQUFDLDhCQUFVLENBQUM7b0JBQ3ZDLFFBQVEsRUFBRTt3QkFDUixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxjQUFj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S0FBSyxJQUFJLEVBQUU7WUFDakQsY0FBYyxDQUFDLE9BQXFCLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFeEUsTUFBTSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUUzQixNQUFNLENBQUMsRUFBRSxDQUFDLE1BQThCLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzdELE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBbUIsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMkRBQTJELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDeEUsY0FBYyxDQUFDLE9BQXFCLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDeEUsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLDJCQUFrQixDQUFDLENBQUM7UUFDM0UsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXGNvbW1vblxcZmlsZS1zdG9yYWdlXFxmaWxlLXN0b3JhZ2Uuc2VydmljZS5zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlc3QsIFRlc3RpbmdNb2R1bGUgfSBmcm9tICdAbmVzdGpzL3Rlc3RpbmcnO1xuaW1wb3J0IHsgRmlsZVN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi9maWxlLXN0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBnZXRSZXBvc2l0b3J5VG9rZW4gfSBmcm9tICdAbmVzdGpzL3R5cGVvcm0nO1xuaW1wb3J0IHsgQXR0YWNobWVudCB9IGZyb20gJy4vZW50aXRpZXMvYXR0YWNobWVudC5lbnRpdHknO1xuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJ0BuZXN0anMvY29uZmlnJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7XG4gIEJhZFJlcXVlc3RFeGNlcHRpb24sXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxuICBGb3JiaWRkZW5FeGNlcHRpb24sXG59IGZyb20gJ0BuZXN0anMvY29tbW9uJztcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tICd0eXBlb3JtJztcblxuLy8gTW9jayBmcy1leHRyYVxuamVzdC5tb2NrKCdmcy1leHRyYScpO1xuXG5kZXNjcmliZSgnRmlsZVN0b3JhZ2VTZXJ2aWNlJywgKCkgPT4ge1xuICBsZXQgc2VydmljZTogRmlsZVN0b3JhZ2VTZXJ2aWNlO1xuICBsZXQgYXR0YWNobWVudFJlcG86IFJlcG9zaXRvcnk8QXR0YWNobWVudD47XG5cbiAgY29uc3QgbW9ja0F0dGFjaG1lbnQgPSB7XG4gICAgaWQ6IDEsXG4gICAgb3JpZ2luYWxGaWxlbmFtZTogJ3Rlc3QucGRmJyxcbiAgICBzdG9yZWRGaWxlbmFtZTogJ3V1aWQucGRmJyxcbiAgICBmaWxlUGF0aDogJy9wZXJtYW5lbnQvMjAyNC8xMi91dWlkLnBkZicsXG4gICAgZmlsZVNpemU6IDEwMjQsXG4gICAgdXBsb2FkZWRCeVVzZXJJZDogMSxcbiAgfSBhcyBBdHRhY2htZW50O1xuXG4gIGNvbnN0IG1vY2tGaWxlID0ge1xuICAgIG9yaWdpbmFsbmFtZTogJ3Rlc3QucGRmJyxcbiAgICBtaW1ldHlwZTogJ2FwcGxpY2F0aW9uL3BkZicsXG4gICAgc2l6ZTogMTAyNCxcbiAgICBidWZmZXI6IEJ1ZmZlci5mcm9tKCd0ZXN0LWNvbnRlbnQnKSxcbiAgfSBhcyBFeHByZXNzLk11bHRlci5GaWxlO1xuXG4gIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG1vZHVsZTogVGVzdGluZ01vZHVsZSA9IGF3YWl0IFRlc3QuY3JlYXRlVGVzdGluZ01vZHVsZSh7XG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgRmlsZVN0b3JhZ2VTZXJ2aWNlLFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogZ2V0UmVwb3NpdG9yeVRva2VuKEF0dGFjaG1lbnQpLFxuICAgICAgICAgIHVzZVZhbHVlOiB7XG4gICAgICAgICAgICBjcmVhdGU6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUobW9ja0F0dGFjaG1lbnQpLFxuICAgICAgICAgICAgc2F2ZTogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tBdHRhY2htZW50KSxcbiAgICAgICAgICAgIGZpbmQ6IGplc3QuZm4oKSxcbiAgICAgICAgICAgIGZpbmRPbmU6IGplc3QuZm4oKSxcbiAgICAgICAgICAgIHJlbW92ZTogamVzdC5mbigpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBDb25maWdTZXJ2aWNlLFxuICAgICAgICAgIHVzZVZhbHVlOiB7XG4gICAgICAgICAgICBnZXQ6IGplc3QuZm4oKGtleSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoa2V5ID09PSAnTk9ERV9FTlYnKSByZXR1cm4gJ3Rlc3QnO1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pLmNvbXBpbGUoKTtcblxuICAgIHNlcnZpY2UgPSBtb2R1bGUuZ2V0PEZpbGVTdG9yYWdlU2VydmljZT4oRmlsZVN0b3JhZ2VTZXJ2aWNlKTtcbiAgICBhdHRhY2htZW50UmVwbyA9IG1vZHVsZS5nZXQoZ2V0UmVwb3NpdG9yeVRva2VuKEF0dGFjaG1lbnQpKTtcblxuICAgIGplc3QuY2xlYXJBbGxNb2NrcygpO1xuICAgIChmcy5lbnN1cmVEaXJTeW5jIGFzIHVua25vd24gYXMgamVzdC5Nb2NrKS5tb2NrUmV0dXJuVmFsdWUodHJ1ZSk7XG4gICAgKGZzLndyaXRlRmlsZSBhcyB1bmtub3duIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUodW5kZWZpbmVkKTtcbiAgICAoZnMucGF0aEV4aXN0cyBhcyB1bmtub3duIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUodHJ1ZSk7XG4gICAgKGZzLm1vdmUgYXMgdW5rbm93biBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZCk7XG4gICAgKGZzLnJlbW92ZSBhcyB1bmtub3duIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUodW5kZWZpbmVkKTtcbiAgICAoZnMucmVhZEZpbGUgYXMgdW5rbm93biBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKFxuICAgICAgQnVmZmVyLmZyb20oJ3Rlc3QnKVxuICAgICk7XG4gICAgKGZzLnN0YXQgYXMgdW5rbm93biBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHsgc2l6ZTogMTAyNCB9KTtcbiAgICAoZnMuZW5zdXJlRGlyIGFzIHVua25vd24gYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh1bmRlZmluZWQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJlIGRlZmluZWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHNlcnZpY2UpLnRvQmVEZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd1cGxvYWQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzYXZlIGZpbGUgdG8gdGVtcCBhbmQgY3JlYXRlIERCIHJlY29yZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlcnZpY2UudXBsb2FkKG1vY2tGaWxlLCAxKTtcblxuICAgICAgZXhwZWN0KGZzLndyaXRlRmlsZSBhcyB1bmtub3duIGFzIGplc3QuTW9jaykudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgZXhwZWN0KGF0dGFjaG1lbnRSZXBvLmNyZWF0ZSBhcyBqZXN0Lk1vY2spLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIGV4cGVjdChhdHRhY2htZW50UmVwby5zYXZlIGFzIGplc3QuTW9jaykudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZURlZmluZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgQmFkUmVxdWVzdEV4Y2VwdGlvbiBpZiB3cml0ZSBmYWlscycsIGFzeW5jICgpID0+IHtcbiAgICAgIChmcy53cml0ZUZpbGUgYXMgdW5rbm93biBhcyBqZXN0Lk1vY2spLm1vY2tSZWplY3RlZFZhbHVlT25jZShcbiAgICAgICAgbmV3IEVycm9yKCdXcml0ZSBlcnJvcicpXG4gICAgICApO1xuICAgICAgYXdhaXQgZXhwZWN0KHNlcnZpY2UudXBsb2FkKG1vY2tGaWxlLCAxKSkucmVqZWN0cy50b1Rocm93KFxuICAgICAgICBCYWRSZXF1ZXN0RXhjZXB0aW9uXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29tbWl0JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgbW92ZSBmaWxlcyB0byBwZXJtYW5lbnQgc3RvcmFnZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRlbXBJZHMgPSBbJ3V1aWQtMSddO1xuICAgICAgY29uc3QgbW9ja0F0dGFjaG1lbnRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgLi4ubW9ja0F0dGFjaG1lbnQsXG4gICAgICAgICAgaXNUZW1wb3Jhcnk6IHRydWUsXG4gICAgICAgICAgdGVtcElkOiAndXVpZC0xJyxcbiAgICAgICAgICBmaWxlUGF0aDogJy90ZW1wL3V1aWQucGRmJyxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIChhdHRhY2htZW50UmVwby5maW5kIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUobW9ja0F0dGFjaG1lbnRzKTtcblxuICAgICAgYXdhaXQgc2VydmljZS5jb21taXQodGVtcElkcyk7XG5cbiAgICAgIGV4cGVjdChmcy5lbnN1cmVEaXIgYXMgdW5rbm93biBhcyBqZXN0Lk1vY2spLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIGV4cGVjdChmcy5tb3ZlIGFzIHVua25vd24gYXMgamVzdC5Nb2NrKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICBleHBlY3QoYXR0YWNobWVudFJlcG8uc2F2ZSBhcyBqZXN0Lk1vY2spLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2hvdyB3YXJuaW5nIGlmIGZpbGUgY291bnRzIG1pc21hdGNoJywgYXN5bmMgKCkgPT4ge1xuICAgICAgKGF0dGFjaG1lbnRSZXBvLmZpbmQgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZShbXSk7XG4gICAgICBhd2FpdCBleHBlY3Qoc2VydmljZS5jb21taXQoWyd1dWlkLTEnXSkpLnJlamVjdHMudG9UaHJvdyhcbiAgICAgICAgTm90Rm91bmRFeGNlcHRpb25cbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdkZWxldGUnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBkZWxldGUgZmlsZSBpZiB1c2VyIG93bnMgaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAoYXR0YWNobWVudFJlcG8uZmluZE9uZSBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tBdHRhY2htZW50KTtcblxuICAgICAgYXdhaXQgc2VydmljZS5kZWxldGUoMSwgMSk7XG5cbiAgICAgIGV4cGVjdChmcy5yZW1vdmUgYXMgdW5rbm93biBhcyBqZXN0Lk1vY2spLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIGV4cGVjdChhdHRhY2htZW50UmVwby5yZW1vdmUgYXMgamVzdC5Nb2NrKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IEZvcmJpZGRlbkV4Y2VwdGlvbiBpZiB1c2VyIGRvZXMgbm90IG93biBmaWxlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgKGF0dGFjaG1lbnRSZXBvLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZShtb2NrQXR0YWNobWVudCk7XG4gICAgICBhd2FpdCBleHBlY3Qoc2VydmljZS5kZWxldGUoMSwgOTk5KSkucmVqZWN0cy50b1Rocm93KEZvcmJpZGRlbkV4Y2VwdGlvbik7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d5/filestorageservicespec_d5167b4d60ea5a3678045fd966d840bb.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d5/filestorageservicespec_d5167b4d60ea5a3678045fd966d840bb.map new file mode 100644 index 0000000..876910b --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d5/filestorageservicespec_d5167b4d60ea5a3678045fd966d840bb.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\file-storage\\file-storage.service.spec.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\file-storage\\file-storage.service.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\nimport { FileStorageService } from './file-storage.service';\nimport { getRepositoryToken } from '@nestjs/typeorm';\nimport { Attachment } from './entities/attachment.entity';\nimport { ConfigService } from '@nestjs/config';\nimport * as fs from 'fs-extra';\nimport {\n BadRequestException,\n NotFoundException,\n ForbiddenException,\n} from '@nestjs/common';\nimport { Repository } from 'typeorm';\n\n// Mock fs-extra\njest.mock('fs-extra');\n\ndescribe('FileStorageService', () => {\n let service: FileStorageService;\n let attachmentRepo: Repository;\n\n const mockAttachment = {\n id: 1,\n originalFilename: 'test.pdf',\n storedFilename: 'uuid.pdf',\n filePath: '/permanent/2024/12/uuid.pdf',\n fileSize: 1024,\n uploadedByUserId: 1,\n } as Attachment;\n\n const mockFile = {\n originalname: 'test.pdf',\n mimetype: 'application/pdf',\n size: 1024,\n buffer: Buffer.from('test-content'),\n } as Express.Multer.File;\n\n beforeEach(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n FileStorageService,\n {\n provide: getRepositoryToken(Attachment),\n useValue: {\n create: jest.fn().mockReturnValue(mockAttachment),\n save: jest.fn().mockResolvedValue(mockAttachment),\n find: jest.fn(),\n findOne: jest.fn(),\n remove: jest.fn(),\n },\n },\n {\n provide: ConfigService,\n useValue: {\n get: jest.fn((key) => {\n if (key === 'NODE_ENV') return 'test';\n return null;\n }),\n },\n },\n ],\n }).compile();\n\n service = module.get(FileStorageService);\n attachmentRepo = module.get(getRepositoryToken(Attachment));\n\n jest.clearAllMocks();\n (fs.ensureDirSync as unknown as jest.Mock).mockReturnValue(true);\n (fs.writeFile as unknown as jest.Mock).mockResolvedValue(undefined);\n (fs.pathExists as unknown as jest.Mock).mockResolvedValue(true);\n (fs.move as unknown as jest.Mock).mockResolvedValue(undefined);\n (fs.remove as unknown as jest.Mock).mockResolvedValue(undefined);\n (fs.readFile as unknown as jest.Mock).mockResolvedValue(\n Buffer.from('test')\n );\n (fs.stat as unknown as jest.Mock).mockResolvedValue({ size: 1024 });\n (fs.ensureDir as unknown as jest.Mock).mockResolvedValue(undefined);\n });\n\n it('should be defined', () => {\n expect(service).toBeDefined();\n });\n\n describe('upload', () => {\n it('should save file to temp and create DB record', async () => {\n const result = await service.upload(mockFile, 1);\n\n expect(fs.writeFile as unknown as jest.Mock).toHaveBeenCalled();\n expect(attachmentRepo.create as jest.Mock).toHaveBeenCalled();\n expect(attachmentRepo.save as jest.Mock).toHaveBeenCalled();\n expect(result).toBeDefined();\n });\n\n it('should throw BadRequestException if write fails', async () => {\n (fs.writeFile as unknown as jest.Mock).mockRejectedValueOnce(\n new Error('Write error')\n );\n await expect(service.upload(mockFile, 1)).rejects.toThrow(\n BadRequestException\n );\n });\n });\n\n describe('commit', () => {\n it('should move files to permanent storage', async () => {\n const tempIds = ['uuid-1'];\n const mockAttachments = [\n {\n ...mockAttachment,\n isTemporary: true,\n tempId: 'uuid-1',\n filePath: '/temp/uuid.pdf',\n },\n ];\n\n (attachmentRepo.find as jest.Mock).mockResolvedValue(mockAttachments);\n\n await service.commit(tempIds);\n\n expect(fs.ensureDir as unknown as jest.Mock).toHaveBeenCalled();\n expect(fs.move as unknown as jest.Mock).toHaveBeenCalled();\n expect(attachmentRepo.save as jest.Mock).toHaveBeenCalled();\n });\n\n it('should show warning if file counts mismatch', async () => {\n (attachmentRepo.find as jest.Mock).mockResolvedValue([]);\n await expect(service.commit(['uuid-1'])).rejects.toThrow(\n NotFoundException\n );\n });\n });\n\n describe('delete', () => {\n it('should delete file if user owns it', async () => {\n (attachmentRepo.findOne as jest.Mock).mockResolvedValue(mockAttachment);\n\n await service.delete(1, 1);\n\n expect(fs.remove as unknown as jest.Mock).toHaveBeenCalled();\n expect(attachmentRepo.remove as jest.Mock).toHaveBeenCalled();\n });\n\n it('should throw ForbiddenException if user does not own file', async () => {\n (attachmentRepo.findOne as jest.Mock).mockResolvedValue(mockAttachment);\n await expect(service.delete(1, 999)).rejects.toThrow(ForbiddenException);\n });\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d5/notificationgateway_d57b1a0af4e39fcfe2fabb5f60aff91a b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d5/notificationgateway_d57b1a0af4e39fcfe2fabb5f60aff91a new file mode 100644 index 0000000..2e97de7 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d5/notificationgateway_d57b1a0af4e39fcfe2fabb5f60aff91a @@ -0,0 +1,49 @@ +3f341c470ab1902034a3166d90886873 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var NotificationGateway_1; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.NotificationGateway = void 0; +const websockets_1 = require("@nestjs/websockets"); +const socket_io_1 = require("socket.io"); +const common_1 = require("@nestjs/common"); +let NotificationGateway = NotificationGateway_1 = class NotificationGateway { + constructor() { + this.logger = new common_1.Logger(NotificationGateway_1.name); + } + handleConnection(client) { + this.logger.log(`Client connected: ${client.id}`); + } + handleDisconnect(client) { + this.logger.log(`Client disconnected: ${client.id}`); + } + /** + * ส่งแจ้งเตือนไปหา User แบบ Real-time + */ + sendToUser(userId, payload) { + this.server.to(`user_${userId}`).emit('new_notification', payload); + } +}; +exports.NotificationGateway = NotificationGateway; +__decorate([ + (0, websockets_1.WebSocketServer)(), + __metadata("design:type", typeof (_a = typeof socket_io_1.Server !== "undefined" && socket_io_1.Server) === "function" ? _a : Object) +], NotificationGateway.prototype, "server", void 0); +exports.NotificationGateway = NotificationGateway = NotificationGateway_1 = __decorate([ + (0, websockets_1.WebSocketGateway)({ + cors: { + origin: '*', + }, + namespace: 'notifications', + }) +], NotificationGateway); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbm90aWZpY2F0aW9uXFxub3RpZmljYXRpb24uZ2F0ZXdheS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUs0QjtBQUM1Qix5Q0FBMkM7QUFDM0MsMkNBQXdDO0FBU2pDLElBQU0sbUJBQW1CLDJCQUF6QixNQUFNLG1CQUFtQjtJQUF6QjtRQU1ZLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxxQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQWdCakUsQ0FBQztJQWRDLGdCQUFnQixDQUFDLE1BQWM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMscUJBQXFCLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxNQUFjO1FBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLHdCQUF3QixNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQUMsTUFBYyxFQUFFLE9BQXFCO1FBQzlDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDckUsQ0FBQztDQUNGLENBQUE7QUF0Qlksa0RBQW1CO0FBSTlCO0lBREMsSUFBQSw0QkFBZSxHQUFFO2tEQUNULGtCQUFNLG9CQUFOLGtCQUFNO21EQUFDOzhCQUpMLG1CQUFtQjtJQU4vQixJQUFBLDZCQUFnQixFQUFDO1FBQ2hCLElBQUksRUFBRTtZQUNKLE1BQU0sRUFBRSxHQUFHO1NBQ1o7UUFDRCxTQUFTLEVBQUUsZUFBZTtLQUMzQixDQUFDO0dBQ1csbUJBQW1CLENBc0IvQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxub3RpZmljYXRpb25cXG5vdGlmaWNhdGlvbi5nYXRld2F5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFdlYlNvY2tldEdhdGV3YXksXG4gIFdlYlNvY2tldFNlcnZlcixcbiAgT25HYXRld2F5Q29ubmVjdGlvbixcbiAgT25HYXRld2F5RGlzY29ubmVjdCxcbn0gZnJvbSAnQG5lc3Rqcy93ZWJzb2NrZXRzJztcbmltcG9ydCB7IFNlcnZlciwgU29ja2V0IH0gZnJvbSAnc29ja2V0LmlvJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbiB9IGZyb20gJy4vZW50aXRpZXMvbm90aWZpY2F0aW9uLmVudGl0eSc7XG5cbkBXZWJTb2NrZXRHYXRld2F5KHtcbiAgY29yczoge1xuICAgIG9yaWdpbjogJyonLFxuICB9LFxuICBuYW1lc3BhY2U6ICdub3RpZmljYXRpb25zJyxcbn0pXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uR2F0ZXdheVxuICBpbXBsZW1lbnRzIE9uR2F0ZXdheUNvbm5lY3Rpb24sIE9uR2F0ZXdheURpc2Nvbm5lY3RcbntcbiAgQFdlYlNvY2tldFNlcnZlcigpXG4gIHNlcnZlciE6IFNlcnZlcjsgLy8g4pyFIEZJWDog4LmA4LiV4Li04LihICEgKERlZmluaXRlIEFzc2lnbm1lbnQgQXNzZXJ0aW9uKVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IExvZ2dlcihOb3RpZmljYXRpb25HYXRld2F5Lm5hbWUpO1xuXG4gIGhhbmRsZUNvbm5lY3Rpb24oY2xpZW50OiBTb2NrZXQpIHtcbiAgICB0aGlzLmxvZ2dlci5sb2coYENsaWVudCBjb25uZWN0ZWQ6ICR7Y2xpZW50LmlkfWApO1xuICB9XG5cbiAgaGFuZGxlRGlzY29ubmVjdChjbGllbnQ6IFNvY2tldCkge1xuICAgIHRoaXMubG9nZ2VyLmxvZyhgQ2xpZW50IGRpc2Nvbm5lY3RlZDogJHtjbGllbnQuaWR9YCk7XG4gIH1cblxuICAvKipcbiAgICog4Liq4LmI4LiH4LmB4LiI4LmJ4LiH4LmA4LiV4Li34Lit4LiZ4LmE4Lib4Lir4LiyIFVzZXIg4LmB4Lia4LiaIFJlYWwtdGltZVxuICAgKi9cbiAgc2VuZFRvVXNlcih1c2VySWQ6IG51bWJlciwgcGF5bG9hZDogTm90aWZpY2F0aW9uKSB7XG4gICAgdGhpcy5zZXJ2ZXIudG8oYHVzZXJfJHt1c2VySWR9YCkuZW1pdCgnbmV3X25vdGlmaWNhdGlvbicsIHBheWxvYWQpO1xuICB9XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d5/notificationgateway_d57b1a0af4e39fcfe2fabb5f60aff91a.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d5/notificationgateway_d57b1a0af4e39fcfe2fabb5f60aff91a.map new file mode 100644 index 0000000..8cfe875 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d5/notificationgateway_d57b1a0af4e39fcfe2fabb5f60aff91a.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\notification\\notification.gateway.ts","mappings":";;;;;;;;;;;;;;AAAA,mDAK4B;AAC5B,yCAA2C;AAC3C,2CAAwC;AASjC,IAAM,mBAAmB,2BAAzB,MAAM,mBAAmB;IAAzB;QAMY,WAAM,GAAG,IAAI,eAAM,CAAC,qBAAmB,CAAC,IAAI,CAAC,CAAC;IAgBjE,CAAC;IAdC,gBAAgB,CAAC,MAAc;QAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,gBAAgB,CAAC,MAAc;QAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,MAAc,EAAE,OAAqB;QAC9C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC;CACF,CAAA;AAtBY,kDAAmB;AAI9B;IADC,IAAA,4BAAe,GAAE;kDACT,kBAAM,oBAAN,kBAAM;mDAAC;8BAJL,mBAAmB;IAN/B,IAAA,6BAAgB,EAAC;QAChB,IAAI,EAAE;YACJ,MAAM,EAAE,GAAG;SACZ;QACD,SAAS,EAAE,eAAe;KAC3B,CAAC;GACW,mBAAmB,CAsB/B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\notification\\notification.gateway.ts"],"sourcesContent":["import {\n WebSocketGateway,\n WebSocketServer,\n OnGatewayConnection,\n OnGatewayDisconnect,\n} from '@nestjs/websockets';\nimport { Server, Socket } from 'socket.io';\nimport { Logger } from '@nestjs/common';\nimport { Notification } from './entities/notification.entity';\n\n@WebSocketGateway({\n cors: {\n origin: '*',\n },\n namespace: 'notifications',\n})\nexport class NotificationGateway\n implements OnGatewayConnection, OnGatewayDisconnect\n{\n @WebSocketServer()\n server!: Server; // ✅ FIX: เติม ! (Definite Assignment Assertion)\n\n private readonly logger = new Logger(NotificationGateway.name);\n\n handleConnection(client: Socket) {\n this.logger.log(`Client connected: ${client.id}`);\n }\n\n handleDisconnect(client: Socket) {\n this.logger.log(`Client disconnected: ${client.id}`);\n }\n\n /**\n * ส่งแจ้งเตือนไปหา User แบบ Real-time\n */\n sendToUser(userId: number, payload: Notification) {\n this.server.to(`user_${userId}`).emit('new_notification', payload);\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d7/rfarevisionentity_d767f95649fe928f8b415acb6077308b b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d7/rfarevisionentity_d767f95649fe928f8b415acb6077308b new file mode 100644 index 0000000..6de85fe --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d7/rfarevisionentity_d767f95649fe928f8b415acb6077308b @@ -0,0 +1,87 @@ +dd64838a9214400a0aa18efa214c7909 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RfaRevision = void 0; +// File: src/modules/rfa/entities/rfa-revision.entity.ts +const typeorm_1 = require("typeorm"); +const correspondence_revision_entity_1 = require("../../correspondence/entities/correspondence-revision.entity"); +const rfa_approve_code_entity_1 = require("./rfa-approve-code.entity"); +const rfa_item_entity_1 = require("./rfa-item.entity"); +const rfa_status_code_entity_1 = require("./rfa-status-code.entity"); +const rfa_workflow_entity_1 = require("./rfa-workflow.entity"); +let RfaRevision = class RfaRevision { +}; +exports.RfaRevision = RfaRevision; +__decorate([ + (0, typeorm_1.PrimaryColumn)(), + __metadata("design:type", Number) +], RfaRevision.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.OneToOne)(() => correspondence_revision_entity_1.CorrespondenceRevision, { onDelete: 'CASCADE' }), + (0, typeorm_1.JoinColumn)({ name: 'id' }), + __metadata("design:type", typeof (_a = typeof correspondence_revision_entity_1.CorrespondenceRevision !== "undefined" && correspondence_revision_entity_1.CorrespondenceRevision) === "function" ? _a : Object) +], RfaRevision.prototype, "correspondenceRevision", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'rfa_status_code_id' }), + __metadata("design:type", Number) +], RfaRevision.prototype, "rfaStatusCodeId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'rfa_approve_code_id', nullable: true }), + __metadata("design:type", Number) +], RfaRevision.prototype, "rfaApproveCodeId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'approved_date', type: 'date', nullable: true }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], RfaRevision.prototype, "approvedDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'json', nullable: true }), + __metadata("design:type", Object) +], RfaRevision.prototype, "details", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'schema_version', default: 1 }), + __metadata("design:type", Number) +], RfaRevision.prototype, "schemaVersion", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'v_ref_drawing_count', + type: 'int', + generatedType: 'VIRTUAL', + asExpression: "JSON_UNQUOTE(JSON_EXTRACT(details, '$.drawingCount'))", + nullable: true, + }), + __metadata("design:type", Number) +], RfaRevision.prototype, "vRefDrawingCount", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => rfa_status_code_entity_1.RfaStatusCode), + (0, typeorm_1.JoinColumn)({ name: 'rfa_status_code_id' }), + __metadata("design:type", typeof (_c = typeof rfa_status_code_entity_1.RfaStatusCode !== "undefined" && rfa_status_code_entity_1.RfaStatusCode) === "function" ? _c : Object) +], RfaRevision.prototype, "statusCode", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => rfa_approve_code_entity_1.RfaApproveCode), + (0, typeorm_1.JoinColumn)({ name: 'rfa_approve_code_id' }), + __metadata("design:type", typeof (_d = typeof rfa_approve_code_entity_1.RfaApproveCode !== "undefined" && rfa_approve_code_entity_1.RfaApproveCode) === "function" ? _d : Object) +], RfaRevision.prototype, "approveCode", void 0); +__decorate([ + (0, typeorm_1.OneToMany)(() => rfa_item_entity_1.RfaItem, (item) => item.rfaRevision, { cascade: true }), + __metadata("design:type", Array) +], RfaRevision.prototype, "items", void 0); +__decorate([ + (0, typeorm_1.OneToMany)(() => rfa_workflow_entity_1.RfaWorkflow, (workflow) => workflow.rfaRevision, { + cascade: true, + }), + __metadata("design:type", Array) +], RfaRevision.prototype, "workflows", void 0); +exports.RfaRevision = RfaRevision = __decorate([ + (0, typeorm_1.Entity)('rfa_revisions') +], RfaRevision); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccmZhXFxlbnRpdGllc1xccmZhLXJldmlzaW9uLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEsd0RBQXdEO0FBQ3hELHFDQVFpQjtBQUNqQixpSEFBc0c7QUFDdEcsdUVBQTJEO0FBQzNELHVEQUE0QztBQUM1QyxxRUFBeUQ7QUFDekQsK0RBQW9EO0FBRzdDLElBQU0sV0FBVyxHQUFqQixNQUFNLFdBQVc7Q0FxRHZCLENBQUE7QUFyRFksa0NBQVc7QUFFdEI7SUFEQyxJQUFBLHVCQUFhLEdBQUU7O3VDQUNKO0FBSVo7SUFGQyxJQUFBLGtCQUFRLEVBQUMsR0FBRyxFQUFFLENBQUMsdURBQXNCLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDL0QsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO2tEQUNGLHVEQUFzQixvQkFBdEIsdURBQXNCOzJEQUFDO0FBR2hEO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLENBQUM7O29EQUNkO0FBR3pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7cURBQzlCO0FBRzFCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztrREFDakQsSUFBSSxvQkFBSixJQUFJO2lEQUFDO0FBS3BCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7OzRDQUN4QjtBQUlqQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7O2tEQUN4QjtBQVV2QjtJQVBDLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSxxQkFBcUI7UUFDM0IsSUFBSSxFQUFFLEtBQUs7UUFDWCxhQUFhLEVBQUUsU0FBUztRQUN4QixZQUFZLEVBQUUsdURBQXVEO1FBQ3JFLFFBQVEsRUFBRSxJQUFJO0tBQ2YsQ0FBQzs7cURBQ3dCO0FBTTFCO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLHNDQUFhLENBQUM7SUFDOUIsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLENBQUM7a0RBQzlCLHNDQUFhLG9CQUFiLHNDQUFhOytDQUFDO0FBSTNCO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLHdDQUFjLENBQUM7SUFDL0IsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLENBQUM7a0RBQzlCLHdDQUFjLG9CQUFkLHdDQUFjO2dEQUFDO0FBRzdCO0lBREMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLHlCQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7OzBDQUN0RDtBQUtsQjtJQUhDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxpQ0FBVyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFO1FBQ2hFLE9BQU8sRUFBRSxJQUFJO0tBQ2QsQ0FBQzs7OENBQ3dCO3NCQXBEZixXQUFXO0lBRHZCLElBQUEsZ0JBQU0sRUFBQyxlQUFlLENBQUM7R0FDWCxXQUFXLENBcUR2QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxyZmFcXGVudGl0aWVzXFxyZmEtcmV2aXNpb24uZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9tb2R1bGVzL3JmYS9lbnRpdGllcy9yZmEtcmV2aXNpb24uZW50aXR5LnRzXG5pbXBvcnQge1xuICBDb2x1bW4sXG4gIEVudGl0eSxcbiAgSm9pbkNvbHVtbixcbiAgTWFueVRvT25lLFxuICBPbmVUb01hbnksXG4gIFByaW1hcnlDb2x1bW4sXG4gIE9uZVRvT25lLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlUmV2aXNpb24gfSBmcm9tICcuLi8uLi9jb3JyZXNwb25kZW5jZS9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS1yZXZpc2lvbi5lbnRpdHknO1xuaW1wb3J0IHsgUmZhQXBwcm92ZUNvZGUgfSBmcm9tICcuL3JmYS1hcHByb3ZlLWNvZGUuZW50aXR5JztcbmltcG9ydCB7IFJmYUl0ZW0gfSBmcm9tICcuL3JmYS1pdGVtLmVudGl0eSc7XG5pbXBvcnQgeyBSZmFTdGF0dXNDb2RlIH0gZnJvbSAnLi9yZmEtc3RhdHVzLWNvZGUuZW50aXR5JztcbmltcG9ydCB7IFJmYVdvcmtmbG93IH0gZnJvbSAnLi9yZmEtd29ya2Zsb3cuZW50aXR5JztcblxuQEVudGl0eSgncmZhX3JldmlzaW9ucycpXG5leHBvcnQgY2xhc3MgUmZhUmV2aXNpb24ge1xuICBAUHJpbWFyeUNvbHVtbigpXG4gIGlkITogbnVtYmVyO1xuXG4gIEBPbmVUb09uZSgoKSA9PiBDb3JyZXNwb25kZW5jZVJldmlzaW9uLCB7IG9uRGVsZXRlOiAnQ0FTQ0FERScgfSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAnaWQnIH0pXG4gIGNvcnJlc3BvbmRlbmNlUmV2aXNpb24hOiBDb3JyZXNwb25kZW5jZVJldmlzaW9uO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmZhX3N0YXR1c19jb2RlX2lkJyB9KVxuICByZmFTdGF0dXNDb2RlSWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdyZmFfYXBwcm92ZV9jb2RlX2lkJywgbnVsbGFibGU6IHRydWUgfSlcbiAgcmZhQXBwcm92ZUNvZGVJZD86IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ2FwcHJvdmVkX2RhdGUnLCB0eXBlOiAnZGF0ZScsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGFwcHJvdmVkRGF0ZT86IERhdGU7XG5cbiAgLy8gLS0tIEpTT04gJiBTY2hlbWEgU2VjdGlvbiAtLS1cblxuICBAQ29sdW1uKHsgdHlwZTogJ2pzb24nLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBkZXRhaWxzPzogb2JqZWN0OyAvLyBEeW5hbWljIEpTT04g4oCUIHR5cGVkIGFzIGBvYmplY3RgIHBlciBUeXBlT1JNIEpTT04gY29sdW1uIGNvbnZlbnRpb24gKG5vLWFueSwgQURSLTAxOSlcblxuICAvLyDinIUgW05ld10g4LiI4Liz4LmA4Lib4LmH4LiZ4Liq4Liz4Lir4Lij4Lix4LiaIERhdGEgTWlncmF0aW9uIChUMi41LjUpXG4gIEBDb2x1bW4oeyBuYW1lOiAnc2NoZW1hX3ZlcnNpb24nLCBkZWZhdWx0OiAxIH0pXG4gIHNjaGVtYVZlcnNpb24hOiBudW1iZXI7XG5cbiAgLy8g4pyFIFZpcnR1YWwgQ29sdW1uXG4gIEBDb2x1bW4oe1xuICAgIG5hbWU6ICd2X3JlZl9kcmF3aW5nX2NvdW50JyxcbiAgICB0eXBlOiAnaW50JyxcbiAgICBnZW5lcmF0ZWRUeXBlOiAnVklSVFVBTCcsXG4gICAgYXNFeHByZXNzaW9uOiBcIkpTT05fVU5RVU9URShKU09OX0VYVFJBQ1QoZGV0YWlscywgJyQuZHJhd2luZ0NvdW50JykpXCIsXG4gICAgbnVsbGFibGU6IHRydWUsXG4gIH0pXG4gIHZSZWZEcmF3aW5nQ291bnQ/OiBudW1iZXI7XG5cbiAgLy8gLS0tIFJlbGF0aW9ucyAtLS1cblxuICBATWFueVRvT25lKCgpID0+IFJmYVN0YXR1c0NvZGUpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3JmYV9zdGF0dXNfY29kZV9pZCcgfSlcbiAgc3RhdHVzQ29kZSE6IFJmYVN0YXR1c0NvZGU7XG5cbiAgQE1hbnlUb09uZSgoKSA9PiBSZmFBcHByb3ZlQ29kZSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAncmZhX2FwcHJvdmVfY29kZV9pZCcgfSlcbiAgYXBwcm92ZUNvZGU/OiBSZmFBcHByb3ZlQ29kZTtcblxuICBAT25lVG9NYW55KCgpID0+IFJmYUl0ZW0sIChpdGVtKSA9PiBpdGVtLnJmYVJldmlzaW9uLCB7IGNhc2NhZGU6IHRydWUgfSlcbiAgaXRlbXMhOiBSZmFJdGVtW107XG5cbiAgQE9uZVRvTWFueSgoKSA9PiBSZmFXb3JrZmxvdywgKHdvcmtmbG93KSA9PiB3b3JrZmxvdy5yZmFSZXZpc2lvbiwge1xuICAgIGNhc2NhZGU6IHRydWUsXG4gIH0pXG4gIHdvcmtmbG93cyE6IFJmYVdvcmtmbG93W107XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d7/rfarevisionentity_d767f95649fe928f8b415acb6077308b.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d7/rfarevisionentity_d767f95649fe928f8b415acb6077308b.map new file mode 100644 index 0000000..b72a9e3 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d7/rfarevisionentity_d767f95649fe928f8b415acb6077308b.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-revision.entity.ts","mappings":";;;;;;;;;;;;;AAAA,wDAAwD;AACxD,qCAQiB;AACjB,iHAAsG;AACtG,uEAA2D;AAC3D,uDAA4C;AAC5C,qEAAyD;AACzD,+DAAoD;AAG7C,IAAM,WAAW,GAAjB,MAAM,WAAW;CAqDvB,CAAA;AArDY,kCAAW;AAEtB;IADC,IAAA,uBAAa,GAAE;;uCACJ;AAIZ;IAFC,IAAA,kBAAQ,EAAC,GAAG,EAAE,CAAC,uDAAsB,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC/D,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;kDACF,uDAAsB,oBAAtB,uDAAsB;2DAAC;AAGhD;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;;oDACd;AAGzB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;qDAC9B;AAG1B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACjD,IAAI,oBAAJ,IAAI;iDAAC;AAKpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4CACxB;AAIjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;kDACxB;AAUvB;IAPC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,qBAAqB;QAC3B,IAAI,EAAE,KAAK;QACX,aAAa,EAAE,SAAS;QACxB,YAAY,EAAE,uDAAuD;QACrE,QAAQ,EAAE,IAAI;KACf,CAAC;;qDACwB;AAM1B;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,sCAAa,CAAC;IAC9B,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;kDAC9B,sCAAa,oBAAb,sCAAa;+CAAC;AAI3B;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wCAAc,CAAC;IAC/B,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;kDAC9B,wCAAc,oBAAd,wCAAc;gDAAC;AAG7B;IADC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,yBAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;0CACtD;AAKlB;IAHC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,iCAAW,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE;QAChE,OAAO,EAAE,IAAI;KACd,CAAC;;8CACwB;sBApDf,WAAW;IADvB,IAAA,gBAAM,EAAC,eAAe,CAAC;GACX,WAAW,CAqDvB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-revision.entity.ts"],"sourcesContent":["// File: src/modules/rfa/entities/rfa-revision.entity.ts\nimport {\n Column,\n Entity,\n JoinColumn,\n ManyToOne,\n OneToMany,\n PrimaryColumn,\n OneToOne,\n} from 'typeorm';\nimport { CorrespondenceRevision } from '../../correspondence/entities/correspondence-revision.entity';\nimport { RfaApproveCode } from './rfa-approve-code.entity';\nimport { RfaItem } from './rfa-item.entity';\nimport { RfaStatusCode } from './rfa-status-code.entity';\nimport { RfaWorkflow } from './rfa-workflow.entity';\n\n@Entity('rfa_revisions')\nexport class RfaRevision {\n @PrimaryColumn()\n id!: number;\n\n @OneToOne(() => CorrespondenceRevision, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'id' })\n correspondenceRevision!: CorrespondenceRevision;\n\n @Column({ name: 'rfa_status_code_id' })\n rfaStatusCodeId!: number;\n\n @Column({ name: 'rfa_approve_code_id', nullable: true })\n rfaApproveCodeId?: number;\n\n @Column({ name: 'approved_date', type: 'date', nullable: true })\n approvedDate?: Date;\n\n // --- JSON & Schema Section ---\n\n @Column({ type: 'json', nullable: true })\n details?: object; // Dynamic JSON — typed as `object` per TypeORM JSON column convention (no-any, ADR-019)\n\n // ✅ [New] จำเป็นสำหรับ Data Migration (T2.5.5)\n @Column({ name: 'schema_version', default: 1 })\n schemaVersion!: number;\n\n // ✅ Virtual Column\n @Column({\n name: 'v_ref_drawing_count',\n type: 'int',\n generatedType: 'VIRTUAL',\n asExpression: \"JSON_UNQUOTE(JSON_EXTRACT(details, '$.drawingCount'))\",\n nullable: true,\n })\n vRefDrawingCount?: number;\n\n // --- Relations ---\n\n @ManyToOne(() => RfaStatusCode)\n @JoinColumn({ name: 'rfa_status_code_id' })\n statusCode!: RfaStatusCode;\n\n @ManyToOne(() => RfaApproveCode)\n @JoinColumn({ name: 'rfa_approve_code_id' })\n approveCode?: RfaApproveCode;\n\n @OneToMany(() => RfaItem, (item) => item.rfaRevision, { cascade: true })\n items!: RfaItem[];\n\n @OneToMany(() => RfaWorkflow, (workflow) => workflow.rfaRevision, {\n cascade: true,\n })\n workflows!: RfaWorkflow[];\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d8/filestorageservice_d8c424ff74b3a97c0b9fa3330d0a60b9 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d8/filestorageservice_d8c424ff74b3a97c0b9fa3330d0a60b9 new file mode 100644 index 0000000..a410b88 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d8/filestorageservice_d8c424ff74b3a97c0b9fa3330d0a60b9 @@ -0,0 +1,316 @@ +265535a3f6e998fd28150f9f452422c0 +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var FileStorageService_1; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.FileStorageService = void 0; +// File: src/common/file-storage/file-storage.service.ts +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const config_1 = require("@nestjs/config"); +const fs = __importStar(require("fs-extra")); +const path = __importStar(require("path")); +const crypto = __importStar(require("crypto")); +const uuid_1 = require("uuid"); +const attachment_entity_1 = require("./entities/attachment.entity"); +const common_2 = require("@nestjs/common"); // ✅ Import เพิ่ม +let FileStorageService = FileStorageService_1 = class FileStorageService { + constructor(attachmentRepository, configService) { + this.attachmentRepository = attachmentRepository; + this.configService = configService; + this.logger = new common_1.Logger(FileStorageService_1.name); + // ใช้ env vars จาก docker-compose สำหรับ Production + // ถ้าไม่ได้กำหนดจะ fallback เป็น ./uploads/temp และ ./uploads/permanent + this.tempDir = + this.configService.get('UPLOAD_TEMP_DIR') || + path.join(process.cwd(), 'uploads', 'temp'); + this.permanentDir = + this.configService.get('UPLOAD_PERMANENT_DIR') || + path.join(process.cwd(), 'uploads', 'permanent'); + // สร้างโฟลเดอร์ temp และ permanent รอไว้เลยถ้ายังไม่มี + fs.ensureDirSync(this.tempDir); + fs.ensureDirSync(this.permanentDir); + } + /** + * Phase 1: Upload (บันทึกไฟล์ลง Temp) + */ + async upload(file, userId) { + const tempId = (0, uuid_1.v4)(); + // Fix: แปลงชื่อไฟล์จาก Latin1 → UTF-8 (Multer/busboy decodes as Latin1 by default) + const originalFilename = this.fixMulterFilename(file.originalname); + const fileExt = path.extname(originalFilename); + const storedFilename = `${(0, uuid_1.v4)()}${fileExt}`; + const tempPath = path.join(this.tempDir, storedFilename); + // 1. คำนวณ Checksum (SHA-256) เพื่อความปลอดภัยและความถูกต้องของไฟล์ + const checksum = this.calculateChecksum(file.buffer); + // 2. บันทึกไฟล์ลง Disk (Temp Folder) + try { + await fs.writeFile(tempPath, file.buffer); + } + catch (error) { + this.logger.error(`Failed to write file: ${tempPath}`, error); + throw new common_1.BadRequestException('File upload failed'); + } + // 3. สร้าง Record ใน Database + const attachment = this.attachmentRepository.create({ + originalFilename, + storedFilename: storedFilename, + filePath: tempPath, // เก็บ path ปัจจุบันไปก่อน + mimeType: file.mimetype, + fileSize: file.size, + isTemporary: true, + tempId: tempId, + expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000), // หมดอายุใน 24 ชม. + checksum: checksum, + uploadedByUserId: userId, + }); + return this.attachmentRepository.save(attachment); + } + /** + * Phase 2: Commit (ย้ายไฟล์จาก Temp -> Permanent) + * เมธอดนี้จะถูกเรียกโดย Service อื่น (เช่น CorrespondenceService) เมื่อกด Save + */ + /** + * Phase 2: Commit (ย้ายไฟล์จาก Temp -> Permanent) + * เมธอดนี้จะถูกเรียกโดย Service อื่น (เช่น CorrespondenceService) เมื่อกด Save + * Updated [Phase 2]: Support issueDate and documentType for organized storage + */ + async commit(tempIds, options) { + if (!tempIds || tempIds.length === 0) { + return []; + } + const attachments = await this.attachmentRepository.find({ + where: { tempId: (0, typeorm_2.In)(tempIds), isTemporary: true }, + }); + if (attachments.length !== tempIds.length) { + // แจ้งเตือนแต่อาจจะไม่ throw ถ้าต้องการให้ process ต่อไปได้บางส่วน (ขึ้นอยู่กับ business logic) + // แต่เพื่อความปลอดภัยควรแจ้งว่าไฟล์ไม่ครบ + this.logger.warn(`Expected ${tempIds.length} files to commit, but found ${attachments.length}`); + throw new common_1.NotFoundException('Some files not found or already committed'); + } + const committedAttachments = []; + // Use issueDate if provided, otherwise default to current date + const refDate = options?.issueDate + ? new Date(options.issueDate) + : new Date(); + // Validate Date (in case invalid string passed) + const effectiveDate = isNaN(refDate.getTime()) ? new Date() : refDate; + const year = effectiveDate.getFullYear().toString(); + const month = (effectiveDate.getMonth() + 1).toString().padStart(2, '0'); + // Construct Path: permanent/{DocumentType}/{YYYY}/{MM}/filename + const docTypeFolder = options?.documentType || 'General'; + // โฟลเดอร์ถาวรแยกตาม Type/ปี/เดือน + const permanentDir = path.join(this.permanentDir, docTypeFolder, year, month); + await fs.ensureDir(permanentDir); + for (const att of attachments) { + const oldPath = att.filePath; + const newPath = path.join(permanentDir, att.storedFilename); + try { + // ย้ายไฟล์ + if (await fs.pathExists(oldPath)) { + await fs.move(oldPath, newPath, { overwrite: true }); + // อัปเดตข้อมูลใน DB + att.filePath = newPath; + att.isTemporary = false; + att.tempId = undefined; // เคลียร์ tempId + att.expiresAt = undefined; // เคลียร์วันหมดอายุ + att.referenceDate = effectiveDate; // Save reference date + committedAttachments.push(await this.attachmentRepository.save(att)); + } + else { + this.logger.error(`File missing during commit: ${oldPath}`); + throw new common_1.NotFoundException(`File not found on disk: ${att.originalFilename}`); + } + } + catch (error) { + this.logger.error(`Failed to move file from ${oldPath} to ${newPath}`, error); + throw new common_1.BadRequestException(`Failed to commit file: ${att.originalFilename}`); + } + } + return committedAttachments; + } + /** + * Download File + * ดึงไฟล์มาเป็น Stream เพื่อส่งกลับไปให้ Controller + */ + async download(id) { + // 1. ค้นหาข้อมูลไฟล์จาก DB + const attachment = await this.attachmentRepository.findOne({ + where: { id }, + }); + if (!attachment) { + throw new common_1.NotFoundException(`Attachment #${id} not found`); + } + // 2. ตรวจสอบว่าไฟล์มีอยู่จริงบน Disk หรือไม่ + const filePath = attachment.filePath; + if (!fs.existsSync(filePath)) { + this.logger.error(`File missing on disk: ${filePath}`); + throw new common_1.NotFoundException('File not found on server storage'); + } + // 3. สร้าง Read Stream (มีประสิทธิภาพกว่าการโหลดทั้งไฟล์เข้า Memory) + const stream = fs.createReadStream(filePath); + return { stream, attachment }; + } + /** + * แก้ปัญหา Multer/busboy ถอดรหัสชื่อไฟล์เป็น Latin1 แทน UTF-8 + * ทำให้ภาษาไทยกลายเป็น mojibake (เช่น ผรม → 脿赂聹脿赂拢脿赂隆) + * วิธีแก้: แปลง latin1 bytes กลับเป็น UTF-8 + */ + fixMulterFilename(originalname) { + try { + const decoded = Buffer.from(originalname, 'latin1').toString('utf8'); + // ตรวจสอบว่า decoded string มี valid UTF-8 characters + // ถ้า originalname เป็น ASCII อยู่แล้ว ผลลัพธ์จะเหมือนเดิม + return decoded; + } + catch { + return originalname; + } + } + calculateChecksum(buffer) { + return crypto.createHash('sha256').update(buffer).digest('hex'); + } + /** + * ✅ NEW: Import Staging File (For Legacy Migration) + * ย้ายไฟล์จาก staging_ai ไปยัง permanent storage โดยตรง + */ + async importStagingFile(sourceFilePath, userId, options) { + if (!(await fs.pathExists(sourceFilePath))) { + this.logger.error(`Staging file not found: ${sourceFilePath}`); + throw new common_1.NotFoundException(`Source file not found: ${sourceFilePath}`); + } + // 1. Get file stats & checksum + const stats = await fs.stat(sourceFilePath); + const fileExt = path.extname(sourceFilePath); + const originalFilename = path.basename(sourceFilePath); + const storedFilename = `${(0, uuid_1.v4)()}${fileExt}`; + // Determine mime type basic + let mimeType = 'application/octet-stream'; + if (fileExt.toLowerCase() === '.pdf') + mimeType = 'application/pdf'; + else if (fileExt.toLowerCase() === '.xlsx') + mimeType = + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; + const fileBuffer = await fs.readFile(sourceFilePath); + const checksum = this.calculateChecksum(fileBuffer); + // 2. Generate Permanent Path + const refDate = options?.issueDate || new Date(); + const effectiveDate = isNaN(refDate.getTime()) ? new Date() : refDate; + const year = effectiveDate.getFullYear().toString(); + const month = (effectiveDate.getMonth() + 1).toString().padStart(2, '0'); + const docTypeFolder = options?.documentType || 'General'; + const permanentDir = path.join(this.permanentDir, docTypeFolder, year, month); + await fs.ensureDir(permanentDir); + const newPath = path.join(permanentDir, storedFilename); + // 3. Move File + try { + await fs.move(sourceFilePath, newPath, { overwrite: true }); + } + catch (error) { + this.logger.error(`Failed to move staging file to ${newPath}`, error); + throw new common_1.BadRequestException('Failed to process staging file'); + } + // 4. Create Database Record + const attachment = this.attachmentRepository.create({ + originalFilename, + storedFilename, + filePath: newPath, + mimeType, + fileSize: stats.size, + isTemporary: false, + referenceDate: effectiveDate, + checksum, + uploadedByUserId: userId, + }); + return this.attachmentRepository.save(attachment); + } + /** + * ✅ NEW: Delete File + * ลบไฟล์ออกจาก Disk และ Database + */ + async delete(id, userId) { + // 1. ค้นหาไฟล์ + const attachment = await this.attachmentRepository.findOne({ + where: { id }, + }); + if (!attachment) { + throw new common_1.NotFoundException(`Attachment #${id} not found`); + } + // 2. ตรวจสอบความเป็นเจ้าของ (Security Check) + // อนุญาตให้ลบถ้าเป็นคนอัปโหลดเอง + // (ในอนาคตอาจเพิ่มเงื่อนไข OR User เป็น Admin/Document Control) + if (attachment.uploadedByUserId !== userId) { + this.logger.warn(`User ${userId} tried to delete file ${id} owned by ${attachment.uploadedByUserId}`); + throw new common_2.ForbiddenException('You are not allowed to delete this file'); + } + // 3. ลบไฟล์ออกจาก Disk + try { + if (await fs.pathExists(attachment.filePath)) { + await fs.remove(attachment.filePath); + } + else { + this.logger.warn(`File not found on disk during deletion: ${attachment.filePath}`); + } + } + catch (error) { + this.logger.error(`Failed to delete file from disk: ${attachment.filePath}`, error); + throw new common_1.BadRequestException('Failed to delete file from storage'); + } + // 4. ลบ Record ออกจาก Database + await this.attachmentRepository.remove(attachment); + this.logger.log(`File deleted: ${id} by user ${userId}`); + } +}; +exports.FileStorageService = FileStorageService; +exports.FileStorageService = FileStorageService = FileStorageService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(attachment_entity_1.Attachment)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object, typeof (_b = typeof config_1.ConfigService !== "undefined" && config_1.ConfigService) === "function" ? _b : Object]) +], FileStorageService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxmaWxlLXN0b3JhZ2VcXGZpbGUtc3RvcmFnZS5zZXJ2aWNlLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsd0RBQXdEO0FBQ3hELDJDQUt3QjtBQUN4Qiw2Q0FBbUQ7QUFDbkQscUNBQXlDO0FBQ3pDLDJDQUErQztBQUMvQyw2Q0FBK0I7QUFDL0IsMkNBQTZCO0FBQzdCLCtDQUFpQztBQUNqQywrQkFBb0M7QUFDcEMsb0VBQTBEO0FBQzFELDJDQUFvRCxDQUFDLGlCQUFpQjtBQUcvRCxJQUFNLGtCQUFrQiwwQkFBeEIsTUFBTSxrQkFBa0I7SUFLN0IsWUFFRSxvQkFBb0QsRUFDNUMsYUFBNEI7UUFENUIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUF3QjtRQUM1QyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQVByQixXQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsb0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFTNUQsb0RBQW9EO1FBQ3BELHdFQUF3RTtRQUN4RSxJQUFJLENBQUMsT0FBTztZQUNWLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFTLGlCQUFpQixDQUFDO2dCQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFlBQVk7WUFDZixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBUyxzQkFBc0IsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRW5ELHVEQUF1RDtRQUN2RCxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQixFQUFFLENBQUMsYUFBYSxDQUFDLElBQUks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QUFNLENBQUMsSUFBSSxDQUNkLDJDQUEyQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQ2pFLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZixvQ0FBb0MsVUFBVSxDQUFDLFFBQVEsRUFBRSxFQUN6RCxLQUFLLENBQ04sQ0FBQztZQUNGLE1BQU0sSUFBSSw0QkFBbUIsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFFRCwrQkFBK0I7UUFDL0IsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRW5ELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLFlBQVksTUFBTSxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0NBQ0YsQ0FBQTtBQWhVWSxnREFBa0I7NkJBQWxCLGtCQUFrQjtJQUQ5QixJQUFBLG1CQUFVLEdBQUU7SUFPUixXQUFBLElBQUEsMEJBQWdCLEVBQUMsOEJBQVUsQ0FBQyxDQUFBO3lEQUNDLG9CQUFVLG9CQUFWLG9CQUFVLG9EQUNqQixzQkFBYSxvQkFBYixzQkFBYTtHQVIzQixrQkFBa0IsQ0FnVTlCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXGNvbW1vblxcZmlsZS1zdG9yYWdlXFxmaWxlLXN0b3JhZ2Uuc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGaWxlOiBzcmMvY29tbW9uL2ZpbGUtc3RvcmFnZS9maWxlLXN0b3JhZ2Uuc2VydmljZS50c1xuaW1wb3J0IHtcbiAgSW5qZWN0YWJsZSxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIEJhZFJlcXVlc3RFeGNlcHRpb24sXG4gIExvZ2dlcixcbn0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0UmVwb3NpdG9yeSB9IGZyb20gJ0BuZXN0anMvdHlwZW9ybSc7XG5pbXBvcnQgeyBSZXBvc2l0b3J5LCBJbiB9IGZyb20gJ3R5cGVvcm0nO1xuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJ0BuZXN0anMvY29uZmlnJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgQXR0YWNobWVudCB9IGZyb20gJy4vZW50aXRpZXMvYXR0YWNobWVudC5lbnRpdHknO1xuaW1wb3J0IHsgRm9yYmlkZGVuRXhjZXB0aW9uIH0gZnJvbSAnQG5lc3Rqcy9jb21tb24nOyAvLyDinIUgSW1wb3J0IOC5gOC4nuC4tOC5iOC4oVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRmlsZVN0b3JhZ2VTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKEZpbGVTdG9yYWdlU2VydmljZS5uYW1lKTtcbiAgcHJpdmF0ZSByZWFkb25seSB0ZW1wRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVybWFuZW50RGlyOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdFJlcG9zaXRvcnkoQXR0YWNobWVudClcbiAgICBwcml2YXRlIGF0dGFjaG1lbnRSZXBvc2l0b3J5OiBSZXBvc2l0b3J5PEF0dGFjaG1lbnQ+LFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZVxuICApIHtcbiAgICAvLyDguYPguIrguYkgZW52IHZhcnMg4LiI4Liy4LiBIGRvY2tlci1jb21wb3NlIOC4quC4s+C4q+C4o+C4seC4miBQcm9kdWN0aW9uXG4gICAgLy8g4LiW4LmJ4Liy4LmE4Lih4LmI4LmE4LiU4LmJ4LiB4Liz4Lir4LiZ4LiU4LiI4LiwIGZhbGxiYWNrIOC5gOC4m+C5h+C4mSAuL3VwbG9hZHMvdGVtcCDguYHguKXguLAgLi91cGxvYWRzL3Blcm1hbmVudFxuICAgIHRoaXMudGVtcERpciA9XG4gICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0PHN0cmluZz4oJ1VQTE9BRF9URU1QX0RJUicpIHx8XG4gICAgICBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ3VwbG9hZHMnLCAndGVtcCcpO1xuICAgIHRoaXMucGVybWFuZW50RGlyID1cbiAgICAgIHRoaXMuY29uZmlnU2VydmljZS5nZXQ8c3RyaW5nPignVVBMT0FEX1BFUk1BTkVOVF9ESVInKSB8fFxuICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICd1cGxvYWRzJywgJ3Blcm1hbmVudCcpO1xuXG4gICAgLy8g4Liq4Lij4LmJ4Liy4LiH4LmC4Lif4Lil4LmA4LiU4Lit4Lij4LmMIHRlbXAg4LmB4Lil4LiwIHBlcm1hbmVudCDguKPguK3guYTguKfguYnguYDguKXguKLguJbguYnguLLguKLguLHguIfguYTguKHguYjguKHguLVcbiAgICBmcy5lbnN1cmVEaXJTeW5jKHRoaXMudGVtcERpcik7XG4gICAgZnMuZW5zdXJlRGlyU3luYyh0aGlzLnBlcm1hbmVudERpcik7XG4gIH1cblxuICAvKipcbiAgICogUGhhc2UgMTogVXBsb2FkICjguJrguLHguJnguJfguLbguIHguYTguJ/guKXguYzguKXguIcgVGVtcClcbiAgICovXG4gIGFzeW5jIHVwbG9hZChmaWxlOiBFeHByZXNzLk11bHRlci5GaWxlLCB1c2VySWQ6IG51bWJlcik6IFByb21pc2U8QXR0YWNobWVudD4ge1xuICAgIGNvbnN0IHRlbXBJZCA9IHV1aWR2NCgpO1xuICAgIC8vIEZpeDog4LmB4Lib4Lil4LiH4LiK4Li34LmI4Lit4LmE4Lif4Lil4LmM4LiI4Liy4LiBIExhdGluMSDihpIgVVRGLTggKE11bHRlci9idXNib3kgZGVjb2RlcyBhcyBMYXRpbjEgYnkgZGVmYXVsdClcbiAgICBjb25zdCBvcmlnaW5hbEZpbGVuYW1lID0gdGhpcy5maXhNdWx0ZXJGaWxlbmFtZShmaWxlLm9yaWdpbmFsbmFtZSk7XG4gICAgY29uc3QgZmlsZUV4dCA9IHBhdGguZXh0bmFtZShvcmlnaW5hbEZpbGVuYW1lKTtcbiAgICBjb25zdCBzdG9yZWRGaWxlbmFtZSA9IGAke3V1aWR2NCgpfSR7ZmlsZUV4dH1gO1xuICAgIGNvbnN0IHRlbXBQYXRoID0gcGF0aC5qb2luKHRoaXMudGVtcERpciwgc3RvcmVkRmlsZW5hbWUpO1xuXG4gICAgLy8gMS4g4LiE4Liz4LiZ4Lin4LiTIENoZWNrc3VtIChTSEEtMjU2KSDguYDguJ7guLfguYjguK3guITguKfguLLguKHguJvguKXguK3guJTguKDguLHguKLguYHguKXguLDguITguKfguLLguKHguJbguLnguIHguJXguYnguK3guIfguILguK3guIfguYTguJ/guKXguYxcbiAgICBjb25zdCBjaGVja3N1bSA9IHRoaXMuY2FsY3VsYXRlQ2hlY2tzdW0oZmlsZS5idWZmZXIpO1xuXG4gICAgLy8gMi4g4Lia4Lix4LiZ4LiX4Li24LiB4LmE4Lif4Lil4LmM4Lil4LiHIERpc2sgKFRlbXAgRm9sZGVyKVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUodGVtcFBhdGgsIGZpbGUuYnVmZmVyKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byB3cml0ZSBmaWxlOiAke3RlbXBQYXRofWAsIGVycm9yKTtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCdGaWxlIHVwbG9hZCBmYWlsZWQnKTtcbiAgICB9XG5cbiAgICAvLyAzLiDguKrguKPguYnguLLguIcgUmVjb3JkIOC5g+C4mSBEYXRhYmFzZVxuICAgIGNvbnN0IGF0dGFjaG1lbnQgPSB0aGlzLmF0dGFjaG1lbnRSZXBvc2l0b3J5LmNyZWF0ZSh7XG4gICAgICBvcmlnaW5hbEZpbGVuYW1lLFxuICAgICAgc3RvcmVkRmlsZW5hbWU6IHN0b3JlZEZpbGVuYW1lLFxuICAgICAgZmlsZVBhdGg6IHRlbXBQYXRoLCAvLyDguYDguIHguYfguJogcGF0aCDguJvguLHguIjguIjguLjguJrguLHguJnguYTguJvguIHguYjguK3guJlcbiAgICAgIG1pbWVUeXBlOiBmaWxlLm1pbWV0eXBlLFxuICAgICAgZmlsZVNpemU6IGZpbGUuc2l6ZSxcbiAgICAgIGlzVGVtcG9yYXJ5OiB0cnVlLFxuICAgICAgdGVtcElkOiB0ZW1wSWQsXG4gICAgICBleHBpcmVzQXQ6IG5ldyBEYXRlKERhdGUubm93KCkgKyAyNCAqIDYwICogNjAgKiAxMDAwKSwgLy8g4Lir4Lih4LiU4Lit4Liy4Lii4Li44LmD4LiZIDI0IOC4iuC4oS5cbiAgICAgIGNoZWNrc3VtOiBjaGVja3N1bSxcbiAgICAgIHVwbG9hZGVkQnlVc2VySWQ6IHVzZXJJZCxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmF0dGFjaG1lbnRSZXBvc2l0b3J5LnNhdmUoYXR0YWNobWVudCk7XG4gIH1cblxuICAvKipcbiAgICogUGhhc2UgMjogQ29tbWl0ICjguKLguYnguLLguKLguYTguJ/guKXguYzguIjguLLguIEgVGVtcCAtPiBQZXJtYW5lbnQpXG4gICAqIOC5gOC4oeC4mOC4reC4lOC4meC4teC5ieC4iOC4sOC4luC4ueC4geC5gOC4o+C4teC4ouC4geC5guC4lOC4oiBTZXJ2aWNlIOC4reC4t+C5iOC4mSAo4LmA4LiK4LmI4LiZIENvcnJlc3BvbmRlbmNlU2VydmljZSkg4LmA4Lih4Li34LmI4Lit4LiB4LiUIFNhdmVcbiAgICovXG4gIC8qKlxuICAgKiBQaGFzZSAyOiBDb21taXQgKOC4ouC5ieC4suC4ouC5hOC4n+C4peC5jOC4iOC4suC4gSBUZW1wIC0+IFBlcm1hbmVudClcbiAgICog4LmA4Lih4LiY4Lit4LiU4LiZ4Li14LmJ4LiI4Liw4LiW4Li54LiB4LmA4Lij4Li14Lii4LiB4LmC4LiU4LiiIFNlcnZpY2Ug4Lit4Li34LmI4LiZICjguYDguIrguYjguJkgQ29ycmVzcG9uZGVuY2VTZXJ2aWNlKSDguYDguKHguLfguYjguK3guIHguJQgU2F2ZVxuICAgKiBVcGRhdGVkIFtQaGFzZSAyXTogU3VwcG9ydCBpc3N1ZURhdGUgYW5kIGRvY3VtZW50VHlwZSBmb3Igb3JnYW5pemVkIHN0b3JhZ2VcbiAgICovXG4gIGFzeW5jIGNvbW1pdChcbiAgICB0ZW1wSWRzOiBzdHJpbmdbXSxcbiAgICBvcHRpb25zPzogeyBpc3N1ZURhdGU/OiBEYXRlOyBkb2N1bWVudFR5cGU/OiBzdHJpbmcgfVxuICApOiBQcm9taXNlPEF0dGFjaG1lbnRbXT4ge1xuICAgIGlmICghdGVtcElkcyB8fCB0ZW1wSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gYXdhaXQgdGhpcy5hdHRhY2htZW50UmVwb3NpdG9yeS5maW5kKHtcbiAgICAgIHdoZXJlOiB7IHRlbXBJZDogSW4odGVtcElkcyksIGlzVGVtcG9yYXJ5OiB0cnVlIH0sXG4gICAgfSk7XG5cbiAgICBpZiAoYXR0YWNobWVudHMubGVuZ3RoICE9PSB0ZW1wSWRzLmxlbmd0aCkge1xuICAgICAgLy8g4LmB4LiI4LmJ4LiH4LmA4LiV4Li34Lit4LiZ4LmB4LiV4LmI4Lit4Liy4LiI4LiI4Liw4LmE4Lih4LmIIHRocm93IOC4luC5ieC4suC4leC5ieC4reC4h+C4geC4suC4o+C5g+C4q+C5iSBwcm9jZXNzIOC4leC5iOC4reC5hOC4m+C5hOC4lOC5ieC4muC4suC4h+C4quC5iOC4p+C4mSAo4LiC4Li24LmJ4LiZ4Lit4Lii4Li54LmI4LiB4Lix4LiaIGJ1c2luZXNzIGxvZ2ljKVxuICAgICAgLy8g4LmB4LiV4LmI4LmA4Lie4Li34LmI4Lit4LiE4Lin4Liy4Lih4Lib4Lil4Lit4LiU4Lig4Lix4Lii4LiE4Lin4Lij4LmB4LiI4LmJ4LiH4Lin4LmI4Liy4LmE4Lif4Lil4LmM4LmE4Lih4LmI4LiE4Lij4LiaXG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICBgRXhwZWN0ZWQgJHt0ZW1wSWRzLmxlbmd0aH0gZmlsZXMgdG8gY29tbWl0LCBidXQgZm91bmQgJHthdHRhY2htZW50cy5sZW5ndGh9YFxuICAgICAgKTtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbignU29tZSBmaWxlcyBub3QgZm91bmQgb3IgYWxyZWFkeSBjb21taXR0ZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21taXR0ZWRBdHRhY2htZW50czogQXR0YWNobWVudFtdID0gW107XG4gICAgLy8gVXNlIGlzc3VlRGF0ZSBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gY3VycmVudCBkYXRlXG4gICAgY29uc3QgcmVmRGF0ZSA9IG9wdGlvbnM/Lmlzc3VlRGF0ZVxuICAgICAgPyBuZXcgRGF0ZShvcHRpb25zLmlzc3VlRGF0ZSlcbiAgICAgIDogbmV3IERhdGUoKTtcblxuICAgIC8vIFZhbGlkYXRlIERhdGUgKGluIGNhc2UgaW52YWxpZCBzdHJpbmcgcGFzc2VkKVxuICAgIGNvbnN0IGVmZmVjdGl2ZURhdGUgPSBpc05hTihyZWZEYXRlLmdldFRpbWUoKSkgPyBuZXcgRGF0ZSgpIDogcmVmRGF0ZTtcblxuICAgIGNvbnN0IHllYXIgPSBlZmZlY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKTtcbiAgICBjb25zdCBtb250aCA9IChlZmZlY3RpdmVEYXRlLmdldE1vbnRoKCkgKyAxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG5cbiAgICAvLyBDb25zdHJ1Y3QgUGF0aDogcGVybWFuZW50L3tEb2N1bWVudFR5cGV9L3tZWVlZfS97TU19L2ZpbGVuYW1lXG4gICAgY29uc3QgZG9jVHlwZUZvbGRlciA9IG9wdGlvbnM/LmRvY3VtZW50VHlwZSB8fCAnR2VuZXJhbCc7XG5cbiAgICAvLyDguYLguJ/guKXguYDguJTguK3guKPguYzguJbguLLguKfguKPguYHguKLguIHguJXguLLguKEgVHlwZS/guJvguLUv4LmA4LiU4Li34Lit4LiZXG4gICAgY29uc3QgcGVybWFuZW50RGlyID0gcGF0aC5qb2luKFxuICAgICAgdGhpcy5wZXJtYW5lbnREaXIsXG4gICAgICBkb2NUeXBlRm9sZGVyLFxuICAgICAgeWVhcixcbiAgICAgIG1vbnRoXG4gICAgKTtcbiAgICBhd2FpdCBmcy5lbnN1cmVEaXIocGVybWFuZW50RGlyKTtcblxuICAgIGZvciAoY29uc3QgYXR0IG9mIGF0dGFjaG1lbnRzKSB7XG4gICAgICBjb25zdCBvbGRQYXRoID0gYXR0LmZpbGVQYXRoO1xuICAgICAgY29uc3QgbmV3UGF0aCA9IHBhdGguam9pbihwZXJtYW5lbnREaXIsIGF0dC5zdG9yZWRGaWxlbmFtZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIOC4ouC5ieC4suC4ouC5hOC4n+C4peC5jFxuICAgICAgICBpZiAoYXdhaXQgZnMucGF0aEV4aXN0cyhvbGRQYXRoKSkge1xuICAgICAgICAgIGF3YWl0IGZzLm1vdmUob2xkUGF0aCwgbmV3UGF0aCwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG5cbiAgICAgICAgICAvLyDguK3guLHguJvguYDguJTguJXguILguYnguK3guKHguLnguKXguYPguJkgREJcbiAgICAgICAgICBhdHQuZmlsZVBhdGggPSBuZXdQYXRoO1xuICAgICAgICAgIGF0dC5pc1RlbXBvcmFyeSA9IGZhbHNlO1xuICAgICAgICAgIGF0dC50ZW1wSWQgPSB1bmRlZmluZWQ7IC8vIOC5gOC4hOC4peC4teC4ouC4o+C5jCB0ZW1wSWRcbiAgICAgICAgICBhdHQuZXhwaXJlc0F0ID0gdW5kZWZpbmVkOyAvLyDguYDguITguKXguLXguKLguKPguYzguKfguLHguJnguKvguKHguJTguK3guLLguKLguLhcbiAgICAgICAgICBhdHQucmVmZXJlbmNlRGF0ZSA9IGVmZmVjdGl2ZURhdGU7IC8vIFNhdmUgcmVmZXJlbmNlIGRhdGVcblxuICAgICAgICAgIGNvbW1pdHRlZEF0dGFjaG1lbnRzLnB1c2goYXdhaXQgdGhpcy5hdHRhY2htZW50UmVwb3NpdG9yeS5zYXZlKGF0dCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGaWxlIG1pc3NpbmcgZHVyaW5nIGNvbW1pdDogJHtvbGRQYXRofWApO1xuICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihcbiAgICAgICAgICAgIGBGaWxlIG5vdCBmb3VuZCBvbiBkaXNrOiAke2F0dC5vcmlnaW5hbEZpbGVuYW1lfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIG1vdmUgZmlsZSBmcm9tICR7b2xkUGF0aH0gdG8gJHtuZXdQYXRofWAsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgKTtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgICAgYEZhaWxlZCB0byBjb21taXQgZmlsZTogJHthdHQub3JpZ2luYWxGaWxlbmFtZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbW1pdHRlZEF0dGFjaG1lbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIERvd25sb2FkIEZpbGVcbiAgICog4LiU4Li24LiH4LmE4Lif4Lil4LmM4Lih4Liy4LmA4Lib4LmH4LiZIFN0cmVhbSDguYDguJ7guLfguYjguK3guKrguYjguIfguIHguKXguLHguJrguYTguJvguYPguKvguYkgQ29udHJvbGxlclxuICAgKi9cbiAgYXN5bmMgZG93bmxvYWQoXG4gICAgaWQ6IG51bWJlclxuICApOiBQcm9taXNlPHsgc3RyZWFtOiBmcy5SZWFkU3RyZWFtOyBhdHRhY2htZW50OiBBdHRhY2htZW50IH0+IHtcbiAgICAvLyAxLiDguITguYnguJnguKvguLLguILguYnguK3guKHguLnguKXguYTguJ/guKXguYzguIjguLLguIEgREJcbiAgICBjb25zdCBhdHRhY2htZW50ID0gYXdhaXQgdGhpcy5hdHRhY2htZW50UmVwb3NpdG9yeS5maW5kT25lKHtcbiAgICAgIHdoZXJlOiB7IGlkIH0sXG4gICAgfSk7XG5cbiAgICBpZiAoIWF0dGFjaG1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgQXR0YWNobWVudCAjJHtpZH0gbm90IGZvdW5kYCk7XG4gICAgfVxuXG4gICAgLy8gMi4g4LiV4Lij4Lin4LiI4Liq4Lit4Lia4Lin4LmI4Liy4LmE4Lif4Lil4LmM4Lih4Li14Lit4Lii4Li54LmI4LiI4Lij4Li04LiH4Lia4LiZIERpc2sg4Lir4Lij4Li34Lit4LmE4Lih4LmIXG4gICAgY29uc3QgZmlsZVBhdGggPSBhdHRhY2htZW50LmZpbGVQYXRoO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGaWxlIG1pc3Npbmcgb24gZGlzazogJHtmaWxlUGF0aH1gKTtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbignRmlsZSBub3QgZm91bmQgb24gc2VydmVyIHN0b3JhZ2UnKTtcbiAgICB9XG5cbiAgICAvLyAzLiDguKrguKPguYnguLLguIcgUmVhZCBTdHJlYW0gKOC4oeC4teC4m+C4o+C4sOC4quC4tOC4l+C4mOC4tOC4oOC4suC4nuC4geC4p+C5iOC4suC4geC4suC4o+C5guC4q+C4peC4lOC4l+C4seC5ieC4h+C5hOC4n+C4peC5jOC5gOC4guC5ieC4siBNZW1vcnkpXG4gICAgY29uc3Qgc3RyZWFtID0gZnMuY3JlYXRlUmVhZFN0cmVhbShmaWxlUGF0aCk7XG5cbiAgICByZXR1cm4geyBzdHJlYW0sIGF0dGFjaG1lbnQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDguYHguIHguYnguJvguLHguI3guKvguLIgTXVsdGVyL2J1c2JveSDguJbguK3guJTguKPguKvguLHguKrguIrguLfguYjguK3guYTguJ/guKXguYzguYDguJvguYfguJkgTGF0aW4xIOC5geC4l+C4mSBVVEYtOFxuICAgKiDguJfguLPguYPguKvguYnguKDguLLguKnguLLguYTguJfguKLguIHguKXguLLguKLguYDguJvguYfguJkgbW9qaWJha2UgKOC5gOC4iuC5iOC4mSDguJzguKPguKEg4oaSIOiEv+i1guiBueiEv+i1guaLouiEv+i1gumahilcbiAgICog4Lin4Li04LiY4Li14LmB4LiB4LmJOiDguYHguJvguKXguIcgbGF0aW4xIGJ5dGVzIOC4geC4peC4seC4muC5gOC4m+C5h+C4mSBVVEYtOFxuICAgKi9cbiAgcHJpdmF0ZSBmaXhNdWx0ZXJGaWxlbmFtZShvcmlnaW5hbG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShvcmlnaW5hbG5hbWUsICdsYXRpbjEnKS50b1N0cmluZygndXRmOCcpO1xuICAgICAgLy8g4LiV4Lij4Lin4LiI4Liq4Lit4Lia4Lin4LmI4LiyIGRlY29kZWQgc3RyaW5nIOC4oeC4tSB2YWxpZCBVVEYtOCBjaGFyYWN0ZXJzXG4gICAgICAvLyDguJbguYnguLIgb3JpZ2luYWxuYW1lIOC5gOC4m+C5h+C4mSBBU0NJSSDguK3guKLguLnguYjguYHguKXguYnguKcg4Lic4Lil4Lil4Lix4Lie4LiY4LmM4LiI4Liw4LmA4Lir4Lih4Li34Lit4LiZ4LmA4LiU4Li04LihXG4gICAgICByZXR1cm4gZGVjb2RlZDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBvcmlnaW5hbG5hbWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVDaGVja3N1bShidWZmZXI6IEJ1ZmZlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoYnVmZmVyKS5kaWdlc3QoJ2hleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIOKchSBORVc6IEltcG9ydCBTdGFnaW5nIEZpbGUgKEZvciBMZWdhY3kgTWlncmF0aW9uKVxuICAgKiDguKLguYnguLLguKLguYTguJ/guKXguYzguIjguLLguIEgc3RhZ2luZ19haSDguYTguJvguKLguLHguIcgcGVybWFuZW50IHN0b3JhZ2Ug4LmC4LiU4Lii4LiV4Lij4LiHXG4gICAqL1xuICBhc3luYyBpbXBvcnRTdGFnaW5nRmlsZShcbiAgICBzb3VyY2VGaWxlUGF0aDogc3RyaW5nLFxuICAgIHVzZXJJZDogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiB7IGlzc3VlRGF0ZT86IERhdGU7IGRvY3VtZW50VHlwZT86IHN0cmluZyB9XG4gICk6IFByb21pc2U8QXR0YWNobWVudD4ge1xuICAgIGlmICghKGF3YWl0IGZzLnBhdGhFeGlzdHMoc291cmNlRmlsZVBhdGgpKSkge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYFN0YWdpbmcgZmlsZSBub3QgZm91bmQ6ICR7c291cmNlRmlsZVBhdGh9YCk7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oYFNvdXJjZSBmaWxlIG5vdCBmb3VuZDogJHtzb3VyY2VGaWxlUGF0aH1gKTtcbiAgICB9XG5cbiAgICAvLyAxLiBHZXQgZmlsZSBzdGF0cyAmIGNoZWNrc3VtXG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KHNvdXJjZUZpbGVQYXRoKTtcbiAgICBjb25zdCBmaWxlRXh0ID0gcGF0aC5leHRuYW1lKHNvdXJjZUZpbGVQYXRoKTtcbiAgICBjb25zdCBvcmlnaW5hbEZpbGVuYW1lID0gcGF0aC5iYXNlbmFtZShzb3VyY2VGaWxlUGF0aCk7XG4gICAgY29uc3Qgc3RvcmVkRmlsZW5hbWUgPSBgJHt1dWlkdjQoKX0ke2ZpbGVFeHR9YDtcblxuICAgIC8vIERldGVybWluZSBtaW1lIHR5cGUgYmFzaWNcbiAgICBsZXQgbWltZVR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcbiAgICBpZiAoZmlsZUV4dC50b0xvd2VyQ2FzZSgpID09PSAnLnBkZicpIG1pbWVUeXBlID0gJ2FwcGxpY2F0aW9uL3BkZic7XG4gICAgZWxzZSBpZiAoZmlsZUV4dC50b0xvd2VyQ2FzZSgpID09PSAnLnhsc3gnKVxuICAgICAgbWltZVR5cGUgPVxuICAgICAgICAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnO1xuXG4gICAgY29uc3QgZmlsZUJ1ZmZlciA9IGF3YWl0IGZzLnJlYWRGaWxlKHNvdXJjZUZpbGVQYXRoKTtcbiAgICBjb25zdCBjaGVja3N1bSA9IHRoaXMuY2FsY3VsYXRlQ2hlY2tzdW0oZmlsZUJ1ZmZlcik7XG5cbiAgICAvLyAyLiBHZW5lcmF0ZSBQZXJtYW5lbnQgUGF0aFxuICAgIGNvbnN0IHJlZkRhdGUgPSBvcHRpb25zPy5pc3N1ZURhdGUgfHwgbmV3IERhdGUoKTtcbiAgICBjb25zdCBlZmZlY3RpdmVEYXRlID0gaXNOYU4ocmVmRGF0ZS5nZXRUaW1lKCkpID8gbmV3IERhdGUoKSA6IHJlZkRhdGU7XG4gICAgY29uc3QgeWVhciA9IGVmZmVjdGl2ZURhdGUuZ2V0RnVsbFllYXIoKS50b1N0cmluZygpO1xuICAgIGNvbnN0IG1vbnRoID0gKGVmZmVjdGl2ZURhdGUuZ2V0TW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBjb25zdCBkb2NUeXBlRm9sZGVyID0gb3B0aW9ucz8uZG9jdW1lbnRUeXBlIHx8ICdHZW5lcmFsJztcblxuICAgIGNvbnN0IHBlcm1hbmVudERpciA9IHBhdGguam9pbihcbiAgICAgIHRoaXMucGVybWFuZW50RGlyLFxuICAgICAgZG9jVHlwZUZvbGRlcixcbiAgICAgIHllYXIsXG4gICAgICBtb250aFxuICAgICk7XG4gICAgYXdhaXQgZnMuZW5zdXJlRGlyKHBlcm1hbmVudERpcik7XG5cbiAgICBjb25zdCBuZXdQYXRoID0gcGF0aC5qb2luKHBlcm1hbmVudERpciwgc3RvcmVkRmlsZW5hbWUpO1xuXG4gICAgLy8gMy4gTW92ZSBGaWxlXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLm1vdmUoc291cmNlRmlsZVBhdGgsIG5ld1BhdGgsIHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIG1vdmUgc3RhZ2luZyBmaWxlIHRvICR7bmV3UGF0aH1gLCBlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbignRmFpbGVkIHRvIHByb2Nlc3Mgc3RhZ2luZyBmaWxlJyk7XG4gICAgfVxuXG4gICAgLy8gNC4gQ3JlYXRlIERhdGFiYXNlIFJlY29yZFxuICAgIGNvbnN0IGF0dGFjaG1lbnQgPSB0aGlzLmF0dGFjaG1lbnRSZXBvc2l0b3J5LmNyZWF0ZSh7XG4gICAgICBvcmlnaW5hbEZpbGVuYW1lLFxuICAgICAgc3RvcmVkRmlsZW5hbWUsXG4gICAgICBmaWxlUGF0aDogbmV3UGF0aCxcbiAgICAgIG1pbWVUeXBlLFxuICAgICAgZmlsZVNpemU6IHN0YXRzLnNpemUsXG4gICAgICBpc1RlbXBvcmFyeTogZmFsc2UsXG4gICAgICByZWZlcmVuY2VEYXRlOiBlZmZlY3RpdmVEYXRlLFxuICAgICAgY2hlY2tzdW0sXG4gICAgICB1cGxvYWRlZEJ5VXNlcklkOiB1c2VySWQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hdHRhY2htZW50UmVwb3NpdG9yeS5zYXZlKGF0dGFjaG1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOKchSBORVc6IERlbGV0ZSBGaWxlXG4gICAqIOC4peC4muC5hOC4n+C4peC5jOC4reC4reC4geC4iOC4suC4gSBEaXNrIOC5geC4peC4sCBEYXRhYmFzZVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGlkOiBudW1iZXIsIHVzZXJJZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gMS4g4LiE4LmJ4LiZ4Lir4Liy4LmE4Lif4Lil4LmMXG4gICAgY29uc3QgYXR0YWNobWVudCA9IGF3YWl0IHRoaXMuYXR0YWNobWVudFJlcG9zaXRvcnkuZmluZE9uZSh7XG4gICAgICB3aGVyZTogeyBpZCB9LFxuICAgIH0pO1xuXG4gICAgaWYgKCFhdHRhY2htZW50KSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oYEF0dGFjaG1lbnQgIyR7aWR9IG5vdCBmb3VuZGApO1xuICAgIH1cblxuICAgIC8vIDIuIOC4leC4o+C4p+C4iOC4quC4reC4muC4hOC4p+C4suC4oeC5gOC4m+C5h+C4meC5gOC4iOC5ieC4suC4guC4reC4hyAoU2VjdXJpdHkgQ2hlY2spXG4gICAgLy8g4Lit4LiZ4Li44LiN4Liy4LiV4LmD4Lir4LmJ4Lil4Lia4LiW4LmJ4Liy4LmA4Lib4LmH4LiZ4LiE4LiZ4Lit4Lix4Lib4LmC4Lir4Lil4LiU4LmA4Lit4LiHXG4gICAgLy8gKOC5g+C4meC4reC4meC4suC4hOC4leC4reC4suC4iOC5gOC4nuC4tOC5iOC4oeC5gOC4h+C4t+C5iOC4reC4meC5hOC4giBPUiBVc2VyIOC5gOC4m+C5h+C4mSBBZG1pbi9Eb2N1bWVudCBDb250cm9sKVxuICAgIGlmIChhdHRhY2htZW50LnVwbG9hZGVkQnlVc2VySWQgIT09IHVzZXJJZCkge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgYFVzZXIgJHt1c2VySWR9IHRyaWVkIHRvIGRlbGV0ZSBmaWxlICR7aWR9IG93bmVkIGJ5ICR7YXR0YWNobWVudC51cGxvYWRlZEJ5VXNlcklkfWBcbiAgICAgICk7XG4gICAgICB0aHJvdyBuZXcgRm9yYmlkZGVuRXhjZXB0aW9uKCdZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIGRlbGV0ZSB0aGlzIGZpbGUnKTtcbiAgICB9XG5cbiAgICAvLyAzLiDguKXguJrguYTguJ/guKXguYzguK3guK3guIHguIjguLLguIEgRGlza1xuICAgIHRyeSB7XG4gICAgICBpZiAoYXdhaXQgZnMucGF0aEV4aXN0cyhhdHRhY2htZW50LmZpbGVQYXRoKSkge1xuICAgICAgICBhd2FpdCBmcy5yZW1vdmUoYXR0YWNobWVudC5maWxlUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgIGBGaWxlIG5vdCBmb3VuZCBvbiBkaXNrIGR1cmluZyBkZWxldGlvbjogJHthdHRhY2htZW50LmZpbGVQYXRofWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gZGVsZXRlIGZpbGUgZnJvbSBkaXNrOiAke2F0dGFjaG1lbnQuZmlsZVBhdGh9YCxcbiAgICAgICAgZXJyb3JcbiAgICAgICk7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbignRmFpbGVkIHRvIGRlbGV0ZSBmaWxlIGZyb20gc3RvcmFnZScpO1xuICAgIH1cblxuICAgIC8vIDQuIOC4peC4miBSZWNvcmQg4Lit4Lit4LiB4LiI4Liy4LiBIERhdGFiYXNlXG4gICAgYXdhaXQgdGhpcy5hdHRhY2htZW50UmVwb3NpdG9yeS5yZW1vdmUoYXR0YWNobWVudCk7XG5cbiAgICB0aGlzLmxvZ2dlci5sb2coYEZpbGUgZGVsZXRlZDogJHtpZH0gYnkgdXNlciAke3VzZXJJZH1gKTtcbiAgfVxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d8/filestorageservice_d8c424ff74b3a97c0b9fa3330d0a60b9.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d8/filestorageservice_d8c424ff74b3a97c0b9fa3330d0a60b9.map new file mode 100644 index 0000000..b450924 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d8/filestorageservice_d8c424ff74b3a97c0b9fa3330d0a60b9.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\file-storage\\file-storage.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\file-storage\\file-storage.service.ts"],"sourcesContent":["// File: src/common/file-storage/file-storage.service.ts\nimport {\n Injectable,\n NotFoundException,\n BadRequestException,\n Logger,\n} from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { Repository, In } from 'typeorm';\nimport { ConfigService } from '@nestjs/config';\nimport * as fs from 'fs-extra';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Attachment } from './entities/attachment.entity';\nimport { ForbiddenException } from '@nestjs/common'; // ✅ Import เพิ่ม\n\n@Injectable()\nexport class FileStorageService {\n private readonly logger = new Logger(FileStorageService.name);\n private readonly tempDir: string;\n private readonly permanentDir: string;\n\n constructor(\n @InjectRepository(Attachment)\n private attachmentRepository: Repository,\n private configService: ConfigService\n ) {\n // ใช้ env vars จาก docker-compose สำหรับ Production\n // ถ้าไม่ได้กำหนดจะ fallback เป็น ./uploads/temp และ ./uploads/permanent\n this.tempDir =\n this.configService.get('UPLOAD_TEMP_DIR') ||\n path.join(process.cwd(), 'uploads', 'temp');\n this.permanentDir =\n this.configService.get('UPLOAD_PERMANENT_DIR') ||\n path.join(process.cwd(), 'uploads', 'permanent');\n\n // สร้างโฟลเดอร์ temp และ permanent รอไว้เลยถ้ายังไม่มี\n fs.ensureDirSync(this.tempDir);\n fs.ensureDirSync(this.permanentDir);\n }\n\n /**\n * Phase 1: Upload (บันทึกไฟล์ลง Temp)\n */\n async upload(file: Express.Multer.File, userId: number): Promise {\n const tempId = uuidv4();\n // Fix: แปลงชื่อไฟล์จาก Latin1 → UTF-8 (Multer/busboy decodes as Latin1 by default)\n const originalFilename = this.fixMulterFilename(file.originalname);\n const fileExt = path.extname(originalFilename);\n const storedFilename = `${uuidv4()}${fileExt}`;\n const tempPath = path.join(this.tempDir, storedFilename);\n\n // 1. คำนวณ Checksum (SHA-256) เพื่อความปลอดภัยและความถูกต้องของไฟล์\n const checksum = this.calculateChecksum(file.buffer);\n\n // 2. บันทึกไฟล์ลง Disk (Temp Folder)\n try {\n await fs.writeFile(tempPath, file.buffer);\n } catch (error) {\n this.logger.error(`Failed to write file: ${tempPath}`, error);\n throw new BadRequestException('File upload failed');\n }\n\n // 3. สร้าง Record ใน Database\n const attachment = this.attachmentRepository.create({\n originalFilename,\n storedFilename: storedFilename,\n filePath: tempPath, // เก็บ path ปัจจุบันไปก่อน\n mimeType: file.mimetype,\n fileSize: file.size,\n isTemporary: true,\n tempId: tempId,\n expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000), // หมดอายุใน 24 ชม.\n checksum: checksum,\n uploadedByUserId: userId,\n });\n\n return this.attachmentRepository.save(attachment);\n }\n\n /**\n * Phase 2: Commit (ย้ายไฟล์จาก Temp -> Permanent)\n * เมธอดนี้จะถูกเรียกโดย Service อื่น (เช่น CorrespondenceService) เมื่อกด Save\n */\n /**\n * Phase 2: Commit (ย้ายไฟล์จาก Temp -> Permanent)\n * เมธอดนี้จะถูกเรียกโดย Service อื่น (เช่น CorrespondenceService) เมื่อกด Save\n * Updated [Phase 2]: Support issueDate and documentType for organized storage\n */\n async commit(\n tempIds: string[],\n options?: { issueDate?: Date; documentType?: string }\n ): Promise {\n if (!tempIds || tempIds.length === 0) {\n return [];\n }\n\n const attachments = await this.attachmentRepository.find({\n where: { tempId: In(tempIds), isTemporary: true },\n });\n\n if (attachments.length !== tempIds.length) {\n // แจ้งเตือนแต่อาจจะไม่ throw ถ้าต้องการให้ process ต่อไปได้บางส่วน (ขึ้นอยู่กับ business logic)\n // แต่เพื่อความปลอดภัยควรแจ้งว่าไฟล์ไม่ครบ\n this.logger.warn(\n `Expected ${tempIds.length} files to commit, but found ${attachments.length}`\n );\n throw new NotFoundException('Some files not found or already committed');\n }\n\n const committedAttachments: Attachment[] = [];\n // Use issueDate if provided, otherwise default to current date\n const refDate = options?.issueDate\n ? new Date(options.issueDate)\n : new Date();\n\n // Validate Date (in case invalid string passed)\n const effectiveDate = isNaN(refDate.getTime()) ? new Date() : refDate;\n\n const year = effectiveDate.getFullYear().toString();\n const month = (effectiveDate.getMonth() + 1).toString().padStart(2, '0');\n\n // Construct Path: permanent/{DocumentType}/{YYYY}/{MM}/filename\n const docTypeFolder = options?.documentType || 'General';\n\n // โฟลเดอร์ถาวรแยกตาม Type/ปี/เดือน\n const permanentDir = path.join(\n this.permanentDir,\n docTypeFolder,\n year,\n month\n );\n await fs.ensureDir(permanentDir);\n\n for (const att of attachments) {\n const oldPath = att.filePath;\n const newPath = path.join(permanentDir, att.storedFilename);\n\n try {\n // ย้ายไฟล์\n if (await fs.pathExists(oldPath)) {\n await fs.move(oldPath, newPath, { overwrite: true });\n\n // อัปเดตข้อมูลใน DB\n att.filePath = newPath;\n att.isTemporary = false;\n att.tempId = undefined; // เคลียร์ tempId\n att.expiresAt = undefined; // เคลียร์วันหมดอายุ\n att.referenceDate = effectiveDate; // Save reference date\n\n committedAttachments.push(await this.attachmentRepository.save(att));\n } else {\n this.logger.error(`File missing during commit: ${oldPath}`);\n throw new NotFoundException(\n `File not found on disk: ${att.originalFilename}`\n );\n }\n } catch (error) {\n this.logger.error(\n `Failed to move file from ${oldPath} to ${newPath}`,\n error\n );\n throw new BadRequestException(\n `Failed to commit file: ${att.originalFilename}`\n );\n }\n }\n\n return committedAttachments;\n }\n\n /**\n * Download File\n * ดึงไฟล์มาเป็น Stream เพื่อส่งกลับไปให้ Controller\n */\n async download(\n id: number\n ): Promise<{ stream: fs.ReadStream; attachment: Attachment }> {\n // 1. ค้นหาข้อมูลไฟล์จาก DB\n const attachment = await this.attachmentRepository.findOne({\n where: { id },\n });\n\n if (!attachment) {\n throw new NotFoundException(`Attachment #${id} not found`);\n }\n\n // 2. ตรวจสอบว่าไฟล์มีอยู่จริงบน Disk หรือไม่\n const filePath = attachment.filePath;\n if (!fs.existsSync(filePath)) {\n this.logger.error(`File missing on disk: ${filePath}`);\n throw new NotFoundException('File not found on server storage');\n }\n\n // 3. สร้าง Read Stream (มีประสิทธิภาพกว่าการโหลดทั้งไฟล์เข้า Memory)\n const stream = fs.createReadStream(filePath);\n\n return { stream, attachment };\n }\n\n /**\n * แก้ปัญหา Multer/busboy ถอดรหัสชื่อไฟล์เป็น Latin1 แทน UTF-8\n * ทำให้ภาษาไทยกลายเป็น mojibake (เช่น ผรม → 脿赂聹脿赂拢脿赂隆)\n * วิธีแก้: แปลง latin1 bytes กลับเป็น UTF-8\n */\n private fixMulterFilename(originalname: string): string {\n try {\n const decoded = Buffer.from(originalname, 'latin1').toString('utf8');\n // ตรวจสอบว่า decoded string มี valid UTF-8 characters\n // ถ้า originalname เป็น ASCII อยู่แล้ว ผลลัพธ์จะเหมือนเดิม\n return decoded;\n } catch {\n return originalname;\n }\n }\n\n private calculateChecksum(buffer: Buffer): string {\n return crypto.createHash('sha256').update(buffer).digest('hex');\n }\n\n /**\n * ✅ NEW: Import Staging File (For Legacy Migration)\n * ย้ายไฟล์จาก staging_ai ไปยัง permanent storage โดยตรง\n */\n async importStagingFile(\n sourceFilePath: string,\n userId: number,\n options?: { issueDate?: Date; documentType?: string }\n ): Promise {\n if (!(await fs.pathExists(sourceFilePath))) {\n this.logger.error(`Staging file not found: ${sourceFilePath}`);\n throw new NotFoundException(`Source file not found: ${sourceFilePath}`);\n }\n\n // 1. Get file stats & checksum\n const stats = await fs.stat(sourceFilePath);\n const fileExt = path.extname(sourceFilePath);\n const originalFilename = path.basename(sourceFilePath);\n const storedFilename = `${uuidv4()}${fileExt}`;\n\n // Determine mime type basic\n let mimeType = 'application/octet-stream';\n if (fileExt.toLowerCase() === '.pdf') mimeType = 'application/pdf';\n else if (fileExt.toLowerCase() === '.xlsx')\n mimeType =\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n\n const fileBuffer = await fs.readFile(sourceFilePath);\n const checksum = this.calculateChecksum(fileBuffer);\n\n // 2. Generate Permanent Path\n const refDate = options?.issueDate || new Date();\n const effectiveDate = isNaN(refDate.getTime()) ? new Date() : refDate;\n const year = effectiveDate.getFullYear().toString();\n const month = (effectiveDate.getMonth() + 1).toString().padStart(2, '0');\n const docTypeFolder = options?.documentType || 'General';\n\n const permanentDir = path.join(\n this.permanentDir,\n docTypeFolder,\n year,\n month\n );\n await fs.ensureDir(permanentDir);\n\n const newPath = path.join(permanentDir, storedFilename);\n\n // 3. Move File\n try {\n await fs.move(sourceFilePath, newPath, { overwrite: true });\n } catch (error) {\n this.logger.error(`Failed to move staging file to ${newPath}`, error);\n throw new BadRequestException('Failed to process staging file');\n }\n\n // 4. Create Database Record\n const attachment = this.attachmentRepository.create({\n originalFilename,\n storedFilename,\n filePath: newPath,\n mimeType,\n fileSize: stats.size,\n isTemporary: false,\n referenceDate: effectiveDate,\n checksum,\n uploadedByUserId: userId,\n });\n\n return this.attachmentRepository.save(attachment);\n }\n\n /**\n * ✅ NEW: Delete File\n * ลบไฟล์ออกจาก Disk และ Database\n */\n async delete(id: number, userId: number): Promise {\n // 1. ค้นหาไฟล์\n const attachment = await this.attachmentRepository.findOne({\n where: { id },\n });\n\n if (!attachment) {\n throw new NotFoundException(`Attachment #${id} not found`);\n }\n\n // 2. ตรวจสอบความเป็นเจ้าของ (Security Check)\n // อนุญาตให้ลบถ้าเป็นคนอัปโหลดเอง\n // (ในอนาคตอาจเพิ่มเงื่อนไข OR User เป็น Admin/Document Control)\n if (attachment.uploadedByUserId !== userId) {\n this.logger.warn(\n `User ${userId} tried to delete file ${id} owned by ${attachment.uploadedByUserId}`\n );\n throw new ForbiddenException('You are not allowed to delete this file');\n }\n\n // 3. ลบไฟล์ออกจาก Disk\n try {\n if (await fs.pathExists(attachment.filePath)) {\n await fs.remove(attachment.filePath);\n } else {\n this.logger.warn(\n `File not found on disk during deletion: ${attachment.filePath}`\n );\n }\n } catch (error) {\n this.logger.error(\n `Failed to delete file from disk: ${attachment.filePath}`,\n error\n );\n throw new BadRequestException('Failed to delete file from storage');\n }\n\n // 4. ลบ Record ออกจาก Database\n await this.attachmentRepository.remove(attachment);\n\n this.logger.log(`File deleted: ${id} by user ${userId}`);\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d8/workfloweventservice_d8263716c15fd09882d37d13da00fa51 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d8/workfloweventservice_d8263716c15fd09882d37d13da00fa51 new file mode 100644 index 0000000..329aa32 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d8/workfloweventservice_d8263716c15fd09882d37d13da00fa51 @@ -0,0 +1,75 @@ +d326bd5446a9bf0cce98c417980e8473 +"use strict"; +// File: src/modules/workflow-engine/workflow-event.service.ts +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var WorkflowEventService_1; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WorkflowEventService = void 0; +const common_1 = require("@nestjs/common"); +let WorkflowEventService = WorkflowEventService_1 = class WorkflowEventService { + constructor() { + this.logger = new common_1.Logger(WorkflowEventService_1.name); + } + // สามารถ Inject NotificationService หรือ HttpService เข้ามาได้ตรงนี้ + // constructor(private readonly notificationService: NotificationService) {} + /** + * ประมวลผลรายการ Events ที่เกิดจากการเปลี่ยนสถานะ + */ + dispatchEvents(instanceId, events, context) { + if (!events || events.length === 0) + return; + this.logger.log(`Dispatching ${events.length} events for Instance ${instanceId}`); + // ทำแบบ Async ไม่รอผล (Fire-and-forget) เพื่อไม่ให้กระทบ Response Time ของ User + void Promise.allSettled(events.map((event) => this.processSingleEvent(instanceId, event, context))).then((results) => { + // Log errors if any + results.forEach((res, idx) => { + if (res.status === 'rejected') { + this.logger.error(`Failed to process event [${idx}]: ${String(res.reason)}`); + } + }); + }); + } + async processSingleEvent(instanceId, event, context) { + await Promise.resolve(); + try { + switch (event.type) { + case 'notify': + this.handleNotify(event, context); + break; + case 'webhook': + this.handleWebhook(event, context); + break; + case 'auto_action': + // Logic สำหรับ Auto Transition (เช่น ถ้าผ่านเงื่อนไข ให้ไปต่อเลย) + this.logger.log(`Auto Action triggered for ${instanceId}`); + break; + default: + this.logger.warn(`Unknown event type: ${event.type}`); + } + } + catch (error) { + this.logger.error(`Error processing event ${event.type}: ${String(error)}`); + throw error; + } + } + // --- Handlers --- + handleNotify(event, _context) { + // Mockup: ในของจริงจะเรียก NotificationService.send() + // const recipients = this.resolveRecipients(event.target, context); + this.logger.log(`[EVENT] Notify target: "${event.target}" | Template: "${event.template}"`); + } + handleWebhook(event, _context) { + // Mockup: เรียก HttpService.post() + this.logger.log(`[EVENT] Webhook to: "${event.target}" | Payload: ${JSON.stringify(event.payload)}`); + } +}; +exports.WorkflowEventService = WorkflowEventService; +exports.WorkflowEventService = WorkflowEventService = WorkflowEventService_1 = __decorate([ + (0, common_1.Injectable)() +], WorkflowEventService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcd29ya2Zsb3ctZW5naW5lXFx3b3JrZmxvdy1ldmVudC5zZXJ2aWNlLnRzIiwibWFwcGluZ3MiOiI7QUFBQSw4REFBOEQ7Ozs7Ozs7Ozs7QUFFOUQsMkNBQW9EO0FBZ0I3QyxJQUFNLG9CQUFvQiw0QkFBMUIsTUFBTSxvQkFBb0I7SUFBMUI7UUFDWSxXQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsc0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7SUErRWxFLENBQUM7SUE3RUMscUVBQXFFO0lBQ3JFLDRFQUE0RTtJQUU1RTs7T0FFRztJQUNILGNBQWMsQ0FDWixVQUFrQixFQUNsQixNQUFrQixFQUNsQixPQUFnQztRQUVoQyxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU87UUFFM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQ2IsZUFBZSxNQUFNLENBQUMsTUFBTSx3QkFBd0IsVUFBVSxFQUFFLENBQ2pFLENBQUM7UUFFRixnRkFBZ0Y7UUFDaEYsS0FBSyxPQUFPLENBQUMsVUFBVSxDQUNyQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUMzRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2pCLG9CQUFvQjtZQUNwQixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUMzQixJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7b0JBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLDRCQUE0QixHQUFHLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUMxRCxDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxrQkFBa0IsQ0FDOUIsVUFBa0IsRUFDbEIsS0FBZSxFQUNmLE9BQWdDO1FBRWhDLE1BQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQztZQUNILFFBQVEsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNuQixLQUFLLFFBQVE7b0JBQ1gsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQ2xDLE1BQU07Z0JBQ1IsS0FBSyxTQUFTO29CQUNaLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUNuQyxNQUFNO2dCQUNSLEtBQUssYUFBYTtvQkFDaEIsa0VBQWtFO29CQUNsRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsVUFBVSxFQUFFLENBQUMsQ0FBQztvQkFDM0QsTUFBTTtnQkFDUjtvQkFDRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDMUQsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2YsMEJBQTBCLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQ3pELENBQUM7WUFDRixNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQsbUJBQW1CO0lBRVgsWUFBWSxDQUFDLEtBQWUsRUFBRSxRQUFpQztRQUNyRSxzREFBc0Q7UUFDdEQsb0VBQW9FO1FBQ3BFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNiLDJCQUEyQixLQUFLLENBQUMsTUFBTSxrQkFBa0IsS0FBSyxDQUFDLFFBQVEsR0FBRyxDQUMzRSxDQUFDO0lBQ0osQ0FBQztJQUVPLGFBQWEsQ0FBQyxLQUFlLEVBQUUsUUFBaUM7UUFDdEUsbUNBQW1DO1FBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNiLHdCQUF3QixLQUFLLENBQUMsTUFBTSxnQkFBZ0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FDcEYsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFBO0FBaEZZLG9EQUFvQjsrQkFBcEIsb0JBQW9CO0lBRGhDLElBQUEsbUJBQVUsR0FBRTtHQUNBLG9CQUFvQixDQWdGaEMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcd29ya2Zsb3ctZW5naW5lXFx3b3JrZmxvdy1ldmVudC5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9tb2R1bGVzL3dvcmtmbG93LWVuZ2luZS93b3JrZmxvdy1ldmVudC5zZXJ2aWNlLnRzXG5cbmltcG9ydCB7IEluamVjdGFibGUsIExvZ2dlciB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcbmltcG9ydCB7IFJhd0V2ZW50IH0gZnJvbSAnLi93b3JrZmxvdy1kc2wuc2VydmljZSc7XG5cbi8vIEludGVyZmFjZSDguKrguLPguKvguKPguLHguJogRXh0ZXJuYWwgU2VydmljZXMg4LiX4Li14LmI4LiI4Liw4Lih4Liy4Lij4Lix4LiaIEV2ZW50IOC4leC5iOC4rVxuLy8gKOC5g+C4meC4reC4meC4suC4hOC4leC4hOC4p+C4o+C5g+C4iuC5iSBOZXN0SlMgRXZlbnQgRW1pdHRlciDguYDguJ7guLfguYjguK0gRGVjb3VwbGUg4Lit4Lii4LmI4Liy4LiH4Liq4Lih4Lia4Li54Lij4LiT4LmMKVxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0V2ZW50SGFuZGxlciB7XG4gIGhhbmRsZU5vdGlmaWNhdGlvbihcbiAgICB0YXJnZXQ6IHN0cmluZyxcbiAgICB0ZW1wbGF0ZTogc3RyaW5nLFxuICAgIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dm9pZD47XG4gIGhhbmRsZVdlYmhvb2sodXJsOiBzdHJpbmcsIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlQXV0b0FjdGlvbihpbnN0YW5jZUlkOiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFdvcmtmbG93RXZlbnRTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKFdvcmtmbG93RXZlbnRTZXJ2aWNlLm5hbWUpO1xuXG4gIC8vIOC4quC4suC4oeC4suC4o+C4liBJbmplY3QgTm90aWZpY2F0aW9uU2VydmljZSDguKvguKPguLfguK0gSHR0cFNlcnZpY2Ug4LmA4LiC4LmJ4Liy4Lih4Liy4LmE4LiU4LmJ4LiV4Lij4LiH4LiZ4Li14LmJXG4gIC8vIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZSkge31cblxuICAvKipcbiAgICog4Lib4Lij4Liw4Lih4Lin4Lil4Lic4Lil4Lij4Liy4Lii4LiB4Liy4LijIEV2ZW50cyDguJfguLXguYjguYDguIHguLTguJTguIjguLLguIHguIHguLLguKPguYDguJvguKXguLXguYjguKLguJnguKrguJbguLLguJnguLBcbiAgICovXG4gIGRpc3BhdGNoRXZlbnRzKFxuICAgIGluc3RhbmNlSWQ6IHN0cmluZyxcbiAgICBldmVudHM6IFJhd0V2ZW50W10sXG4gICAgY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKSB7XG4gICAgaWYgKCFldmVudHMgfHwgZXZlbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgdGhpcy5sb2dnZXIubG9nKFxuICAgICAgYERpc3BhdGNoaW5nICR7ZXZlbnRzLmxlbmd0aH0gZXZlbnRzIGZvciBJbnN0YW5jZSAke2luc3RhbmNlSWR9YFxuICAgICk7XG5cbiAgICAvLyDguJfguLPguYHguJrguJogQXN5bmMg4LmE4Lih4LmI4Lij4Lit4Lic4LilIChGaXJlLWFuZC1mb3JnZXQpIOC5gOC4nuC4t+C5iOC4reC5hOC4oeC5iOC5g+C4q+C5ieC4geC4o+C4sOC4l+C4miBSZXNwb25zZSBUaW1lIOC4guC4reC4hyBVc2VyXG4gICAgdm9pZCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBldmVudHMubWFwKChldmVudCkgPT4gdGhpcy5wcm9jZXNzU2luZ2xlRXZlbnQoaW5zdGFuY2VJZCwgZXZlbnQsIGNvbnRleHQpKVxuICAgICkudGhlbigocmVzdWx0cykgPT4ge1xuICAgICAgLy8gTG9nIGVycm9ycyBpZiBhbnlcbiAgICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzLCBpZHgpID0+IHtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gcHJvY2VzcyBldmVudCBbJHtpZHh9XTogJHtTdHJpbmcocmVzLnJlYXNvbil9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzU2luZ2xlRXZlbnQoXG4gICAgaW5zdGFuY2VJZDogc3RyaW5nLFxuICAgIGV2ZW50OiBSYXdFdmVudCxcbiAgICBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApIHtcbiAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB0cnkge1xuICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ25vdGlmeSc6XG4gICAgICAgICAgdGhpcy5oYW5kbGVOb3RpZnkoZXZlbnQsIGNvbnRleHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd3ZWJob29rJzpcbiAgICAgICAgICB0aGlzLmhhbmRsZVdlYmhvb2soZXZlbnQsIGNvbnRleHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdhdXRvX2FjdGlvbic6XG4gICAgICAgICAgLy8gTG9naWMg4Liq4Liz4Lir4Lij4Lix4LiaIEF1dG8gVHJhbnNpdGlvbiAo4LmA4LiK4LmI4LiZIOC4luC5ieC4suC4nOC5iOC4suC4meC5gOC4h+C4t+C5iOC4reC4meC5hOC4giDguYPguKvguYnguYTguJvguJXguYjguK3guYDguKXguKIpXG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKGBBdXRvIEFjdGlvbiB0cmlnZ2VyZWQgZm9yICR7aW5zdGFuY2VJZH1gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBVbmtub3duIGV2ZW50IHR5cGU6ICR7ZXZlbnQudHlwZX1gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgIGBFcnJvciBwcm9jZXNzaW5nIGV2ZW50ICR7ZXZlbnQudHlwZX06ICR7U3RyaW5nKGVycm9yKX1gXG4gICAgICApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tIEhhbmRsZXJzIC0tLVxuXG4gIHByaXZhdGUgaGFuZGxlTm90aWZ5KGV2ZW50OiBSYXdFdmVudCwgX2NvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgLy8gTW9ja3VwOiDguYPguJnguILguK3guIfguIjguKPguLTguIfguIjguLDguYDguKPguLXguKLguIEgTm90aWZpY2F0aW9uU2VydmljZS5zZW5kKClcbiAgICAvLyBjb25zdCByZWNpcGllbnRzID0gdGhpcy5yZXNvbHZlUmVjaXBpZW50cyhldmVudC50YXJnZXQsIGNvbnRleHQpO1xuICAgIHRoaXMubG9nZ2VyLmxvZyhcbiAgICAgIGBbRVZFTlRdIE5vdGlmeSB0YXJnZXQ6IFwiJHtldmVudC50YXJnZXR9XCIgfCBUZW1wbGF0ZTogXCIke2V2ZW50LnRlbXBsYXRlfVwiYFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVdlYmhvb2soZXZlbnQ6IFJhd0V2ZW50LCBfY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICAvLyBNb2NrdXA6IOC5gOC4o+C4teC4ouC4gSBIdHRwU2VydmljZS5wb3N0KClcbiAgICB0aGlzLmxvZ2dlci5sb2coXG4gICAgICBgW0VWRU5UXSBXZWJob29rIHRvOiBcIiR7ZXZlbnQudGFyZ2V0fVwiIHwgUGF5bG9hZDogJHtKU09OLnN0cmluZ2lmeShldmVudC5wYXlsb2FkKX1gXG4gICAgKTtcbiAgfVxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d8/workfloweventservice_d8263716c15fd09882d37d13da00fa51.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d8/workfloweventservice_d8263716c15fd09882d37d13da00fa51.map new file mode 100644 index 0000000..46b0ff0 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d8/workfloweventservice_d8263716c15fd09882d37d13da00fa51.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\workflow-event.service.ts","mappings":";AAAA,8DAA8D;;;;;;;;;;AAE9D,2CAAoD;AAgB7C,IAAM,oBAAoB,4BAA1B,MAAM,oBAAoB;IAA1B;QACY,WAAM,GAAG,IAAI,eAAM,CAAC,sBAAoB,CAAC,IAAI,CAAC,CAAC;IA+ElE,CAAC;IA7EC,qEAAqE;IACrE,4EAA4E;IAE5E;;OAEG;IACH,cAAc,CACZ,UAAkB,EAClB,MAAkB,EAClB,OAAgC;QAEhC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE3C,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,eAAe,MAAM,CAAC,MAAM,wBAAwB,UAAU,EAAE,CACjE,CAAC;QAEF,gFAAgF;QAChF,KAAK,OAAO,CAAC,UAAU,CACrB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAC3E,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YACjB,oBAAoB;YACpB,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBAC3B,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;oBAC9B,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,4BAA4B,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAC1D,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAC9B,UAAkB,EAClB,KAAe,EACf,OAAgC;QAEhC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;gBACnB,KAAK,QAAQ;oBACX,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;oBAClC,MAAM;gBACR,KAAK,SAAS;oBACZ,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;oBACnC,MAAM;gBACR,KAAK,aAAa;oBAChB,kEAAkE;oBAClE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,6BAA6B,UAAU,EAAE,CAAC,CAAC;oBAC3D,MAAM;gBACR;oBACE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,0BAA0B,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,CACzD,CAAC;YACF,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,mBAAmB;IAEX,YAAY,CAAC,KAAe,EAAE,QAAiC;QACrE,sDAAsD;QACtD,oEAAoE;QACpE,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,2BAA2B,KAAK,CAAC,MAAM,kBAAkB,KAAK,CAAC,QAAQ,GAAG,CAC3E,CAAC;IACJ,CAAC;IAEO,aAAa,CAAC,KAAe,EAAE,QAAiC;QACtE,mCAAmC;QACnC,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,wBAAwB,KAAK,CAAC,MAAM,gBAAgB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CACpF,CAAC;IACJ,CAAC;CACF,CAAA;AAhFY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;GACA,oBAAoB,CAgFhC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\workflow-event.service.ts"],"sourcesContent":["// File: src/modules/workflow-engine/workflow-event.service.ts\n\nimport { Injectable, Logger } from '@nestjs/common';\nimport { RawEvent } from './workflow-dsl.service';\n\n// Interface สำหรับ External Services ที่จะมารับ Event ต่อ\n// (ในอนาคตควรใช้ NestJS Event Emitter เพื่อ Decouple อย่างสมบูรณ์)\nexport interface WorkflowEventHandler {\n handleNotification(\n target: string,\n template: string,\n payload: Record\n ): Promise;\n handleWebhook(url: string, payload: Record): Promise;\n handleAutoAction(instanceId: string, action: string): Promise;\n}\n\n@Injectable()\nexport class WorkflowEventService {\n private readonly logger = new Logger(WorkflowEventService.name);\n\n // สามารถ Inject NotificationService หรือ HttpService เข้ามาได้ตรงนี้\n // constructor(private readonly notificationService: NotificationService) {}\n\n /**\n * ประมวลผลรายการ Events ที่เกิดจากการเปลี่ยนสถานะ\n */\n dispatchEvents(\n instanceId: string,\n events: RawEvent[],\n context: Record\n ) {\n if (!events || events.length === 0) return;\n\n this.logger.log(\n `Dispatching ${events.length} events for Instance ${instanceId}`\n );\n\n // ทำแบบ Async ไม่รอผล (Fire-and-forget) เพื่อไม่ให้กระทบ Response Time ของ User\n void Promise.allSettled(\n events.map((event) => this.processSingleEvent(instanceId, event, context))\n ).then((results) => {\n // Log errors if any\n results.forEach((res, idx) => {\n if (res.status === 'rejected') {\n this.logger.error(\n `Failed to process event [${idx}]: ${String(res.reason)}`\n );\n }\n });\n });\n }\n\n private async processSingleEvent(\n instanceId: string,\n event: RawEvent,\n context: Record\n ) {\n await Promise.resolve();\n try {\n switch (event.type) {\n case 'notify':\n this.handleNotify(event, context);\n break;\n case 'webhook':\n this.handleWebhook(event, context);\n break;\n case 'auto_action':\n // Logic สำหรับ Auto Transition (เช่น ถ้าผ่านเงื่อนไข ให้ไปต่อเลย)\n this.logger.log(`Auto Action triggered for ${instanceId}`);\n break;\n default:\n this.logger.warn(`Unknown event type: ${event.type}`);\n }\n } catch (error) {\n this.logger.error(\n `Error processing event ${event.type}: ${String(error)}`\n );\n throw error;\n }\n }\n\n // --- Handlers ---\n\n private handleNotify(event: RawEvent, _context: Record) {\n // Mockup: ในของจริงจะเรียก NotificationService.send()\n // const recipients = this.resolveRecipients(event.target, context);\n this.logger.log(\n `[EVENT] Notify target: \"${event.target}\" | Template: \"${event.template}\"`\n );\n }\n\n private handleWebhook(event: RawEvent, _context: Record) {\n // Mockup: เรียก HttpService.post()\n this.logger.log(\n `[EVENT] Webhook to: \"${event.target}\" | Payload: ${JSON.stringify(event.payload)}`\n );\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d9/cryptoservice_d94fb8fca20f7a7b18f203fd1141e965 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d9/cryptoservice_d94fb8fca20f7a7b18f203fd1141e965 new file mode 100644 index 0000000..a78918a --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d9/cryptoservice_d94fb8fca20f7a7b18f203fd1141e965 @@ -0,0 +1,106 @@ +c13c6c2ed242ca7a5c0bd753e2bbfcaa +"use strict"; +// File: src/common/services/crypto.service.ts +// บันทึกการแก้ไข: Encryption/Decryption Utility (T1.1) +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var CryptoService_1; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CryptoService = void 0; +const common_1 = require("@nestjs/common"); +const config_1 = require("@nestjs/config"); +const crypto = __importStar(require("crypto")); +let CryptoService = CryptoService_1 = class CryptoService { + constructor(configService) { + this.configService = configService; + this.logger = new common_1.Logger(CryptoService_1.name); + this.algorithm = 'aes-256-cbc'; + this.ivLength = 16; + // Key ต้องมีขนาด 32 bytes (256 bits) + const secret = this.configService.get('APP_SECRET_KEY') || + 'default-secret-key-32-chars-long!'; + this.key = crypto.scryptSync(secret, 'salt', 32); + } + encrypt(text) { + if (text === null || text === undefined) + return text; + try { + const stringValue = String(text); + const iv = crypto.randomBytes(this.ivLength); + const cipher = crypto.createCipheriv(this.algorithm, this.key, iv); + let encrypted = cipher.update(stringValue, 'utf8', 'hex'); + encrypted += cipher.final('hex'); + return `${iv.toString('hex')}:${encrypted}`; + } + catch (error) { + this.logger.error(`Encryption failed: ${error instanceof Error ? error.message : String(error)}`); + throw error; + } + } + decrypt(text) { + if (!text || typeof text !== 'string' || !text.includes(':')) + return text; + try { + const [ivHex, encryptedHex] = text.split(':'); + if (!ivHex || !encryptedHex) + return text; + const iv = Buffer.from(ivHex, 'hex'); + const decipher = crypto.createDecipheriv(this.algorithm, this.key, iv); + let decrypted = decipher.update(encryptedHex, 'hex', 'utf8'); + decrypted += decipher.final('utf8'); + return decrypted; + } + catch (error) { + this.logger.warn(`Decryption failed for value. Returning original text. Error: ${error instanceof Error ? error.message : String(error)}`); + // กรณี Decrypt ไม่ได้ ให้คืนค่าเดิมเพื่อป้องกัน App Crash + return text; + } + } +}; +exports.CryptoService = CryptoService; +exports.CryptoService = CryptoService = CryptoService_1 = __decorate([ + (0, common_1.Injectable)(), + __metadata("design:paramtypes", [typeof (_a = typeof config_1.ConfigService !== "undefined" && config_1.ConfigService) === "function" ? _a : Object]) +], CryptoService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxzZXJ2aWNlc1xcY3J5cHRvLnNlcnZpY2UudHMiLCJtYXBwaW5ncyI6IjtBQUFBLDhDQUE4QztBQUM5Qyx1REFBdUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRXZELDJDQUFvRDtBQUNwRCwyQ0FBK0M7QUFDL0MsK0NBQWlDO0FBRzFCLElBQU0sYUFBYSxxQkFBbkIsTUFBTSxhQUFhO0lBTXhCLFlBQW9CLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBTC9CLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxlQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsY0FBUyxHQUFHLGFBQWEsQ0FBQztRQUUxQixhQUFRLEdBQUcsRUFBRSxDQUFDO1FBRzdCLHFDQUFxQztRQUNyQyxNQUFNLE1BQU0sR0FDVixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBUyxnQkFBZ0IsQ0FBQztZQUNoRCxtQ0FBbUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsT0FBTyxDQUNMLElBQWtEO1FBRWxELElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXJELElBQUksQ0FBQztZQUNILE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNuRSxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDMUQsU0FBUyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksU0FBUyxFQUFFLENBQUM7UUFDOUMsQ0FBQztRQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2Ysc0JBQXNCLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUMvRSxDQUFDO1lBQ0YsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFZO1FBQ2xCLElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUUxRSxJQUFJLENBQUM7WUFDSCxNQUFNLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFlBQVk7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFFekMsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDckMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN2RSxJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDN0QsU0FBUyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEMsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2QsZ0VBQWdFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUN6SCxDQUFDO1lBQ0YsMERBQTBEO1lBQzFELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7Q0FDRixDQUFBO0FBdERZLHNDQUFhO3dCQUFiLGFBQWE7SUFEekIsSUFBQSxtQkFBVSxHQUFFO3lEQU93QixzQkFBYSxvQkFBYixzQkFBYTtHQU5yQyxhQUFhLENBc0R6QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxjb21tb25cXHNlcnZpY2VzXFxjcnlwdG8uc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGaWxlOiBzcmMvY29tbW9uL3NlcnZpY2VzL2NyeXB0by5zZXJ2aWNlLnRzXG4vLyDguJrguLHguJnguJfguLbguIHguIHguLLguKPguYHguIHguYnguYTguII6IEVuY3J5cHRpb24vRGVjcnlwdGlvbiBVdGlsaXR5IChUMS4xKVxuXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBMb2dnZXIgfSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnQG5lc3Rqcy9jb25maWcnO1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDcnlwdG9TZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKENyeXB0b1NlcnZpY2UubmFtZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWxnb3JpdGhtID0gJ2Flcy0yNTYtY2JjJztcbiAgcHJpdmF0ZSByZWFkb25seSBrZXk6IEJ1ZmZlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBpdkxlbmd0aCA9IDE2O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSkge1xuICAgIC8vIEtleSDguJXguYnguK3guIfguKHguLXguILguJnguLLguJQgMzIgYnl0ZXMgKDI1NiBiaXRzKVxuICAgIGNvbnN0IHNlY3JldCA9XG4gICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0PHN0cmluZz4oJ0FQUF9TRUNSRVRfS0VZJykgfHxcbiAgICAgICdkZWZhdWx0LXNlY3JldC1rZXktMzItY2hhcnMtbG9uZyEnO1xuICAgIHRoaXMua2V5ID0gY3J5cHRvLnNjcnlwdFN5bmMoc2VjcmV0LCAnc2FsdCcsIDMyKTtcbiAgfVxuXG4gIGVuY3J5cHQoXG4gICAgdGV4dDogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWRcbiAgKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRleHQgPT09IG51bGwgfHwgdGV4dCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGV4dDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IFN0cmluZyh0ZXh0KTtcbiAgICAgIGNvbnN0IGl2ID0gY3J5cHRvLnJhbmRvbUJ5dGVzKHRoaXMuaXZMZW5ndGgpO1xuICAgICAgY29uc3QgY2lwaGVyID0gY3J5cHRvLmNyZWF0ZUNpcGhlcml2KHRoaXMuYWxnb3JpdGhtLCB0aGlzLmtleSwgaXYpO1xuICAgICAgbGV0IGVuY3J5cHRlZCA9IGNpcGhlci51cGRhdGUoc3RyaW5nVmFsdWUsICd1dGY4JywgJ2hleCcpO1xuICAgICAgZW5jcnlwdGVkICs9IGNpcGhlci5maW5hbCgnaGV4Jyk7XG4gICAgICByZXR1cm4gYCR7aXYudG9TdHJpbmcoJ2hleCcpfToke2VuY3J5cHRlZH1gO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYEVuY3J5cHRpb24gZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgZGVjcnlwdCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGV4dCB8fCB0eXBlb2YgdGV4dCAhPT0gJ3N0cmluZycgfHwgIXRleHQuaW5jbHVkZXMoJzonKSkgcmV0dXJuIHRleHQ7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgW2l2SGV4LCBlbmNyeXB0ZWRIZXhdID0gdGV4dC5zcGxpdCgnOicpO1xuICAgICAgaWYgKCFpdkhleCB8fCAhZW5jcnlwdGVkSGV4KSByZXR1cm4gdGV4dDtcblxuICAgICAgY29uc3QgaXYgPSBCdWZmZXIuZnJvbShpdkhleCwgJ2hleCcpO1xuICAgICAgY29uc3QgZGVjaXBoZXIgPSBjcnlwdG8uY3JlYXRlRGVjaXBoZXJpdih0aGlzLmFsZ29yaXRobSwgdGhpcy5rZXksIGl2KTtcbiAgICAgIGxldCBkZWNyeXB0ZWQgPSBkZWNpcGhlci51cGRhdGUoZW5jcnlwdGVkSGV4LCAnaGV4JywgJ3V0ZjgnKTtcbiAgICAgIGRlY3J5cHRlZCArPSBkZWNpcGhlci5maW5hbCgndXRmOCcpO1xuICAgICAgcmV0dXJuIGRlY3J5cHRlZDtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgYERlY3J5cHRpb24gZmFpbGVkIGZvciB2YWx1ZS4gUmV0dXJuaW5nIG9yaWdpbmFsIHRleHQuIEVycm9yOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICApO1xuICAgICAgLy8g4LiB4Lij4LiT4Li1IERlY3J5cHQg4LmE4Lih4LmI4LmE4LiU4LmJIOC5g+C4q+C5ieC4hOC4t+C4meC4hOC5iOC4suC5gOC4lOC4tOC4oeC5gOC4nuC4t+C5iOC4reC4m+C5ieC4reC4h+C4geC4seC4mSBBcHAgQ3Jhc2hcbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgfVxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d9/cryptoservice_d94fb8fca20f7a7b18f203fd1141e965.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d9/cryptoservice_d94fb8fca20f7a7b18f203fd1141e965.map new file mode 100644 index 0000000..9b2fddf --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d9/cryptoservice_d94fb8fca20f7a7b18f203fd1141e965.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\services\\crypto.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\services\\crypto.service.ts"],"sourcesContent":["// File: src/common/services/crypto.service.ts\n// บันทึกการแก้ไข: Encryption/Decryption Utility (T1.1)\n\nimport { Injectable, Logger } from '@nestjs/common';\nimport { ConfigService } from '@nestjs/config';\nimport * as crypto from 'crypto';\n\n@Injectable()\nexport class CryptoService {\n private readonly logger = new Logger(CryptoService.name);\n private readonly algorithm = 'aes-256-cbc';\n private readonly key: Buffer;\n private readonly ivLength = 16;\n\n constructor(private configService: ConfigService) {\n // Key ต้องมีขนาด 32 bytes (256 bits)\n const secret =\n this.configService.get('APP_SECRET_KEY') ||\n 'default-secret-key-32-chars-long!';\n this.key = crypto.scryptSync(secret, 'salt', 32);\n }\n\n encrypt(\n text: string | number | boolean | null | undefined\n ): string | null | undefined {\n if (text === null || text === undefined) return text;\n\n try {\n const stringValue = String(text);\n const iv = crypto.randomBytes(this.ivLength);\n const cipher = crypto.createCipheriv(this.algorithm, this.key, iv);\n let encrypted = cipher.update(stringValue, 'utf8', 'hex');\n encrypted += cipher.final('hex');\n return `${iv.toString('hex')}:${encrypted}`;\n } catch (error: unknown) {\n this.logger.error(\n `Encryption failed: ${error instanceof Error ? error.message : String(error)}`\n );\n throw error;\n }\n }\n\n decrypt(text: string): string {\n if (!text || typeof text !== 'string' || !text.includes(':')) return text;\n\n try {\n const [ivHex, encryptedHex] = text.split(':');\n if (!ivHex || !encryptedHex) return text;\n\n const iv = Buffer.from(ivHex, 'hex');\n const decipher = crypto.createDecipheriv(this.algorithm, this.key, iv);\n let decrypted = decipher.update(encryptedHex, 'hex', 'utf8');\n decrypted += decipher.final('utf8');\n return decrypted;\n } catch (error: unknown) {\n this.logger.warn(\n `Decryption failed for value. Returning original text. Error: ${error instanceof Error ? error.message : String(error)}`\n );\n // กรณี Decrypt ไม่ได้ ให้คืนค่าเดิมเพื่อป้องกัน App Crash\n return text;\n }\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d9/updateprojectdto_d94c4ce750d5054f7326d5626a57ca13 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d9/updateprojectdto_d94c4ce750d5054f7326d5626a57ca13 new file mode 100644 index 0000000..529143f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d9/updateprojectdto_d94c4ce750d5054f7326d5626a57ca13 @@ -0,0 +1,10 @@ +e59c5793a6d2b08973b11b90a3286220 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UpdateProjectDto = void 0; +const swagger_1 = require("@nestjs/swagger"); +const create_project_dto_1 = require("./create-project.dto"); +class UpdateProjectDto extends (0, swagger_1.PartialType)(create_project_dto_1.CreateProjectDto) { +} +exports.UpdateProjectDto = UpdateProjectDto; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccHJvamVjdFxcZHRvXFx1cGRhdGUtcHJvamVjdC5kdG8udHMiLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQThDO0FBQzlDLDZEQUF3RDtBQUV4RCxNQUFhLGdCQUFpQixTQUFRLElBQUEscUJBQVcsRUFBQyxxQ0FBZ0IsQ0FBQztDQUFHO0FBQXRFLDRDQUFzRSIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxwcm9qZWN0XFxkdG9cXHVwZGF0ZS1wcm9qZWN0LmR0by50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQYXJ0aWFsVHlwZSB9IGZyb20gJ0BuZXN0anMvc3dhZ2dlcic7XG5pbXBvcnQgeyBDcmVhdGVQcm9qZWN0RHRvIH0gZnJvbSAnLi9jcmVhdGUtcHJvamVjdC5kdG8nO1xuXG5leHBvcnQgY2xhc3MgVXBkYXRlUHJvamVjdER0byBleHRlbmRzIFBhcnRpYWxUeXBlKENyZWF0ZVByb2plY3REdG8pIHt9XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d9/updateprojectdto_d94c4ce750d5054f7326d5626a57ca13.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d9/updateprojectdto_d94c4ce750d5054f7326d5626a57ca13.map new file mode 100644 index 0000000..7f15452 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/d9/updateprojectdto_d94c4ce750d5054f7326d5626a57ca13.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\project\\dto\\update-project.dto.ts","mappings":";;;AAAA,6CAA8C;AAC9C,6DAAwD;AAExD,MAAa,gBAAiB,SAAQ,IAAA,qBAAW,EAAC,qCAAgB,CAAC;CAAG;AAAtE,4CAAsE","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\project\\dto\\update-project.dto.ts"],"sourcesContent":["import { PartialType } from '@nestjs/swagger';\nimport { CreateProjectDto } from './create-project.dto';\n\nexport class UpdateProjectDto extends PartialType(CreateProjectDto) {}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/da/projectservicespec_daaf06fc7b27b9d454ba3d3f4dcc0121 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/da/projectservicespec_daaf06fc7b27b9d454ba3d3f4dcc0121 new file mode 100644 index 0000000..f54a3ba --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/da/projectservicespec_daaf06fc7b27b9d454ba3d3f4dcc0121 @@ -0,0 +1,77 @@ +64ded6eb7a3d342fa069648b5a557750 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const testing_1 = require("@nestjs/testing"); +const typeorm_1 = require("@nestjs/typeorm"); +const project_service_1 = require("./project.service"); +const project_entity_1 = require("./entities/project.entity"); +const organization_service_1 = require("../organization/organization.service"); +describe('ProjectService', () => { + let service; + let mockProjectRepository; + let mockOrganizationService; + beforeEach(async () => { + mockProjectRepository = { + find: jest.fn(), + findOne: jest.fn(), + create: jest.fn(), + save: jest.fn(), + softDelete: jest.fn(), + createQueryBuilder: jest.fn(() => ({ + leftJoinAndSelect: jest.fn().mockReturnThis(), + where: jest.fn().mockReturnThis(), + andWhere: jest.fn().mockReturnThis(), + orderBy: jest.fn().mockReturnThis(), + skip: jest.fn().mockReturnThis(), + take: jest.fn().mockReturnThis(), + getManyAndCount: jest.fn().mockResolvedValue([[], 0]), + })), + }; + mockOrganizationService = { + findAllActive: jest.fn(), + }; + const module = await testing_1.Test.createTestingModule({ + providers: [ + project_service_1.ProjectService, + { + provide: (0, typeorm_1.getRepositoryToken)(project_entity_1.Project), + useValue: mockProjectRepository, + }, + { + provide: organization_service_1.OrganizationService, + useValue: mockOrganizationService, + }, + ], + }).compile(); + service = module.get(project_service_1.ProjectService); + }); + it('should be defined', () => { + expect(service).toBeDefined(); + }); + describe('findAll', () => { + it('should return paginated projects', async () => { + const mockProjects = [ + { + project_id: 1, + project_code: 'PROJ-001', + project_name: 'Test Project', + }, + ]; + const qb = mockProjectRepository.createQueryBuilder(); + qb.getManyAndCount.mockResolvedValue([mockProjects, 1]); + const result = await service.findAll({ page: 1, limit: 10 }); + expect(result.data).toBeDefined(); + expect(result.meta).toBeDefined(); + }); + }); + describe('findAllOrganizations', () => { + it('should return all organizations', async () => { + const mockOrgs = [{ organization_id: 1, name: 'Test Org' }]; + mockOrganizationService.findAllActive.mockResolvedValue(mockOrgs); + const result = await service.findAllOrganizations(); + expect(mockOrganizationService.findAllActive).toHaveBeenCalled(); + expect(result).toEqual(mockOrgs); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccHJvamVjdFxccHJvamVjdC5zZXJ2aWNlLnNwZWMudHMiLCJtYXBwaW5ncyI6Ijs7QUFBQSw2Q0FBc0Q7QUFDdEQsNkNBQXFEO0FBQ3JELHVEQUFtRDtBQUNuRCw4REFBb0Q7QUFDcEQsK0VBQTJFO0FBRTNFLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUU7SUFDOUIsSUFBSSxPQUF1QixDQUFDO0lBQzVCLElBQUkscUJBQWdELENBQUM7SUFDckQsSUFBSSx1QkFBa0QsQ0FBQztJQUV2RCxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDcEIscUJBQXFCLEdBQUc7WUFDdEIsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDZixPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNsQixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNqQixJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNmLFVBQVUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ3JCLGtCQUFrQixFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDakMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLGNBQWMsRUFBRTtnQkFDN0MsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxjQUFjLEVBQUU7Z0JBQ2pDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsY0FBYyxFQUFFO2dCQUNwQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLGNBQWMsRUFBRTtnQkFDbkMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxjQUFjLEVBQUU7Z0JBQ2hDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsY0FBYyxFQUFFO2dCQUNoQyxlQUFlLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ3RELENBQUMsQ0FBQztTQUNKLENBQUM7UUFFRix1QkFBdUIsR0FBRztZQUN4QixhQUFhLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtTQUN6QixDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQWtCLE1BQU0sY0FBSSxDQUFDLG1CQUFtQixDQUFDO1lBQzNELFNBQVMsRUFBRTtnQkFDVCxnQ0FBYztnQkFDZDtvQkFDRSxPQUFPLEVBQUUsSUFBQSw0QkFBa0IsRUFBQyx3QkFBTyxDQUFDO29CQUNwQyxRQUFRLEVBQUUscUJBQXFCO2lCQUNoQztnQkFDRDtvQkFDRSxPQUFPLEVBQUUsMENBQW1CO29CQUM1QixRQUFRLEVBQUUsdUJBQXVCO2lCQUNsQzthQUNGO1NBQ0YsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRWIsT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQWlCLGdDQUFjLENBQUMsQ0FBQztJQUN2RCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUU7UUFDM0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7UUFDdkIsRUFBRSxDQUFDLGtDQUFrQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2hELE1BQU0sWUFBWSxHQUFHO2dCQUNuQjtvQkFDRSxVQUFVLEVBQUUsQ0FBQztvQkFDYixZQUFZLEVBQUUsVUFBVTtvQkFDeEIsWUFBWSxFQUFFLGNBQWM7aUJBQzdCO2FBQ0YsQ0FBQztZQUNGLE1BQU0sRUFBRSxHQUFHLHFCQUFxQixDQUFDLGtCQUFrQixFQUVsRCxDQUFDO1lBQ0YsRUFBRSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXhELE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFN0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNsQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxFQUFFO1FBQ3BDLEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUMvQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEVBQUUsZUFBZSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUM1RCx1QkFBdUIsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFbEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUVwRCxNQUFNLENBQUMsdUJBQXVCLENBQUMsYUFBYSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNqRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxwcm9qZWN0XFxwcm9qZWN0LnNlcnZpY2Uuc3BlYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZXN0LCBUZXN0aW5nTW9kdWxlIH0gZnJvbSAnQG5lc3Rqcy90ZXN0aW5nJztcbmltcG9ydCB7IGdldFJlcG9zaXRvcnlUb2tlbiB9IGZyb20gJ0BuZXN0anMvdHlwZW9ybSc7XG5pbXBvcnQgeyBQcm9qZWN0U2VydmljZSB9IGZyb20gJy4vcHJvamVjdC5zZXJ2aWNlJztcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuL2VudGl0aWVzL3Byb2plY3QuZW50aXR5JztcbmltcG9ydCB7IE9yZ2FuaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi9vcmdhbml6YXRpb24vb3JnYW5pemF0aW9uLnNlcnZpY2UnO1xuXG5kZXNjcmliZSgnUHJvamVjdFNlcnZpY2UnLCAoKSA9PiB7XG4gIGxldCBzZXJ2aWNlOiBQcm9qZWN0U2VydmljZTtcbiAgbGV0IG1vY2tQcm9qZWN0UmVwb3NpdG9yeTogUmVjb3JkPHN0cmluZywgamVzdC5Nb2NrPjtcbiAgbGV0IG1vY2tPcmdhbml6YXRpb25TZXJ2aWNlOiBSZWNvcmQ8c3RyaW5nLCBqZXN0Lk1vY2s+O1xuXG4gIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tQcm9qZWN0UmVwb3NpdG9yeSA9IHtcbiAgICAgIGZpbmQ6IGplc3QuZm4oKSxcbiAgICAgIGZpbmRPbmU6IGplc3QuZm4oKSxcbiAgICAgIGNyZWF0ZTogamVzdC5mbigpLFxuICAgICAgc2F2ZTogamVzdC5mbigpLFxuICAgICAgc29mdERlbGV0ZTogamVzdC5mbigpLFxuICAgICAgY3JlYXRlUXVlcnlCdWlsZGVyOiBqZXN0LmZuKCgpID0+ICh7XG4gICAgICAgIGxlZnRKb2luQW5kU2VsZWN0OiBqZXN0LmZuKCkubW9ja1JldHVyblRoaXMoKSxcbiAgICAgICAgd2hlcmU6IGplc3QuZm4oKS5tb2NrUmV0dXJuVGhpcygpLFxuICAgICAgICBhbmRXaGVyZTogamVzdC5mbigpLm1vY2tSZXR1cm5UaGlzKCksXG4gICAgICAgIG9yZGVyQnk6IGplc3QuZm4oKS5tb2NrUmV0dXJuVGhpcygpLFxuICAgICAgICBza2lwOiBqZXN0LmZuKCkubW9ja1JldHVyblRoaXMoKSxcbiAgICAgICAgdGFrZTogamVzdC5mbigpLm1vY2tSZXR1cm5UaGlzKCksXG4gICAgICAgIGdldE1hbnlBbmRDb3VudDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKFtbXSwgMF0pLFxuICAgICAgfSkpLFxuICAgIH07XG5cbiAgICBtb2NrT3JnYW5pemF0aW9uU2VydmljZSA9IHtcbiAgICAgIGZpbmRBbGxBY3RpdmU6IGplc3QuZm4oKSxcbiAgICB9O1xuXG4gICAgY29uc3QgbW9kdWxlOiBUZXN0aW5nTW9kdWxlID0gYXdhaXQgVGVzdC5jcmVhdGVUZXN0aW5nTW9kdWxlKHtcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICBQcm9qZWN0U2VydmljZSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IGdldFJlcG9zaXRvcnlUb2tlbihQcm9qZWN0KSxcbiAgICAgICAgICB1c2VWYWx1ZTogbW9ja1Byb2plY3RSZXBvc2l0b3J5LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogT3JnYW5pemF0aW9uU2VydmljZSxcbiAgICAgICAgICB1c2VWYWx1ZTogbW9ja09yZ2FuaXphdGlvblNlcnZpY2UsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pLmNvbXBpbGUoKTtcblxuICAgIHNlcnZpY2UgPSBtb2R1bGUuZ2V0PFByb2plY3RTZXJ2aWNlPihQcm9qZWN0U2VydmljZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYmUgZGVmaW5lZCcsICgpID0+IHtcbiAgICBleHBlY3Qoc2VydmljZSkudG9CZURlZmluZWQoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2ZpbmRBbGwnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gcGFnaW5hdGVkIHByb2plY3RzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbW9ja1Byb2plY3RzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvamVjdF9pZDogMSxcbiAgICAgICAgICBwcm9qZWN0X2NvZGU6ICdQUk9KLTAwMScsXG4gICAgICAgICAgcHJvamVjdF9uYW1lOiAnVGVzdCBQcm9qZWN0JyxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCBxYiA9IG1vY2tQcm9qZWN0UmVwb3NpdG9yeS5jcmVhdGVRdWVyeUJ1aWxkZXIoKSBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgZ2V0TWFueUFuZENvdW50OiBqZXN0Lk1vY2s7XG4gICAgICB9O1xuICAgICAgcWIuZ2V0TWFueUFuZENvdW50Lm1vY2tSZXNvbHZlZFZhbHVlKFttb2NrUHJvamVjdHMsIDFdKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VydmljZS5maW5kQWxsKHsgcGFnZTogMSwgbGltaXQ6IDEwIH0pO1xuXG4gICAgICBleHBlY3QocmVzdWx0LmRhdGEpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QocmVzdWx0Lm1ldGEpLnRvQmVEZWZpbmVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmaW5kQWxsT3JnYW5pemF0aW9ucycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhbGwgb3JnYW5pemF0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1vY2tPcmdzID0gW3sgb3JnYW5pemF0aW9uX2lkOiAxLCBuYW1lOiAnVGVzdCBPcmcnIH1dO1xuICAgICAgbW9ja09yZ2FuaXphdGlvblNlcnZpY2UuZmluZEFsbEFjdGl2ZS5tb2NrUmVzb2x2ZWRWYWx1ZShtb2NrT3Jncyk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlcnZpY2UuZmluZEFsbE9yZ2FuaXphdGlvbnMoKTtcblxuICAgICAgZXhwZWN0KG1vY2tPcmdhbml6YXRpb25TZXJ2aWNlLmZpbmRBbGxBY3RpdmUpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwobW9ja09yZ3MpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/da/projectservicespec_daaf06fc7b27b9d454ba3d3f4dcc0121.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/da/projectservicespec_daaf06fc7b27b9d454ba3d3f4dcc0121.map new file mode 100644 index 0000000..85fdcc3 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/da/projectservicespec_daaf06fc7b27b9d454ba3d3f4dcc0121.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\project\\project.service.spec.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\project\\project.service.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\nimport { getRepositoryToken } from '@nestjs/typeorm';\nimport { ProjectService } from './project.service';\nimport { Project } from './entities/project.entity';\nimport { OrganizationService } from '../organization/organization.service';\n\ndescribe('ProjectService', () => {\n let service: ProjectService;\n let mockProjectRepository: Record;\n let mockOrganizationService: Record;\n\n beforeEach(async () => {\n mockProjectRepository = {\n find: jest.fn(),\n findOne: jest.fn(),\n create: jest.fn(),\n save: jest.fn(),\n softDelete: jest.fn(),\n createQueryBuilder: jest.fn(() => ({\n leftJoinAndSelect: jest.fn().mockReturnThis(),\n where: jest.fn().mockReturnThis(),\n andWhere: jest.fn().mockReturnThis(),\n orderBy: jest.fn().mockReturnThis(),\n skip: jest.fn().mockReturnThis(),\n take: jest.fn().mockReturnThis(),\n getManyAndCount: jest.fn().mockResolvedValue([[], 0]),\n })),\n };\n\n mockOrganizationService = {\n findAllActive: jest.fn(),\n };\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n ProjectService,\n {\n provide: getRepositoryToken(Project),\n useValue: mockProjectRepository,\n },\n {\n provide: OrganizationService,\n useValue: mockOrganizationService,\n },\n ],\n }).compile();\n\n service = module.get(ProjectService);\n });\n\n it('should be defined', () => {\n expect(service).toBeDefined();\n });\n\n describe('findAll', () => {\n it('should return paginated projects', async () => {\n const mockProjects = [\n {\n project_id: 1,\n project_code: 'PROJ-001',\n project_name: 'Test Project',\n },\n ];\n const qb = mockProjectRepository.createQueryBuilder() as unknown as {\n getManyAndCount: jest.Mock;\n };\n qb.getManyAndCount.mockResolvedValue([mockProjects, 1]);\n\n const result = await service.findAll({ page: 1, limit: 10 });\n\n expect(result.data).toBeDefined();\n expect(result.meta).toBeDefined();\n });\n });\n\n describe('findAllOrganizations', () => {\n it('should return all organizations', async () => {\n const mockOrgs = [{ organization_id: 1, name: 'Test Org' }];\n mockOrganizationService.findAllActive.mockResolvedValue(mockOrgs);\n\n const result = await service.findAllOrganizations();\n\n expect(mockOrganizationService.findAllActive).toHaveBeenCalled();\n expect(result).toEqual(mockOrgs);\n });\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/db/contractdrawingsubcategoryentity_db702410fe427ce5596f5483aea98a15 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/db/contractdrawingsubcategoryentity_db702410fe427ce5596f5483aea98a15 new file mode 100644 index 0000000..2321af0 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/db/contractdrawingsubcategoryentity_db702410fe427ce5596f5483aea98a15 @@ -0,0 +1,60 @@ +e32c989e925f8f3b2b2617b90c1e377c +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ContractDrawingSubCategory = void 0; +const typeorm_1 = require("typeorm"); +const project_entity_1 = require("../../project/entities/project.entity"); +let ContractDrawingSubCategory = class ContractDrawingSubCategory { +}; +exports.ContractDrawingSubCategory = ContractDrawingSubCategory; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], ContractDrawingSubCategory.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id' }), + __metadata("design:type", Number) +], ContractDrawingSubCategory.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sub_cat_code', length: 50 }), + __metadata("design:type", String) +], ContractDrawingSubCategory.prototype, "subCatCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sub_cat_name', length: 255 }), + __metadata("design:type", String) +], ContractDrawingSubCategory.prototype, "subCatName", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], ContractDrawingSubCategory.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sort_order', default: 0 }), + __metadata("design:type", Number) +], ContractDrawingSubCategory.prototype, "sortOrder", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], ContractDrawingSubCategory.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], ContractDrawingSubCategory.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => project_entity_1.Project), + (0, typeorm_1.JoinColumn)({ name: 'project_id' }), + __metadata("design:type", typeof (_c = typeof project_entity_1.Project !== "undefined" && project_entity_1.Project) === "function" ? _c : Object) +], ContractDrawingSubCategory.prototype, "project", void 0); +exports.ContractDrawingSubCategory = ContractDrawingSubCategory = __decorate([ + (0, typeorm_1.Entity)('contract_drawing_sub_cats') +], ContractDrawingSubCategory); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXGNvbnRyYWN0LWRyYXdpbmctc3ViLWNhdGVnb3J5LmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBUWlCO0FBQ2pCLDBFQUFnRTtBQUd6RCxJQUFNLDBCQUEwQixHQUFoQyxNQUFNLDBCQUEwQjtDQTRCdEMsQ0FBQTtBQTVCWSxnRUFBMEI7QUFFckM7SUFEQyxJQUFBLGdDQUFzQixHQUFFOztzREFDYjtBQUdaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDOzs2REFDWjtBQUduQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDOzs4REFDekI7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7OERBQzFCO0FBR3BCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7OytEQUNwQjtBQUdyQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDOzs2REFDeEI7QUFHbkI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7NkRBQUM7QUFHakI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7NkRBQUM7QUFJakI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsd0JBQU8sQ0FBQztJQUN4QixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQ3pCLHdCQUFPLG9CQUFQLHdCQUFPOzJEQUFDO3FDQTNCUCwwQkFBMEI7SUFEdEMsSUFBQSxnQkFBTSxFQUFDLDJCQUEyQixDQUFDO0dBQ3ZCLDBCQUEwQixDQTRCdEMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXGNvbnRyYWN0LWRyYXdpbmctc3ViLWNhdGVnb3J5LmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHksXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXG4gIENvbHVtbixcbiAgQ3JlYXRlRGF0ZUNvbHVtbixcbiAgVXBkYXRlRGF0ZUNvbHVtbixcbiAgTWFueVRvT25lLFxuICBKb2luQ29sdW1uLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0L2VudGl0aWVzL3Byb2plY3QuZW50aXR5JztcblxuQEVudGl0eSgnY29udHJhY3RfZHJhd2luZ19zdWJfY2F0cycpXG5leHBvcnQgY2xhc3MgQ29udHJhY3REcmF3aW5nU3ViQ2F0ZWdvcnkge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIGlkITogbnVtYmVyOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBDb2x1bW4oeyBuYW1lOiAncHJvamVjdF9pZCcgfSlcbiAgcHJvamVjdElkITogbnVtYmVyOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBDb2x1bW4oeyBuYW1lOiAnc3ViX2NhdF9jb2RlJywgbGVuZ3RoOiA1MCB9KVxuICBzdWJDYXRDb2RlITogc3RyaW5nOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBDb2x1bW4oeyBuYW1lOiAnc3ViX2NhdF9uYW1lJywgbGVuZ3RoOiAyNTUgfSlcbiAgc3ViQ2F0TmFtZSE6IHN0cmluZzsgLy8g4LmA4LiV4Li04LihICFcblxuICBAQ29sdW1uKHsgdHlwZTogJ3RleHQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBkZXNjcmlwdGlvbj86IHN0cmluZzsgLy8gTnVsbGFibGUg4LmD4LiK4LmJID9cblxuICBAQ29sdW1uKHsgbmFtZTogJ3NvcnRfb3JkZXInLCBkZWZhdWx0OiAwIH0pXG4gIHNvcnRPcmRlciE6IG51bWJlcjsgLy8g4LmA4LiV4Li04LihICFcblxuICBAQ3JlYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICdjcmVhdGVkX2F0JyB9KVxuICBjcmVhdGVkQXQhOiBEYXRlOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBVcGRhdGVEYXRlQ29sdW1uKHsgbmFtZTogJ3VwZGF0ZWRfYXQnIH0pXG4gIHVwZGF0ZWRBdCE6IERhdGU7IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQE1hbnlUb09uZSgoKSA9PiBQcm9qZWN0KVxuICBASm9pbkNvbHVtbih7IG5hbWU6ICdwcm9qZWN0X2lkJyB9KVxuICBwcm9qZWN0ITogUHJvamVjdDsgLy8g4LmA4LiV4Li04LihICFcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/db/contractdrawingsubcategoryentity_db702410fe427ce5596f5483aea98a15.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/db/contractdrawingsubcategoryentity_db702410fe427ce5596f5483aea98a15.map new file mode 100644 index 0000000..90bff9f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/db/contractdrawingsubcategoryentity_db702410fe427ce5596f5483aea98a15.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\contract-drawing-sub-category.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAQiB;AACjB,0EAAgE;AAGzD,IAAM,0BAA0B,GAAhC,MAAM,0BAA0B;CA4BtC,CAAA;AA5BY,gEAA0B;AAErC;IADC,IAAA,gCAAsB,GAAE;;sDACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;6DACZ;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;8DACzB;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;8DAC1B;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;+DACpB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;6DACxB;AAGnB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;6DAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;6DAAC;AAIjB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wBAAO,CAAC;IACxB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,wBAAO,oBAAP,wBAAO;2DAAC;qCA3BP,0BAA0B;IADtC,IAAA,gBAAM,EAAC,2BAA2B,CAAC;GACvB,0BAA0B,CA4BtC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\contract-drawing-sub-category.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n UpdateDateColumn,\n ManyToOne,\n JoinColumn,\n} from 'typeorm';\nimport { Project } from '../../project/entities/project.entity';\n\n@Entity('contract_drawing_sub_cats')\nexport class ContractDrawingSubCategory {\n @PrimaryGeneratedColumn()\n id!: number; // เติม !\n\n @Column({ name: 'project_id' })\n projectId!: number; // เติม !\n\n @Column({ name: 'sub_cat_code', length: 50 })\n subCatCode!: string; // เติม !\n\n @Column({ name: 'sub_cat_name', length: 255 })\n subCatName!: string; // เติม !\n\n @Column({ type: 'text', nullable: true })\n description?: string; // Nullable ใช้ ?\n\n @Column({ name: 'sort_order', default: 0 })\n sortOrder!: number; // เติม !\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date; // เติม !\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date; // เติม !\n\n @ManyToOne(() => Project)\n @JoinColumn({ name: 'project_id' })\n project!: Project; // เติม !\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/de/addreferencedto_de618b4cb1acf6bd3a1dc051d1761ca5 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/de/addreferencedto_de618b4cb1acf6bd3a1dc051d1761ca5 new file mode 100644 index 0000000..9a1eb3e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/de/addreferencedto_de618b4cb1acf6bd3a1dc051d1761ca5 @@ -0,0 +1,28 @@ +bcb72451389188fe12a13aa93be14537 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AddReferenceDto = void 0; +const class_validator_1 = require("class-validator"); +const swagger_1 = require("@nestjs/swagger"); +class AddReferenceDto { +} +exports.AddReferenceDto = AddReferenceDto; +__decorate([ + (0, swagger_1.ApiProperty)({ + description: 'Target Correspondence UUID to reference (ADR-019)', + example: '019505a1-7c3e-7000-8000-abc123def456', + }), + (0, class_validator_1.IsUUID)('all'), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], AddReferenceDto.prototype, "targetUuid", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGR0b1xcYWRkLXJlZmVyZW5jZS5kdG8udHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEscURBQXFEO0FBQ3JELDZDQUE4QztBQUU5QyxNQUFhLGVBQWU7Q0FRM0I7QUFSRCwwQ0FRQztBQURDO0lBTkMsSUFBQSxxQkFBVyxFQUFDO1FBQ1gsV0FBVyxFQUFFLG1EQUFtRDtRQUNoRSxPQUFPLEVBQUUsc0NBQXNDO0tBQ2hELENBQUM7SUFDRCxJQUFBLHdCQUFNLEVBQUMsS0FBSyxDQUFDO0lBQ2IsSUFBQSw0QkFBVSxHQUFFOzttREFDTyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxjb3JyZXNwb25kZW5jZVxcZHRvXFxhZGQtcmVmZXJlbmNlLmR0by50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJc1VVSUQsIElzTm90RW1wdHkgfSBmcm9tICdjbGFzcy12YWxpZGF0b3InO1xuaW1wb3J0IHsgQXBpUHJvcGVydHkgfSBmcm9tICdAbmVzdGpzL3N3YWdnZXInO1xuXG5leHBvcnQgY2xhc3MgQWRkUmVmZXJlbmNlRHRvIHtcbiAgQEFwaVByb3BlcnR5KHtcbiAgICBkZXNjcmlwdGlvbjogJ1RhcmdldCBDb3JyZXNwb25kZW5jZSBVVUlEIHRvIHJlZmVyZW5jZSAoQURSLTAxOSknLFxuICAgIGV4YW1wbGU6ICcwMTk1MDVhMS03YzNlLTcwMDAtODAwMC1hYmMxMjNkZWY0NTYnLFxuICB9KVxuICBASXNVVUlEKCdhbGwnKVxuICBASXNOb3RFbXB0eSgpXG4gIHRhcmdldFV1aWQhOiBzdHJpbmc7XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/de/addreferencedto_de618b4cb1acf6bd3a1dc051d1761ca5.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/de/addreferencedto_de618b4cb1acf6bd3a1dc051d1761ca5.map new file mode 100644 index 0000000..a208591 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/de/addreferencedto_de618b4cb1acf6bd3a1dc051d1761ca5.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\add-reference.dto.ts","mappings":";;;;;;;;;;;;AAAA,qDAAqD;AACrD,6CAA8C;AAE9C,MAAa,eAAe;CAQ3B;AARD,0CAQC;AADC;IANC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,mDAAmD;QAChE,OAAO,EAAE,sCAAsC;KAChD,CAAC;IACD,IAAA,wBAAM,EAAC,KAAK,CAAC;IACb,IAAA,4BAAU,GAAE;;mDACO","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\add-reference.dto.ts"],"sourcesContent":["import { IsUUID, IsNotEmpty } from 'class-validator';\nimport { ApiProperty } from '@nestjs/swagger';\n\nexport class AddReferenceDto {\n @ApiProperty({\n description: 'Target Correspondence UUID to reference (ADR-019)',\n example: '019505a1-7c3e-7000-8000-abc123def456',\n })\n @IsUUID('all')\n @IsNotEmpty()\n targetUuid!: string;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/de/workflowactiondto_de25df6637f0f6baa62507feb9bba1f7 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/de/workflowactiondto_de25df6637f0f6baa62507feb9bba1f7 new file mode 100644 index 0000000..ecffe63 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/de/workflowactiondto_de25df6637f0f6baa62507feb9bba1f7 @@ -0,0 +1,80 @@ +397e9fb75dd17b7b0f05a57990aa58d9 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WorkflowActionDto = void 0; +const class_validator_1 = require("class-validator"); +const workflow_interface_1 = require("../../workflow-engine/interfaces/workflow.interface"); +const swagger_1 = require("@nestjs/swagger"); +/** + * DTO for processing workflow actions + * + * Supports both: + * - New Unified Workflow Engine (uses instanceId) + * - Legacy RFA workflow (uses returnToSequence) + */ +class WorkflowActionDto { +} +exports.WorkflowActionDto = WorkflowActionDto; +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Workflow Instance ID (UUID) - for Unified Workflow Engine', + example: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890', + }), + (0, class_validator_1.IsUUID)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], WorkflowActionDto.prototype, "instanceId", void 0); +__decorate([ + (0, swagger_1.ApiProperty)({ + description: 'Workflow Action', + enum: ['APPROVE', 'REJECT', 'RETURN', 'CANCEL', 'ACKNOWLEDGE'], + }), + (0, class_validator_1.IsEnum)(workflow_interface_1.WorkflowAction), + __metadata("design:type", typeof (_a = typeof workflow_interface_1.WorkflowAction !== "undefined" && workflow_interface_1.WorkflowAction) === "function" ? _a : Object) +], WorkflowActionDto.prototype, "action", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Review comments', + example: 'Approved with note...', + }), + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], WorkflowActionDto.prototype, "comment", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Review comments (deprecated, use comment)', + example: 'Approved with note...', + }), + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], WorkflowActionDto.prototype, "comments", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Sequence to return to (only for RETURN action in legacy RFA)', + example: 1, + }), + (0, class_validator_1.IsInt)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", Number) +], WorkflowActionDto.prototype, "returnToSequence", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Additional payload data', + example: { priority: 'HIGH' }, + }), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", typeof (_b = typeof Record !== "undefined" && Record) === "function" ? _b : Object) +], WorkflowActionDto.prototype, "payload", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGR0b1xcd29ya2Zsb3ctYWN0aW9uLmR0by50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscURBQThFO0FBQzlFLDRGQUFxRjtBQUNyRiw2Q0FBbUU7QUFFbkU7Ozs7OztHQU1HO0FBQ0gsTUFBYSxpQkFBaUI7Q0FpRDdCO0FBakRELDhDQWlEQztBQTFDQztJQU5DLElBQUEsNkJBQW1CLEVBQUM7UUFDbkIsV0FBVyxFQUFFLDJEQUEyRDtRQUN4RSxPQUFPLEVBQUUsc0NBQXNDO0tBQ2hELENBQUM7SUFDRCxJQUFBLHdCQUFNLEdBQUU7SUFDUixJQUFBLDRCQUFVLEdBQUU7O3FEQUNPO0FBT3BCO0lBTEMsSUFBQSxxQkFBVyxFQUFDO1FBQ1gsV0FBVyxFQUFFLGlCQUFpQjtRQUM5QixJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDO0tBQy9ELENBQUM7SUFDRCxJQUFBLHdCQUFNLEVBQUMsbUNBQWMsQ0FBQztrREFDZCxtQ0FBYyxvQkFBZCxtQ0FBYztpREFBQztBQVF4QjtJQU5DLElBQUEsNkJBQW1CLEVBQUM7UUFDbkIsV0FBVyxFQUFFLGlCQUFpQjtRQUM5QixPQUFPLEVBQUUsdUJBQXVCO0tBQ2pDLENBQUM7SUFDRCxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7O2tEQUNJO0FBV2pCO0lBTkMsSUFBQSw2QkFBbUIsRUFBQztRQUNuQixXQUFXLEVBQUUsMkNBQTJDO1FBQ3hELE9BQU8sRUFBRSx1QkFBdUI7S0FDakMsQ0FBQztJQUNELElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7bURBQ0s7QUFRbEI7SUFOQyxJQUFBLDZCQUFtQixFQUFDO1FBQ25CLFdBQVcsRUFBRSw4REFBOEQ7UUFDM0UsT0FBTyxFQUFFLENBQUM7S0FDWCxDQUFDO0lBQ0QsSUFBQSx1QkFBSyxHQUFFO0lBQ1AsSUFBQSw0QkFBVSxHQUFFOzsyREFDYTtBQU8xQjtJQUxDLElBQUEsNkJBQW1CLEVBQUM7UUFDbkIsV0FBVyxFQUFFLHlCQUF5QjtRQUN0QyxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFO0tBQzlCLENBQUM7SUFDRCxJQUFBLDRCQUFVLEdBQUU7a0RBQ0gsTUFBTSxvQkFBTixNQUFNO2tEQUFrQiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxjb3JyZXNwb25kZW5jZVxcZHRvXFx3b3JrZmxvdy1hY3Rpb24uZHRvLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElzRW51bSwgSXNTdHJpbmcsIElzT3B0aW9uYWwsIElzVVVJRCwgSXNJbnQgfSBmcm9tICdjbGFzcy12YWxpZGF0b3InO1xuaW1wb3J0IHsgV29ya2Zsb3dBY3Rpb24gfSBmcm9tICcuLi8uLi93b3JrZmxvdy1lbmdpbmUvaW50ZXJmYWNlcy93b3JrZmxvdy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQXBpUHJvcGVydHksIEFwaVByb3BlcnR5T3B0aW9uYWwgfSBmcm9tICdAbmVzdGpzL3N3YWdnZXInO1xuXG4vKipcbiAqIERUTyBmb3IgcHJvY2Vzc2luZyB3b3JrZmxvdyBhY3Rpb25zXG4gKlxuICogU3VwcG9ydHMgYm90aDpcbiAqIC0gTmV3IFVuaWZpZWQgV29ya2Zsb3cgRW5naW5lICh1c2VzIGluc3RhbmNlSWQpXG4gKiAtIExlZ2FjeSBSRkEgd29ya2Zsb3cgKHVzZXMgcmV0dXJuVG9TZXF1ZW5jZSlcbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtmbG93QWN0aW9uRHRvIHtcbiAgQEFwaVByb3BlcnR5T3B0aW9uYWwoe1xuICAgIGRlc2NyaXB0aW9uOiAnV29ya2Zsb3cgSW5zdGFuY2UgSUQgKFVVSUQpIC0gZm9yIFVuaWZpZWQgV29ya2Zsb3cgRW5naW5lJyxcbiAgICBleGFtcGxlOiAnYTFiMmMzZDQtZTVmNi03ODkwLWFiY2QtZWYxMjM0NTY3ODkwJyxcbiAgfSlcbiAgQElzVVVJRCgpXG4gIEBJc09wdGlvbmFsKClcbiAgaW5zdGFuY2VJZD86IHN0cmluZztcblxuICBAQXBpUHJvcGVydHkoe1xuICAgIGRlc2NyaXB0aW9uOiAnV29ya2Zsb3cgQWN0aW9uJyxcbiAgICBlbnVtOiBbJ0FQUFJPVkUnLCAnUkVKRUNUJywgJ1JFVFVSTicsICdDQU5DRUwnLCAnQUNLTk9XTEVER0UnXSxcbiAgfSlcbiAgQElzRW51bShXb3JrZmxvd0FjdGlvbilcbiAgYWN0aW9uITogV29ya2Zsb3dBY3Rpb247XG5cbiAgQEFwaVByb3BlcnR5T3B0aW9uYWwoe1xuICAgIGRlc2NyaXB0aW9uOiAnUmV2aWV3IGNvbW1lbnRzJyxcbiAgICBleGFtcGxlOiAnQXBwcm92ZWQgd2l0aCBub3RlLi4uJyxcbiAgfSlcbiAgQElzU3RyaW5nKClcbiAgQElzT3B0aW9uYWwoKVxuICBjb21tZW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgJ2NvbW1lbnQnIGluc3RlYWRcbiAgICovXG4gIEBBcGlQcm9wZXJ0eU9wdGlvbmFsKHtcbiAgICBkZXNjcmlwdGlvbjogJ1JldmlldyBjb21tZW50cyAoZGVwcmVjYXRlZCwgdXNlIGNvbW1lbnQpJyxcbiAgICBleGFtcGxlOiAnQXBwcm92ZWQgd2l0aCBub3RlLi4uJyxcbiAgfSlcbiAgQElzU3RyaW5nKClcbiAgQElzT3B0aW9uYWwoKVxuICBjb21tZW50cz86IHN0cmluZztcblxuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7XG4gICAgZGVzY3JpcHRpb246ICdTZXF1ZW5jZSB0byByZXR1cm4gdG8gKG9ubHkgZm9yIFJFVFVSTiBhY3Rpb24gaW4gbGVnYWN5IFJGQSknLFxuICAgIGV4YW1wbGU6IDEsXG4gIH0pXG4gIEBJc0ludCgpXG4gIEBJc09wdGlvbmFsKClcbiAgcmV0dXJuVG9TZXF1ZW5jZT86IG51bWJlcjtcblxuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7XG4gICAgZGVzY3JpcHRpb246ICdBZGRpdGlvbmFsIHBheWxvYWQgZGF0YScsXG4gICAgZXhhbXBsZTogeyBwcmlvcml0eTogJ0hJR0gnIH0sXG4gIH0pXG4gIEBJc09wdGlvbmFsKClcbiAgcGF5bG9hZD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/de/workflowactiondto_de25df6637f0f6baa62507feb9bba1f7.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/de/workflowactiondto_de25df6637f0f6baa62507feb9bba1f7.map new file mode 100644 index 0000000..a1316c5 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/de/workflowactiondto_de25df6637f0f6baa62507feb9bba1f7.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\workflow-action.dto.ts","mappings":";;;;;;;;;;;;;AAAA,qDAA8E;AAC9E,4FAAqF;AACrF,6CAAmE;AAEnE;;;;;;GAMG;AACH,MAAa,iBAAiB;CAiD7B;AAjDD,8CAiDC;AA1CC;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,2DAA2D;QACxE,OAAO,EAAE,sCAAsC;KAChD,CAAC;IACD,IAAA,wBAAM,GAAE;IACR,IAAA,4BAAU,GAAE;;qDACO;AAOpB;IALC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,iBAAiB;QAC9B,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,CAAC;KAC/D,CAAC;IACD,IAAA,wBAAM,EAAC,mCAAc,CAAC;kDACd,mCAAc,oBAAd,mCAAc;iDAAC;AAQxB;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,iBAAiB;QAC9B,OAAO,EAAE,uBAAuB;KACjC,CAAC;IACD,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;kDACI;AAWjB;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,2CAA2C;QACxD,OAAO,EAAE,uBAAuB;KACjC,CAAC;IACD,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;mDACK;AAQlB;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,8DAA8D;QAC3E,OAAO,EAAE,CAAC;KACX,CAAC;IACD,IAAA,uBAAK,GAAE;IACP,IAAA,4BAAU,GAAE;;2DACa;AAO1B;IALC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,yBAAyB;QACtC,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;KAC9B,CAAC;IACD,IAAA,4BAAU,GAAE;kDACH,MAAM,oBAAN,MAAM;kDAAkB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\workflow-action.dto.ts"],"sourcesContent":["import { IsEnum, IsString, IsOptional, IsUUID, IsInt } from 'class-validator';\nimport { WorkflowAction } from '../../workflow-engine/interfaces/workflow.interface';\nimport { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';\n\n/**\n * DTO for processing workflow actions\n *\n * Supports both:\n * - New Unified Workflow Engine (uses instanceId)\n * - Legacy RFA workflow (uses returnToSequence)\n */\nexport class WorkflowActionDto {\n @ApiPropertyOptional({\n description: 'Workflow Instance ID (UUID) - for Unified Workflow Engine',\n example: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',\n })\n @IsUUID()\n @IsOptional()\n instanceId?: string;\n\n @ApiProperty({\n description: 'Workflow Action',\n enum: ['APPROVE', 'REJECT', 'RETURN', 'CANCEL', 'ACKNOWLEDGE'],\n })\n @IsEnum(WorkflowAction)\n action!: WorkflowAction;\n\n @ApiPropertyOptional({\n description: 'Review comments',\n example: 'Approved with note...',\n })\n @IsString()\n @IsOptional()\n comment?: string;\n\n /**\n * @deprecated Use 'comment' instead\n */\n @ApiPropertyOptional({\n description: 'Review comments (deprecated, use comment)',\n example: 'Approved with note...',\n })\n @IsString()\n @IsOptional()\n comments?: string;\n\n @ApiPropertyOptional({\n description: 'Sequence to return to (only for RETURN action in legacy RFA)',\n example: 1,\n })\n @IsInt()\n @IsOptional()\n returnToSequence?: number;\n\n @ApiPropertyOptional({\n description: 'Additional payload data',\n example: { priority: 'HIGH' },\n })\n @IsOptional()\n payload?: Record;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/jsonschemacontroller_df3af79a98cd0cc3642b18f0befcdf94 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/jsonschemacontroller_df3af79a98cd0cc3642b18f0befcdf94 new file mode 100644 index 0000000..1c18fa4 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/jsonschemacontroller_df3af79a98cd0cc3642b18f0befcdf94 @@ -0,0 +1,204 @@ +36ea56f3227cfa40d5cca9b0a906b141 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var _a, _b, _c, _d, _e, _f, _g, _h, _j; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.JsonSchemaController = void 0; +// File: src/modules/json-schema/json-schema.controller.ts +const common_1 = require("@nestjs/common"); +const swagger_1 = require("@nestjs/swagger"); +const json_schema_service_1 = require("./json-schema.service"); +const schema_migration_service_1 = require("./services/schema-migration.service"); +const create_json_schema_dto_1 = require("./dto/create-json-schema.dto"); +const migrate_data_dto_1 = require("./dto/migrate-data.dto"); +const search_json_schema_dto_1 = require("./dto/search-json-schema.dto"); +const update_json_schema_dto_1 = require("./dto/update-json-schema.dto"); +const current_user_decorator_1 = require("../../common/decorators/current-user.decorator"); +const require_permission_decorator_1 = require("../../common/decorators/require-permission.decorator"); +const jwt_auth_guard_1 = require("../../common/guards/jwt-auth.guard"); +const rbac_guard_1 = require("../../common/guards/rbac.guard"); +const user_entity_1 = require("../user/entities/user.entity"); +let JsonSchemaController = class JsonSchemaController { + constructor(jsonSchemaService, migrationService) { + this.jsonSchemaService = jsonSchemaService; + this.migrationService = migrationService; + } + // ---------------------------------------------------------------------- + // Schema Management (CRUD) + // ---------------------------------------------------------------------- + create(createDto) { + return this.jsonSchemaService.create(createDto); + } + findAll(searchDto) { + return this.jsonSchemaService.findAll(searchDto); + } + findOne(id) { + return this.jsonSchemaService.findOne(id); + } + findLatest(code) { + return this.jsonSchemaService.findLatestByCode(code); + } + update(id, updateDto) { + return this.jsonSchemaService.update(id, updateDto); + } + remove(id) { + return this.jsonSchemaService.remove(id); + } + // ---------------------------------------------------------------------- + // Validation & Security + // ---------------------------------------------------------------------- + async validate(code, data) { + // Note: Validation API นี้ใช้สำหรับ Test หรือ Pre-check เท่านั้น + // การ Save จริงจะเรียกผ่าน Service ภายใน + return this.jsonSchemaService.validateData(code, data); + } + async processReadData(code, data, user) { + // แปลง User Entity เป็น Security Context + // roles มักจะถูก inject เข้ามาใน request.user โดย Strategy หรือ Guard แม้จะไม่มีใน Entity หลัก + const userWithRoles = user; + const userRoles = userWithRoles.roles + ? userWithRoles.roles.map((r) => (typeof r === 'string' ? r : r.roleName)) // รองรับทั้ง Object Role และ String Role + : []; + return this.jsonSchemaService.processReadData(code, data, { userRoles }); + } + // ---------------------------------------------------------------------- + // Data Migration + // ---------------------------------------------------------------------- + async migrateData(tableName, id, dto) { + return this.migrationService.migrateData(tableName, id, dto.targetSchemaCode, dto.targetVersion); + } +}; +exports.JsonSchemaController = JsonSchemaController; +__decorate([ + (0, common_1.Post)(), + (0, swagger_1.ApiOperation)({ + summary: 'Create a new schema or new version of existing schema', + }), + (0, swagger_1.ApiResponse)({ + status: 201, + description: 'The schema has been successfully created.', + }), + (0, require_permission_decorator_1.RequirePermission)('system.manage_all') // Admin Only + , + __param(0, (0, common_1.Body)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_c = typeof create_json_schema_dto_1.CreateJsonSchemaDto !== "undefined" && create_json_schema_dto_1.CreateJsonSchemaDto) === "function" ? _c : Object]), + __metadata("design:returntype", void 0) +], JsonSchemaController.prototype, "create", null); +__decorate([ + (0, common_1.Get)(), + (0, swagger_1.ApiOperation)({ summary: 'List all schemas with pagination and filtering' }), + (0, require_permission_decorator_1.RequirePermission)('document.view') // Viewer+ can see schemas + , + __param(0, (0, common_1.Query)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_d = typeof search_json_schema_dto_1.SearchJsonSchemaDto !== "undefined" && search_json_schema_dto_1.SearchJsonSchemaDto) === "function" ? _d : Object]), + __metadata("design:returntype", void 0) +], JsonSchemaController.prototype, "findAll", null); +__decorate([ + (0, common_1.Get)(':id'), + (0, swagger_1.ApiOperation)({ summary: 'Get a specific schema version by ID' }), + (0, require_permission_decorator_1.RequirePermission)('document.view'), + __param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Number]), + __metadata("design:returntype", void 0) +], JsonSchemaController.prototype, "findOne", null); +__decorate([ + (0, common_1.Get)('latest/:code'), + (0, swagger_1.ApiOperation)({ + summary: 'Get the latest active version of a schema by code', + }), + (0, swagger_1.ApiParam)({ name: 'code', description: 'Schema Code (e.g., RFA_DWG)' }), + (0, require_permission_decorator_1.RequirePermission)('document.view'), + __param(0, (0, common_1.Param)('code')), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String]), + __metadata("design:returntype", void 0) +], JsonSchemaController.prototype, "findLatest", null); +__decorate([ + (0, common_1.Patch)(':id'), + (0, swagger_1.ApiOperation)({ + summary: 'Update a specific schema (Not recommended for active schemas)', + }), + (0, require_permission_decorator_1.RequirePermission)('system.manage_all'), + __param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)), + __param(1, (0, common_1.Body)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Number, typeof (_e = typeof update_json_schema_dto_1.UpdateJsonSchemaDto !== "undefined" && update_json_schema_dto_1.UpdateJsonSchemaDto) === "function" ? _e : Object]), + __metadata("design:returntype", void 0) +], JsonSchemaController.prototype, "update", null); +__decorate([ + (0, common_1.Delete)(':id'), + (0, swagger_1.ApiOperation)({ summary: 'Delete a schema version (Hard Delete)' }), + (0, require_permission_decorator_1.RequirePermission)('system.manage_all'), + __param(0, (0, common_1.Param)('id', common_1.ParseIntPipe)), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Number]), + __metadata("design:returntype", void 0) +], JsonSchemaController.prototype, "remove", null); +__decorate([ + (0, common_1.Post)('validate/:code'), + (0, common_1.HttpCode)(common_1.HttpStatus.OK), + (0, swagger_1.ApiOperation)({ summary: 'Validate data against the latest schema version' }), + (0, swagger_1.ApiResponse)({ + status: 200, + description: 'Validation result including errors and sanitized data', + }), + (0, require_permission_decorator_1.RequirePermission)('document.view'), + __param(0, (0, common_1.Param)('code')), + __param(1, (0, common_1.Body)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, typeof (_f = typeof Record !== "undefined" && Record) === "function" ? _f : Object]), + __metadata("design:returntype", Promise) +], JsonSchemaController.prototype, "validate", null); +__decorate([ + (0, common_1.Post)('read/:code'), + (0, common_1.HttpCode)(common_1.HttpStatus.OK), + (0, swagger_1.ApiOperation)({ + summary: 'Process read data (Decrypt & Filter) based on user roles', + }), + (0, require_permission_decorator_1.RequirePermission)('document.view'), + __param(0, (0, common_1.Param)('code')), + __param(1, (0, common_1.Body)()), + __param(2, (0, current_user_decorator_1.CurrentUser)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, typeof (_g = typeof Record !== "undefined" && Record) === "function" ? _g : Object, typeof (_h = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _h : Object]), + __metadata("design:returntype", Promise) +], JsonSchemaController.prototype, "processReadData", null); +__decorate([ + (0, common_1.Post)('migrate/:table/:id'), + (0, common_1.HttpCode)(common_1.HttpStatus.OK), + (0, swagger_1.ApiOperation)({ + summary: 'Migrate specific entity data to target schema version', + }), + (0, swagger_1.ApiParam)({ name: 'table', description: 'Table Name (e.g. rfa_revisions)' }), + (0, swagger_1.ApiParam)({ name: 'id', description: 'Entity ID' }), + (0, require_permission_decorator_1.RequirePermission)('system.manage_all') // Dangerous Op -> Admin Only + , + __param(0, (0, common_1.Param)('table')), + __param(1, (0, common_1.Param)('id', common_1.ParseIntPipe)), + __param(2, (0, common_1.Body)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, Number, typeof (_j = typeof migrate_data_dto_1.MigrateDataDto !== "undefined" && migrate_data_dto_1.MigrateDataDto) === "function" ? _j : Object]), + __metadata("design:returntype", Promise) +], JsonSchemaController.prototype, "migrateData", null); +exports.JsonSchemaController = JsonSchemaController = __decorate([ + (0, swagger_1.ApiTags)('JSON Schemas Management'), + (0, swagger_1.ApiBearerAuth)(), + (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard, rbac_guard_1.RbacGuard), + (0, common_1.Controller)('json-schemas'), + __metadata("design:paramtypes", [typeof (_a = typeof json_schema_service_1.JsonSchemaService !== "undefined" && json_schema_service_1.JsonSchemaService) === "function" ? _a : Object, typeof (_b = typeof schema_migration_service_1.SchemaMigrationService !== "undefined" && schema_migration_service_1.SchemaMigrationService) === "function" ? _b : Object]) +], JsonSchemaController); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcanNvbi1zY2hlbWFcXGpzb24tc2NoZW1hLmNvbnRyb2xsZXIudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDBEQUEwRDtBQUMxRCwyQ0Fhd0I7QUFDeEIsNkNBTXlCO0FBRXpCLCtEQUEwRDtBQUMxRCxrRkFBNkU7QUFFN0UseUVBQW1FO0FBQ25FLDZEQUF3RDtBQUN4RCx5RUFBbUU7QUFDbkUseUVBQW1FO0FBRW5FLDJGQUE2RTtBQUM3RSx1R0FBeUY7QUFDekYsdUVBQWtFO0FBQ2xFLCtEQUEyRDtBQUMzRCw4REFBb0Q7QUFNN0MsSUFBTSxvQkFBb0IsR0FBMUIsTUFBTSxvQkFBb0I7SUFDL0IsWUFDbUIsaUJBQW9DLEVBQ3BDLGdCQUF3QztRQUR4QyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBd0I7SUFDeEQsQ0FBQztJQUVKLHlFQUF5RTtJQUN6RSwyQkFBMkI7SUFDM0IseUVBQXlFO0lBV3pFLE1BQU0sQ0FBUyxTQUE4QjtRQUMzQyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUtELE9BQU8sQ0FBVSxTQUE4QjtRQUM3QyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUtELE9BQU8sQ0FBNEIsRUFBVTtRQUMzQyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQVFELFVBQVUsQ0FBZ0IsSUFBWTtRQUNwQyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBT0QsTUFBTSxDQUN1QixFQUFVLEVBQzdCLFNBQThCO1FBRXRDLE9BQU8sSUFBSSxDQUFDLGlC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SUFDbEMsSUFBQSxtQkFBVSxFQUFDLGNBQWMsQ0FBQzt5REFHYSx1Q0FBaUIsb0JBQWpCLHVDQUFpQixvREFDbEIsaURBQXNCLG9CQUF0QixpREFBc0I7R0FIaEQsb0JBQW9CLENBc0loQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxqc29uLXNjaGVtYVxcanNvbi1zY2hlbWEuY29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGaWxlOiBzcmMvbW9kdWxlcy9qc29uLXNjaGVtYS9qc29uLXNjaGVtYS5jb250cm9sbGVyLnRzXG5pbXBvcnQge1xuICBCb2R5LFxuICBDb250cm9sbGVyLFxuICBEZWxldGUsXG4gIEdldCxcbiAgSHR0cENvZGUsXG4gIEh0dHBTdGF0dXMsXG4gIFBhcmFtLFxuICBQYXJzZUludFBpcGUsXG4gIFBhdGNoLFxuICBQb3N0LFxuICBRdWVyeSxcbiAgVXNlR3VhcmRzLFxufSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XG5pbXBvcnQge1xuICBBcGlCZWFyZXJBdXRoLFxuICBBcGlPcGVyYXRpb24sXG4gIEFwaVBhcmFtLFxuICBBcGlSZXNwb25zZSxcbiAgQXBpVGFncyxcbn0gZnJvbSAnQG5lc3Rqcy9zd2FnZ2VyJztcblxuaW1wb3J0IHsgSnNvblNjaGVtYVNlcnZpY2UgfSBmcm9tICcuL2pzb24tc2NoZW1hLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2NoZW1hTWlncmF0aW9uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvc2NoZW1hLW1pZ3JhdGlvbi5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQ3JlYXRlSnNvblNjaGVtYUR0byB9IGZyb20gJy4vZHRvL2NyZWF0ZS1qc29uLXNjaGVtYS5kdG8nO1xuaW1wb3J0IHsgTWlncmF0ZURhdGFEdG8gfSBmcm9tICcuL2R0by9taWdyYXRlLWRhdGEuZHRvJztcbmltcG9ydCB7IFNlYXJjaEpzb25TY2hlbWFEdG8gfSBmcm9tICcuL2R0by9zZWFyY2gtanNvbi1zY2hlbWEuZHRvJztcbmltcG9ydCB7IFVwZGF0ZUpzb25TY2hlbWFEdG8gfSBmcm9tICcuL2R0by91cGRhdGUtanNvbi1zY2hlbWEuZHRvJztcblxuaW1wb3J0IHsgQ3VycmVudFVzZXIgfSBmcm9tICcuLi8uLi9jb21tb24vZGVjb3JhdG9ycy9jdXJyZW50LXVzZXIuZGVjb3JhdG9yJztcbmltcG9ydCB7IFJlcXVpcmVQZXJtaXNzaW9uIH0gZnJvbSAnLi4vLi4vY29tbW9uL2RlY29yYXRvcnMvcmVxdWlyZS1wZXJtaXNzaW9uLmRlY29yYXRvcic7XG5pbXBvcnQgeyBKd3RBdXRoR3VhcmQgfSBmcm9tICcuLi8uLi9jb21tb24vZ3VhcmRzL2p3dC1hdXRoLmd1YXJkJztcbmltcG9ydCB7IFJiYWNHdWFyZCB9IGZyb20gJy4uLy4uL2NvbW1vbi9ndWFyZHMvcmJhYy5ndWFyZCc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vdXNlci9lbnRpdGllcy91c2VyLmVudGl0eSc7XG5cbkBBcGlUYWdzKCdKU09OIFNjaGVtYXMgTWFuYWdlbWVudCcpXG5AQXBpQmVhcmVyQXV0aCgpXG5AVXNlR3VhcmRzKEp3dEF1dGhHdWFyZCwgUmJhY0d1YXJkKVxuQENvbnRyb2xsZXIoJ2pzb24tc2NoZW1hcycpXG5leHBvcnQgY2xhc3MgSnNvblNjaGVtYUNvbnRyb2xsZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGpzb25TY2hlbWFTZXJ2aWNlOiBKc29uU2NoZW1hU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1pZ3JhdGlvblNlcnZpY2U6IFNjaGVtYU1pZ3JhdGlvblNlcnZpY2VcbiAgKSB7fVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gU2NoZW1hIE1hbmFnZW1lbnQgKENSVUQpXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBAUG9zdCgpXG4gIEBBcGlPcGVyYXRpb24oe1xuICAgIHN1bW1hcnk6ICdDcmVhdGUgYSBuZXcgc2NoZW1hIG9yIG5ldyB2ZXJzaW9uIG9mIGV4aXN0aW5nIHNjaGVtYScsXG4gIH0pXG4gIEBBcGlSZXNwb25zZSh7XG4gICAgc3RhdHVzOiAyMDEsXG4gICAgZGVzY3JpcHRpb246ICdUaGUgc2NoZW1hIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLicsXG4gIH0pXG4gIEBSZXF1aXJlUGVybWlzc2lvbignc3lzdGVtLm1hbmFnZV9hbGwnKSAvLyBBZG1pbiBPbmx5XG4gIGNyZWF0ZShAQm9keSgpIGNyZWF0ZUR0bzogQ3JlYXRlSnNvblNjaGVtYUR0bykge1xuICAgIHJldHVybiB0aGlzLmpzb25TY2hlbWFTZXJ2aWNlLmNyZWF0ZShjcmVhdGVEdG8pO1xuICB9XG5cbiAgQEdldCgpXG4gIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiAnTGlzdCBhbGwgc2NoZW1hcyB3aXRoIHBhZ2luYXRpb24gYW5kIGZpbHRlcmluZycgfSlcbiAgQFJlcXVpcmVQZXJtaXNzaW9uKCdkb2N1bWVudC52aWV3JykgLy8gVmlld2VyKyBjYW4gc2VlIHNjaGVtYXNcbiAgZmluZEFsbChAUXVlcnkoKSBzZWFyY2hEdG86IFNlYXJjaEpzb25TY2hlbWFEdG8pIHtcbiAgICByZXR1cm4gdGhpcy5qc29uU2NoZW1hU2VydmljZS5maW5kQWxsKHNlYXJjaER0byk7XG4gIH1cblxuICBAR2V0KCc6aWQnKVxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ0dldCBhIHNwZWNpZmljIHNjaGVtYSB2ZXJzaW9uIGJ5IElEJyB9KVxuICBAUmVxdWlyZVBlcm1pc3Npb24oJ2RvY3VtZW50LnZpZXcnKVxuICBmaW5kT25lKEBQYXJhbSgnaWQnLCBQYXJzZUludFBpcGUpIGlkOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5qc29uU2NoZW1hU2VydmljZS5maW5kT25lKGlkKTtcbiAgfVxuXG4gIEBHZXQoJ2xhdGVzdC86Y29kZScpXG4gIEBBcGlPcGVyYXRpb24oe1xuICAgIHN1bW1hcnk6ICdHZXQgdGhlIGxhdGVzdCBhY3RpdmUgdmVyc2lvbiBvZiBhIHNjaGVtYSBieSBjb2RlJyxcbiAgfSlcbiAgQEFwaVBhcmFtKHsgbmFtZTogJ2NvZGUnLCBkZXNjcmlwdGlvbjogJ1NjaGVtYSBDb2RlIChlLmcuLCBSRkFfRFdHKScgfSlcbiAgQFJlcXVpcmVQZXJtaXNzaW9uKCdkb2N1bWVudC52aWV3JylcbiAgZmluZExhdGVzdChAUGFyYW0oJ2NvZGUnKSBjb2RlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5qc29uU2NoZW1hU2VydmljZS5maW5kTGF0ZXN0QnlDb2RlKGNvZGUpO1xuICB9XG5cbiAgQFBhdGNoKCc6aWQnKVxuICBAQXBpT3BlcmF0aW9uKHtcbiAgICBzdW1tYXJ5OiAnVXBkYXRlIGEgc3BlY2lmaWMgc2NoZW1hIChOb3QgcmVjb21tZW5kZWQgZm9yIGFjdGl2ZSBzY2hlbWFzKScsXG4gIH0pXG4gIEBSZXF1aXJlUGVybWlzc2lvbignc3lzdGVtLm1hbmFnZV9hbGwnKVxuICB1cGRhdGUoXG4gICAgQFBhcmFtKCdpZCcsIFBhcnNlSW50UGlwZSkgaWQ6IG51bWJlcixcbiAgICBAQm9keSgpIHVwZGF0ZUR0bzogVXBkYXRlSnNvblNjaGVtYUR0b1xuICApIHtcbiAgICByZXR1cm4gdGhpcy5qc29uU2NoZW1hU2VydmljZS51cGRhdGUoaWQsIHVwZGF0ZUR0byk7XG4gIH1cblxuICBARGVsZXRlKCc6aWQnKVxuICBAQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogJ0RlbGV0ZSBhIHNjaGVtYSB2ZXJzaW9uIChIYXJkIERlbGV0ZSknIH0pXG4gIEBSZXF1aXJlUGVybWlzc2lvbignc3lzdGVtLm1hbmFnZV9hbGwnKVxuICByZW1vdmUoQFBhcmFtKCdpZCcsIFBhcnNlSW50UGlwZSkgaWQ6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmpzb25TY2hlbWFTZXJ2aWNlLnJlbW92ZShpZCk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFZhbGlkYXRpb24gJiBTZWN1cml0eVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgQFBvc3QoJ3ZhbGlkYXRlLzpjb2RlJylcbiAgQEh0dHBDb2RlKEh0dHBTdGF0dXMuT0spXG4gIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiAnVmFsaWRhdGUgZGF0YSBhZ2FpbnN0IHRoZSBsYXRlc3Qgc2NoZW1hIHZlcnNpb24nIH0pXG4gIEBBcGlSZXNwb25zZSh7XG4gICAgc3RhdHVzOiAyMDAsXG4gICAgZGVzY3JpcHRpb246ICdWYWxpZGF0aW9uIHJlc3VsdCBpbmNsdWRpbmcgZXJyb3JzIGFuZCBzYW5pdGl6ZWQgZGF0YScsXG4gIH0pXG4gIEBSZXF1aXJlUGVybWlzc2lvbignZG9jdW1lbnQudmlldycpXG4gIGFzeW5jIHZhbGlkYXRlKFxuICAgIEBQYXJhbSgnY29kZScpIGNvZGU6IHN0cmluZyxcbiAgICBAQm9keSgpIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICkge1xuICAgIC8vIE5vdGU6IFZhbGlkYXRpb24gQVBJIOC4meC4teC5ieC5g+C4iuC5ieC4quC4s+C4q+C4o+C4seC4miBUZXN0IOC4q+C4o+C4t+C4rSBQcmUtY2hlY2sg4LmA4LiX4LmI4Liy4LiZ4Lix4LmJ4LiZXG4gICAgLy8g4LiB4Liy4LijIFNhdmUg4LiI4Lij4Li04LiH4LiI4Liw4LmA4Lij4Li14Lii4LiB4Lic4LmI4Liy4LiZIFNlcnZpY2Ug4Lig4Liy4Lii4LmD4LiZXG4gICAgcmV0dXJuIHRoaXMuanNvblNjaGVtYVNlcnZpY2UudmFsaWRhdGVEYXRhKGNvZGUsIGRhdGEpO1xuICB9XG5cbiAgQFBvc3QoJ3JlYWQvOmNvZGUnKVxuICBASHR0cENvZGUoSHR0cFN0YXR1cy5PSylcbiAgQEFwaU9wZXJhdGlvbih7XG4gICAgc3VtbWFyeTogJ1Byb2Nlc3MgcmVhZCBkYXRhIChEZWNyeXB0ICYgRmlsdGVyKSBiYXNlZCBvbiB1c2VyIHJvbGVzJyxcbiAgfSlcbiAgQFJlcXVpcmVQZXJtaXNzaW9uKCdkb2N1bWVudC52aWV3JylcbiAgYXN5bmMgcHJvY2Vzc1JlYWREYXRhKFxuICAgIEBQYXJhbSgnY29kZScpIGNvZGU6IHN0cmluZyxcbiAgICBAQm9keSgpIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIEBDdXJyZW50VXNlcigpIHVzZXI6IFVzZXJcbiAgKSB7XG4gICAgLy8g4LmB4Lib4Lil4LiHIFVzZXIgRW50aXR5IOC5gOC4m+C5h+C4mSBTZWN1cml0eSBDb250ZXh0XG4gICAgLy8gcm9sZXMg4Lih4Lix4LiB4LiI4Liw4LiW4Li54LiBIGluamVjdCDguYDguILguYnguLLguKHguLLguYPguJkgcmVxdWVzdC51c2VyIOC5guC4lOC4oiBTdHJhdGVneSDguKvguKPguLfguK0gR3VhcmQg4LmB4Lih4LmJ4LiI4Liw4LmE4Lih4LmI4Lih4Li14LmD4LiZIEVudGl0eSDguKvguKXguLHguIFcbiAgICBjb25zdCB1c2VyV2l0aFJvbGVzID0gdXNlciBhcyBVc2VyICYge1xuICAgICAgcm9sZXM/OiBBcnJheTx7IHJvbGVOYW1lOiBzdHJpbmcgfSB8IHN0cmluZz47XG4gICAgfTtcbiAgICBjb25zdCB1c2VyUm9sZXMgPSB1c2VyV2l0aFJvbGVzLnJvbGVzXG4gICAgICA/IHVzZXJXaXRoUm9sZXMucm9sZXMubWFwKChyKSA9PiAodHlwZW9mIHIgPT09ICdzdHJpbmcnID8gciA6IHIucm9sZU5hbWUpKSAvLyDguKPguK3guIfguKPguLHguJrguJfguLHguYnguIcgT2JqZWN0IFJvbGUg4LmB4Lil4LiwIFN0cmluZyBSb2xlXG4gICAgICA6IFtdO1xuXG4gICAgcmV0dXJuIHRoaXMuanNvblNjaGVtYVNlcnZpY2UucHJvY2Vzc1JlYWREYXRhKGNvZGUsIGRhdGEsIHsgdXNlclJvbGVzIH0pO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBEYXRhIE1pZ3JhdGlvblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgQFBvc3QoJ21pZ3JhdGUvOnRhYmxlLzppZCcpXG4gIEBIdHRwQ29kZShIdHRwU3RhdHVzLk9LKVxuICBAQXBpT3BlcmF0aW9uKHtcbiAgICBzdW1tYXJ5OiAnTWlncmF0ZSBzcGVjaWZpYyBlbnRpdHkgZGF0YSB0byB0YXJnZXQgc2NoZW1hIHZlcnNpb24nLFxuICB9KVxuICBAQXBpUGFyYW0oeyBuYW1lOiAndGFibGUnLCBkZXNjcmlwdGlvbjogJ1RhYmxlIE5hbWUgKGUuZy4gcmZhX3JldmlzaW9ucyknIH0pXG4gIEBBcGlQYXJhbSh7IG5hbWU6ICdpZCcsIGRlc2NyaXB0aW9uOiAnRW50aXR5IElEJyB9KVxuICBAUmVxdWlyZVBlcm1pc3Npb24oJ3N5c3RlbS5tYW5hZ2VfYWxsJykgLy8gRGFuZ2Vyb3VzIE9wIC0+IEFkbWluIE9ubHlcbiAgYXN5bmMgbWlncmF0ZURhdGEoXG4gICAgQFBhcmFtKCd0YWJsZScpIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIEBQYXJhbSgnaWQnLCBQYXJzZUludFBpcGUpIGlkOiBudW1iZXIsXG4gICAgQEJvZHkoKSBkdG86IE1pZ3JhdGVEYXRhRHRvXG4gICkge1xuICAgIHJldHVybiB0aGlzLm1pZ3JhdGlvblNlcnZpY2UubWlncmF0ZURhdGEoXG4gICAgICB0YWJsZU5hbWUsXG4gICAgICBpZCxcbiAgICAgIGR0by50YXJnZXRTY2hlbWFDb2RlLFxuICAgICAgZHRvLnRhcmdldFZlcnNpb25cbiAgICApO1xuICB9XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/jsonschemacontroller_df3af79a98cd0cc3642b18f0befcdf94.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/jsonschemacontroller_df3af79a98cd0cc3642b18f0befcdf94.map new file mode 100644 index 0000000..d9ba2d4 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/jsonschemacontroller_df3af79a98cd0cc3642b18f0befcdf94.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\json-schema.controller.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\json-schema.controller.ts"],"sourcesContent":["// File: src/modules/json-schema/json-schema.controller.ts\nimport {\n Body,\n Controller,\n Delete,\n Get,\n HttpCode,\n HttpStatus,\n Param,\n ParseIntPipe,\n Patch,\n Post,\n Query,\n UseGuards,\n} from '@nestjs/common';\nimport {\n ApiBearerAuth,\n ApiOperation,\n ApiParam,\n ApiResponse,\n ApiTags,\n} from '@nestjs/swagger';\n\nimport { JsonSchemaService } from './json-schema.service';\nimport { SchemaMigrationService } from './services/schema-migration.service';\n\nimport { CreateJsonSchemaDto } from './dto/create-json-schema.dto';\nimport { MigrateDataDto } from './dto/migrate-data.dto';\nimport { SearchJsonSchemaDto } from './dto/search-json-schema.dto';\nimport { UpdateJsonSchemaDto } from './dto/update-json-schema.dto';\n\nimport { CurrentUser } from '../../common/decorators/current-user.decorator';\nimport { RequirePermission } from '../../common/decorators/require-permission.decorator';\nimport { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';\nimport { RbacGuard } from '../../common/guards/rbac.guard';\nimport { User } from '../user/entities/user.entity';\n\n@ApiTags('JSON Schemas Management')\n@ApiBearerAuth()\n@UseGuards(JwtAuthGuard, RbacGuard)\n@Controller('json-schemas')\nexport class JsonSchemaController {\n constructor(\n private readonly jsonSchemaService: JsonSchemaService,\n private readonly migrationService: SchemaMigrationService\n ) {}\n\n // ----------------------------------------------------------------------\n // Schema Management (CRUD)\n // ----------------------------------------------------------------------\n\n @Post()\n @ApiOperation({\n summary: 'Create a new schema or new version of existing schema',\n })\n @ApiResponse({\n status: 201,\n description: 'The schema has been successfully created.',\n })\n @RequirePermission('system.manage_all') // Admin Only\n create(@Body() createDto: CreateJsonSchemaDto) {\n return this.jsonSchemaService.create(createDto);\n }\n\n @Get()\n @ApiOperation({ summary: 'List all schemas with pagination and filtering' })\n @RequirePermission('document.view') // Viewer+ can see schemas\n findAll(@Query() searchDto: SearchJsonSchemaDto) {\n return this.jsonSchemaService.findAll(searchDto);\n }\n\n @Get(':id')\n @ApiOperation({ summary: 'Get a specific schema version by ID' })\n @RequirePermission('document.view')\n findOne(@Param('id', ParseIntPipe) id: number) {\n return this.jsonSchemaService.findOne(id);\n }\n\n @Get('latest/:code')\n @ApiOperation({\n summary: 'Get the latest active version of a schema by code',\n })\n @ApiParam({ name: 'code', description: 'Schema Code (e.g., RFA_DWG)' })\n @RequirePermission('document.view')\n findLatest(@Param('code') code: string) {\n return this.jsonSchemaService.findLatestByCode(code);\n }\n\n @Patch(':id')\n @ApiOperation({\n summary: 'Update a specific schema (Not recommended for active schemas)',\n })\n @RequirePermission('system.manage_all')\n update(\n @Param('id', ParseIntPipe) id: number,\n @Body() updateDto: UpdateJsonSchemaDto\n ) {\n return this.jsonSchemaService.update(id, updateDto);\n }\n\n @Delete(':id')\n @ApiOperation({ summary: 'Delete a schema version (Hard Delete)' })\n @RequirePermission('system.manage_all')\n remove(@Param('id', ParseIntPipe) id: number) {\n return this.jsonSchemaService.remove(id);\n }\n\n // ----------------------------------------------------------------------\n // Validation & Security\n // ----------------------------------------------------------------------\n\n @Post('validate/:code')\n @HttpCode(HttpStatus.OK)\n @ApiOperation({ summary: 'Validate data against the latest schema version' })\n @ApiResponse({\n status: 200,\n description: 'Validation result including errors and sanitized data',\n })\n @RequirePermission('document.view')\n async validate(\n @Param('code') code: string,\n @Body() data: Record\n ) {\n // Note: Validation API นี้ใช้สำหรับ Test หรือ Pre-check เท่านั้น\n // การ Save จริงจะเรียกผ่าน Service ภายใน\n return this.jsonSchemaService.validateData(code, data);\n }\n\n @Post('read/:code')\n @HttpCode(HttpStatus.OK)\n @ApiOperation({\n summary: 'Process read data (Decrypt & Filter) based on user roles',\n })\n @RequirePermission('document.view')\n async processReadData(\n @Param('code') code: string,\n @Body() data: Record,\n @CurrentUser() user: User\n ) {\n // แปลง User Entity เป็น Security Context\n // roles มักจะถูก inject เข้ามาใน request.user โดย Strategy หรือ Guard แม้จะไม่มีใน Entity หลัก\n const userWithRoles = user as User & {\n roles?: Array<{ roleName: string } | string>;\n };\n const userRoles = userWithRoles.roles\n ? userWithRoles.roles.map((r) => (typeof r === 'string' ? r : r.roleName)) // รองรับทั้ง Object Role และ String Role\n : [];\n\n return this.jsonSchemaService.processReadData(code, data, { userRoles });\n }\n\n // ----------------------------------------------------------------------\n // Data Migration\n // ----------------------------------------------------------------------\n\n @Post('migrate/:table/:id')\n @HttpCode(HttpStatus.OK)\n @ApiOperation({\n summary: 'Migrate specific entity data to target schema version',\n })\n @ApiParam({ name: 'table', description: 'Table Name (e.g. rfa_revisions)' })\n @ApiParam({ name: 'id', description: 'Entity ID' })\n @RequirePermission('system.manage_all') // Dangerous Op -> Admin Only\n async migrateData(\n @Param('table') tableName: string,\n @Param('id', ParseIntPipe) id: number,\n @Body() dto: MigrateDataDto\n ) {\n return this.migrationService.migrateData(\n tableName,\n id,\n dto.targetSchemaCode,\n dto.targetVersion\n );\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/jsonsecurityservice_dfc24cb882be3c83955914f235f463d5 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/jsonsecurityservice_dfc24cb882be3c83955914f235f463d5 new file mode 100644 index 0000000..59eab36 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/jsonsecurityservice_dfc24cb882be3c83955914f235f463d5 @@ -0,0 +1,108 @@ +ead1d7b154ca83a2638455ae76606ffa +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.JsonSecurityService = void 0; +// File: src/modules/json-schema/services/json-security.service.ts +const common_1 = require("@nestjs/common"); +const crypto_service_1 = require("../../../common/services/crypto.service"); +let JsonSecurityService = class JsonSecurityService { + constructor(cryptoService) { + this.cryptoService = cryptoService; + } + /** + * ขาเข้า (Write): เข้ารหัสข้อมูล Sensitive ก่อนบันทึก + */ + encryptFields(data, schemaDefinition) { + if (!data || typeof data !== 'object') + return data; + const processed = { ...data }; + // Traverse schema properties + const properties = schemaDefinition.properties; + if (properties) { + for (const [key, propSchema] of Object.entries(properties)) { + if (data[key] !== undefined) { + // 1. Check encryption flag + if (propSchema['x-encrypt'] === true) { + processed[key] = this.cryptoService.encrypt(data[key]); + } + // 2. Recursive for nested objects/arrays + if (propSchema.type === 'object' && propSchema.properties) { + processed[key] = this.encryptFields(data[key], propSchema); + } + else if (propSchema.type === 'array' && propSchema.items) { + if (Array.isArray(data[key])) { + processed[key] = data[key].map((item) => this.encryptFields(item, propSchema.items)); + } + } + } + } + } + return processed; + } + /** + * ขาออก (Read): ถอดรหัส และ กรองข้อมูลตามสิทธิ์ + */ + decryptAndFilterFields(data, schemaDefinition, context) { + if (!data || typeof data !== 'object') + return data; + // Clone data to avoid mutation + const processed = { ...data }; + const properties = schemaDefinition.properties; + if (properties) { + for (const [key, propSchema] of Object.entries(properties)) { + if (data[key] !== undefined) { + // 1. Decrypt (ถ้ามีค่าและถูกเข้ารหัสไว้) + if (propSchema['x-encrypt'] === true) { + processed[key] = this.cryptoService.decrypt(data[key]); + } + // 2. Security Check (Role-based Access Control) + if (propSchema['x-security']) { + const rule = propSchema['x-security']; + const requiredRoles = rule.roles || []; + const hasPermission = requiredRoles.some((role) => context.userRoles.includes(role) || + context.userRoles.includes('SUPERADMIN')); + if (!hasPermission) { + if (rule.onDeny === 'REMOVE') { + delete processed[key]; + continue; // ข้ามไป field ถัดไป + } + else { + // Default: MASK + processed[key] = '********'; + } + } + } + // 3. Recursive for nested objects/arrays + // (ทำต่อเมื่อ Field ยังไม่ถูกลบ) + if (processed[key] !== undefined) { + if (propSchema.type === 'object' && propSchema.properties) { + processed[key] = this.decryptAndFilterFields(processed[key], propSchema, context); + } + else if (propSchema.type === 'array' && propSchema.items) { + if (Array.isArray(processed[key])) { + processed[key] = processed[key].map((item) => this.decryptAndFilterFields(item, propSchema.items, context)); + } + } + } + } + } + } + return processed; + } +}; +exports.JsonSecurityService = JsonSecurityService; +exports.JsonSecurityService = JsonSecurityService = __decorate([ + (0, common_1.Injectable)(), + __metadata("design:paramtypes", [typeof (_a = typeof crypto_service_1.CryptoService !== "undefined" && crypto_service_1.CryptoService) === "function" ? _a : Object]) +], JsonSecurityService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcanNvbi1zY2hlbWFcXHNlcnZpY2VzXFxqc29uLXNlY3VyaXR5LnNlcnZpY2UudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLGtFQUFrRTtBQUNsRSwyQ0FBNEM7QUFDNUMsNEVBQXdFO0FBT2pFLElBQU0sbUJBQW1CLEdBQXpCLE1BQU0sbUJBQW1CO0lBQzlCLFlBQTZCLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO0lBQUcsQ0FBQztJQUU3RDs7T0FFRztJQUNILGFBQWEsQ0FDWCxJQUE2QixFQUM3QixnQkFBeUM7UUFFekMsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDbkQsTUFBTSxTQUFTLEdBQTRCLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUV2RCw2QkFBNkI7UUFDN0IsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsVUFFdkIsQ0FBQztRQUNkLElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUMzRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDNUIsMkJBQTJCO29CQUMzQixJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQzt3QkFDckMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUN6QyxJQUFJLENBQUMsR0FBRyxDQUE4QixDQUN2QyxDQUFDO29CQUNKLENBQUM7b0JBRUQseUNBQXlDO29CQUN6QyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQzt3QkFDMUQsU0FBUyxDQUFD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U0FBUyxDQUFDLEdBQUcsQ0FBNEIsRUFDekMsVUFBVSxFQUNWLE9BQU8sQ0FDUixDQUFDO3dCQUNKLENBQUM7NkJBQU0sSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7NEJBQzNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO2dDQUNsQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQ1osU0FBUyxDQUFDLEdBQUcsQ0FDZCxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ2IsSUFBSSxDQUFDLHNCQUFzQixDQUN6QixJQUFJLEVBQ0osVUFBVSxDQUFDLEtBQWdDLEVBQzNDLE9BQU8sQ0FDUixDQUNGLENBQUM7NEJBQ0osQ0FBQzt3QkFDSCxDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztDQUNGLENBQUE7QUEzSFksa0RBQW1COzhCQUFuQixtQkFBbUI7SUFEL0IsSUFBQSxtQkFBVSxHQUFFO3lEQUVpQyw4QkFBYSxvQkFBYiw4QkFBYTtHQUQ5QyxtQkFBbUIsQ0EySC9CIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGpzb24tc2NoZW1hXFxzZXJ2aWNlc1xcanNvbi1zZWN1cml0eS5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEZpbGU6IHNyYy9tb2R1bGVzL2pzb24tc2NoZW1hL3NlcnZpY2VzL2pzb24tc2VjdXJpdHkuc2VydmljZS50c1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcbmltcG9ydCB7IENyeXB0b1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vc2VydmljZXMvY3J5cHRvLnNlcnZpY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5Q29udGV4dCB7XG4gIHVzZXJSb2xlczogc3RyaW5nW107IC8vIFJvbGUg4LiC4Lit4LiHIHVzZXIg4Lib4Lix4LiI4LiI4Li44Lia4Lix4LiZICjguYDguIrguYjguJkgWydFRElUT1InLCAndmlld2VyJ10pXG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBKc29uU2VjdXJpdHlTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjcnlwdG9TZXJ2aWNlOiBDcnlwdG9TZXJ2aWNlKSB7fVxuXG4gIC8qKlxuICAgKiDguILguLLguYDguILguYnguLIgKFdyaXRlKTog4LmA4LiC4LmJ4Liy4Lij4Lir4Lix4Liq4LiC4LmJ4Lit4Lih4Li54LilIFNlbnNpdGl2ZSDguIHguYjguK3guJnguJrguLHguJnguJfguLbguIFcbiAgICovXG4gIGVuY3J5cHRGaWVsZHMoXG4gICAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgc2NoZW1hRGVmaW5pdGlvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHJldHVybiBkYXRhO1xuICAgIGNvbnN0IHByb2Nlc3NlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IC4uLmRhdGEgfTtcblxuICAgIC8vIFRyYXZlcnNlIHNjaGVtYSBwcm9wZXJ0aWVzXG4gICAgY29uc3QgcHJvcGVydGllcyA9IHNjaGVtYURlZmluaXRpb24ucHJvcGVydGllcyBhc1xuICAgICAgfCBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGlmIChwcm9wZXJ0aWVzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHByb3BTY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BlcnRpZXMpKSB7XG4gICAgICAgIGlmIChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIDEuIENoZWNrIGVuY3J5cHRpb24gZmxhZ1xuICAgICAgICAgIGlmIChwcm9wU2NoZW1hWyd4LWVuY3J5cHQnXSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcHJvY2Vzc2VkW2tleV0gPSB0aGlzLmNyeXB0b1NlcnZpY2UuZW5jcnlwdChcbiAgICAgICAgICAgICAgZGF0YVtrZXldIGFzIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gMi4gUmVjdXJzaXZlIGZvciBuZXN0ZWQgb2JqZWN0cy9hcnJheXNcbiAgICAgICAgICBpZiAocHJvcFNjaGVtYS50eXBlID09PSAnb2JqZWN0JyAmJiBwcm9wU2NoZW1hLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIHByb2Nlc3NlZFtrZXldID0gdGhpcy5lbmNyeXB0RmllbGRzKFxuICAgICAgICAgICAgICBkYXRhW2tleV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICAgIHByb3BTY2hlbWFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChwcm9wU2NoZW1hLnR5cGUgPT09ICdhcnJheScgJiYgcHJvcFNjaGVtYS5pdGVtcykge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YVtrZXldKSkge1xuICAgICAgICAgICAgICBwcm9jZXNzZWRba2V5XSA9IChkYXRhW2tleV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSkubWFwKFxuICAgICAgICAgICAgICAgIChpdGVtKSA9PlxuICAgICAgICAgICAgICAgICAgdGhpcy5lbmNyeXB0RmllbGRzKFxuICAgICAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgICAgICBwcm9wU2NoZW1hLml0ZW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9jZXNzZWQ7XG4gIH1cblxuICAvKipcbiAgICog4LiC4Liy4Lit4Lit4LiBIChSZWFkKTog4LiW4Lit4LiU4Lij4Lir4Lix4LiqIOC5geC4peC4sCDguIHguKPguK3guIfguILguYnguK3guKHguLnguKXguJXguLLguKHguKrguLTguJfguJjguLTguYxcbiAgICovXG4gIGRlY3J5cHRBbmRGaWx0ZXJGaWVsZHMoXG4gICAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgc2NoZW1hRGVmaW5pdGlvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgY29udGV4dDogU2VjdXJpdHlDb250ZXh0XG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSByZXR1cm4gZGF0YTtcblxuICAgIC8vIENsb25lIGRhdGEgdG8gYXZvaWQgbXV0YXRpb25cbiAgICBjb25zdCBwcm9jZXNzZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyAuLi5kYXRhIH07XG5cbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gc2NoZW1hRGVmaW5pdGlvbi5wcm9wZXJ0aWVzIGFzXG4gICAgICB8IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHByb3BlcnRpZXMpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgcHJvcFNjaGVtYV0gb2YgT2JqZWN0LmVudHJpZXMocHJvcGVydGllcykpIHtcbiAgICAgICAgaWYgKGRhdGFba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gMS4gRGVjcnlwdCAo4LiW4LmJ4Liy4Lih4Li14LiE4LmI4Liy4LmB4Lil4Liw4LiW4Li54LiB4LmA4LiC4LmJ4Liy4Lij4Lir4Lix4Liq4LmE4Lin4LmJKVxuICAgICAgICAgIGlmIChwcm9wU2NoZW1hWyd4LWVuY3J5cHQnXSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcHJvY2Vzc2VkW2tleV0gPSB0aGlzLmNyeXB0b1NlcnZpY2UuZGVjcnlwdChkYXRhW2tleV0gYXMgc3RyaW5nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyAyLiBTZWN1cml0eSBDaGVjayAoUm9sZS1iYXNlZCBBY2Nlc3MgQ29udHJvbClcbiAgICAgICAgICBpZiAocHJvcFNjaGVtYVsneC1zZWN1cml0eSddKSB7XG4gICAgICAgICAgICBjb25zdCBydWxlID0gcHJvcFNjaGVtYVsneC1zZWN1cml0eSddIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgICAgY29uc3QgcmVxdWlyZWRSb2xlcyA9IChydWxlLnJvbGVzIGFzIHN0cmluZ1tdKSB8fCBbXTtcbiAgICAgICAgICAgIGNvbnN0IGhhc1Blcm1pc3Npb24gPSByZXF1aXJlZFJvbGVzLnNvbWUoXG4gICAgICAgICAgICAgIChyb2xlOiBzdHJpbmcpID0+XG4gICAgICAgICAgICAgICAgY29udGV4dC51c2VyUm9sZXMuaW5jbHVkZXMocm9sZSkgfHxcbiAgICAgICAgICAgICAgICBjb250ZXh0LnVzZXJSb2xlcy5pbmNsdWRlcygnU1VQRVJBRE1JTicpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoIWhhc1Blcm1pc3Npb24pIHtcbiAgICAgICAgICAgICAgaWYgKHJ1bGUub25EZW55ID09PSAnUkVNT1ZFJykge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBwcm9jZXNzZWRba2V5XTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8g4LiC4LmJ4Liy4Lih4LmE4LibIGZpZWxkIOC4luC4seC4lOC5hOC4m1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIERlZmF1bHQ6IE1BU0tcbiAgICAgICAgICAgICAgICBwcm9jZXNzZWRba2V5XSA9ICcqKioqKioqKic7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyAzLiBSZWN1cnNpdmUgZm9yIG5lc3RlZCBvYmplY3RzL2FycmF5c1xuICAgICAgICAgIC8vICjguJfguLPguJXguYjguK3guYDguKHguLfguYjguK0gRmllbGQg4Lii4Lix4LiH4LmE4Lih4LmI4LiW4Li54LiB4Lil4LiaKVxuICAgICAgICAgIGlmIChwcm9jZXNzZWRba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAocHJvcFNjaGVtYS50eXBlID09PSAnb2JqZWN0JyAmJiBwcm9wU2NoZW1hLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgcHJvY2Vzc2VkW2tleV0gPSB0aGlzLmRlY3J5cHRBbmRGaWx0ZXJGaWVsZHMoXG4gICAgICAgICAgICAgICAgcHJvY2Vzc2VkW2tleV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICAgICAgcHJvcFNjaGVtYSxcbiAgICAgICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BTY2hlbWEudHlwZSA9PT0gJ2FycmF5JyAmJiBwcm9wU2NoZW1hLml0ZW1zKSB7XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb2Nlc3NlZFtrZXldKSkge1xuICAgICAgICAgICAgICAgIHByb2Nlc3NlZFtrZXldID0gKFxuICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkW2tleV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXVxuICAgICAgICAgICAgICAgICkubWFwKChpdGVtKSA9PlxuICAgICAgICAgICAgICAgICAgdGhpcy5kZWNyeXB0QW5kRmlsdGVyRmllbGRzKFxuICAgICAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgICAgICBwcm9wU2NoZW1hLml0ZW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvY2Vzc2VkO1xuICB9XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/jsonsecurityservice_dfc24cb882be3c83955914f235f463d5.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/jsonsecurityservice_dfc24cb882be3c83955914f235f463d5.map new file mode 100644 index 0000000..b7b1b1d --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/jsonsecurityservice_dfc24cb882be3c83955914f235f463d5.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\services\\json-security.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\services\\json-security.service.ts"],"sourcesContent":["// File: src/modules/json-schema/services/json-security.service.ts\nimport { Injectable } from '@nestjs/common';\nimport { CryptoService } from '../../../common/services/crypto.service';\n\nexport interface SecurityContext {\n userRoles: string[]; // Role ของ user ปัจจุบัน (เช่น ['EDITOR', 'viewer'])\n}\n\n@Injectable()\nexport class JsonSecurityService {\n constructor(private readonly cryptoService: CryptoService) {}\n\n /**\n * ขาเข้า (Write): เข้ารหัสข้อมูล Sensitive ก่อนบันทึก\n */\n encryptFields(\n data: Record,\n schemaDefinition: Record\n ): Record {\n if (!data || typeof data !== 'object') return data;\n const processed: Record = { ...data };\n\n // Traverse schema properties\n const properties = schemaDefinition.properties as\n | Record>\n | undefined;\n if (properties) {\n for (const [key, propSchema] of Object.entries(properties)) {\n if (data[key] !== undefined) {\n // 1. Check encryption flag\n if (propSchema['x-encrypt'] === true) {\n processed[key] = this.cryptoService.encrypt(\n data[key] as string | number | boolean\n );\n }\n\n // 2. Recursive for nested objects/arrays\n if (propSchema.type === 'object' && propSchema.properties) {\n processed[key] = this.encryptFields(\n data[key] as Record,\n propSchema\n );\n } else if (propSchema.type === 'array' && propSchema.items) {\n if (Array.isArray(data[key])) {\n processed[key] = (data[key] as Record[]).map(\n (item) =>\n this.encryptFields(\n item,\n propSchema.items as Record\n )\n );\n }\n }\n }\n }\n }\n return processed;\n }\n\n /**\n * ขาออก (Read): ถอดรหัส และ กรองข้อมูลตามสิทธิ์\n */\n decryptAndFilterFields(\n data: Record,\n schemaDefinition: Record,\n context: SecurityContext\n ): Record {\n if (!data || typeof data !== 'object') return data;\n\n // Clone data to avoid mutation\n const processed: Record = { ...data };\n\n const properties = schemaDefinition.properties as\n | Record>\n | undefined;\n if (properties) {\n for (const [key, propSchema] of Object.entries(properties)) {\n if (data[key] !== undefined) {\n // 1. Decrypt (ถ้ามีค่าและถูกเข้ารหัสไว้)\n if (propSchema['x-encrypt'] === true) {\n processed[key] = this.cryptoService.decrypt(data[key] as string);\n }\n\n // 2. Security Check (Role-based Access Control)\n if (propSchema['x-security']) {\n const rule = propSchema['x-security'] as Record;\n const requiredRoles = (rule.roles as string[]) || [];\n const hasPermission = requiredRoles.some(\n (role: string) =>\n context.userRoles.includes(role) ||\n context.userRoles.includes('SUPERADMIN')\n );\n\n if (!hasPermission) {\n if (rule.onDeny === 'REMOVE') {\n delete processed[key];\n continue; // ข้ามไป field ถัดไป\n } else {\n // Default: MASK\n processed[key] = '********';\n }\n }\n }\n\n // 3. Recursive for nested objects/arrays\n // (ทำต่อเมื่อ Field ยังไม่ถูกลบ)\n if (processed[key] !== undefined) {\n if (propSchema.type === 'object' && propSchema.properties) {\n processed[key] = this.decryptAndFilterFields(\n processed[key] as Record,\n propSchema,\n context\n );\n } else if (propSchema.type === 'array' && propSchema.items) {\n if (Array.isArray(processed[key])) {\n processed[key] = (\n processed[key] as Record[]\n ).map((item) =>\n this.decryptAndFilterFields(\n item,\n propSchema.items as Record,\n context\n )\n );\n }\n }\n }\n }\n }\n }\n return processed;\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/projectentity_df9270cfe86330dbe81d78bdcfac5524 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/projectentity_df9270cfe86330dbe81d78bdcfac5524 new file mode 100644 index 0000000..f1e89a5 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/projectentity_df9270cfe86330dbe81d78bdcfac5524 @@ -0,0 +1,61 @@ +beff9fb990d618231a57f26f3950b8a6 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Project = void 0; +// File: backend/src/modules/project/entities/project.entity.ts +const typeorm_1 = require("typeorm"); +const class_transformer_1 = require("class-transformer"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const contract_entity_1 = require("../../contract/entities/contract.entity"); +// Change Log: +// - 2026-03-27: เพิ่ม createdAt, updatedAt, deletedAt ที่ขาดหายไปตาม DB schema (แก้ Unknown column 'project.createdAt') +let Project = class Project extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.Project = Project; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], Project.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_code', unique: true, length: 50 }), + __metadata("design:type", String) +], Project.prototype, "projectCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_name', length: 255 }), + __metadata("design:type", String) +], Project.prototype, "projectName", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: 1, type: 'tinyint' }), + __metadata("design:type", Boolean) +], Project.prototype, "isActive", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], Project.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], Project.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.DeleteDateColumn)({ name: 'deleted_at', select: false }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], Project.prototype, "deletedAt", void 0); +__decorate([ + (0, typeorm_1.OneToMany)(() => contract_entity_1.Contract, (contract) => contract.project), + __metadata("design:type", Array) +], Project.prototype, "contracts", void 0); +exports.Project = Project = __decorate([ + (0, typeorm_1.Entity)('projects') +], Project); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccHJvamVjdFxcZW50aXRpZXNcXHByb2plY3QuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSwrREFBK0Q7QUFDL0QscUNBUWlCO0FBQ2pCLHlEQUE0QztBQUM1QyxnRkFBMkU7QUFDM0UsNkVBQW1FO0FBRW5FLGNBQWM7QUFDZCx3SEFBd0g7QUFHakgsSUFBTSxPQUFPLEdBQWIsTUFBTSxPQUFRLFNBQVEsaUNBQWM7Q0EyQjFDLENBQUE7QUEzQlksMEJBQU87QUFHbEI7SUFGQyxJQUFBLGdDQUFzQixHQUFFO0lBQ3hCLElBQUEsMkJBQU8sR0FBRTs7bUNBQ0U7QUFLWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7OzRDQUN0QztBQUdyQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOzs0Q0FDekI7QUFHckI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOzt5Q0FDeEM7QUFHbkI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7MENBQUM7QUFHakI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7MENBQUM7QUFHakI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7a0RBQzVDLElBQUksb0JBQUosSUFBSTswQ0FBQztBQUdqQjtJQURDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQywwQkFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDOzswQ0FDbkM7a0JBMUJaLE9BQU87SUFEbkIsSUFBQSxnQkFBTSxFQUFDLFVBQVUsQ0FBQztHQUNOLE9BQU8sQ0EyQm5CIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXHByb2plY3RcXGVudGl0aWVzXFxwcm9qZWN0LmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGaWxlOiBiYWNrZW5kL3NyYy9tb2R1bGVzL3Byb2plY3QvZW50aXRpZXMvcHJvamVjdC5lbnRpdHkudHNcclxuaW1wb3J0IHtcclxuICBFbnRpdHksXHJcbiAgQ29sdW1uLFxyXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXHJcbiAgT25lVG9NYW55LFxyXG4gIENyZWF0ZURhdGVDb2x1bW4sXHJcbiAgVXBkYXRlRGF0ZUNvbHVtbixcclxuICBEZWxldGVEYXRlQ29sdW1uLFxyXG59IGZyb20gJ3R5cGVvcm0nO1xyXG5pbXBvcnQgeyBFeGNsdWRlIH0gZnJvbSAnY2xhc3MtdHJhbnNmb3JtZXInO1xyXG5pbXBvcnQgeyBVdWlkQmFzZUVudGl0eSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9lbnRpdGllcy91dWlkLWJhc2UuZW50aXR5JztcclxuaW1wb3J0IHsgQ29udHJhY3QgfSBmcm9tICcuLi8uLi9jb250cmFjdC9lbnRpdGllcy9jb250cmFjdC5lbnRpdHknO1xyXG5cclxuLy8gQ2hhbmdlIExvZzpcclxuLy8gLSAyMDI2LTAzLTI3OiDguYDguJ7guLTguYjguKEgY3JlYXRlZEF0LCB1cGRhdGVkQXQsIGRlbGV0ZWRBdCDguJfguLXguYjguILguLLguJTguKvguLLguKLguYTguJvguJXguLLguKEgREIgc2NoZW1hICjguYHguIHguYkgVW5rbm93biBjb2x1bW4gJ3Byb2plY3QuY3JlYXRlZEF0JylcclxuXHJcbkBFbnRpdHkoJ3Byb2plY3RzJylcclxuZXhwb3J0IGNsYXNzIFByb2plY3QgZXh0ZW5kcyBVdWlkQmFzZUVudGl0eSB7XHJcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxyXG4gIEBFeGNsdWRlKClcclxuICBpZCE6IG51bWJlcjtcclxuXHJcbiAgLy8gcHVibGljSWQgaW5oZXJpdGVkIGZyb20gVXVpZEJhc2VFbnRpdHkgKERCIGNvbHVtbjogdXVpZClcclxuXHJcbiAgQENvbHVtbih7IG5hbWU6ICdwcm9qZWN0X2NvZGUnLCB1bmlxdWU6IHRydWUsIGxlbmd0aDogNTAgfSlcclxuICBwcm9qZWN0Q29kZSE6IHN0cmluZztcclxuXHJcbiAgQENvbHVtbih7IG5hbWU6ICdwcm9qZWN0X25hbWUnLCBsZW5ndGg6IDI1NSB9KVxyXG4gIHByb2plY3ROYW1lITogc3RyaW5nO1xyXG5cclxuICBAQ29sdW1uKHsgbmFtZTogJ2lzX2FjdGl2ZScsIGRlZmF1bHQ6IDEsIHR5cGU6ICd0aW55aW50JyB9KVxyXG4gIGlzQWN0aXZlITogYm9vbGVhbjtcclxuXHJcbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcclxuICBjcmVhdGVkQXQhOiBEYXRlO1xyXG5cclxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxyXG4gIHVwZGF0ZWRBdCE6IERhdGU7XHJcblxyXG4gIEBEZWxldGVEYXRlQ29sdW1uKHsgbmFtZTogJ2RlbGV0ZWRfYXQnLCBzZWxlY3Q6IGZhbHNlIH0pXHJcbiAgZGVsZXRlZEF0PzogRGF0ZTtcclxuXHJcbiAgQE9uZVRvTWFueSgoKSA9PiBDb250cmFjdCwgKGNvbnRyYWN0KSA9PiBjb250cmFjdC5wcm9qZWN0KVxyXG4gIGNvbnRyYWN0cyE6IENvbnRyYWN0W107XHJcbn1cclxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/projectentity_df9270cfe86330dbe81d78bdcfac5524.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/projectentity_df9270cfe86330dbe81d78bdcfac5524.map new file mode 100644 index 0000000..e622716 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/projectentity_df9270cfe86330dbe81d78bdcfac5524.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\project\\entities\\project.entity.ts","mappings":";;;;;;;;;;;;;AAAA,+DAA+D;AAC/D,qCAQiB;AACjB,yDAA4C;AAC5C,gFAA2E;AAC3E,6EAAmE;AAEnE,cAAc;AACd,wHAAwH;AAGjH,IAAM,OAAO,GAAb,MAAM,OAAQ,SAAQ,iCAAc;CA2B1C,CAAA;AA3BY,0BAAO;AAGlB;IAFC,IAAA,gCAAsB,GAAE;IACxB,IAAA,2BAAO,GAAE;;mCACE;AAKZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;4CACtC;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;4CACzB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;yCACxC;AAGnB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;0CAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;0CAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;kDAC5C,IAAI,oBAAJ,IAAI;0CAAC;AAGjB;IADC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,0BAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;;0CACnC;kBA1BZ,OAAO;IADnB,IAAA,gBAAM,EAAC,UAAU,CAAC;GACN,OAAO,CA2BnB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\project\\entities\\project.entity.ts"],"sourcesContent":["// File: backend/src/modules/project/entities/project.entity.ts\r\nimport {\r\n Entity,\r\n Column,\r\n PrimaryGeneratedColumn,\r\n OneToMany,\r\n CreateDateColumn,\r\n UpdateDateColumn,\r\n DeleteDateColumn,\r\n} from 'typeorm';\r\nimport { Exclude } from 'class-transformer';\r\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\r\nimport { Contract } from '../../contract/entities/contract.entity';\r\n\r\n// Change Log:\r\n// - 2026-03-27: เพิ่ม createdAt, updatedAt, deletedAt ที่ขาดหายไปตาม DB schema (แก้ Unknown column 'project.createdAt')\r\n\r\n@Entity('projects')\r\nexport class Project extends UuidBaseEntity {\r\n @PrimaryGeneratedColumn()\r\n @Exclude()\r\n id!: number;\r\n\r\n // publicId inherited from UuidBaseEntity (DB column: uuid)\r\n\r\n @Column({ name: 'project_code', unique: true, length: 50 })\r\n projectCode!: string;\r\n\r\n @Column({ name: 'project_name', length: 255 })\r\n projectName!: string;\r\n\r\n @Column({ name: 'is_active', default: 1, type: 'tinyint' })\r\n isActive!: boolean;\r\n\r\n @CreateDateColumn({ name: 'created_at' })\r\n createdAt!: Date;\r\n\r\n @UpdateDateColumn({ name: 'updated_at' })\r\n updatedAt!: Date;\r\n\r\n @DeleteDateColumn({ name: 'deleted_at', select: false })\r\n deletedAt?: Date;\r\n\r\n @OneToMany(() => Contract, (contract) => contract.project)\r\n contracts!: Contract[];\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/workflowengineservicespec_dfa2b87d1a4f741ac6f8d136866acaff b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/workflowengineservicespec_dfa2b87d1a4f741ac6f8d136866acaff new file mode 100644 index 0000000..1973741 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/workflowengineservicespec_dfa2b87d1a4f741ac6f8d136866acaff @@ -0,0 +1,170 @@ +c96c630c472fd4dc522da6e65cc06c1e +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const testing_1 = require("@nestjs/testing"); +const workflow_engine_service_1 = require("./workflow-engine.service"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const workflow_definition_entity_1 = require("./entities/workflow-definition.entity"); +const workflow_instance_entity_1 = require("./entities/workflow-instance.entity"); +const workflow_history_entity_1 = require("./entities/workflow-history.entity"); +const workflow_dsl_service_1 = require("./workflow-dsl.service"); +const workflow_event_service_1 = require("./workflow-event.service"); +const common_1 = require("@nestjs/common"); +describe('WorkflowEngineService', () => { + let service; + let defRepo; + let instanceRepo; + let dslService; + let eventService; + // Mock Objects + const mockQueryRunner = { + connect: jest.fn(), + startTransaction: jest.fn(), + commitTransaction: jest.fn(), + rollbackTransaction: jest.fn(), + release: jest.fn(), + manager: { + findOne: jest.fn(), + save: jest.fn(), + }, + }; + const mockDataSource = { + createQueryRunner: jest.fn().mockReturnValue(mockQueryRunner), + }; + const mockDslService = { + compile: jest.fn(), + evaluate: jest.fn(), + }; + const mockEventService = { + dispatchEvents: jest.fn(), + }; + const mockCompiledWorkflow = { + initialState: 'START', + states: { + START: { transitions: { SUBMIT: 'PENDING' } }, + PENDING: { transitions: { APPROVE: 'APPROVED', REJECT: 'REJECTED' } }, + APPROVED: { terminal: true }, + REJECTED: { terminal: true }, + }, + }; + beforeEach(async () => { + const module = await testing_1.Test.createTestingModule({ + providers: [ + workflow_engine_service_1.WorkflowEngineService, + { + provide: (0, typeorm_1.getRepositoryToken)(workflow_definition_entity_1.WorkflowDefinition), + useValue: { + findOne: jest.fn(), + create: jest.fn(), + save: jest.fn(), + }, + }, + { + provide: (0, typeorm_1.getRepositoryToken)(workflow_instance_entity_1.WorkflowInstance), + useValue: { + create: jest.fn(), + save: jest.fn(), + findOne: jest.fn(), + }, + }, + { + provide: (0, typeorm_1.getRepositoryToken)(workflow_history_entity_1.WorkflowHistory), + useValue: { + create: jest.fn(), + save: jest.fn(), + }, + }, + { provide: workflow_dsl_service_1.WorkflowDslService, useValue: mockDslService }, + { provide: workflow_event_service_1.WorkflowEventService, useValue: mockEventService }, + { provide: typeorm_2.DataSource, useValue: mockDataSource }, + ], + }).compile(); + service = module.get(workflow_engine_service_1.WorkflowEngineService); + defRepo = module.get((0, typeorm_1.getRepositoryToken)(workflow_definition_entity_1.WorkflowDefinition)); + instanceRepo = module.get((0, typeorm_1.getRepositoryToken)(workflow_instance_entity_1.WorkflowInstance)); + dslService = module.get(workflow_dsl_service_1.WorkflowDslService); + eventService = module.get(workflow_event_service_1.WorkflowEventService); + jest.clearAllMocks(); + }); + it('should be defined', () => { + expect(service).toBeDefined(); + }); + describe('createDefinition', () => { + it('should create a new definition version', async () => { + const dto = { + workflow_code: 'WF01', + dsl: {}, + }; + mockDslService.compile.mockReturnValue(mockCompiledWorkflow); + defRepo.findOne.mockResolvedValue({ version: 1 }); + defRepo.create.mockReturnValue({ version: 2 }); + defRepo.save.mockResolvedValue({ + version: 2, + workflow_code: 'WF01', + }); + const result = await service.createDefinition(dto); + expect(dslService.compile).toHaveBeenCalledWith(dto.dsl); + expect(defRepo.create).toHaveBeenCalledWith(expect.objectContaining({ version: 2 })); + expect(result).toEqual(expect.objectContaining({ version: 2 })); + }); + }); + describe('createInstance', () => { + it('should create a new instance with initial state', async () => { + const mockDef = { + id: 'def-1', + compiled: mockCompiledWorkflow, + }; + defRepo.findOne.mockResolvedValue(mockDef); + instanceRepo.create.mockReturnValue({ + id: 'inst-1', + currentState: 'START', + }); + instanceRepo.save.mockResolvedValue({ id: 'inst-1' }); + const result = await service.createInstance('WF01', 'DOC', '101'); + expect(instanceRepo.create).toHaveBeenCalledWith(expect.objectContaining({ + currentState: 'START', + entityId: '101', + })); + expect(result).toBeDefined(); + }); + it('should throw NotFoundException if definition not found', async () => { + defRepo.findOne.mockResolvedValue(null); + await expect(service.createInstance('WF01', 'DOC', '101')).rejects.toThrow(common_1.NotFoundException); + }); + }); + describe('processTransition', () => { + it('should process transition successfully and commit transaction', async () => { + const instanceId = 'inst-1'; + const mockInstance = { + id: instanceId, + currentState: 'PENDING', + status: workflow_instance_entity_1.WorkflowStatus.ACTIVE, + definition: { compiled: mockCompiledWorkflow }, + context: { some: 'data' }, + }; + // Mock Pessimistic Lock Find + mockQueryRunner.manager.findOne.mockResolvedValue(mockInstance); + // Mock DSL Evaluation + mockDslService.evaluate.mockReturnValue({ + nextState: 'APPROVED', + events: [{ type: 'NOTIFY' }], + }); + const result = await service.processTransition(instanceId, 'APPROVE', 1); + expect(mockQueryRunner.startTransaction).toHaveBeenCalled(); + expect(mockDslService.evaluate).toHaveBeenCalled(); + expect(mockQueryRunner.manager.save).toHaveBeenCalledTimes(2); // Instance + History + expect(mockQueryRunner.commitTransaction).toHaveBeenCalled(); + expect(eventService.dispatchEvents).toHaveBeenCalled(); // Should dispatch events + expect(result.nextState).toBe('APPROVED'); + expect(result.isCompleted).toBe(true); + }); + it('should rollback transaction on error', async () => { + mockQueryRunner.manager.findOne.mockRejectedValue(new Error('DB Error')); + await expect(service.processTransition('inst-1', 'APPROVE', 1)).rejects.toThrow('DB Error'); + expect(mockQueryRunner.rollbackTransaction).toHaveBeenCalled(); + expect(mockQueryRunner.release).toHaveBeenCalled(); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcd29ya2Zsb3ctZW5naW5lXFx3b3JrZmxvdy1lbmdpbmUuc2VydmljZS5zcGVjLnRzIiwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQXNEO0FBQ3RELHVFQUFrRTtBQUNsRSw2Q0FBcUQ7QUFDckQscUNBQWlEO0FBQ2pELHNGQUEyRTtBQUMzRSxrRkFHNkM7QUFDN0MsZ0ZBQXFFO0FBQ3JFLGlFQUE0RDtBQUM1RCxxRUFBZ0U7QUFDaEUsMkNBQW1EO0FBR25ELFFBQVEsQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLEVBQUU7SUFDckMsSUFBSSxPQUE4QixDQUFDO0lBQ25DLElBQUksT0FBdUMsQ0FBQztJQUM1QyxJQUFJLFlBQTBDLENBQUM7SUFDL0MsSUFBSSxVQUE4QixDQUFDO0lBQ25DLElBQUksWUFBa0MsQ0FBQztJQUV2QyxlQUFlO0lBQ2YsTUFBTSxlQUFlLEdBQUc7UUFDdEIsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDbEIsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUMzQixpQkFBaUIsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQzVCLG1CQUFtQixFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDOUIsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDbEIsT0FBTyxFQUFFO1lBQ1AsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDbEIsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7U0FDaEI7S0FDRixDQUFDO0lBRUYsTUFBTSxjQUFjLEdBQUc7UUFDckIsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUM7S0FDOUQsQ0FBQztJQUVGLE1BQU0sY0FBYyxHQUFHO1FBQ3JCLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2xCLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO0tB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QyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsc0NBQXNDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDcEQsZUFBZSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUV6RSxNQUFNLE1BQU0sQ0FDVixPQUFPLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FDbEQsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRTlCLE1BQU0sQ0FBQyxlQUFlLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQy9ELE1BQU0sQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcd29ya2Zsb3ctZW5naW5lXFx3b3JrZmxvdy1lbmdpbmUuc2VydmljZS5zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlc3QsIFRlc3RpbmdNb2R1bGUgfSBmcm9tICdAbmVzdGpzL3Rlc3RpbmcnO1xuaW1wb3J0IHsgV29ya2Zsb3dFbmdpbmVTZXJ2aWNlIH0gZnJvbSAnLi93b3JrZmxvdy1lbmdpbmUuc2VydmljZSc7XG5pbXBvcnQgeyBnZXRSZXBvc2l0b3J5VG9rZW4gfSBmcm9tICdAbmVzdGpzL3R5cGVvcm0nO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSwgUmVwb3NpdG9yeSB9IGZyb20gJ3R5cGVvcm0nO1xuaW1wb3J0IHsgV29ya2Zsb3dEZWZpbml0aW9uIH0gZnJvbSAnLi9lbnRpdGllcy93b3JrZmxvdy1kZWZpbml0aW9uLmVudGl0eSc7XG5pbXBvcnQge1xuICBXb3JrZmxvd0luc3RhbmNlLFxuICBXb3JrZmxvd1N0YXR1cyxcbn0gZnJvbSAnLi9lbnRpdGllcy93b3JrZmxvdy1pbnN0YW5jZS5lbnRpdHknO1xuaW1wb3J0IHsgV29ya2Zsb3dIaXN0b3J5IH0gZnJvbSAnLi9lbnRpdGllcy93b3JrZmxvdy1oaXN0b3J5LmVudGl0eSc7XG5pbXBvcnQgeyBXb3JrZmxvd0RzbFNlcnZpY2UgfSBmcm9tICcuL3dvcmtmbG93LWRzbC5zZXJ2aWNlJztcbmltcG9ydCB7IFdvcmtmbG93RXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi93b3JrZmxvdy1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IE5vdEZvdW5kRXhjZXB0aW9uIH0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xuaW1wb3J0IHsgQ3JlYXRlV29ya2Zsb3dEZWZpbml0aW9uRHRvIH0gZnJvbSAnLi9kdG8vY3JlYXRlLXdvcmtmbG93LWRlZmluaXRpb24uZHRvJztcblxuZGVzY3JpYmUoJ1dvcmtmbG93RW5naW5lU2VydmljZScsICgpID0+IHtcbiAgbGV0IHNlcnZpY2U6IFdvcmtmbG93RW5naW5lU2VydmljZTtcbiAgbGV0IGRlZlJlcG86IFJlcG9zaXRvcnk8V29ya2Zsb3dEZWZpbml0aW9uPjtcbiAgbGV0IGluc3RhbmNlUmVwbzogUmVwb3NpdG9yeTxXb3JrZmxvd0luc3RhbmNlPjtcbiAgbGV0IGRzbFNlcnZpY2U6IFdvcmtmbG93RHNsU2VydmljZTtcbiAgbGV0IGV2ZW50U2VydmljZTogV29ya2Zsb3dFdmVudFNlcnZpY2U7XG5cbiAgLy8gTW9jayBPYmplY3RzXG4gIGNvbnN0IG1vY2tRdWVyeVJ1bm5lciA9IHtcbiAgICBjb25uZWN0OiBqZXN0LmZuKCksXG4gICAgc3RhcnRUcmFuc2FjdGlvbjogamVzdC5mbigpLFxuICAgIGNvbW1pdFRyYW5zYWN0aW9uOiBqZXN0LmZuKCksXG4gICAgcm9sbGJhY2tUcmFuc2FjdGlvbjogamVzdC5mbigpLFxuICAgIHJlbGVhc2U6IGplc3QuZm4oKSxcbiAgICBtYW5hZ2VyOiB7XG4gICAgICBmaW5kT25lOiBqZXN0LmZuKCksXG4gICAgICBzYXZlOiBqZXN0LmZuKCksXG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBtb2NrRGF0YVNvdXJjZSA9IHtcbiAgICBjcmVhdGVRdWVyeVJ1bm5lcjogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShtb2NrUXVlcnlSdW5uZXIpLFxuICB9O1xuXG4gIGNvbnN0IG1vY2tEc2xTZXJ2aWNlID0ge1xuICAgIGNvbXBpbGU6IGplc3QuZm4oKSxcbiAgICBldmFsdWF0ZTogamVzdC5mbigpLFxuICB9O1xuXG4gIGNvbnN0IG1vY2tFdmVudFNlcnZpY2UgPSB7XG4gICAgZGlzcGF0Y2hFdmVudHM6IGplc3QuZm4oKSxcbiAgfTtcblxuICBjb25zdCBtb2NrQ29tcGlsZWRXb3JrZmxvdyA9IHtcbiAgICBpbml0aWFsU3RhdGU6ICdTVEFSVCcsXG4gICAgc3RhdGVzOiB7XG4gICAgICBTVEFSVDogeyB0cmFuc2l0aW9uczogeyBTVUJNSVQ6ICdQRU5ESU5HJyB9IH0sXG4gICAgICBQRU5ESU5HOiB7IHRyYW5zaXRpb25zOiB7IEFQUFJPVkU6ICdBUFBST1ZFRCcsIFJFSkVDVDogJ1JFSkVDVEVEJyB9IH0sXG4gICAgICBBUFBST1ZFRDogeyB0ZXJtaW5hbDogdHJ1ZSB9LFxuICAgICAgUkVKRUNURUQ6IHsgdGVybWluYWw6IHRydWUgfSxcbiAgICB9LFxuICB9O1xuXG4gIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG1vZHVsZTogVGVzdGluZ01vZHVsZSA9IGF3YWl0IFRlc3QuY3JlYXRlVGVzdGluZ01vZHVsZSh7XG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgV29ya2Zsb3dFbmdpbmVTZXJ2aWNlLFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogZ2V0UmVwb3NpdG9yeVRva2VuKFdvcmtmbG93RGVmaW5pdGlvbiksXG4gICAgICAgICAgdXNlVmFsdWU6IHtcbiAgICAgICAgICAgIGZpbmRPbmU6IGplc3QuZm4oKSxcbiAgICAgICAgICAgIGNyZWF0ZTogamVzdC5mbigpLFxuICAgICAgICAgICAgc2F2ZTogamVzdC5mbigpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBnZXRSZXBvc2l0b3J5VG9rZW4oV29ya2Zsb3dJbnN0YW5jZSksXG4gICAgICAgICAgdXNlVmFsdWU6IHtcbiAgICAgICAgICAgIGNyZWF0ZTogamVzdC5mbigpLFxuICAgICAgICAgICAgc2F2ZTogamVzdC5mbigpLFxuICAgICAgICAgICAgZmluZE9uZTogamVzdC5mbigpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBnZXRSZXBvc2l0b3J5VG9rZW4oV29ya2Zsb3dIaXN0b3J5KSxcbiAgICAgICAgICB1c2VWYWx1ZToge1xuICAgICAgICAgICAgY3JlYXRlOiBqZXN0LmZuKCksXG4gICAgICAgICAgICBzYXZlOiBqZXN0LmZuKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgeyBwcm92aWRlOiBXb3JrZmxvd0RzbFNlcnZpY2UsIHVzZVZhbHVlOiBtb2NrRHNsU2VydmljZSB9LFxuICAgICAgICB7IHByb3ZpZGU6IFdvcmtmbG93RXZlbnRTZXJ2aWNlLCB1c2VWYWx1ZTogbW9ja0V2ZW50U2VydmljZSB9LFxuICAgICAgICB7IHByb3ZpZGU6IERhdGFTb3VyY2UsIHVzZVZhbHVlOiBtb2NrRGF0YVNvdXJjZSB9LFxuICAgICAgXSxcbiAgICB9KS5jb21waWxlKCk7XG5cbiAgICBzZXJ2aWNlID0gbW9kdWxlLmdldDxXb3JrZmxvd0VuZ2luZVNlcnZpY2U+KFdvcmtmbG93RW5naW5lU2VydmljZSk7XG4gICAgZGVmUmVwbyA9IG1vZHVsZS5nZXQoZ2V0UmVwb3NpdG9yeVRva2VuKFdvcmtmbG93RGVmaW5pdGlvbikpO1xuICAgIGluc3RhbmNlUmVwbyA9IG1vZHVsZS5nZXQoZ2V0UmVwb3NpdG9yeVRva2VuKFdvcmtmbG93SW5zdGFuY2UpKTtcbiAgICBkc2xTZXJ2aWNlID0gbW9kdWxlLmdldChXb3JrZmxvd0RzbFNlcnZpY2UpO1xuICAgIGV2ZW50U2VydmljZSA9IG1vZHVsZS5nZXQoV29ya2Zsb3dFdmVudFNlcnZpY2UpO1xuXG4gICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYmUgZGVmaW5lZCcsICgpID0+IHtcbiAgICBleHBlY3Qoc2VydmljZSkudG9CZURlZmluZWQoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NyZWF0ZURlZmluaXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgYSBuZXcgZGVmaW5pdGlvbiB2ZXJzaW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZHRvID0ge1xuICAgICAgICB3b3JrZmxvd19jb2RlOiAnV0YwMScsXG4gICAgICAgIGRzbDoge30sXG4gICAgICB9IGFzIENyZWF0ZVdvcmtmbG93RGVmaW5pdGlvbkR0bztcbiAgICAgIG1vY2tEc2xTZXJ2aWNlLmNvbXBpbGUubW9ja1JldHVyblZhbHVlKG1vY2tDb21waWxlZFdvcmtmbG93KTtcbiAgICAgIChkZWZSZXBvLmZpbmRPbmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7IHZlcnNpb246IDEgfSk7XG4gICAgICAoZGVmUmVwby5jcmVhdGUgYXMgamVzdC5Nb2NrKS5tb2NrUmV0dXJuVmFsdWUoeyB2ZXJzaW9uOiAyIH0pO1xuICAgICAgKGRlZlJlcG8uc2F2ZSBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgICAgdmVyc2lvbjogMixcbiAgICAgICAgd29ya2Zsb3dfY29kZTogJ1dGMDEnLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlcnZpY2UuY3JlYXRlRGVmaW5pdGlvbihkdG8pO1xuXG4gICAgICBleHBlY3QoZHNsU2VydmljZS5jb21waWxlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChkdG8uZHNsKTtcbiAgICAgIGV4cGVjdChkZWZSZXBvLmNyZWF0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgdmVyc2lvbjogMiB9KVxuICAgICAgKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyB2ZXJzaW9uOiAyIH0pKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NyZWF0ZUluc3RhbmNlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY3JlYXRlIGEgbmV3IGluc3RhbmNlIHdpdGggaW5pdGlhbCBzdGF0ZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1vY2tEZWYgPSB7XG4gICAgICAgIGlkOiAnZGVmLTEnLFxuICAgICAgICBjb21waWxlZDogbW9ja0NvbXBpbGVkV29ya2Zsb3csXG4gICAgICB9O1xuXG4gICAgICAoZGVmUmVwby5maW5kT25lIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUobW9ja0RlZik7XG4gICAgICAoaW5zdGFuY2VSZXBvLmNyZWF0ZSBhcyBqZXN0Lk1vY2spLm1vY2tSZXR1cm5WYWx1ZSh7XG4gICAgICAgIGlkOiAnaW5zdC0xJyxcbiAgICAgICAgY3VycmVudFN0YXRlOiAnU1RBUlQnLFxuICAgICAgfSk7XG4gICAgICAoaW5zdGFuY2VSZXBvLnNhdmUgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7IGlkOiAnaW5zdC0xJyB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VydmljZS5jcmVhdGVJbnN0YW5jZSgnV0YwMScsICdET0MnLCAnMTAxJyk7XG5cbiAgICAgIGV4cGVjdChpbnN0YW5jZVJlcG8uY3JlYXRlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIGN1cnJlbnRTdGF0ZTogJ1NUQVJUJyxcbiAgICAgICAgICBlbnRpdHlJZDogJzEwMScsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZURlZmluZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgTm90Rm91bmRFeGNlcHRpb24gaWYgZGVmaW5pdGlvbiBub3QgZm91bmQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAoZGVmUmVwby5maW5kT25lIGFzIGplc3QuTW9jaykubW9ja1Jlc29sdmVkVmFsdWUobnVsbCk7XG4gICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgIHNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoJ1dGMDEnLCAnRE9DJywgJzEwMScpXG4gICAgICApLnJlamVjdHMudG9UaHJvdyhOb3RGb3VuZEV4Y2VwdGlvbik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwcm9jZXNzVHJhbnNpdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHByb2Nlc3MgdHJhbnNpdGlvbiBzdWNjZXNzZnVsbHkgYW5kIGNvbW1pdCB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlSWQgPSAnaW5zdC0xJztcbiAgICAgIGNvbnN0IG1vY2tJbnN0YW5jZSA9IHtcbiAgICAgICAgaWQ6IGluc3RhbmNlSWQsXG4gICAgICAgIGN1cnJlbnRTdGF0ZTogJ1BFTkRJTkcnLFxuICAgICAgICBzdGF0dXM6IFdvcmtmbG93U3RhdHVzLkFDVElWRSxcbiAgICAgICAgZGVmaW5pdGlvbjogeyBjb21waWxlZDogbW9ja0NvbXBpbGVkV29ya2Zsb3cgfSxcbiAgICAgICAgY29udGV4dDogeyBzb21lOiAnZGF0YScgfSxcbiAgICAgIH07XG5cbiAgICAgIC8vIE1vY2sgUGVzc2ltaXN0aWMgTG9jayBGaW5kXG4gICAgICBtb2NrUXVlcnlSdW5uZXIubWFuYWdlci5maW5kT25lLm1vY2tSZXNvbHZlZFZhbHVlKG1vY2tJbnN0YW5jZSk7XG5cbiAgICAgIC8vIE1vY2sgRFNMIEV2YWx1YXRpb25cbiAgICAgIG1vY2tEc2xTZXJ2aWNlLmV2YWx1YXRlLm1vY2tSZXR1cm5WYWx1ZSh7XG4gICAgICAgIG5leHRTdGF0ZTogJ0FQUFJPVkVEJyxcbiAgICAgICAgZXZlbnRzOiBbeyB0eXBlOiAnTk9USUZZJyB9XSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXJ2aWNlLnByb2Nlc3NUcmFuc2l0aW9uKGluc3RhbmNlSWQsICdBUFBST1ZFJywgMSk7XG5cbiAgICAgIGV4cGVjdChtb2NrUXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbikudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgZXhwZWN0KG1vY2tEc2xTZXJ2aWNlLmV2YWx1YXRlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICBleHBlY3QobW9ja1F1ZXJ5UnVubmVyLm1hbmFnZXIuc2F2ZSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDIpOyAvLyBJbnN0YW5jZSArIEhpc3RvcnlcbiAgICAgIGV4cGVjdChtb2NrUXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24pLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIGV4cGVjdChldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudHMpLnRvSGF2ZUJlZW5DYWxsZWQoKTsgLy8gU2hvdWxkIGRpc3BhdGNoIGV2ZW50c1xuICAgICAgZXhwZWN0KHJlc3VsdC5uZXh0U3RhdGUpLnRvQmUoJ0FQUFJPVkVEJyk7XG4gICAgICBleHBlY3QocmVzdWx0LmlzQ29tcGxldGVkKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByb2xsYmFjayB0cmFuc2FjdGlvbiBvbiBlcnJvcicsIGFzeW5jICgpID0+IHtcbiAgICAgIG1vY2tRdWVyeVJ1bm5lci5tYW5hZ2VyLmZpbmRPbmUubW9ja1JlamVjdGVkVmFsdWUobmV3IEVycm9yKCdEQiBFcnJvcicpKTtcblxuICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICBzZXJ2aWNlLnByb2Nlc3NUcmFuc2l0aW9uKCdpbnN0LTEnLCAnQVBQUk9WRScsIDEpXG4gICAgICApLnJlamVjdHMudG9UaHJvdygnREIgRXJyb3InKTtcblxuICAgICAgZXhwZWN0KG1vY2tRdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICBleHBlY3QobW9ja1F1ZXJ5UnVubmVyLnJlbGVhc2UpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/workflowengineservicespec_dfa2b87d1a4f741ac6f8d136866acaff.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/workflowengineservicespec_dfa2b87d1a4f741ac6f8d136866acaff.map new file mode 100644 index 0000000..55dedb5 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/df/workflowengineservicespec_dfa2b87d1a4f741ac6f8d136866acaff.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\workflow-engine.service.spec.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\workflow-engine.service.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\nimport { WorkflowEngineService } from './workflow-engine.service';\nimport { getRepositoryToken } from '@nestjs/typeorm';\nimport { DataSource, Repository } from 'typeorm';\nimport { WorkflowDefinition } from './entities/workflow-definition.entity';\nimport {\n WorkflowInstance,\n WorkflowStatus,\n} from './entities/workflow-instance.entity';\nimport { WorkflowHistory } from './entities/workflow-history.entity';\nimport { WorkflowDslService } from './workflow-dsl.service';\nimport { WorkflowEventService } from './workflow-event.service';\nimport { NotFoundException } from '@nestjs/common';\nimport { CreateWorkflowDefinitionDto } from './dto/create-workflow-definition.dto';\n\ndescribe('WorkflowEngineService', () => {\n let service: WorkflowEngineService;\n let defRepo: Repository;\n let instanceRepo: Repository;\n let dslService: WorkflowDslService;\n let eventService: WorkflowEventService;\n\n // Mock Objects\n const mockQueryRunner = {\n connect: jest.fn(),\n startTransaction: jest.fn(),\n commitTransaction: jest.fn(),\n rollbackTransaction: jest.fn(),\n release: jest.fn(),\n manager: {\n findOne: jest.fn(),\n save: jest.fn(),\n },\n };\n\n const mockDataSource = {\n createQueryRunner: jest.fn().mockReturnValue(mockQueryRunner),\n };\n\n const mockDslService = {\n compile: jest.fn(),\n evaluate: jest.fn(),\n };\n\n const mockEventService = {\n dispatchEvents: jest.fn(),\n };\n\n const mockCompiledWorkflow = {\n initialState: 'START',\n states: {\n START: { transitions: { SUBMIT: 'PENDING' } },\n PENDING: { transitions: { APPROVE: 'APPROVED', REJECT: 'REJECTED' } },\n APPROVED: { terminal: true },\n REJECTED: { terminal: true },\n },\n };\n\n beforeEach(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n WorkflowEngineService,\n {\n provide: getRepositoryToken(WorkflowDefinition),\n useValue: {\n findOne: jest.fn(),\n create: jest.fn(),\n save: jest.fn(),\n },\n },\n {\n provide: getRepositoryToken(WorkflowInstance),\n useValue: {\n create: jest.fn(),\n save: jest.fn(),\n findOne: jest.fn(),\n },\n },\n {\n provide: getRepositoryToken(WorkflowHistory),\n useValue: {\n create: jest.fn(),\n save: jest.fn(),\n },\n },\n { provide: WorkflowDslService, useValue: mockDslService },\n { provide: WorkflowEventService, useValue: mockEventService },\n { provide: DataSource, useValue: mockDataSource },\n ],\n }).compile();\n\n service = module.get(WorkflowEngineService);\n defRepo = module.get(getRepositoryToken(WorkflowDefinition));\n instanceRepo = module.get(getRepositoryToken(WorkflowInstance));\n dslService = module.get(WorkflowDslService);\n eventService = module.get(WorkflowEventService);\n\n jest.clearAllMocks();\n });\n\n it('should be defined', () => {\n expect(service).toBeDefined();\n });\n\n describe('createDefinition', () => {\n it('should create a new definition version', async () => {\n const dto = {\n workflow_code: 'WF01',\n dsl: {},\n } as CreateWorkflowDefinitionDto;\n mockDslService.compile.mockReturnValue(mockCompiledWorkflow);\n (defRepo.findOne as jest.Mock).mockResolvedValue({ version: 1 });\n (defRepo.create as jest.Mock).mockReturnValue({ version: 2 });\n (defRepo.save as jest.Mock).mockResolvedValue({\n version: 2,\n workflow_code: 'WF01',\n });\n\n const result = await service.createDefinition(dto);\n\n expect(dslService.compile).toHaveBeenCalledWith(dto.dsl);\n expect(defRepo.create).toHaveBeenCalledWith(\n expect.objectContaining({ version: 2 })\n );\n expect(result).toEqual(expect.objectContaining({ version: 2 }));\n });\n });\n\n describe('createInstance', () => {\n it('should create a new instance with initial state', async () => {\n const mockDef = {\n id: 'def-1',\n compiled: mockCompiledWorkflow,\n };\n\n (defRepo.findOne as jest.Mock).mockResolvedValue(mockDef);\n (instanceRepo.create as jest.Mock).mockReturnValue({\n id: 'inst-1',\n currentState: 'START',\n });\n (instanceRepo.save as jest.Mock).mockResolvedValue({ id: 'inst-1' });\n\n const result = await service.createInstance('WF01', 'DOC', '101');\n\n expect(instanceRepo.create).toHaveBeenCalledWith(\n expect.objectContaining({\n currentState: 'START',\n entityId: '101',\n })\n );\n expect(result).toBeDefined();\n });\n\n it('should throw NotFoundException if definition not found', async () => {\n (defRepo.findOne as jest.Mock).mockResolvedValue(null);\n await expect(\n service.createInstance('WF01', 'DOC', '101')\n ).rejects.toThrow(NotFoundException);\n });\n });\n\n describe('processTransition', () => {\n it('should process transition successfully and commit transaction', async () => {\n const instanceId = 'inst-1';\n const mockInstance = {\n id: instanceId,\n currentState: 'PENDING',\n status: WorkflowStatus.ACTIVE,\n definition: { compiled: mockCompiledWorkflow },\n context: { some: 'data' },\n };\n\n // Mock Pessimistic Lock Find\n mockQueryRunner.manager.findOne.mockResolvedValue(mockInstance);\n\n // Mock DSL Evaluation\n mockDslService.evaluate.mockReturnValue({\n nextState: 'APPROVED',\n events: [{ type: 'NOTIFY' }],\n });\n\n const result = await service.processTransition(instanceId, 'APPROVE', 1);\n\n expect(mockQueryRunner.startTransaction).toHaveBeenCalled();\n expect(mockDslService.evaluate).toHaveBeenCalled();\n expect(mockQueryRunner.manager.save).toHaveBeenCalledTimes(2); // Instance + History\n expect(mockQueryRunner.commitTransaction).toHaveBeenCalled();\n expect(eventService.dispatchEvents).toHaveBeenCalled(); // Should dispatch events\n expect(result.nextState).toBe('APPROVED');\n expect(result.isCompleted).toBe(true);\n });\n\n it('should rollback transaction on error', async () => {\n mockQueryRunner.manager.findOne.mockRejectedValue(new Error('DB Error'));\n\n await expect(\n service.processTransition('inst-1', 'APPROVE', 1)\n ).rejects.toThrow('DB Error');\n\n expect(mockQueryRunner.rollbackTransaction).toHaveBeenCalled();\n expect(mockQueryRunner.release).toHaveBeenCalled();\n });\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e0/uuidbaseentityspec_e098b8a2511d0107635b195f6fbea8de b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e0/uuidbaseentityspec_e098b8a2511d0107635b195f6fbea8de new file mode 100644 index 0000000..7f682f1 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e0/uuidbaseentityspec_e098b8a2511d0107635b195f6fbea8de @@ -0,0 +1,61 @@ +fc60a7faece32d2d851f7763dd2c65e4 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +// Mock uuid module to avoid ESM import issue with uuid@13 +jest.mock('uuid', () => ({ + validate: (str) => /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(str), + v7: () => '01912345-6789-7abc-8def-0123456789ab', +})); +const uuid_base_entity_1 = require("./uuid-base.entity"); +// Concrete subclass for testing the abstract base +class TestEntity extends uuid_base_entity_1.UuidBaseEntity { +} +describe('UuidBaseEntity', () => { + // ========================================================== + // generatePublicId() — @BeforeInsert hook + // ========================================================== + describe('generatePublicId()', () => { + it('should generate a UUIDv7 when publicId is not set', () => { + const entity = new TestEntity(); + expect(entity.publicId).toBeUndefined(); + entity.generatePublicId(); + expect(entity.publicId).toBe('01912345-6789-7abc-8def-0123456789ab'); + }); + it('should not overwrite an existing publicId', () => { + const entity = new TestEntity(); + entity.publicId = 'existing-publicId-value-should-be-kept'; + entity.generatePublicId(); + expect(entity.publicId).toBe('existing-publicId-value-should-be-kept'); + }); + it('should not overwrite a pre-set UUIDv1 from DB default', () => { + const entity = new TestEntity(); + entity.publicId = '550e8400-e29b-11d4-a716-446655440000'; + entity.generatePublicId(); + expect(entity.publicId).toBe('550e8400-e29b-11d4-a716-446655440000'); + }); + it('should generate publicId when publicId is empty string', () => { + const entity = new TestEntity(); + entity.publicId = ''; + entity.generatePublicId(); + // Empty string is falsy, so generatePublicId should assign a new value + expect(entity.publicId).toBe('01912345-6789-7abc-8def-0123456789ab'); + }); + }); + // ========================================================== + // Inheritance + // ========================================================== + describe('inheritance', () => { + it('should be an instance of UuidBaseEntity', () => { + const entity = new TestEntity(); + expect(entity).toBeInstanceOf(uuid_base_entity_1.UuidBaseEntity); + }); + it('should have publicId property accessible from subclass', () => { + const entity = new TestEntity(); + entity.publicId = 'test-publicId'; + entity.id = 42; + expect(entity.publicId).toBe('test-publicId'); + expect(entity.id).toBe(42); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxlbnRpdGllc1xcdXVpZC1iYXNlLmVudGl0eS5zcGVjLnRzIiwibWFwcGluZ3MiOiI7O0FBQUEsMERBQTBEO0FBQzFELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDdkIsUUFBUSxFQUFFLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FDeEIsaUVBQWlFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUM3RSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsc0NBQXNDO0NBQ2pELENBQUMsQ0FBQyxDQUFDO0FBRUoseURBQW9EO0FBRXBELGtEQUFrRDtBQUNsRCxNQUFNLFVBQVcsU0FBUSxpQ0FBYztDQUV0QztBQUVELFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUU7SUFDOUIsNkRBQTZEO0lBQzdELDBDQUEwQztJQUMxQyw2REFBNkQ7SUFFN0QsUUFBUSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtRQUNsQyxFQUFFLENBQUMsbURBQW1ELEVBQUUsR0FBRyxFQUFFO1lBQzNELE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7WUFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUV4QyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUUxQixNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDJDQUEyQyxFQUFFLEdBQUcsRUFBRTtZQUNuRCxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsd0NBQXdDLENBQUM7WUFFM0QsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFFMUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsd0NBQXdDLENBQUMsQ0FBQztRQUN6RSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx1REFBdUQsRUFBRSxHQUFHLEVBQUU7WUFDL0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNoQyxNQUFNLENBQUMsUUFBUSxHQUFHLHNDQUFzQyxDQUFDO1lBRXpELE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBRTFCLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDdkUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsd0RBQXdELEVBQUUsR0FBRyxFQUFFO1lBQ2hFLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7WUFDaEMsTUFBTSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7WUFFckIsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFFMUIsdUVBQXVFO1lBQ3ZFLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDdkUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILDZEQUE2RDtJQUM3RCxjQUFjO0lBQ2QsNkRBQTZEO0lBRTdELFFBQVEsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFO1FBQzNCLEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxHQUFHLEVBQUU7WUFDakQsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNoQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsY0FBYyxDQUFDLGlDQUFjLENBQUMsQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx3REFBd0QsRUFBRSxHQUFHLEVBQUU7WUFDaEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNoQyxNQUFNLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQztZQUNsQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUVmLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxjb21tb25cXGVudGl0aWVzXFx1dWlkLWJhc2UuZW50aXR5LnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gTW9jayB1dWlkIG1vZHVsZSB0byBhdm9pZCBFU00gaW1wb3J0IGlzc3VlIHdpdGggdXVpZEAxM1xyXG5qZXN0Lm1vY2soJ3V1aWQnLCAoKSA9PiAoe1xyXG4gIHZhbGlkYXRlOiAoc3RyOiBzdHJpbmcpID0+XHJcbiAgICAvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQvaS50ZXN0KHN0ciksXHJcbiAgdjc6ICgpID0+ICcwMTkxMjM0NS02Nzg5LTdhYmMtOGRlZi0wMTIzNDU2Nzg5YWInLFxyXG59KSk7XHJcblxyXG5pbXBvcnQgeyBVdWlkQmFzZUVudGl0eSB9IGZyb20gJy4vdXVpZC1iYXNlLmVudGl0eSc7XHJcblxyXG4vLyBDb25jcmV0ZSBzdWJjbGFzcyBmb3IgdGVzdGluZyB0aGUgYWJzdHJhY3QgYmFzZVxyXG5jbGFzcyBUZXN0RW50aXR5IGV4dGVuZHMgVXVpZEJhc2VFbnRpdHkge1xyXG4gIGlkITogbnVtYmVyO1xyXG59XHJcblxyXG5kZXNjcmliZSgnVXVpZEJhc2VFbnRpdHknLCAoKSA9PiB7XHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gIC8vIGdlbmVyYXRlUHVibGljSWQoKSDigJQgQEJlZm9yZUluc2VydCBob29rXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICBkZXNjcmliZSgnZ2VuZXJhdGVQdWJsaWNJZCgpJywgKCkgPT4ge1xyXG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBhIFVVSUR2NyB3aGVuIHB1YmxpY0lkIGlzIG5vdCBzZXQnLCAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVudGl0eSA9IG5ldyBUZXN0RW50aXR5KCk7XHJcbiAgICAgIGV4cGVjdChlbnRpdHkucHVibGljSWQpLnRvQmVVbmRlZmluZWQoKTtcclxuXHJcbiAgICAgIGVudGl0eS5nZW5lcmF0ZVB1YmxpY0lkKCk7XHJcblxyXG4gICAgICBleHBlY3QoZW50aXR5LnB1YmxpY0lkKS50b0JlKCcwMTkxMjM0NS02Nzg5LTdhYmMtOGRlZi0wMTIzNDU2Nzg5YWInKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdzaG91bGQgbm90IG92ZXJ3cml0ZSBhbiBleGlzdGluZyBwdWJsaWNJZCcsICgpID0+IHtcclxuICAgICAgY29uc3QgZW50aXR5ID0gbmV3IFRlc3RFbnRpdHkoKTtcclxuICAgICAgZW50aXR5LnB1YmxpY0lkID0gJ2V4aXN0aW5nLXB1YmxpY0lkLXZhbHVlLXNob3VsZC1iZS1rZXB0JztcclxuXHJcbiAgICAgIGVudGl0eS5nZW5lcmF0ZVB1YmxpY0lkKCk7XHJcblxyXG4gICAgICBleHBlY3QoZW50aXR5LnB1YmxpY0lkKS50b0JlKCdleGlzdGluZy1wdWJsaWNJZC12YWx1ZS1zaG91bGQtYmUta2VwdCcpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ3Nob3VsZCBub3Qgb3ZlcndyaXRlIGEgcHJlLXNldCBVVUlEdjEgZnJvbSBEQiBkZWZhdWx0JywgKCkgPT4ge1xyXG4gICAgICBjb25zdCBlbnRpdHkgPSBuZXcgVGVzdEVudGl0eSgpO1xyXG4gICAgICBlbnRpdHkucHVibGljSWQgPSAnNTUwZTg0MDAtZTI5Yi0xMWQ0LWE3MTYtNDQ2NjU1NDQwMDAwJztcclxuXHJcbiAgICAgIGVudGl0eS5nZW5lcmF0ZVB1YmxpY0lkKCk7XHJcblxyXG4gICAgICBleHBlY3QoZW50aXR5LnB1YmxpY0lkKS50b0JlKCc1NTBlODQwMC1lMjliLTExZDQtYTcxNi00NDY2NTU0NDAwMDAnKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgcHVibGljSWQgd2hlbiBwdWJsaWNJZCBpcyBlbXB0eSBzdHJpbmcnLCAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVudGl0eSA9IG5ldyBUZXN0RW50aXR5KCk7XHJcbiAgICAgIGVudGl0eS5wdWJsaWNJZCA9ICcnO1xyXG5cclxuICAgICAgZW50aXR5LmdlbmVyYXRlUHVibGljSWQoKTtcclxuXHJcbiAgICAgIC8vIEVtcHR5IHN0cmluZyBpcyBmYWxzeSwgc28gZ2VuZXJhdGVQdWJsaWNJZCBzaG91bGQgYXNzaWduIGEgbmV3IHZhbHVlXHJcbiAgICAgIGV4cGVjdChlbnRpdHkucHVibGljSWQpLnRvQmUoJzAxOTEyMzQ1LTY3ODktN2FiYy04ZGVmLTAxMjM0NTY3ODlhYicpO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAvLyBJbmhlcml0YW5jZVxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgZGVzY3JpYmUoJ2luaGVyaXRhbmNlJywgKCkgPT4ge1xyXG4gICAgaXQoJ3Nob3VsZCBiZSBhbiBpbnN0YW5jZSBvZiBVdWlkQmFzZUVudGl0eScsICgpID0+IHtcclxuICAgICAgY29uc3QgZW50aXR5ID0gbmV3IFRlc3RFbnRpdHkoKTtcclxuICAgICAgZXhwZWN0KGVudGl0eSkudG9CZUluc3RhbmNlT2YoVXVpZEJhc2VFbnRpdHkpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ3Nob3VsZCBoYXZlIHB1YmxpY0lkIHByb3BlcnR5IGFjY2Vzc2libGUgZnJvbSBzdWJjbGFzcycsICgpID0+IHtcclxuICAgICAgY29uc3QgZW50aXR5ID0gbmV3IFRlc3RFbnRpdHkoKTtcclxuICAgICAgZW50aXR5LnB1YmxpY0lkID0gJ3Rlc3QtcHVibGljSWQnO1xyXG4gICAgICBlbnRpdHkuaWQgPSA0MjtcclxuXHJcbiAgICAgIGV4cGVjdChlbnRpdHkucHVibGljSWQpLnRvQmUoJ3Rlc3QtcHVibGljSWQnKTtcclxuICAgICAgZXhwZWN0KGVudGl0eS5pZCkudG9CZSg0Mik7XHJcbiAgICB9KTtcclxuICB9KTtcclxufSk7XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e0/uuidbaseentityspec_e098b8a2511d0107635b195f6fbea8de.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e0/uuidbaseentityspec_e098b8a2511d0107635b195f6fbea8de.map new file mode 100644 index 0000000..c82bcb3 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e0/uuidbaseentityspec_e098b8a2511d0107635b195f6fbea8de.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\entities\\uuid-base.entity.spec.ts","mappings":";;AAAA,0DAA0D;AAC1D,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACvB,QAAQ,EAAE,CAAC,GAAW,EAAE,EAAE,CACxB,iEAAiE,CAAC,IAAI,CAAC,GAAG,CAAC;IAC7E,EAAE,EAAE,GAAG,EAAE,CAAC,sCAAsC;CACjD,CAAC,CAAC,CAAC;AAEJ,yDAAoD;AAEpD,kDAAkD;AAClD,MAAM,UAAW,SAAQ,iCAAc;CAEtC;AAED,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,6DAA6D;IAC7D,0CAA0C;IAC1C,6DAA6D;IAE7D,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAChC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;YAExC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAE1B,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAChC,MAAM,CAAC,QAAQ,GAAG,wCAAwC,CAAC;YAE3D,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAE1B,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAChC,MAAM,CAAC,QAAQ,GAAG,sCAAsC,CAAC;YAEzD,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAE1B,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAChC,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC;YAErB,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAE1B,uEAAuE;YACvE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,6DAA6D;IAC7D,cAAc;IACd,6DAA6D;IAE7D,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAChC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,iCAAc,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAChC,MAAM,CAAC,QAAQ,GAAG,eAAe,CAAC;YAClC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;YAEf,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\entities\\uuid-base.entity.spec.ts"],"sourcesContent":["// Mock uuid module to avoid ESM import issue with uuid@13\r\njest.mock('uuid', () => ({\r\n validate: (str: string) =>\r\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(str),\r\n v7: () => '01912345-6789-7abc-8def-0123456789ab',\r\n}));\r\n\r\nimport { UuidBaseEntity } from './uuid-base.entity';\r\n\r\n// Concrete subclass for testing the abstract base\r\nclass TestEntity extends UuidBaseEntity {\r\n id!: number;\r\n}\r\n\r\ndescribe('UuidBaseEntity', () => {\r\n // ==========================================================\r\n // generatePublicId() — @BeforeInsert hook\r\n // ==========================================================\r\n\r\n describe('generatePublicId()', () => {\r\n it('should generate a UUIDv7 when publicId is not set', () => {\r\n const entity = new TestEntity();\r\n expect(entity.publicId).toBeUndefined();\r\n\r\n entity.generatePublicId();\r\n\r\n expect(entity.publicId).toBe('01912345-6789-7abc-8def-0123456789ab');\r\n });\r\n\r\n it('should not overwrite an existing publicId', () => {\r\n const entity = new TestEntity();\r\n entity.publicId = 'existing-publicId-value-should-be-kept';\r\n\r\n entity.generatePublicId();\r\n\r\n expect(entity.publicId).toBe('existing-publicId-value-should-be-kept');\r\n });\r\n\r\n it('should not overwrite a pre-set UUIDv1 from DB default', () => {\r\n const entity = new TestEntity();\r\n entity.publicId = '550e8400-e29b-11d4-a716-446655440000';\r\n\r\n entity.generatePublicId();\r\n\r\n expect(entity.publicId).toBe('550e8400-e29b-11d4-a716-446655440000');\r\n });\r\n\r\n it('should generate publicId when publicId is empty string', () => {\r\n const entity = new TestEntity();\r\n entity.publicId = '';\r\n\r\n entity.generatePublicId();\r\n\r\n // Empty string is falsy, so generatePublicId should assign a new value\r\n expect(entity.publicId).toBe('01912345-6789-7abc-8def-0123456789ab');\r\n });\r\n });\r\n\r\n // ==========================================================\r\n // Inheritance\r\n // ==========================================================\r\n\r\n describe('inheritance', () => {\r\n it('should be an instance of UuidBaseEntity', () => {\r\n const entity = new TestEntity();\r\n expect(entity).toBeInstanceOf(UuidBaseEntity);\r\n });\r\n\r\n it('should have publicId property accessible from subclass', () => {\r\n const entity = new TestEntity();\r\n entity.publicId = 'test-publicId';\r\n entity.id = 42;\r\n\r\n expect(entity.publicId).toBe('test-publicId');\r\n expect(entity.id).toBe(42);\r\n });\r\n });\r\n});\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/parserservice_e3eeeec977b0a2ef96ee65e1f116c970 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/parserservice_e3eeeec977b0a2ef96ee65e1f116c970 new file mode 100644 index 0000000..9522d04 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/parserservice_e3eeeec977b0a2ef96ee65e1f116c970 @@ -0,0 +1,171 @@ +254b78c2246b4b3f77c3c1661bb4a439 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var WorkflowDslParser_1; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WorkflowDslParser = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +const workflow_dsl_schema_1 = require("./workflow-dsl.schema"); +const workflow_definition_entity_1 = require("../entities/workflow-definition.entity"); +let WorkflowDslParser = WorkflowDslParser_1 = class WorkflowDslParser { + constructor(workflowDefRepo) { + this.workflowDefRepo = workflowDefRepo; + this.logger = new common_1.Logger(WorkflowDslParser_1.name); + } + /** + * Parse และ Validate Workflow DSL from JSON string + * @param dslJson JSON string ของ Workflow DSL + * @returns WorkflowDefinition entity พร้อมบันทึกลง database + */ + async parse(dslJson) { + try { + // Step 1: Parse JSON + const rawDsl = JSON.parse(dslJson); + // Step 2: Validate with Zod schema + const dsl = workflow_dsl_schema_1.WorkflowDslSchema.parse(rawDsl); + // Step 3: Validate state machine integrity + this.validateStateMachine(dsl); + // Step 4: Build WorkflowDefinition entity + const definition = this.buildDefinition(dsl); + // Step 5: Save to database + return await this.workflowDefRepo.save(definition); + } + catch (error) { + if (error instanceof SyntaxError) { + throw new common_1.BadRequestException(`Invalid JSON: ${error.message}`); + } + const err = error; + if (err.name === 'ZodError') { + throw new common_1.BadRequestException(`Invalid workflow DSL: ${JSON.stringify(err.errors)}`); + } + throw error; + } + } + /** + * Validate state machine integrity + * ตรวจสอบว่า state machine ถูกต้องตามหลักการ: + * - All states in transitions must exist in states array + * - Initial state must exist + * - All final states must exist + * - No dead-end states (states with no outgoing transitions except final states) + */ + validateStateMachine(dsl) { + const stateSet = new Set(dsl.states); + const finalStateSet = new Set(dsl.finalStates); + // 1. Validate initial state + if (!stateSet.has(dsl.initialState)) { + throw new common_1.BadRequestException(`Initial state "${dsl.initialState}" not found in states array`); + } + // 2. Validate final states + dsl.finalStates.forEach((state) => { + if (!stateSet.has(state)) { + throw new common_1.BadRequestException(`Final state "${state}" not found in states array`); + } + }); + // 3. Validate transitions + const statesWithOutgoing = new Set(); + dsl.transitions.forEach((transition, index) => { + // Check 'from' state + if (!stateSet.has(transition.from)) { + throw new common_1.BadRequestException(`Transition ${index}: 'from' state "${transition.from}" not found in states array`); + } + // Check 'to' state + if (!stateSet.has(transition.to)) { + throw new common_1.BadRequestException(`Transition ${index}: 'to' state "${transition.to}" not found in states array`); + } + // Track states with outgoing transitions + statesWithOutgoing.add(transition.from); + }); + // 4. Check for dead-end states (except final states) + const nonFinalStates = dsl.states.filter((state) => !finalStateSet.has(state)); + nonFinalStates.forEach((state) => { + if (!statesWithOutgoing.has(state) && state !== dsl.initialState) { + this.logger.warn(`Warning: State "${state}" has no outgoing transitions (potential dead-end)`); + } + }); + // 5. Check for duplicate transitions + const transitionKeys = new Set(); + dsl.transitions.forEach((transition) => { + const key = `${transition.from}-${transition.trigger}-${transition.to}`; + if (transitionKeys.has(key)) { + throw new common_1.BadRequestException(`Duplicate transition: ${transition.from} --[${transition.trigger}]--> ${transition.to}`); + } + transitionKeys.add(key); + }); + this.logger.log(`Workflow "${dsl.name}" v${dsl.version} validated successfully`); + } + /** + * Build WorkflowDefinition entity from validated DSL + */ + buildDefinition(dsl) { + const definition = new workflow_definition_entity_1.WorkflowDefinition(); + definition.workflow_code = dsl.name; + // Map Semver (1.0.0) to version int (1) + const majorVersion = Number(dsl.version.split('.')[0]); + definition.version = isNaN(majorVersion) ? 1 : majorVersion; + definition.description = dsl.description; + definition.dsl = dsl; + definition.compiled = dsl; + definition.is_active = true; + return definition; + } + /** + * Get parsed DSL from WorkflowDefinition + */ + async getParsedDsl(definitionId) { + const definition = await this.workflowDefRepo.findOne({ + where: { id: definitionId }, + }); + if (!definition) { + throw new common_1.BadRequestException(`Workflow definition ${definitionId} not found`); + } + try { + const dsl = definition.dsl; + return workflow_dsl_schema_1.WorkflowDslSchema.parse(dsl); + } + catch (error) { + this.logger.error(`Failed to parse stored DSL for definition ${definitionId}`, error); + throw new common_1.BadRequestException(`Invalid stored DSL: ${error instanceof Error ? error.message : String(error)}`); + } + } + /** + * Validate DSL without saving (dry-run) + */ + validateOnly(dslJson) { + try { + const rawDsl = JSON.parse(dslJson); + const dsl = workflow_dsl_schema_1.WorkflowDslSchema.parse(rawDsl); + this.validateStateMachine(dsl); + return { valid: true }; + } + catch (error) { + return { + valid: false, + errors: [ + error instanceof Error ? error.message : 'Unknown validation error', + ], + }; + } + } +}; +exports.WorkflowDslParser = WorkflowDslParser; +exports.WorkflowDslParser = WorkflowDslParser = WorkflowDslParser_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(workflow_definition_entity_1.WorkflowDefinition)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object]) +], WorkflowDslParser); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcd29ya2Zsb3ctZW5naW5lXFxkc2xcXHBhcnNlci5zZXJ2aWNlLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXlFO0FBQ3pFLDZDQUFtRDtBQUNuRCxxQ0FBcUM7QUFDckMsK0RBQXVFO0FBQ3ZFLHVGQUE0RTtBQUdyRSxJQUFNLGlCQUFpQix5QkFBdkIsTUFBTSxpQkFBaUI7SUFHNUIsWUFFRSxlQUF1RDtRQUEvQyxvQkFBZSxHQUFmLGVBQWUsQ0FBZ0M7UUFKeEMsV0FBTSxHQUFHLElBQUksZUFBTSxDQUFDLG1CQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBSzFELENBQUM7SUFFSjs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFlO1FBQ3pCLElBQUksQ0FBQztZQUNILHFCQUFxQjtZQUNyQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBWSxDQUFDO1lBRTlDLG1DQUFtQztZQUNuQyxNQUFNLEdBQUcsR0FBRyx1Q0FBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFNUMsMkNBQTJDO1lBQzNDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUUvQiwwQ0FBMEM7WUFDMUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUU3QywyQkFBMkI7WUFDM0IsT0FBTyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFBQyxPQUFPLEtBQWMsRUFBRSxDQUFDO1lBQ3hCLElBQUksS0FBSyxZQUFZLFdBQVcsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLElBQUksNEJBQW1CLENBQUMsaUJBQWlCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2xFLENBQUM7WUFDRCxNQUFNLEdBQUcsR0FBRyxLQUlYLENBQUM7WUFDRixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sSUFBSSw0QkFBbUIsQ0FDM0IseUJBQXlCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQ3RELENBQUM7WUFDSixDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxvQkFBb0IsQ0FBQyxHQUFnQjtRQUMzQyxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckMsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRS9DLDRCQUE0QjtRQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksNEJBQW1CLENBQzNCLGtCQUFrQixHQUFHLENBQUMsWUFBWSw2QkFBNkIsQ0FDaEUsQ0FBQztRQUNKLENBQUM7UUFFRCwyQkFBMkI7UUFDM0IsR0FBRyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNoQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN6QixNQUFNLElBQUksNEJBQW1CLENBQzNCLGdCQUFnQixLQUFLLDZCQUE2QixDQUNuRCxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsMEJBQTBCO1FBQzFCLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUU3QyxHQUFHLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUM1QyxxQkFBcUI7WUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sSUFBSSw0QkFBbUIsQ0FDM0IsY0FBYyxLQUFLLG1CQUFtQixVQUFVLENBQUMsSUFBSSw2QkFBNkIsQ0FDbkYsQ0FBQztZQUNKLENBQUM7WUFFRCxtQkFBbUI7WUFDbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sSUFBSSw0QkFBbUIsQ0FDM0IsY0FBYyxLQUFLLGlCQUFpQixVQUFVLENBQUMsRUFBRSw2QkFBNkIsQ0FDL0UsQ0FBQztZQUNKLENBQUM7WUFFRCx5Q0FBeUM7WUFDekMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztRQUVILHFEQUFxRDtRQUNyRCxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FDdEMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FDckMsQ0FBQztRQUVGLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUMvQixJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssS0FBSyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ2pFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNkLG1CQUFtQixLQUFLLG9EQUFvRCxDQUM3RSxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgscUNBQXFDO1FBQ3JDLE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDekMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUNyQyxNQUFNLEdBQUcsR0FBRyxHQUFHLFVBQVUsQ0FBQyxJQUFJLElBQUksVUFBVSxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDeEUsSUFBSSxjQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sSUFBSSw0QkFBbUIsQ0FDM0IseUJBQXlCLFVBQVUsQ0FBQyxJQUFJLE9BQU8sVUFBVSxDQUFDLE9BQU8sUUFBUSxVQUFVLENBQUMsRUFBRSxFQUFFLENBQ3pGLENBQUM7WUFDSixDQUFDO1lBQ0QsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNiLGFBQWEsR0FBRyxDQUFDLElBQUksTUFBTSxHQUFHLENBQUMsT0FBTyx5QkFBeUIsQ0FDaEUsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNLLGVBQWUsQ0FBQyxHQUFnQjtRQUN0QyxNQUFNLFVBQVUsR0FBRyxJQUFJLCtDQUFrQixFQUFFLENBQUM7UUFDNUMsVUFBVSxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ3BDLHdDQUF3QztRQUN4QyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RCxVQUFVLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7UUFDNUQsVUFBVSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDO1FBQ3pDLFVBQVUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ3JCLFVBQVUsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO1FBQzFCLFVBQVUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBRTVCLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBb0I7UUFDckMsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQztZQUNwRCxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFO1NBQzVCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksNEJBQW1CLENBQzNCLHVCQUF1QixZQUFZLFlBQVksQ0FDaEQsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDO1lBQzNCLE9BQU8sdUNBQWlCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFBQyxPQUFPLEtBQWMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLDZDQUE2QyxZQUFZLEVBQUUsRUFDM0QsS0FBSyxDQUNOLENBQUM7WUFDRixNQUFNLElBQUksNEJBQW1CLENBQzNCLHVCQUF1QixLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDaEYsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZLENBQUMsT0FBZTtRQUMxQixJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBWSxDQUFDO1lBQzlDLE1BQU0sR0FBRyxHQUFHLHVDQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDL0IsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN6QixDQUFDO1FBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztZQUN4QixPQUFPO2dCQUNMLEtBQUssRUFBRSxLQUFLO2dCQUNaLE1BQU0sRUFBRTtvQkFDTixLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQywwQkFBMEI7aUJBQ3BFO2FBQ0YsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0NBQ0YsQ0FBQTtBQTlMWSw4Q0FBaUI7NEJBQWpCLGlCQUFpQjtJQUQ3QixJQUFBLG1CQUFVLEdBQUU7SUFLUixXQUFBLElBQUEsMEJBQWdCLEVBQUMsK0NBQWtCLENBQUMsQ0FBQTt5REFDWixvQkFBVSxvQkFBVixvQkFBVTtHQUwxQixpQkFBaUIsQ0E4TDdCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXHdvcmtmbG93LWVuZ2luZVxcZHNsXFxwYXJzZXIuc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBMb2dnZXIsIEJhZFJlcXVlc3RFeGNlcHRpb24gfSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3RSZXBvc2l0b3J5IH0gZnJvbSAnQG5lc3Rqcy90eXBlb3JtJztcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFdvcmtmbG93RHNsU2NoZW1hLCBXb3JrZmxvd0RzbCB9IGZyb20gJy4vd29ya2Zsb3ctZHNsLnNjaGVtYSc7XG5pbXBvcnQgeyBXb3JrZmxvd0RlZmluaXRpb24gfSBmcm9tICcuLi9lbnRpdGllcy93b3JrZmxvdy1kZWZpbml0aW9uLmVudGl0eSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBXb3JrZmxvd0RzbFBhcnNlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IExvZ2dlcihXb3JrZmxvd0RzbFBhcnNlci5uYW1lKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0UmVwb3NpdG9yeShXb3JrZmxvd0RlZmluaXRpb24pXG4gICAgcHJpdmF0ZSB3b3JrZmxvd0RlZlJlcG86IFJlcG9zaXRvcnk8V29ya2Zsb3dEZWZpbml0aW9uPlxuICApIHt9XG5cbiAgLyoqXG4gICAqIFBhcnNlIOC5geC4peC4sCBWYWxpZGF0ZSBXb3JrZmxvdyBEU0wgZnJvbSBKU09OIHN0cmluZ1xuICAgKiBAcGFyYW0gZHNsSnNvbiBKU09OIHN0cmluZyDguILguK3guIcgV29ya2Zsb3cgRFNMXG4gICAqIEByZXR1cm5zIFdvcmtmbG93RGVmaW5pdGlvbiBlbnRpdHkg4Lie4Lij4LmJ4Lit4Lih4Lia4Lix4LiZ4LiX4Li24LiB4Lil4LiHIGRhdGFiYXNlXG4gICAqL1xuICBhc3luYyBwYXJzZShkc2xKc29uOiBzdHJpbmcpOiBQcm9taXNlPFdvcmtmbG93RGVmaW5pdGlvbj4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBTdGVwIDE6IFBhcnNlIEpTT05cbiAgICAgIGNvbnN0IHJhd0RzbCA9IEpTT04ucGFyc2UoZHNsSnNvbikgYXMgdW5rbm93bjtcblxuICAgICAgLy8gU3RlcCAyOiBWYWxpZGF0ZSB3aXRoIFpvZCBzY2hlbWFcbiAgICAgIGNvbnN0IGRzbCA9IFdvcmtmbG93RHNsU2NoZW1hLnBhcnNlKHJhd0RzbCk7XG5cbiAgICAgIC8vIFN0ZXAgMzogVmFsaWRhdGUgc3RhdGUgbWFjaGluZSBpbnRlZ3JpdHlcbiAgICAgIHRoaXMudmFsaWRhdGVTdGF0ZU1hY2hpbmUoZHNsKTtcblxuICAgICAgLy8gU3RlcCA0OiBCdWlsZCBXb3JrZmxvd0RlZmluaXRpb24gZW50aXR5XG4gICAgICBjb25zdCBkZWZpbml0aW9uID0gdGhpcy5idWlsZERlZmluaXRpb24oZHNsKTtcblxuICAgICAgLy8gU3RlcCA1OiBTYXZlIHRvIGRhdGFiYXNlXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy53b3JrZmxvd0RlZlJlcG8uc2F2ZShkZWZpbml0aW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU3ludGF4RXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oYEludmFsaWQgSlNPTjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyID0gZXJyb3IgYXMge1xuICAgICAgICBuYW1lPzogc3RyaW5nO1xuICAgICAgICBlcnJvcnM/OiB1bmtub3duO1xuICAgICAgICBtZXNzYWdlPzogc3RyaW5nO1xuICAgICAgfTtcbiAgICAgIGlmIChlcnIubmFtZSA9PT0gJ1pvZEVycm9yJykge1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgICBgSW52YWxpZCB3b3JrZmxvdyBEU0w6ICR7SlNPTi5zdHJpbmdpZnkoZXJyLmVycm9ycyl9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHN0YXRlIG1hY2hpbmUgaW50ZWdyaXR5XG4gICAqIOC4leC4o+C4p+C4iOC4quC4reC4muC4p+C5iOC4siBzdGF0ZSBtYWNoaW5lIOC4luC4ueC4geC4leC5ieC4reC4h+C4leC4suC4oeC4q+C4peC4seC4geC4geC4suC4ozpcbiAgICogLSBBbGwgc3RhdGVzIGluIHRyYW5zaXRpb25zIG11c3QgZXhpc3QgaW4gc3RhdGVzIGFycmF5XG4gICAqIC0gSW5pdGlhbCBzdGF0ZSBtdXN0IGV4aXN0XG4gICAqIC0gQWxsIGZpbmFsIHN0YXRlcyBtdXN0IGV4aXN0XG4gICAqIC0gTm8gZGVhZC1lbmQgc3RhdGVzIChzdGF0ZXMgd2l0aCBubyBvdXRnb2luZyB0cmFuc2l0aW9ucyBleGNlcHQgZmluYWwgc3RhdGVzKVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVN0YXRlTWFjaGluZShkc2w6IFdvcmtmbG93RHNsKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGVTZXQgPSBuZXcgU2V0KGRzbC5zdGF0ZXMpO1xuICAgIGNvbnN0IGZpbmFsU3RhdGVTZXQgPSBuZXcgU2V0KGRzbC5maW5hbFN0YXRlcyk7XG5cbiAgICAvLyAxLiBWYWxpZGF0ZSBpbml0aWFsIHN0YXRlXG4gICAgaWYgKCFzdGF0ZVNldC5oYXMoZHNsLmluaXRpYWxTdGF0ZSkpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICBgSW5pdGlhbCBzdGF0ZSBcIiR7ZHNsLmluaXRpYWxTdGF0ZX1cIiBub3QgZm91bmQgaW4gc3RhdGVzIGFycmF5YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAyLiBWYWxpZGF0ZSBmaW5hbCBzdGF0ZXNcbiAgICBkc2wuZmluYWxTdGF0ZXMuZm9yRWFjaCgoc3RhdGUpID0+IHtcbiAgICAgIGlmICghc3RhdGVTZXQuaGFzKHN0YXRlKSkge1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgICBgRmluYWwgc3RhdGUgXCIke3N0YXRlfVwiIG5vdCBmb3VuZCBpbiBzdGF0ZXMgYXJyYXlgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyAzLiBWYWxpZGF0ZSB0cmFuc2l0aW9uc1xuICAgIGNvbnN0IHN0YXRlc1dpdGhPdXRnb2luZyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZHNsLnRyYW5zaXRpb25zLmZvckVhY2goKHRyYW5zaXRpb24sIGluZGV4KSA9PiB7XG4gICAgICAvLyBDaGVjayAnZnJvbScgc3RhdGVcbiAgICAgIGlmICghc3RhdGVTZXQuaGFzKHRyYW5zaXRpb24uZnJvbSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgICAgYFRyYW5zaXRpb24gJHtpbmRleH06ICdmcm9tJyBzdGF0ZSBcIiR7dHJhbnNpdGlvbi5mcm9tfVwiIG5vdCBmb3VuZCBpbiBzdGF0ZXMgYXJyYXlgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrICd0bycgc3RhdGVcbiAgICAgIGlmICghc3RhdGVTZXQuaGFzKHRyYW5zaXRpb24udG8pKSB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICAgIGBUcmFuc2l0aW9uICR7aW5kZXh9OiAndG8nIHN0YXRlIFwiJHt0cmFuc2l0aW9uLnRvfVwiIG5vdCBmb3VuZCBpbiBzdGF0ZXMgYXJyYXlgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRyYWNrIHN0YXRlcyB3aXRoIG91dGdvaW5nIHRyYW5zaXRpb25zXG4gICAgICBzdGF0ZXNXaXRoT3V0Z29pbmcuYWRkKHRyYW5zaXRpb24uZnJvbSk7XG4gICAgfSk7XG5cbiAgICAvLyA0LiBDaGVjayBmb3IgZGVhZC1lbmQgc3RhdGVzIChleGNlcHQgZmluYWwgc3RhdGVzKVxuICAgIGNvbnN0IG5vbkZpbmFsU3RhdGVzID0gZHNsLnN0YXRlcy5maWx0ZXIoXG4gICAgICAoc3RhdGUpID0+ICFmaW5hbFN0YXRlU2V0LmhhcyhzdGF0ZSlcbiAgICApO1xuXG4gICAgbm9uRmluYWxTdGF0ZXMuZm9yRWFjaCgoc3RhdGUpID0+IHtcbiAgICAgIGlmICghc3RhdGVzV2l0aE91dGdvaW5nLmhhcyhzdGF0ZSkgJiYgc3RhdGUgIT09IGRzbC5pbml0aWFsU3RhdGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgV2FybmluZzogU3RhdGUgXCIke3N0YXRlfVwiIGhhcyBubyBvdXRnb2luZyB0cmFuc2l0aW9ucyAocG90ZW50aWFsIGRlYWQtZW5kKWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIDUuIENoZWNrIGZvciBkdXBsaWNhdGUgdHJhbnNpdGlvbnNcbiAgICBjb25zdCB0cmFuc2l0aW9uS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGRzbC50cmFuc2l0aW9ucy5mb3JFYWNoKCh0cmFuc2l0aW9uKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBgJHt0cmFuc2l0aW9uLmZyb219LSR7dHJhbnNpdGlvbi50cmlnZ2VyfS0ke3RyYW5zaXRpb24udG99YDtcbiAgICAgIGlmICh0cmFuc2l0aW9uS2V5cy5oYXMoa2V5KSkge1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgICBgRHVwbGljYXRlIHRyYW5zaXRpb246ICR7dHJhbnNpdGlvbi5mcm9tfSAtLVske3RyYW5zaXRpb24udHJpZ2dlcn1dLS0+ICR7dHJhbnNpdGlvbi50b31gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0cmFuc2l0aW9uS2V5cy5hZGQoa2V5KTtcbiAgICB9KTtcblxuICAgIHRoaXMubG9nZ2VyLmxvZyhcbiAgICAgIGBXb3JrZmxvdyBcIiR7ZHNsLm5hbWV9XCIgdiR7ZHNsLnZlcnNpb259IHZhbGlkYXRlZCBzdWNjZXNzZnVsbHlgXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBXb3JrZmxvd0RlZmluaXRpb24gZW50aXR5IGZyb20gdmFsaWRhdGVkIERTTFxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZERlZmluaXRpb24oZHNsOiBXb3JrZmxvd0RzbCk6IFdvcmtmbG93RGVmaW5pdGlvbiB7XG4gICAgY29uc3QgZGVmaW5pdGlvbiA9IG5ldyBXb3JrZmxvd0RlZmluaXRpb24oKTtcbiAgICBkZWZpbml0aW9uLndvcmtmbG93X2NvZGUgPSBkc2wubmFtZTtcbiAgICAvLyBNYXAgU2VtdmVyICgxLjAuMCkgdG8gdmVyc2lvbiBpbnQgKDEpXG4gICAgY29uc3QgbWFqb3JWZXJzaW9uID0gTnVtYmVyKGRzbC52ZXJzaW9uLnNwbGl0KCcuJylbMF0pO1xuICAgIGRlZmluaXRpb24udmVyc2lvbiA9IGlzTmFOKG1ham9yVmVyc2lvbikgPyAxIDogbWFqb3JWZXJzaW9uO1xuICAgIGRlZmluaXRpb24uZGVzY3JpcHRpb24gPSBkc2wuZGVzY3JpcHRpb247XG4gICAgZGVmaW5pdGlvbi5kc2wgPSBkc2w7XG4gICAgZGVmaW5pdGlvbi5jb21waWxlZCA9IGRzbDtcbiAgICBkZWZpbml0aW9uLmlzX2FjdGl2ZSA9IHRydWU7XG5cbiAgICByZXR1cm4gZGVmaW5pdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFyc2VkIERTTCBmcm9tIFdvcmtmbG93RGVmaW5pdGlvblxuICAgKi9cbiAgYXN5bmMgZ2V0UGFyc2VkRHNsKGRlZmluaXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxXb3JrZmxvd0RzbD4ge1xuICAgIGNvbnN0IGRlZmluaXRpb24gPSBhd2FpdCB0aGlzLndvcmtmbG93RGVmUmVwby5maW5kT25lKHtcbiAgICAgIHdoZXJlOiB7IGlkOiBkZWZpbml0aW9uSWQgfSxcbiAgICB9KTtcblxuICAgIGlmICghZGVmaW5pdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgIGBXb3JrZmxvdyBkZWZpbml0aW9uICR7ZGVmaW5pdGlvbklkfSBub3QgZm91bmRgXG4gICAgICApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkc2wgPSBkZWZpbml0aW9uLmRzbDtcbiAgICAgIHJldHVybiBXb3JrZmxvd0RzbFNjaGVtYS5wYXJzZShkc2wpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBwYXJzZSBzdG9yZWQgRFNMIGZvciBkZWZpbml0aW9uICR7ZGVmaW5pdGlvbklkfWAsXG4gICAgICAgIGVycm9yXG4gICAgICApO1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgIGBJbnZhbGlkIHN0b3JlZCBEU0w6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIERTTCB3aXRob3V0IHNhdmluZyAoZHJ5LXJ1bilcbiAgICovXG4gIHZhbGlkYXRlT25seShkc2xKc29uOiBzdHJpbmcpOiB7IHZhbGlkOiBib29sZWFuOyBlcnJvcnM/OiBzdHJpbmdbXSB9IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3RHNsID0gSlNPTi5wYXJzZShkc2xKc29uKSBhcyB1bmtub3duO1xuICAgICAgY29uc3QgZHNsID0gV29ya2Zsb3dEc2xTY2hlbWEucGFyc2UocmF3RHNsKTtcbiAgICAgIHRoaXMudmFsaWRhdGVTdGF0ZU1hY2hpbmUoZHNsKTtcbiAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlIH07XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgICAgZXJyb3JzOiBbXG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biB2YWxpZGF0aW9uIGVycm9yJyxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/parserservice_e3eeeec977b0a2ef96ee65e1f116c970.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/parserservice_e3eeeec977b0a2ef96ee65e1f116c970.map new file mode 100644 index 0000000..b0e44dd --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/parserservice_e3eeeec977b0a2ef96ee65e1f116c970.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\dsl\\parser.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\dsl\\parser.service.ts"],"sourcesContent":["import { Injectable, Logger, BadRequestException } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { Repository } from 'typeorm';\nimport { WorkflowDslSchema, WorkflowDsl } from './workflow-dsl.schema';\nimport { WorkflowDefinition } from '../entities/workflow-definition.entity';\n\n@Injectable()\nexport class WorkflowDslParser {\n private readonly logger = new Logger(WorkflowDslParser.name);\n\n constructor(\n @InjectRepository(WorkflowDefinition)\n private workflowDefRepo: Repository\n ) {}\n\n /**\n * Parse และ Validate Workflow DSL from JSON string\n * @param dslJson JSON string ของ Workflow DSL\n * @returns WorkflowDefinition entity พร้อมบันทึกลง database\n */\n async parse(dslJson: string): Promise {\n try {\n // Step 1: Parse JSON\n const rawDsl = JSON.parse(dslJson) as unknown;\n\n // Step 2: Validate with Zod schema\n const dsl = WorkflowDslSchema.parse(rawDsl);\n\n // Step 3: Validate state machine integrity\n this.validateStateMachine(dsl);\n\n // Step 4: Build WorkflowDefinition entity\n const definition = this.buildDefinition(dsl);\n\n // Step 5: Save to database\n return await this.workflowDefRepo.save(definition);\n } catch (error: unknown) {\n if (error instanceof SyntaxError) {\n throw new BadRequestException(`Invalid JSON: ${error.message}`);\n }\n const err = error as {\n name?: string;\n errors?: unknown;\n message?: string;\n };\n if (err.name === 'ZodError') {\n throw new BadRequestException(\n `Invalid workflow DSL: ${JSON.stringify(err.errors)}`\n );\n }\n throw error;\n }\n }\n\n /**\n * Validate state machine integrity\n * ตรวจสอบว่า state machine ถูกต้องตามหลักการ:\n * - All states in transitions must exist in states array\n * - Initial state must exist\n * - All final states must exist\n * - No dead-end states (states with no outgoing transitions except final states)\n */\n private validateStateMachine(dsl: WorkflowDsl): void {\n const stateSet = new Set(dsl.states);\n const finalStateSet = new Set(dsl.finalStates);\n\n // 1. Validate initial state\n if (!stateSet.has(dsl.initialState)) {\n throw new BadRequestException(\n `Initial state \"${dsl.initialState}\" not found in states array`\n );\n }\n\n // 2. Validate final states\n dsl.finalStates.forEach((state) => {\n if (!stateSet.has(state)) {\n throw new BadRequestException(\n `Final state \"${state}\" not found in states array`\n );\n }\n });\n\n // 3. Validate transitions\n const statesWithOutgoing = new Set();\n\n dsl.transitions.forEach((transition, index) => {\n // Check 'from' state\n if (!stateSet.has(transition.from)) {\n throw new BadRequestException(\n `Transition ${index}: 'from' state \"${transition.from}\" not found in states array`\n );\n }\n\n // Check 'to' state\n if (!stateSet.has(transition.to)) {\n throw new BadRequestException(\n `Transition ${index}: 'to' state \"${transition.to}\" not found in states array`\n );\n }\n\n // Track states with outgoing transitions\n statesWithOutgoing.add(transition.from);\n });\n\n // 4. Check for dead-end states (except final states)\n const nonFinalStates = dsl.states.filter(\n (state) => !finalStateSet.has(state)\n );\n\n nonFinalStates.forEach((state) => {\n if (!statesWithOutgoing.has(state) && state !== dsl.initialState) {\n this.logger.warn(\n `Warning: State \"${state}\" has no outgoing transitions (potential dead-end)`\n );\n }\n });\n\n // 5. Check for duplicate transitions\n const transitionKeys = new Set();\n dsl.transitions.forEach((transition) => {\n const key = `${transition.from}-${transition.trigger}-${transition.to}`;\n if (transitionKeys.has(key)) {\n throw new BadRequestException(\n `Duplicate transition: ${transition.from} --[${transition.trigger}]--> ${transition.to}`\n );\n }\n transitionKeys.add(key);\n });\n\n this.logger.log(\n `Workflow \"${dsl.name}\" v${dsl.version} validated successfully`\n );\n }\n\n /**\n * Build WorkflowDefinition entity from validated DSL\n */\n private buildDefinition(dsl: WorkflowDsl): WorkflowDefinition {\n const definition = new WorkflowDefinition();\n definition.workflow_code = dsl.name;\n // Map Semver (1.0.0) to version int (1)\n const majorVersion = Number(dsl.version.split('.')[0]);\n definition.version = isNaN(majorVersion) ? 1 : majorVersion;\n definition.description = dsl.description;\n definition.dsl = dsl;\n definition.compiled = dsl;\n definition.is_active = true;\n\n return definition;\n }\n\n /**\n * Get parsed DSL from WorkflowDefinition\n */\n async getParsedDsl(definitionId: string): Promise {\n const definition = await this.workflowDefRepo.findOne({\n where: { id: definitionId },\n });\n\n if (!definition) {\n throw new BadRequestException(\n `Workflow definition ${definitionId} not found`\n );\n }\n\n try {\n const dsl = definition.dsl;\n return WorkflowDslSchema.parse(dsl);\n } catch (error: unknown) {\n this.logger.error(\n `Failed to parse stored DSL for definition ${definitionId}`,\n error\n );\n throw new BadRequestException(\n `Invalid stored DSL: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Validate DSL without saving (dry-run)\n */\n validateOnly(dslJson: string): { valid: boolean; errors?: string[] } {\n try {\n const rawDsl = JSON.parse(dslJson) as unknown;\n const dsl = WorkflowDslSchema.parse(rawDsl);\n this.validateStateMachine(dsl);\n return { valid: true };\n } catch (error: unknown) {\n return {\n valid: false,\n errors: [\n error instanceof Error ? error.message : 'Unknown validation error',\n ],\n };\n }\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/shopdrawingsubcategoryentity_e35b39331cb52779870e0d0e5d2b17fc b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/shopdrawingsubcategoryentity_e35b39331cb52779870e0d0e5d2b17fc new file mode 100644 index 0000000..f668e60 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/shopdrawingsubcategoryentity_e35b39331cb52779870e0d0e5d2b17fc @@ -0,0 +1,58 @@ +d1f644f9fc5b52e63c0cb88535d3596a +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ShopDrawingSubCategory = void 0; +const typeorm_1 = require("typeorm"); +let ShopDrawingSubCategory = class ShopDrawingSubCategory { +}; +exports.ShopDrawingSubCategory = ShopDrawingSubCategory; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], ShopDrawingSubCategory.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id' }), + __metadata("design:type", Number) +], ShopDrawingSubCategory.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sub_category_code', length: 50, unique: true }), + __metadata("design:type", String) +], ShopDrawingSubCategory.prototype, "subCategoryCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sub_category_name', length: 255 }), + __metadata("design:type", String) +], ShopDrawingSubCategory.prototype, "subCategoryName", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], ShopDrawingSubCategory.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sort_order', default: 0 }), + __metadata("design:type", Number) +], ShopDrawingSubCategory.prototype, "sortOrder", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true }), + __metadata("design:type", Boolean) +], ShopDrawingSubCategory.prototype, "isActive", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], ShopDrawingSubCategory.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], ShopDrawingSubCategory.prototype, "updatedAt", void 0); +exports.ShopDrawingSubCategory = ShopDrawingSubCategory = __decorate([ + (0, typeorm_1.Entity)('shop_drawing_sub_categories') +], ShopDrawingSubCategory); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXHNob3AtZHJhd2luZy1zdWItY2F0ZWdvcnkuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FNaUI7QUFHVixJQUFNLHNCQUFzQixHQUE1QixNQUFNLHNCQUFzQjtDQTJCbEMsQ0FBQTtBQTNCWSx3REFBc0I7QUFFakM7SUFEQyxJQUFBLGdDQUFzQixHQUFFOztrREFDYjtBQUdaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDOzt5REFDWjtBQUduQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7K0RBQ3ZDO0FBR3pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7K0RBQzFCO0FBR3pCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7OzJEQUNwQjtBQUdyQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDOzt5REFDeEI7QUFHbkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7d0RBQzFCO0FBR25CO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDN0IsSUFBSSxvQkFBSixJQUFJO3lEQUFDO0FBR2pCO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDN0IsSUFBSSxvQkFBSixJQUFJO3lEQUFDO2lDQTFCTixzQkFBc0I7SUFEbEMsSUFBQSxnQkFBTSxFQUFDLDZCQUE2QixDQUFDO0dBQ3pCLHNCQUFzQixDQTJCbEMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXHNob3AtZHJhd2luZy1zdWItY2F0ZWdvcnkuZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVudGl0eSxcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbiAgQ29sdW1uLFxuICBDcmVhdGVEYXRlQ29sdW1uLFxuICBVcGRhdGVEYXRlQ29sdW1uLFxufSBmcm9tICd0eXBlb3JtJztcblxuQEVudGl0eSgnc2hvcF9kcmF3aW5nX3N1Yl9jYXRlZ29yaWVzJylcbmV4cG9ydCBjbGFzcyBTaG9wRHJhd2luZ1N1YkNhdGVnb3J5IHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuICBpZCE6IG51bWJlcjsgLy8g4LmA4LiV4Li04LihICEgKOC4leC4seC4p+C4l+C4teC5iCBlcnJvcilcblxuICBAQ29sdW1uKHsgbmFtZTogJ3Byb2plY3RfaWQnIH0pXG4gIHByb2plY3RJZCE6IG51bWJlcjsgLy8g4LmA4LiV4Li04LihICFcblxuICBAQ29sdW1uKHsgbmFtZTogJ3N1Yl9jYXRlZ29yeV9jb2RlJywgbGVuZ3RoOiA1MCwgdW5pcXVlOiB0cnVlIH0pXG4gIHN1YkNhdGVnb3J5Q29kZSE6IHN0cmluZzsgLy8g4LmA4LiV4Li04LihICFcblxuICBAQ29sdW1uKHsgbmFtZTogJ3N1Yl9jYXRlZ29yeV9uYW1lJywgbGVuZ3RoOiAyNTUgfSlcbiAgc3ViQ2F0ZWdvcnlOYW1lITogc3RyaW5nOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBDb2x1bW4oeyB0eXBlOiAndGV4dCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nOyAvLyBudWxsYWJsZSDguYPguIrguYkgP1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnc29ydF9vcmRlcicsIGRlZmF1bHQ6IDAgfSlcbiAgc29ydE9yZGVyITogbnVtYmVyOyAvLyDguYDguJXguLTguKEgIVxuXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXNfYWN0aXZlJywgZGVmYXVsdDogdHJ1ZSB9KVxuICBpc0FjdGl2ZSE6IGJvb2xlYW47IC8vIOC5gOC4leC4tOC4oSAhXG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTsgLy8g4LmA4LiV4Li04LihICFcblxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxuICB1cGRhdGVkQXQhOiBEYXRlOyAvLyDguYDguJXguLTguKEgIVxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/shopdrawingsubcategoryentity_e35b39331cb52779870e0d0e5d2b17fc.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/shopdrawingsubcategoryentity_e35b39331cb52779870e0d0e5d2b17fc.map new file mode 100644 index 0000000..0efb29f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/shopdrawingsubcategoryentity_e35b39331cb52779870e0d0e5d2b17fc.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\shop-drawing-sub-category.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAMiB;AAGV,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;CA2BlC,CAAA;AA3BY,wDAAsB;AAEjC;IADC,IAAA,gCAAsB,GAAE;;kDACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;yDACZ;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;+DACvC;AAGzB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;+DAC1B;AAGzB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;2DACpB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;yDACxB;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;wDAC1B;AAGnB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;yDAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;yDAAC;iCA1BN,sBAAsB;IADlC,IAAA,gBAAM,EAAC,6BAA6B,CAAC;GACzB,sBAAsB,CA2BlC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\shop-drawing-sub-category.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n UpdateDateColumn,\n} from 'typeorm';\n\n@Entity('shop_drawing_sub_categories')\nexport class ShopDrawingSubCategory {\n @PrimaryGeneratedColumn()\n id!: number; // เติม ! (ตัวที่ error)\n\n @Column({ name: 'project_id' })\n projectId!: number; // เติม !\n\n @Column({ name: 'sub_category_code', length: 50, unique: true })\n subCategoryCode!: string; // เติม !\n\n @Column({ name: 'sub_category_name', length: 255 })\n subCategoryName!: string; // เติม !\n\n @Column({ type: 'text', nullable: true })\n description?: string; // nullable ใช้ ?\n\n @Column({ name: 'sort_order', default: 0 })\n sortOrder!: number; // เติม !\n\n @Column({ name: 'is_active', default: true })\n isActive!: boolean; // เติม !\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date; // เติม !\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date; // เติม !\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/userassignmententity_e328ba3a163f74f87685fc110a022bcb b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/userassignmententity_e328ba3a163f74f87685fc110a022bcb new file mode 100644 index 0000000..922dd4f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/userassignmententity_e328ba3a163f74f87685fc110a022bcb @@ -0,0 +1,91 @@ +5ca2d04a14488641599da5575598d386 +"use strict"; +// File: src/modules/user/entities/user-assignment.entity.ts +// บันทึกการแก้ไข: Entity สำหรับการมอบหมาย Role ให้กับ User ตาม Scope (T1.3, RBAC 4-Level) +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e, _f, _g; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UserAssignment = void 0; +const typeorm_1 = require("typeorm"); +const user_entity_1 = require("./user.entity"); +const role_entity_1 = require("./role.entity"); +const organization_entity_1 = require("../../organization/entities/organization.entity"); // ปรับ Path ให้ตรงกับ ProjectModule +const project_entity_1 = require("../../project/entities/project.entity"); // ปรับ Path ให้ตรงกับ ProjectModule +const contract_entity_1 = require("../../contract/entities/contract.entity"); // ปรับ Path ให้ตรงกับ ProjectModule +let UserAssignment = class UserAssignment { +}; +exports.UserAssignment = UserAssignment; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], UserAssignment.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'user_id' }), + __metadata("design:type", Number) +], UserAssignment.prototype, "userId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'role_id' }), + __metadata("design:type", Number) +], UserAssignment.prototype, "roleId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'organization_id', nullable: true }), + __metadata("design:type", Number) +], UserAssignment.prototype, "organizationId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id', nullable: true }), + __metadata("design:type", Number) +], UserAssignment.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'contract_id', nullable: true }), + __metadata("design:type", Number) +], UserAssignment.prototype, "contractId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'assigned_by_user_id', nullable: true }), + __metadata("design:type", Number) +], UserAssignment.prototype, "assignedByUserId", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'assigned_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], UserAssignment.prototype, "assignedAt", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User, (user) => user.assignments, { onDelete: 'CASCADE' }), + (0, typeorm_1.JoinColumn)({ name: 'user_id' }), + __metadata("design:type", typeof (_b = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _b : Object) +], UserAssignment.prototype, "user", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => role_entity_1.Role, { onDelete: 'CASCADE' }), + (0, typeorm_1.JoinColumn)({ name: 'role_id' }), + __metadata("design:type", typeof (_c = typeof role_entity_1.Role !== "undefined" && role_entity_1.Role) === "function" ? _c : Object) +], UserAssignment.prototype, "role", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => organization_entity_1.Organization, { onDelete: 'CASCADE', nullable: true }), + (0, typeorm_1.JoinColumn)({ name: 'organization_id' }), + __metadata("design:type", typeof (_d = typeof organization_entity_1.Organization !== "undefined" && organization_entity_1.Organization) === "function" ? _d : Object) +], UserAssignment.prototype, "organization", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => project_entity_1.Project, { onDelete: 'CASCADE', nullable: true }), + (0, typeorm_1.JoinColumn)({ name: 'project_id' }), + __metadata("design:type", typeof (_e = typeof project_entity_1.Project !== "undefined" && project_entity_1.Project) === "function" ? _e : Object) +], UserAssignment.prototype, "project", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => contract_entity_1.Contract, { onDelete: 'CASCADE', nullable: true }), + (0, typeorm_1.JoinColumn)({ name: 'contract_id' }), + __metadata("design:type", typeof (_f = typeof contract_entity_1.Contract !== "undefined" && contract_entity_1.Contract) === "function" ? _f : Object) +], UserAssignment.prototype, "contract", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User, { nullable: true }), + (0, typeorm_1.JoinColumn)({ name: 'assigned_by_user_id' }), + __metadata("design:type", typeof (_g = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _g : Object) +], UserAssignment.prototype, "assignedBy", void 0); +exports.UserAssignment = UserAssignment = __decorate([ + (0, typeorm_1.Entity)('user_assignments') +], UserAssignment); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcdXNlclxcZW50aXRpZXNcXHVzZXItYXNzaWdubWVudC5lbnRpdHkudHMiLCJtYXBwaW5ncyI6IjtBQUFBLDREQUE0RDtBQUM1RCwwRkFBMEY7Ozs7Ozs7Ozs7Ozs7QUFFMUYscUNBT2lCO0FBQ2pCLCtDQUFxQztBQUNyQywrQ0FBcUM7QUFDckMseUZBQStFLENBQUMsb0NBQW9DO0FBQ3BILDBFQUFnRSxDQUFDLG9DQUFvQztBQUNyRyw2RUFBbUUsQ0FBQyxvQ0FBb0M7QUFHakcsSUFBTSxjQUFjLEdBQXBCLE1BQU0sY0FBYztDQW1EMUIsQ0FBQTtBQW5EWSx3Q0FBYztBQUV6QjtJQURDLElBQUEsZ0NBQXNCLEdBQUU7OzBDQUNiO0FBR1o7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7OzhDQUNaO0FBR2hCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOzs4Q0FDWjtBQUloQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7O3NEQUM1QjtBQUd4QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOztpREFDNUI7QUFHbkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7a0RBQzVCO0FBR3BCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7d0RBQzlCO0FBRzFCO0lBREMsSUFBQSwwQkFBZ0IsRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQztrREFDN0IsSUFBSSxvQkFBSixJQUFJO2tEQUFDO0FBTWxCO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDMUUsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO2tEQUN6QixrQkFBSSxvQkFBSixrQkFBSTs0Q0FBQztBQUlaO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDOUMsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO2tEQUN6QixrQkFBSSxvQkFBSixrQkFBSTs0Q0FBQztBQUlaO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLGtDQUFZLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN0RSxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztrREFDekIsa0NBQVksb0JBQVosa0NBQVk7b0RBQUM7QUFJNUI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsd0JBQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ2pFLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDekIsd0JBQU8sb0JBQVAsd0JBQU87K0NBQUM7QUFJbEI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsMEJBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ2xFLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQztrREFDekIsMEJBQVEsb0JBQVIsMEJBQVE7Z0RBQUM7QUFJcEI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsa0JBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN6QyxJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUsQ0FBQztrREFDL0Isa0JBQUksb0JBQUosa0JBQUk7a0RBQUM7eUJBbERQLGNBQWM7SUFEMUIsSUFBQSxnQkFBTSxFQUFDLGtCQUFrQixDQUFDO0dBQ2QsY0FBYyxDQW1EMUIiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcdXNlclxcZW50aXRpZXNcXHVzZXItYXNzaWdubWVudC5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRmlsZTogc3JjL21vZHVsZXMvdXNlci9lbnRpdGllcy91c2VyLWFzc2lnbm1lbnQuZW50aXR5LnRzXG4vLyDguJrguLHguJnguJfguLbguIHguIHguLLguKPguYHguIHguYnguYTguII6IEVudGl0eSDguKrguLPguKvguKPguLHguJrguIHguLLguKPguKHguK3guJrguKvguKHguLLguKIgUm9sZSDguYPguKvguYnguIHguLHguJogVXNlciDguJXguLLguKEgU2NvcGUgKFQxLjMsIFJCQUMgNC1MZXZlbClcblxuaW1wb3J0IHtcbiAgRW50aXR5LFxuICBDb2x1bW4sXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXG4gIE1hbnlUb09uZSxcbiAgSm9pbkNvbHVtbixcbiAgQ3JlYXRlRGF0ZUNvbHVtbixcbn0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi91c2VyLmVudGl0eSc7XG5pbXBvcnQgeyBSb2xlIH0gZnJvbSAnLi9yb2xlLmVudGl0eSc7XG5pbXBvcnQgeyBPcmdhbml6YXRpb24gfSBmcm9tICcuLi8uLi9vcmdhbml6YXRpb24vZW50aXRpZXMvb3JnYW5pemF0aW9uLmVudGl0eSc7IC8vIOC4m+C4o+C4seC4miBQYXRoIOC5g+C4q+C5ieC4leC4o+C4h+C4geC4seC4miBQcm9qZWN0TW9kdWxlXG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC9lbnRpdGllcy9wcm9qZWN0LmVudGl0eSc7IC8vIOC4m+C4o+C4seC4miBQYXRoIOC5g+C4q+C5ieC4leC4o+C4h+C4geC4seC4miBQcm9qZWN0TW9kdWxlXG5pbXBvcnQgeyBDb250cmFjdCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0L2VudGl0aWVzL2NvbnRyYWN0LmVudGl0eSc7IC8vIOC4m+C4o+C4seC4miBQYXRoIOC5g+C4q+C5ieC4leC4o+C4h+C4geC4seC4miBQcm9qZWN0TW9kdWxlXG5cbkBFbnRpdHkoJ3VzZXJfYXNzaWdubWVudHMnKVxuZXhwb3J0IGNsYXNzIFVzZXJBc3NpZ25tZW50IHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuICBpZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3VzZXJfaWQnIH0pXG4gIHVzZXJJZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3JvbGVfaWQnIH0pXG4gIHJvbGVJZCE6IG51bWJlcjtcblxuICAvLyAtLS0gU2NvcGVzICjguYDguKXguLfguK3guIHguYTguJTguYnguYDguJ7guLXguKLguIcgMSDguKvguKPguLfguK3guYDguJvguYfguJkgTlVMTCDguJfguLHguYnguIfguKvguKHguJTguKrguLPguKvguKPguLHguJogR2xvYmFsKSAtLS1cbiAgQENvbHVtbih7IG5hbWU6ICdvcmdhbml6YXRpb25faWQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBvcmdhbml6YXRpb25JZD86IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3Byb2plY3RfaWQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBwcm9qZWN0SWQ/OiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdjb250cmFjdF9pZCcsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGNvbnRyYWN0SWQ/OiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdhc3NpZ25lZF9ieV91c2VyX2lkJywgbnVsbGFibGU6IHRydWUgfSlcbiAgYXNzaWduZWRCeVVzZXJJZD86IG51bWJlcjtcblxuICBAQ3JlYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICdhc3NpZ25lZF9hdCcgfSlcbiAgYXNzaWduZWRBdCE6IERhdGU7XG5cbiAgLy8gLS0tIFJlbGF0aW9ucyAtLS1cblxuICBATWFueVRvT25lKCgpID0+IFVzZXIsICh1c2VyKSA9PiB1c2VyLmFzc2lnbm1lbnRzLCB7IG9uRGVsZXRlOiAnQ0FTQ0FERScgfSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAndXNlcl9pZCcgfSlcbiAgdXNlciE6IFVzZXI7XG5cbiAgQE1hbnlUb09uZSgoKSA9PiBSb2xlLCB7IG9uRGVsZXRlOiAnQ0FTQ0FERScgfSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAncm9sZV9pZCcgfSlcbiAgcm9sZSE6IFJvbGU7XG5cbiAgQE1hbnlUb09uZSgoKSA9PiBPcmdhbml6YXRpb24sIHsgb25EZWxldGU6ICdDQVNDQURFJywgbnVsbGFibGU6IHRydWUgfSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAnb3JnYW5pemF0aW9uX2lkJyB9KVxuICBvcmdhbml6YXRpb24/OiBPcmdhbml6YXRpb247XG5cbiAgQE1hbnlUb09uZSgoKSA9PiBQcm9qZWN0LCB7IG9uRGVsZXRlOiAnQ0FTQ0FERScsIG51bGxhYmxlOiB0cnVlIH0pXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3Byb2plY3RfaWQnIH0pXG4gIHByb2plY3Q/OiBQcm9qZWN0O1xuXG4gIEBNYW55VG9PbmUoKCkgPT4gQ29udHJhY3QsIHsgb25EZWxldGU6ICdDQVNDQURFJywgbnVsbGFibGU6IHRydWUgfSlcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAnY29udHJhY3RfaWQnIH0pXG4gIGNvbnRyYWN0PzogQ29udHJhY3Q7XG5cbiAgQE1hbnlUb09uZSgoKSA9PiBVc2VyLCB7IG51bGxhYmxlOiB0cnVlIH0pXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2Fzc2lnbmVkX2J5X3VzZXJfaWQnIH0pXG4gIGFzc2lnbmVkQnk/OiBVc2VyO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/userassignmententity_e328ba3a163f74f87685fc110a022bcb.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/userassignmententity_e328ba3a163f74f87685fc110a022bcb.map new file mode 100644 index 0000000..3011c0f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e3/userassignmententity_e328ba3a163f74f87685fc110a022bcb.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\entities\\user-assignment.entity.ts","mappings":";AAAA,4DAA4D;AAC5D,0FAA0F;;;;;;;;;;;;;AAE1F,qCAOiB;AACjB,+CAAqC;AACrC,+CAAqC;AACrC,yFAA+E,CAAC,oCAAoC;AACpH,0EAAgE,CAAC,oCAAoC;AACrG,6EAAmE,CAAC,oCAAoC;AAGjG,IAAM,cAAc,GAApB,MAAM,cAAc;CAmD1B,CAAA;AAnDY,wCAAc;AAEzB;IADC,IAAA,gCAAsB,GAAE;;0CACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;8CACZ;AAGhB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;8CACZ;AAIhB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sDAC5B;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iDAC5B;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kDAC5B;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;wDAC9B;AAG1B;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;kDAAC;AAMlB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC1E,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;kDACzB,kBAAI,oBAAJ,kBAAI;4CAAC;AAIZ;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC9C,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;kDACzB,kBAAI,oBAAJ,kBAAI;4CAAC;AAIZ;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kCAAY,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACtE,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;kDACzB,kCAAY,oBAAZ,kCAAY;oDAAC;AAI5B;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wBAAO,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjE,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,wBAAO,oBAAP,wBAAO;+CAAC;AAIlB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,0BAAQ,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAClE,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;kDACzB,0BAAQ,oBAAR,0BAAQ;gDAAC;AAIpB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACzC,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;kDAC/B,kBAAI,oBAAJ,kBAAI;kDAAC;yBAlDP,cAAc;IAD1B,IAAA,gBAAM,EAAC,kBAAkB,CAAC;GACd,cAAc,CAmD1B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\entities\\user-assignment.entity.ts"],"sourcesContent":["// File: src/modules/user/entities/user-assignment.entity.ts\n// บันทึกการแก้ไข: Entity สำหรับการมอบหมาย Role ให้กับ User ตาม Scope (T1.3, RBAC 4-Level)\n\nimport {\n Entity,\n Column,\n PrimaryGeneratedColumn,\n ManyToOne,\n JoinColumn,\n CreateDateColumn,\n} from 'typeorm';\nimport { User } from './user.entity';\nimport { Role } from './role.entity';\nimport { Organization } from '../../organization/entities/organization.entity'; // ปรับ Path ให้ตรงกับ ProjectModule\nimport { Project } from '../../project/entities/project.entity'; // ปรับ Path ให้ตรงกับ ProjectModule\nimport { Contract } from '../../contract/entities/contract.entity'; // ปรับ Path ให้ตรงกับ ProjectModule\n\n@Entity('user_assignments')\nexport class UserAssignment {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'user_id' })\n userId!: number;\n\n @Column({ name: 'role_id' })\n roleId!: number;\n\n // --- Scopes (เลือกได้เพียง 1 หรือเป็น NULL ทั้งหมดสำหรับ Global) ---\n @Column({ name: 'organization_id', nullable: true })\n organizationId?: number;\n\n @Column({ name: 'project_id', nullable: true })\n projectId?: number;\n\n @Column({ name: 'contract_id', nullable: true })\n contractId?: number;\n\n @Column({ name: 'assigned_by_user_id', nullable: true })\n assignedByUserId?: number;\n\n @CreateDateColumn({ name: 'assigned_at' })\n assignedAt!: Date;\n\n // --- Relations ---\n\n @ManyToOne(() => User, (user) => user.assignments, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'user_id' })\n user!: User;\n\n @ManyToOne(() => Role, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'role_id' })\n role!: Role;\n\n @ManyToOne(() => Organization, { onDelete: 'CASCADE', nullable: true })\n @JoinColumn({ name: 'organization_id' })\n organization?: Organization;\n\n @ManyToOne(() => Project, { onDelete: 'CASCADE', nullable: true })\n @JoinColumn({ name: 'project_id' })\n project?: Project;\n\n @ManyToOne(() => Contract, { onDelete: 'CASCADE', nullable: true })\n @JoinColumn({ name: 'contract_id' })\n contract?: Contract;\n\n @ManyToOne(() => User, { nullable: true })\n @JoinColumn({ name: 'assigned_by_user_id' })\n assignedBy?: User;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/correspondencerecipiententity_e6d8c5873482cabb391dfa74e13913fe b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/correspondencerecipiententity_e6d8c5873482cabb391dfa74e13913fe new file mode 100644 index 0000000..07c410c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/correspondencerecipiententity_e6d8c5873482cabb391dfa74e13913fe @@ -0,0 +1,48 @@ +fece14f86c7396787cf0fce0ba85c5a7 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceRecipient = void 0; +const typeorm_1 = require("typeorm"); +const correspondence_entity_1 = require("./correspondence.entity"); +const organization_entity_1 = require("../../organization/entities/organization.entity"); +let CorrespondenceRecipient = class CorrespondenceRecipient { +}; +exports.CorrespondenceRecipient = CorrespondenceRecipient; +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'correspondence_id' }), + __metadata("design:type", Number) +], CorrespondenceRecipient.prototype, "correspondenceId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'recipient_organization_id' }), + __metadata("design:type", Number) +], CorrespondenceRecipient.prototype, "recipientOrganizationId", void 0); +__decorate([ + (0, typeorm_1.PrimaryColumn)({ name: 'recipient_type', type: 'enum', enum: ['TO', 'CC'] }), + __metadata("design:type", String) +], CorrespondenceRecipient.prototype, "recipientType", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => correspondence_entity_1.Correspondence, (corr) => corr.recipients, { + onDelete: 'CASCADE', + }), + (0, typeorm_1.JoinColumn)({ name: 'correspondence_id' }), + __metadata("design:type", typeof (_a = typeof correspondence_entity_1.Correspondence !== "undefined" && correspondence_entity_1.Correspondence) === "function" ? _a : Object) +], CorrespondenceRecipient.prototype, "correspondence", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => organization_entity_1.Organization), + (0, typeorm_1.JoinColumn)({ name: 'recipient_organization_id' }), + __metadata("design:type", typeof (_b = typeof organization_entity_1.Organization !== "undefined" && organization_entity_1.Organization) === "function" ? _b : Object) +], CorrespondenceRecipient.prototype, "recipientOrganization", void 0); +exports.CorrespondenceRecipient = CorrespondenceRecipient = __decorate([ + (0, typeorm_1.Entity)('correspondence_recipients') +], CorrespondenceRecipient); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGVudGl0aWVzXFxjb3JyZXNwb25kZW5jZS1yZWNpcGllbnQuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FBdUU7QUFDdkUsbUVBQXlEO0FBQ3pELHlGQUErRTtBQUd4RSxJQUFNLHVCQUF1QixHQUE3QixNQUFNLHVCQUF1QjtDQW9CbkMsQ0FBQTtBQXBCWSwwREFBdUI7QUFFbEM7SUFEQyxJQUFBLHVCQUFhLEVBQUMsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQzs7aUVBQ25CO0FBRzFCO0lBREMsSUFBQSx1QkFBYSxFQUFDLEVBQUUsSUFBSSxFQUFFLDJCQUEyQixFQUFFLENBQUM7O3dFQUNwQjtBQUdqQztJQURDLElBQUEsdUJBQWEsRUFBQyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDOzs4REFDaEQ7QUFPNUI7SUFKQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMsc0NBQWMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtRQUMxRCxRQUFRLEVBQUUsU0FBUztLQUNwQixDQUFDO0lBQ0QsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLENBQUM7a0RBQ3pCLHNDQUFjLG9CQUFkLHNDQUFjOytEQUFDO0FBSWhDO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLGtDQUFZLENBQUM7SUFDN0IsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLDJCQUEyQixFQUFFLENBQUM7a0RBQzFCLGtDQUFZLG9CQUFaLGtDQUFZO3NFQUFDO2tDQW5CMUIsdUJBQXVCO0lBRG5DLElBQUEsZ0JBQU0sRUFBQywyQkFBMkIsQ0FBQztHQUN2Qix1QkFBdUIsQ0FvQm5DIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGNvcnJlc3BvbmRlbmNlXFxlbnRpdGllc1xcY29ycmVzcG9uZGVuY2UtcmVjaXBpZW50LmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHksIFByaW1hcnlDb2x1bW4sIE1hbnlUb09uZSwgSm9pbkNvbHVtbiB9IGZyb20gJ3R5cGVvcm0nO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZSB9IGZyb20gJy4vY29ycmVzcG9uZGVuY2UuZW50aXR5JztcclxuaW1wb3J0IHsgT3JnYW5pemF0aW9uIH0gZnJvbSAnLi4vLi4vb3JnYW5pemF0aW9uL2VudGl0aWVzL29yZ2FuaXphdGlvbi5lbnRpdHknO1xyXG5cclxuQEVudGl0eSgnY29ycmVzcG9uZGVuY2VfcmVjaXBpZW50cycpXHJcbmV4cG9ydCBjbGFzcyBDb3JyZXNwb25kZW5jZVJlY2lwaWVudCB7XHJcbiAgQFByaW1hcnlDb2x1bW4oeyBuYW1lOiAnY29ycmVzcG9uZGVuY2VfaWQnIH0pXHJcbiAgY29ycmVzcG9uZGVuY2VJZCE6IG51bWJlcjtcclxuXHJcbiAgQFByaW1hcnlDb2x1bW4oeyBuYW1lOiAncmVjaXBpZW50X29yZ2FuaXphdGlvbl9pZCcgfSlcclxuICByZWNpcGllbnRPcmdhbml6YXRpb25JZCE6IG51bWJlcjtcclxuXHJcbiAgQFByaW1hcnlDb2x1bW4oeyBuYW1lOiAncmVjaXBpZW50X3R5cGUnLCB0eXBlOiAnZW51bScsIGVudW06IFsnVE8nLCAnQ0MnXSB9KVxyXG4gIHJlY2lwaWVudFR5cGUhOiAnVE8nIHwgJ0NDJztcclxuXHJcbiAgLy8gUmVsYXRpb25zXHJcbiAgQE1hbnlUb09uZSgoKSA9PiBDb3JyZXNwb25kZW5jZSwgKGNvcnIpID0+IGNvcnIucmVjaXBpZW50cywge1xyXG4gICAgb25EZWxldGU6ICdDQVNDQURFJyxcclxuICB9KVxyXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2NvcnJlc3BvbmRlbmNlX2lkJyB9KVxyXG4gIGNvcnJlc3BvbmRlbmNlITogQ29ycmVzcG9uZGVuY2U7XHJcblxyXG4gIEBNYW55VG9PbmUoKCkgPT4gT3JnYW5pemF0aW9uKVxyXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3JlY2lwaWVudF9vcmdhbml6YXRpb25faWQnIH0pXHJcbiAgcmVjaXBpZW50T3JnYW5pemF0aW9uITogT3JnYW5pemF0aW9uO1xyXG59XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/correspondencerecipiententity_e6d8c5873482cabb391dfa74e13913fe.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/correspondencerecipiententity_e6d8c5873482cabb391dfa74e13913fe.map new file mode 100644 index 0000000..773077e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/correspondencerecipiententity_e6d8c5873482cabb391dfa74e13913fe.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-recipient.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAAuE;AACvE,mEAAyD;AACzD,yFAA+E;AAGxE,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;CAoBnC,CAAA;AApBY,0DAAuB;AAElC;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;;iEACnB;AAG1B;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAC;;wEACpB;AAGjC;IADC,IAAA,uBAAa,EAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;;8DAChD;AAO5B;IAJC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,sCAAc,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE;QAC1D,QAAQ,EAAE,SAAS;KACpB,CAAC;IACD,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;kDACzB,sCAAc,oBAAd,sCAAc;+DAAC;AAIhC;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kCAAY,CAAC;IAC7B,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAC;kDAC1B,kCAAY,oBAAZ,kCAAY;sEAAC;kCAnB1B,uBAAuB;IADnC,IAAA,gBAAM,EAAC,2BAA2B,CAAC;GACvB,uBAAuB,CAoBnC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\entities\\correspondence-recipient.entity.ts"],"sourcesContent":["import { Entity, PrimaryColumn, ManyToOne, JoinColumn } from 'typeorm';\r\nimport { Correspondence } from './correspondence.entity';\r\nimport { Organization } from '../../organization/entities/organization.entity';\r\n\r\n@Entity('correspondence_recipients')\r\nexport class CorrespondenceRecipient {\r\n @PrimaryColumn({ name: 'correspondence_id' })\r\n correspondenceId!: number;\r\n\r\n @PrimaryColumn({ name: 'recipient_organization_id' })\r\n recipientOrganizationId!: number;\r\n\r\n @PrimaryColumn({ name: 'recipient_type', type: 'enum', enum: ['TO', 'CC'] })\r\n recipientType!: 'TO' | 'CC';\r\n\r\n // Relations\r\n @ManyToOne(() => Correspondence, (corr) => corr.recipients, {\r\n onDelete: 'CASCADE',\r\n })\r\n @JoinColumn({ name: 'correspondence_id' })\r\n correspondence!: Correspondence;\r\n\r\n @ManyToOne(() => Organization)\r\n @JoinColumn({ name: 'recipient_organization_id' })\r\n recipientOrganization!: Organization;\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/correspondenceservice_e6c952ee6661779150c964b393cfe3e9 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/correspondenceservice_e6c952ee6661779150c964b393cfe3e9 new file mode 100644 index 0000000..b5ca26f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/correspondenceservice_e6c952ee6661779150c964b393cfe3e9 @@ -0,0 +1,918 @@ +bd22d2b9d1eee44ebf398938b2a71c4d +"use strict"; +// File: src/modules/correspondence/correspondence.service.ts +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var CorrespondenceService_1; +var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CorrespondenceService = void 0; +const common_1 = require("@nestjs/common"); +const typeorm_1 = require("@nestjs/typeorm"); +const typeorm_2 = require("typeorm"); +// Entities +const correspondence_entity_1 = require("./entities/correspondence.entity"); +const correspondence_revision_entity_1 = require("./entities/correspondence-revision.entity"); +const correspondence_type_entity_1 = require("./entities/correspondence-type.entity"); +const correspondence_status_entity_1 = require("./entities/correspondence-status.entity"); +const correspondence_reference_entity_1 = require("./entities/correspondence-reference.entity"); +const correspondence_recipient_entity_1 = require("./entities/correspondence-recipient.entity"); +const correspondence_tag_entity_1 = require("./entities/correspondence-tag.entity"); +const tag_entity_1 = require("../master/entities/tag.entity"); +const organization_entity_1 = require("../organization/entities/organization.entity"); +const correspondence_revision_attachment_entity_1 = require("./entities/correspondence-revision-attachment.entity"); +// Services +const document_numbering_service_1 = require("../document-numbering/services/document-numbering.service"); +const json_schema_service_1 = require("../json-schema/json-schema.service"); +const workflow_engine_service_1 = require("../workflow-engine/workflow-engine.service"); +const user_service_1 = require("../user/user.service"); +const search_service_1 = require("../search/search.service"); +const file_storage_service_1 = require("../../common/file-storage/file-storage.service"); +const uuid_resolver_service_1 = require("../../common/services/uuid-resolver.service"); +const notification_service_1 = require("../notification/notification.service"); +let CorrespondenceService = CorrespondenceService_1 = class CorrespondenceService { + async hasSystemManageAllPermission(userId) { + const permissions = await this.userService.getUserPermissions(userId); + return permissions.includes('system.manage_all'); + } + /** + * Business Rule: Revision Label Strategy + * - RFA, RFI: Use alphabet starting with 'A' (A, B, C...) + * - Other types (LETTER, MEMO, etc.): Use numeric (null for first, then 1, 2, 3...) + */ + getInitialRevisionLabel(typeCode) { + const alphabetTypes = ['RFA', 'RFI']; + if (alphabetTypes.includes(typeCode.toUpperCase())) { + return 'A'; // Alphabet for RFA, RFI + } + return undefined; // Numeric (no label for revision 0) + } + constructor(correspondenceRepo, revisionRepo, typeRepo, statusRepo, referenceRepo, tagRepo, numberingService, jsonSchemaService, workflowEngine, userService, dataSource, searchService, fileStorageService, uuidResolver, notificationService, revAttachRepo) { + this.correspondenceRepo = correspondenceRepo; + this.revisionRepo = revisionRepo; + this.typeRepo = typeRepo; + this.statusRepo = statusRepo; + this.referenceRepo = referenceRepo; + this.tagRepo = tagRepo; + this.numberingService = numberingService; + this.jsonSchemaService = jsonSchemaService; + this.workflowEngine = workflowEngine; + this.userService = userService; + this.dataSource = dataSource; + this.searchService = searchService; + this.fileStorageService = fileStorageService; + this.uuidResolver = uuidResolver; + this.notificationService = notificationService; + this.revAttachRepo = revAttachRepo; + this.logger = new common_1.Logger(CorrespondenceService_1.name); + } + /** + * Business Rule Validation: EC-CORR-003 - Correspondence to Self + * Prevent external correspondence to same organization + */ + async validateCorrespondenceRecipients(createDto, user) { + // Get user's organization + let userOrgId = user.primaryOrganizationId; + if (!userOrgId) { + const fullUser = await this.userService.findOne(user.user_id); + if (fullUser) { + userOrgId = fullUser.primaryOrganizationId; + } + } + if (!userOrgId) { + if (createDto.originatorId) { + const canManageAll = await this.hasSystemManageAllPermission(user.user_id); + if (canManageAll) { + userOrgId = await this.uuidResolver.resolveOrganizationId(createDto.originatorId); + } + } + if (!userOrgId) { + throw new common_1.BadRequestException('User must belong to an organization to create documents'); + } + } + // For impersonation, use the specified originator + const originatorOrgId = createDto.originatorId + ? await this.uuidResolver.resolveOrganizationId(createDto.originatorId) + : userOrgId; + // Check if it's internal communication + if (createDto.isInternal) { + // Internal communications should use Circulation instead + throw new common_1.BadRequestException('Internal communications should use Circulation Sheet instead of Correspondence'); + } + // Validate recipients + if (!createDto.recipients || createDto.recipients.length === 0) { + throw new common_1.BadRequestException('At least one recipient (TO or CC) is required'); + } + const toRecipients = createDto.recipients.filter((r) => r.type === 'TO'); + const ccRecipients = createDto.recipients.filter((r) => r.type === 'CC'); + if (toRecipients.length === 0 && ccRecipients.length === 0) { + throw new common_1.BadRequestException('At least one TO or CC recipient is required'); + } + // Check for same organization correspondence + for (const recipient of createDto.recipients) { + const recipientOrgId = await this.uuidResolver.resolveOrganizationId(recipient.organizationId); + if (recipientOrgId === originatorOrgId) { + throw new common_1.BadRequestException('Cannot send correspondence to your own organization. Use Circulation Sheet for internal communication.'); + } + } + } + async create(createDto, user) { + // Business Rule Validation: EC-CORR-003 - Correspondence to Self + await this.validateCorrespondenceRecipients(createDto, user); + // ADR-019: Resolve UUID references to internal INT IDs + const resolvedProjectId = await this.uuidResolver.resolveProjectId(createDto.projectId); + const resolvedOriginatorId = createDto.originatorId + ? await this.uuidResolver.resolveOrganizationId(createDto.originatorId) + : undefined; + const resolvedRecipients = createDto.recipients + ? await Promise.all(createDto.recipients.map(async (r) => ({ + organizationId: await this.uuidResolver.resolveOrganizationId(r.organizationId), + type: r.type, + }))) + : undefined; + const type = await this.typeRepo.findOne({ + where: { id: createDto.typeId }, + }); + if (!type) + throw new common_1.NotFoundException('Document Type not found'); + const statusDraft = await this.statusRepo.findOne({ + where: { statusCode: 'DRAFT' }, + }); + if (!statusDraft) { + throw new common_1.InternalServerErrorException('Status DRAFT not found in Master Data'); + } + let userOrgId = user.primaryOrganizationId; + if (!userOrgId) { + const fullUser = await this.userService.findOne(user.user_id); + if (fullUser) { + userOrgId = fullUser.primaryOrganizationId; + } + } + // Impersonation Logic + if (resolvedOriginatorId && resolvedOriginatorId !== userOrgId) { + const canManageAll = await this.hasSystemManageAllPermission(user.user_id); + if (!canManageAll) { + throw new common_1.ForbiddenException('You do not have permission to create documents on behalf of other organizations.'); + } + userOrgId = resolvedOriginatorId; + } + if (!userOrgId) { + throw new common_1.BadRequestException('User must belong to an organization to create documents'); + } + if (createDto.details) { + try { + await this.jsonSchemaService.validate(type.typeCode, createDto.details); + } + catch (error) { + this.logger.warn(`Schema validation warning for ${type.typeCode}: ${error.message}`); + } + } + const queryRunner = this.dataSource.createQueryRunner(); + await queryRunner.connect(); + await queryRunner.startTransaction(); + try { + // [Fix #6] Fetch real ORG Code from Organization entity + const originatorOrg = await this.dataSource.manager.findOne(organization_entity_1.Organization, { + where: { id: userOrgId }, + }); + const orgCode = originatorOrg?.organizationCode ?? 'UNK'; + // [v1.5.1] Extract recipient organization from recipients array (Primary TO) + const toRecipient = resolvedRecipients?.find((r) => r.type === 'TO'); + const recipientOrganizationId = toRecipient?.organizationId; + let recipientCode = ''; + if (recipientOrganizationId) { + const recOrg = await this.dataSource.manager.findOne(organization_entity_1.Organization, { + where: { id: recipientOrganizationId }, + }); + if (recOrg) + recipientCode = recOrg.organizationCode; + } + const docNumber = await this.numberingService.generateNextNumber({ + projectId: resolvedProjectId, + originatorOrganizationId: userOrgId, + typeId: createDto.typeId, + disciplineId: createDto.disciplineId, + subTypeId: createDto.subTypeId, + recipientOrganizationId, // [v1.5.1] Pass recipient for document number format + year: new Date().getFullYear(), + customTokens: { + TYPE_CODE: type.typeCode, + ORG_CODE: orgCode, + RECIPIENT_CODE: recipientCode, + REC_CODE: recipientCode, + }, + }); + const correspondence = queryRunner.manager.create(correspondence_entity_1.Correspondence, { + correspondenceNumber: docNumber.number, + correspondenceTypeId: createDto.typeId, + disciplineId: createDto.disciplineId, + projectId: resolvedProjectId, + originatorId: userOrgId, + isInternal: createDto.isInternal || false, + createdBy: user.user_id, + }); + const savedCorr = await queryRunner.manager.save(correspondence); + const revision = queryRunner.manager.create(correspondence_revision_entity_1.CorrespondenceRevision, { + correspondenceId: savedCorr.id, + revisionNumber: 0, + revisionLabel: this.getInitialRevisionLabel(type.typeCode), + isCurrent: true, + statusId: statusDraft.id, + subject: createDto.subject, + body: createDto.body, + remarks: createDto.remarks, + dueDate: createDto.dueDate ? new Date(createDto.dueDate) : undefined, + documentDate: createDto.documentDate + ? new Date(createDto.documentDate) + : undefined, + issuedDate: createDto.issuedDate + ? new Date(createDto.issuedDate) + : undefined, + receivedDate: createDto.receivedDate + ? new Date(createDto.receivedDate) + : undefined, + description: createDto.description, + details: createDto.details, + createdBy: user.user_id, + schemaVersion: 1, + }); + await queryRunner.manager.save(revision); + // Save Recipients (using resolved INT IDs) + if (resolvedRecipients && resolvedRecipients.length > 0) { + const recipients = resolvedRecipients.map((r) => queryRunner.manager.create(correspondence_recipient_entity_1.CorrespondenceRecipient, { + correspondenceId: savedCorr.id, + recipientOrganizationId: r.organizationId, + recipientType: r.type, + })); + await queryRunner.manager.save(recipients); + } + // Commit attachments from Temp → Permanent (Two-Phase Storage) + if (createDto.attachmentTempIds?.length) { + const issueDate = createDto.issuedDate + ? new Date(createDto.issuedDate) + : createDto.documentDate + ? new Date(createDto.documentDate) + : undefined; + // [FIX v1.8.1] commit ได้ Attachment records กลับมา → บันทึก junction + const committed = await this.fileStorageService.commit(createDto.attachmentTempIds, { issueDate, documentType: 'Correspondence' }); + if (committed.length > 0) { + const links = committed.map((att, idx) => queryRunner.manager.create(correspondence_revision_attachment_entity_1.CorrespondenceRevisionAttachment, { + correspondenceRevisionId: revision.id, + attachmentId: att.id, + isMainDocument: idx === 0, // ไฟล์แรกเป็น main document + })); + await queryRunner.manager.save(correspondence_revision_attachment_entity_1.CorrespondenceRevisionAttachment, links); + } + } + await queryRunner.commitTransaction(); + // Start Workflow Instance (non-blocking) + try { + const workflowCode = `CORRESPONDENCE_${type.typeCode}`; + await this.workflowEngine.createInstance(workflowCode, 'correspondence', savedCorr.id.toString(), { + projectId: resolvedProjectId, + originatorId: userOrgId, + disciplineId: createDto.disciplineId, + initiatorId: user.user_id, + }); + } + catch (error) { + this.logger.warn(`Workflow not started for ${docNumber.number} (Code: CORRESPONDENCE_${type.typeCode}): ${error.message}`); + } + // Fire-and-forget search indexing (non-blocking, void intentional) + void this.searchService.indexDocument({ + id: savedCorr.id, + publicId: savedCorr.publicId, + type: 'correspondence', + docNumber: docNumber.number, + title: createDto.subject, + description: createDto.description, + status: 'DRAFT', + projectId: resolvedProjectId, + createdAt: new Date(), + }); + return { + ...savedCorr, + currentRevision: revision, + }; + } + catch (err) { + await queryRunner.rollbackTransaction(); + this.logger.error(`Failed to create correspondence: ${err.message}`); + throw err; + } + finally { + await queryRunner.release(); + } + } + async findAll(searchDto = {}) { + const { search, typeId, projectId, statusId, status, page = 1, limit = 10, } = searchDto; + const skip = (page - 1) * limit; + // Change: Query from Revision Repo + const query = this.revisionRepo + .createQueryBuilder('rev') + .leftJoinAndSelect('rev.correspondence', 'corr') + .leftJoinAndSelect('corr.type', 'type') + .leftJoinAndSelect('corr.project', 'project') + .leftJoinAndSelect('corr.originator', 'org') + .leftJoinAndSelect('rev.status', 'status'); + // Filter by Revision Status + const revStatus = searchDto.revisionStatus || 'CURRENT'; + if (revStatus === 'CURRENT') { + query.where('rev.isCurrent = :isCurrent', { isCurrent: true }); + } + else if (revStatus === 'OLD') { + query.where('rev.isCurrent = :isCurrent', { isCurrent: false }); + } + // If 'ALL', no filter needed on isCurrent + if (projectId) { + query.andWhere('corr.projectId = :projectId', { projectId }); + } + if (typeId) { + query.andWhere('corr.correspondenceTypeId = :typeId', { typeId }); + } + if (statusId) { + query.andWhere('rev.statusId = :statusId', { statusId }); + } + if (status) { + query.andWhere('status.statusCode = :status', { status }); + } + if (search) { + query.andWhere('(corr.correspondenceNumber LIKE :search OR rev.subject LIKE :search)', { search: `%${search}%` }); + } + // Default Sort: Latest Created + query.orderBy('rev.createdAt', 'DESC').skip(skip).take(limit); + const [items, total] = await query.getManyAndCount(); + return { + data: items, + meta: { + total, + page, + limit, + totalPages: Math.ceil(total / limit), + }, + }; + } + async findOne(id) { + const correspondence = await this.correspondenceRepo.findOne({ + where: { id }, + relations: [ + 'revisions', + 'revisions.status', + 'type', + 'project', + 'originator', + 'recipients', + 'recipients.recipientOrganization', // [v1.5.1] Fixed relation name + ], + }); + if (!correspondence) { + throw new common_1.NotFoundException(`Correspondence with ID ${id} not found`); + } + return correspondence; + } + async findOneByUuid(publicId) { + const correspondence = await this.correspondenceRepo.findOne({ + where: { publicId }, + relations: [ + 'revisions', + 'revisions.status', + 'revisions.attachmentLinks', // [FIX v1.8.1] โหลด junction + 'revisions.attachmentLinks.attachment', // [FIX v1.8.1] โหลด attachment จริง + 'type', + 'project', + 'originator', + 'recipients', + 'recipients.recipientOrganization', + ], + }); + if (!correspondence) { + throw new common_1.NotFoundException(`Correspondence with UUID ${publicId} not found`); + } + return correspondence; + } + async addReference(id, dto) { + const source = await this.correspondenceRepo.findOne({ where: { id } }); + // ADR-019: Resolve target publicId → internal INT id + const target = await this.correspondenceRepo.findOne({ + where: { publicId: dto.targetUuid }, + }); + if (!source || !target) { + throw new common_1.NotFoundException('Source or Target correspondence not found'); + } + if (source.id === target.id) { + throw new common_1.BadRequestException('Cannot reference self'); + } + const exists = await this.referenceRepo.findOne({ + where: { + sourceId: id, + targetId: target.id, + }, + }); + if (exists) { + return exists; + } + const ref = this.referenceRepo.create({ + sourceId: id, + targetId: target.id, + }); + return this.referenceRepo.save(ref); + } + async removeReference(id, targetId) { + const result = await this.referenceRepo.delete({ + sourceId: id, + targetId: targetId, + }); + if (result.affected === 0) { + throw new common_1.NotFoundException('Reference not found'); + } + } + async getTags(id) { + const rows = await this.tagRepo.find({ + where: { correspondenceId: id }, + relations: ['tag'], + }); + return rows.map((r) => r.tag).filter(Boolean); + } + async addTag(id, tagId) { + const correspondence = await this.correspondenceRepo.findOne({ + where: { id }, + }); + if (!correspondence) { + throw new common_1.NotFoundException(`Correspondence ${id} not found`); + } + const tag = await this.dataSource.manager.findOne(tag_entity_1.Tag, { + where: { id: tagId }, + }); + if (!tag) { + throw new common_1.NotFoundException(`Tag ${tagId} not found`); + } + const exists = await this.tagRepo.findOne({ + where: { correspondenceId: id, tagId }, + }); + if (exists) + return exists; + const row = this.tagRepo.create({ correspondenceId: id, tagId }); + return this.tagRepo.save(row); + } + async removeTag(id, tagId) { + const result = await this.tagRepo.delete({ correspondenceId: id, tagId }); + if (result.affected === 0) { + throw new common_1.NotFoundException('Tag assignment not found'); + } + } + async getReferences(id) { + const outgoing = await this.referenceRepo.find({ + where: { sourceId: id }, + relations: ['target', 'target.type'], + }); + const incoming = await this.referenceRepo.find({ + where: { targetId: id }, + relations: ['source', 'source.type'], + }); + return { outgoing, incoming }; + } + async update(id, updateDto, user) { + // 1. Find Current Revision + const revision = await this.revisionRepo.findOne({ + where: { + correspondenceId: id, + isCurrent: true, + }, + relations: ['correspondence'], + }); + if (!revision) { + throw new common_1.NotFoundException(`Current revision for correspondence ${id} not found`); + } + // 2. Check Permission + if (revision.statusId) { + const status = await this.statusRepo.findOne({ + where: { id: revision.statusId }, + }); + if (status && status.statusCode !== 'DRAFT') { + const permissions = await this.userService.getUserPermissions(user.user_id); + const canEditSubmittedOrLater = permissions.includes('correspondence.cancel') || + permissions.includes('system.manage_all'); + if (!canEditSubmittedOrLater) { + throw new common_1.ForbiddenException('Only Org Admin or Superadmin can edit non-draft correspondences'); + } + } + } + // ADR-019: Resolve UUID references in update DTO + const updResolvedProjectId = updateDto.projectId + ? await this.uuidResolver.resolveProjectId(updateDto.projectId) + : undefined; + const updResolvedOriginatorId = updateDto.originatorId + ? await this.uuidResolver.resolveOrganizationId(updateDto.originatorId) + : undefined; + const updResolvedRecipients = updateDto.recipients + ? await Promise.all(updateDto.recipients.map(async (r) => ({ + organizationId: await this.uuidResolver.resolveOrganizationId(r.organizationId), + type: r.type, + }))) + : undefined; + // 3. Update Correspondence Entity if needed + const correspondenceUpdate = {}; + if (updateDto.disciplineId) + correspondenceUpdate.disciplineId = updateDto.disciplineId; + if (updResolvedProjectId) + correspondenceUpdate.projectId = updResolvedProjectId; + if (updResolvedOriginatorId) + correspondenceUpdate.originatorId = updResolvedOriginatorId; + if (Object.keys(correspondenceUpdate).length > 0) { + await this.correspondenceRepo.update(id, correspondenceUpdate); + } + // 4. Update Revision Entity + const revisionUpdate = {}; + if (updateDto.subject) + revisionUpdate.subject = updateDto.subject; + if (updateDto.body) + revisionUpdate.body = updateDto.body; + if (updateDto.remarks) + revisionUpdate.remarks = updateDto.remarks; + // Format Date correctly if string + if (updateDto.dueDate) + revisionUpdate.dueDate = new Date(updateDto.dueDate); + if (updateDto.documentDate) + revisionUpdate.documentDate = new Date(updateDto.documentDate); + if (updateDto.issuedDate) + revisionUpdate.issuedDate = new Date(updateDto.issuedDate); + if (updateDto.receivedDate) + revisionUpdate.receivedDate = new Date(updateDto.receivedDate); + if (updateDto.description) + revisionUpdate.description = updateDto.description; + if (updateDto.details) + revisionUpdate.details = updateDto.details; + if (Object.keys(revisionUpdate).length > 0) { + await this.revisionRepo.update(revision.id, revisionUpdate); + } + // 4.5 Commit new attachments from Temp → Permanent (Two-Phase Storage) + if (updateDto.attachmentTempIds?.length) { + const issueDate = updateDto.issuedDate + ? new Date(updateDto.issuedDate) + : updateDto.documentDate + ? new Date(updateDto.documentDate) + : revision.issuedDate || revision.documentDate || undefined; + // [FIX v1.8.1] commit ได้ Attachment records กลับมา → บันทึก junction + const committed = await this.fileStorageService.commit(updateDto.attachmentTempIds, { + issueDate: issueDate ? new Date(issueDate) : undefined, + documentType: 'Correspondence', + }); + if (committed.length > 0) { + const links = committed.map((att) => this.revAttachRepo.create({ + correspondenceRevisionId: revision.id, + attachmentId: att.id, + isMainDocument: false, // ไฟล์ที่ upload เพิ่มเติมไม่ใช่ main + })); + await this.revAttachRepo.save(links); + } + } + // 5. Update Recipients if provided + if (updResolvedRecipients) { + const recipientRepo = this.dataSource.getRepository(correspondence_recipient_entity_1.CorrespondenceRecipient); + await recipientRepo.delete({ correspondenceId: id }); + const newRecipients = updResolvedRecipients.map((r) => recipientRepo.create({ + correspondenceId: id, + recipientOrganizationId: r.organizationId, + recipientType: r.type, + })); + await recipientRepo.save(newRecipients); + } + // 6. Regenerate Document Number if structural fields changed (Recipient, Discipline, Type, Project) + // AND it is a DRAFT. + // Fetch fresh data for context and comparison + const currentCorr = await this.correspondenceRepo.findOne({ + where: { id }, + relations: ['type', 'recipients', 'recipients.recipientOrganization'], + }); + if (currentCorr) { + const currentToRecipient = currentCorr.recipients?.find((r) => r.recipientType === 'TO'); + const currentRecipientId = currentToRecipient?.recipientOrganizationId; + // Check for ACTUAL value changes + const isProjectChanged = updResolvedProjectId !== undefined && + updResolvedProjectId !== currentCorr.projectId; + const isOriginatorChanged = updResolvedOriginatorId !== undefined && + updResolvedOriginatorId !== currentCorr.originatorId; + const isDisciplineChanged = updateDto.disciplineId !== undefined && + updateDto.disciplineId !== currentCorr.disciplineId; + const isTypeChanged = updateDto.typeId !== undefined && + updateDto.typeId !== currentCorr.correspondenceTypeId; + let isRecipientChanged = false; + let newRecipientId; + if (updResolvedRecipients) { + const newToRecipient = updResolvedRecipients.find((r) => r.type === 'TO'); + newRecipientId = newToRecipient?.organizationId; + if (newRecipientId !== currentRecipientId) { + isRecipientChanged = true; + } + } + if (isProjectChanged || + isDisciplineChanged || + isTypeChanged || + isRecipientChanged || + isOriginatorChanged) { + const targetRecipientId = isRecipientChanged + ? newRecipientId + : currentRecipientId; + // Resolve Recipient Code for the NEW context + let recipientCode = ''; + if (targetRecipientId) { + const recOrg = await this.dataSource.manager.findOne(organization_entity_1.Organization, { + where: { id: targetRecipientId }, + }); + if (recOrg) + recipientCode = recOrg.organizationCode; + } + // [Fix #6] Fetch real ORG Code from originator organization + const originatorOrgForUpdate = await this.dataSource.manager.findOne(organization_entity_1.Organization, { + where: { + id: updResolvedOriginatorId ?? currentCorr.originatorId ?? 0, + }, + }); + const orgCode = originatorOrgForUpdate?.organizationCode ?? 'UNK'; + // Prepare Contexts + const oldCtx = { + projectId: currentCorr.projectId, + originatorOrganizationId: currentCorr.originatorId ?? 0, + typeId: currentCorr.correspondenceTypeId, + disciplineId: currentCorr.disciplineId, + recipientOrganizationId: currentRecipientId, + year: new Date().getFullYear(), + }; + const newCtx = { + projectId: updResolvedProjectId ?? currentCorr.projectId, + originatorOrganizationId: updResolvedOriginatorId ?? currentCorr.originatorId ?? 0, + typeId: updateDto.typeId ?? currentCorr.correspondenceTypeId, + disciplineId: updateDto.disciplineId ?? currentCorr.disciplineId, + recipientOrganizationId: targetRecipientId, + year: new Date().getFullYear(), + userId: user.user_id, // Pass User ID for Audit + customTokens: { + TYPE_CODE: currentCorr.type?.typeCode || '', + ORG_CODE: orgCode, + RECIPIENT_CODE: recipientCode, + REC_CODE: recipientCode, + }, + }; + // If Type Changed, need NEW Type Code + if (isTypeChanged) { + const newType = await this.typeRepo.findOne({ + where: { id: newCtx.typeId }, + }); + if (newType) + newCtx.customTokens.TYPE_CODE = newType.typeCode; + } + const newDocNumber = await this.numberingService.updateNumberForDraft(currentCorr.correspondenceNumber, oldCtx, newCtx); + await this.correspondenceRepo.update(id, { + correspondenceNumber: newDocNumber, + }); + } + } + const updated = await this.findOne(id); + // Re-index updated document in Elasticsearch (fire-and-forget) + void this.searchService.indexDocument({ + id: updated.id, + publicId: updated.publicId, + type: 'correspondence', + docNumber: updated.correspondenceNumber, + title: updateDto.subject ?? updated.revisions?.[0]?.subject, + description: updateDto.description ?? updated.revisions?.[0]?.description, + status: 'DRAFT', + projectId: updated.projectId, + createdAt: updated.createdAt, + }); + return updated; + } + async previewDocumentNumber(createDto, user) { + // ADR-019: Resolve UUID references + const previewProjectId = await this.uuidResolver.resolveProjectId(createDto.projectId); + const previewOriginatorId = createDto.originatorId + ? await this.uuidResolver.resolveOrganizationId(createDto.originatorId) + : undefined; + const previewRecipients = createDto.recipients + ? await Promise.all(createDto.recipients.map(async (r) => ({ + organizationId: await this.uuidResolver.resolveOrganizationId(r.organizationId), + type: r.type, + }))) + : undefined; + const type = await this.typeRepo.findOne({ + where: { id: createDto.typeId }, + }); + if (!type) + throw new common_1.NotFoundException('Document Type not found'); + let userOrgId = user.primaryOrganizationId; + if (!userOrgId) { + const fullUser = await this.userService.findOne(user.user_id); + if (fullUser) + userOrgId = fullUser.primaryOrganizationId; + } + if (previewOriginatorId && previewOriginatorId !== userOrgId) { + // Allow impersonation for preview + userOrgId = previewOriginatorId; + } + // Extract recipient from recipients array + const toRecipient = previewRecipients?.find((r) => r.type === 'TO'); + const recipientOrganizationId = toRecipient?.organizationId; + let recipientCode = ''; + if (recipientOrganizationId) { + const recOrg = await this.dataSource.manager.findOne(organization_entity_1.Organization, { + where: { id: recipientOrganizationId }, + }); + if (recOrg) + recipientCode = recOrg.organizationCode; + } + return this.numberingService.previewNumber({ + projectId: previewProjectId, + originatorOrganizationId: userOrgId, + typeId: createDto.typeId, + disciplineId: createDto.disciplineId, + subTypeId: createDto.subTypeId, + recipientOrganizationId, + year: new Date().getFullYear(), + customTokens: { + TYPE_CODE: type.typeCode, + RECIPIENT_CODE: recipientCode, + REC_CODE: recipientCode, + }, + }); + } + /** + * Business Rule Implementation: EC-CORR-001 - Cancel Correspondence with Downstream Circulation + * Cancel correspondence and handle related circulations + */ + async cancel(publicId, reason, user) { + const correspondence = await this.findOneByUuid(publicId); + // Check if user has permission to cancel (Org Admin or Superadmin only) + const permissions = await this.userService.getUserPermissions(user.user_id); + const canCancel = permissions.includes('correspondence.cancel') || + permissions.includes('system.manage_all'); + if (!canCancel) { + throw new common_1.ForbiddenException('Only administrators can cancel correspondences'); + } + // Check if there are any active circulations + const circulationRepo = this.dataSource.getRepository('Circulation'); + const activeCirculations = await circulationRepo.find({ + where: { + correspondenceId: correspondence.id, + status: 'OPEN', + }, + }); + const warningMessage = activeCirculations.length > 0 + ? `There are ${activeCirculations.length} active circulation(s) for this correspondence. Canceling will force close all related circulations.` + : ''; + // Get the current revision to update status + const currentRevision = await this.revisionRepo.findOne({ + where: { + correspondenceId: correspondence.id, + isCurrent: true, + }, + }); + if (!currentRevision) { + throw new common_1.NotFoundException('Current revision not found'); + } + // Get cancelled status + const cancelledStatus = await this.statusRepo.findOne({ + where: { statusCode: 'CANCELLED' }, + }); + if (!cancelledStatus) { + throw new common_1.InternalServerErrorException('CANCELLED status not found'); + } + const queryRunner = this.dataSource.createQueryRunner(); + await queryRunner.connect(); + await queryRunner.startTransaction(); + try { + // Update correspondence revision status to CANCELLED + await queryRunner.manager.update(correspondence_revision_entity_1.CorrespondenceRevision, currentRevision.id, { + statusId: cancelledStatus.id, + remarks: `Cancelled: ${reason}`, + }); + // Force close all active circulations + if (activeCirculations.length > 0) { + await queryRunner.manager.update('Circulation', { + correspondenceId: correspondence.id, + status: 'OPEN', + }, { + status: 'FORCE_CLOSED', + closedAt: new Date(), + closedBy: user.user_id, + closeReason: `Correspondence cancelled: ${reason}`, + }); + } + await queryRunner.commitTransaction(); + // Re-index cancelled status in Elasticsearch (fire-and-forget) + void this.searchService.indexDocument({ + id: correspondence.id, + publicId: correspondence.publicId, + type: 'correspondence', + docNumber: correspondence.correspondenceNumber, + title: currentRevision.subject, + status: 'CANCELLED', + projectId: correspondence.projectId, + createdAt: correspondence.createdAt, + }); + // Notify originator's doc-control user about cancellation (fire-and-forget) + if (correspondence.originatorId) { + void this.userService + .findDocControlIdByOrg(correspondence.originatorId) + .then((targetUserId) => { + if (targetUserId) { + void this.notificationService.send({ + userId: targetUserId, + title: 'Correspondence Cancelled', + message: `${correspondence.correspondenceNumber} — ${currentRevision.subject} has been cancelled. Reason: ${reason}`, + type: 'EMAIL', + entityType: 'correspondence', + entityId: correspondence.id, + link: `/correspondences/${correspondence.publicId}`, + }); + } + }) + .catch((err) => this.logger.warn(`Cancel notification failed: ${err.message}`)); + } + return { + success: true, + message: warningMessage || 'Correspondence cancelled successfully', + activeCirculationsCount: activeCirculations.length, + }; + } + catch (error) { + await queryRunner.rollbackTransaction(); + this.logger.error(`Failed to cancel correspondence: ${error.message}`); + throw error; + } + finally { + await queryRunner.release(); + } + } + async bulkCancel(publicIds, reason, user) { + const succeeded = []; + const failed = []; + for (const publicId of publicIds) { + try { + await this.cancel(publicId, reason, user); + succeeded.push(publicId); + } + catch { + failed.push(publicId); + } + } + return { succeeded, failed }; + } + async exportCsv(searchDto) { + const { data } = await this.findAll(searchDto); + const header = [ + 'Document No.', + 'Rev', + 'Subject', + 'Type', + 'Status', + 'Project', + 'From', + 'Due Date', + 'Created At', + ]; + const rows = data.map((rev) => { + const corr = rev.correspondence ?? rev; + return [ + this.escapeCsv(corr.correspondenceNumber ?? ''), + this.escapeCsv(rev.revisionLabel ?? String(rev.revisionNumber ?? 0)), + this.escapeCsv(rev.subject ?? ''), + this.escapeCsv(corr.type?.typeCode ?? ''), + this.escapeCsv(rev.status?.statusCode ?? ''), + this.escapeCsv(corr.project?.projectCode ?? ''), + this.escapeCsv(corr.originator?.organizationCode ?? ''), + rev.dueDate ? new Date(rev.dueDate).toISOString().split('T')[0] : '', + new Date(rev.createdAt).toISOString().split('T')[0], + ].join(','); + }); + return [header.join(','), ...rows].join('\n'); + } + escapeCsv(value) { + if (value.includes(',') || value.includes('"') || value.includes('\n')) { + return `"${value.replace(/"/g, '""')}"`; + } + return value; + } +}; +exports.CorrespondenceService = CorrespondenceService; +exports.CorrespondenceService = CorrespondenceService = CorrespondenceService_1 = __decorate([ + (0, common_1.Injectable)(), + __param(0, (0, typeorm_1.InjectRepository)(correspondence_entity_1.Correspondence)), + __param(1, (0, typeorm_1.InjectRepository)(correspondence_revision_entity_1.CorrespondenceRevision)), + __param(2, (0, typeorm_1.InjectRepository)(correspondence_type_entity_1.CorrespondenceType)), + __param(3, (0, typeorm_1.InjectRepository)(correspondence_status_entity_1.CorrespondenceStatus)), + __param(4, (0, typeorm_1.InjectRepository)(correspondence_reference_entity_1.CorrespondenceReference)), + __param(5, (0, typeorm_1.InjectRepository)(correspondence_tag_entity_1.CorrespondenceTag)), + __param(15, (0, typeorm_1.InjectRepository)(correspondence_revision_attachment_entity_1.CorrespondenceRevisionAttachment)), + __metadata("design:paramtypes", [typeof (_a = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _a : Object, typeof (_b = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _b : Object, typeof (_c = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _c : Object, typeof (_d = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _d : Object, typeof (_e = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _e : Object, typeof (_f = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _f : Object, typeof (_g = typeof document_numbering_service_1.DocumentNumberingService !== "undefined" && document_numbering_service_1.DocumentNumberingService) === "function" ? _g : Object, typeof (_h = typeof json_schema_service_1.JsonSchemaService !== "undefined" && json_schema_service_1.JsonSchemaService) === "function" ? _h : Object, typeof (_j = typeof workflow_engine_service_1.WorkflowEngineService !== "undefined" && workflow_engine_service_1.WorkflowEngineService) === "function" ? _j : Object, typeof (_k = typeof user_service_1.UserService !== "undefined" && user_service_1.UserService) === "function" ? _k : Object, typeof (_l = typeof typeorm_2.DataSource !== "undefined" && typeorm_2.DataSource) === "function" ? _l : Object, typeof (_m = typeof search_service_1.SearchService !== "undefined" && search_service_1.SearchService) === "function" ? _m : Object, typeof (_o = typeof file_storage_service_1.FileStorageService !== "undefined" && file_storage_service_1.FileStorageService) === "function" ? _o : Object, typeof (_p = typeof uuid_resolver_service_1.UuidResolverService !== "undefined" && uuid_resolver_service_1.UuidResolverService) === "function" ? _p : Object, typeof (_q = typeof notification_service_1.NotificationService !== "undefined" && notification_service_1.NotificationService) === "function" ? _q : Object, typeof (_r = typeof typeorm_2.Repository !== "undefined" && typeorm_2.Repository) === "function" ? _r : Object]) +], CorrespondenceService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGNvcnJlc3BvbmRlbmNlLnNlcnZpY2UudHMiLCJtYXBwaW5ncyI6IjtBQUFBLDZEQUE2RDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFN0QsMkNBT3dCO0FBQ3hCLDZDQUFtRDtBQUNuRCxxQ0FBaUQ7QUFFakQsV0FBVztBQUNYLDRFQUFrRTtBQUNsRSw4RkFBbUY7QUFDbkYsc0ZBQTJFO0FBQzNFLDBGQUErRTtBQUMvRSxnR0FBcUY7QUFDckYsZ0dBQXFGO0FBQ3JGLG9GQUF5RTtBQUN6RSw4REFBb0Q7QUFFcEQsc0ZBQTRFO0FBQzVFLG9IQUF3RztBQVF4RyxXQUFXO0FBQ1gsMEdBQXFHO0FBQ3JHLDRFQUF1RTtBQUN2RSx3RkFBbUY7QUFDbkYsdURBQW1EO0FBQ25ELDZEQUF5RDtBQUN6RCx5RkFBb0Y7QUFDcEYsdUZBQWtGO0FBQ2xGLCtFQUEyRTtBQVVwRSxJQUFNLHFCQUFxQiw2QkFBM0IsTUFBTSxxQkFBcUI7SUFHeEIsS0FBSyxDQUFDLDRCQUE0QixDQUFDLE1BQWM7UUFDdkQsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sV0FBVyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssdUJBQXVCLENBQUMsUUFBZ0I7UUFDOUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckMsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbkQsT0FBTyxHQUFHLENBQUMsQ0FBQyx3QkFBd0I7UUFDdEMsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDLENBQUMsb0NBQW9DO0lBQ3hELENBQUM7SUFFRCxZQUVFLGtCQUFzRCxFQUV0RCxZQUF3RCxF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cUJBQXFCLENBZ21DakMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGNvcnJlc3BvbmRlbmNlLnNlcnZpY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRmlsZTogc3JjL21vZHVsZXMvY29ycmVzcG9uZGVuY2UvY29ycmVzcG9uZGVuY2Uuc2VydmljZS50c1xyXG5cclxuaW1wb3J0IHtcclxuICBJbmplY3RhYmxlLFxyXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxyXG4gIEJhZFJlcXVlc3RFeGNlcHRpb24sXHJcbiAgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbixcclxuICBGb3JiaWRkZW5FeGNlcHRpb24sXHJcbiAgTG9nZ2VyLFxyXG59IGZyb20gJ0BuZXN0anMvY29tbW9uJztcclxuaW1wb3J0IHsgSW5qZWN0UmVwb3NpdG9yeSB9IGZyb20gJ0BuZXN0anMvdHlwZW9ybSc7XHJcbmltcG9ydCB7IFJlcG9zaXRvcnksIERhdGFTb3VyY2UgfSBmcm9tICd0eXBlb3JtJztcclxuXHJcbi8vIEVudGl0aWVzXHJcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlIH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJldmlzaW9uIH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS1yZXZpc2lvbi5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVR5cGUgfSBmcm9tICcuL2VudGl0aWVzL2NvcnJlc3BvbmRlbmNlLXR5cGUuZW50aXR5JztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VTdGF0dXMgfSBmcm9tICcuL2VudGl0aWVzL2NvcnJlc3BvbmRlbmNlLXN0YXR1cy5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJlZmVyZW5jZSB9IGZyb20gJy4vZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtcmVmZXJlbmNlLmVudGl0eSc7XHJcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlUmVjaXBpZW50IH0gZnJvbSAnLi9lbnRpdGllcy9jb3JyZXNwb25kZW5jZS1yZWNpcGllbnQuZW50aXR5JztcclxuaW1wb3J0IHsgQ29ycmVzcG9uZGVuY2VUYWcgfSBmcm9tICcuL2VudGl0aWVzL2NvcnJlc3BvbmRlbmNlLXRhZy5lbnRpdHknO1xyXG5pbXBvcnQgeyBUYWcgfSBmcm9tICcuLi9tYXN0ZXIvZW50aXRpZXMvdGFnLmVudGl0eSc7XHJcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi91c2VyL2VudGl0aWVzL3VzZXIuZW50aXR5JztcclxuaW1wb3J0IHsgT3JnYW5pemF0aW9uIH0gZnJvbSAnLi4vb3JnYW5pemF0aW9uL2VudGl0aWVzL29yZ2FuaXphdGlvbi5lbnRpdHknO1xyXG5pbXBvcnQgeyBDb3JyZXNwb25kZW5jZVJldmlzaW9uQXR0YWNobWVudCB9IGZyb20gJy4vZW50aXRpZXMvY29ycmVzcG9uZGVuY2UtcmV2aXNpb24tYXR0YWNobWVudC5lbnRpdHknO1xyXG5cclxuLy8gRFRPc1xyXG5pbXBvcnQgeyBDcmVhdGVDb3JyZXNwb25kZW5jZUR0byB9IGZyb20gJy4vZHRvL2NyZWF0ZS1jb3JyZXNwb25kZW5jZS5kdG8nO1xyXG5pbXBvcnQgeyBVcGRhdGVDb3JyZXNwb25kZW5jZUR0byB9IGZyb20gJy4vZHRvL3VwZGF0ZS1jb3JyZXNwb25kZW5jZS5kdG8nO1xyXG5pbXBvcnQgeyBBZGRSZWZlcmVuY2VEdG8gfSBmcm9tICcuL2R0by9hZGQtcmVmZXJlbmNlLmR0byc7XHJcbmltcG9ydCB7IFNlYXJjaENvcnJlc3BvbmRlbmNlRHRvIH0gZnJvbSAnLi9kdG8vc2VhcmNoLWNvcnJlc3BvbmRlbmNlLmR0byc7XHJcblxyXG4vLyBTZXJ2aWNlc1xyXG5pbXBvcnQgeyBEb2N1bWVudE51bWJlcmluZ1NlcnZpY2UgfSBmcm9tICcuLi9kb2N1bWVudC1udW1iZXJpbmcvc2VydmljZXMvZG9jdW1lbnQtbnVtYmVyaW5nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBKc29uU2NoZW1hU2VydmljZSB9IGZyb20gJy4uL2pzb24tc2NoZW1hL2pzb24tc2NoZW1hLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBXb3JrZmxvd0VuZ2luZVNlcnZpY2UgfSBmcm9tICcuLi93b3JrZmxvdy1lbmdpbmUvd29ya2Zsb3ctZW5naW5lLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uL3VzZXIvdXNlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2VhcmNoU2VydmljZSB9IGZyb20gJy4uL3NlYXJjaC9zZWFyY2guc2VydmljZSc7XHJcbmltcG9ydCB7IEZpbGVTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9maWxlLXN0b3JhZ2UvZmlsZS1zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVdWlkUmVzb2x2ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uL3NlcnZpY2VzL3V1aWQtcmVzb2x2ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIENvcnJlc3BvbmRlbmNlU2VydmljZSAtIERvY3VtZW50IG1hbmFnZW1lbnQgKENSVUQpXHJcbiAqL1xyXG5pbnRlcmZhY2UgUmVzb2x2ZWRSZWNpcGllbnQge1xyXG4gIG9yZ2FuaXphdGlvbklkOiBudW1iZXI7XHJcbiAgdHlwZTogJ1RPJyB8ICdDQyc7XHJcbn1cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQ29ycmVzcG9uZGVuY2VTZXJ2aWNlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoQ29ycmVzcG9uZGVuY2VTZXJ2aWNlLm5hbWUpO1xyXG5cclxuICBwcml2YXRlIGFzeW5jIGhhc1N5c3RlbU1hbmFnZUFsbFBlcm1pc3Npb24odXNlcklkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5nZXRVc2VyUGVybWlzc2lvbnModXNlcklkKTtcclxuICAgIHJldHVybiBwZXJtaXNzaW9ucy5pbmNsdWRlcygnc3lzdGVtLm1hbmFnZV9hbGwnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1c2luZXNzIFJ1bGU6IFJldmlzaW9uIExhYmVsIFN0cmF0ZWd5XHJcbiAgICogLSBSRkEsIFJGSTogVXNlIGFscGhhYmV0IHN0YXJ0aW5nIHdpdGggJ0EnIChBLCBCLCBDLi4uKVxyXG4gICAqIC0gT3RoZXIgdHlwZXMgKExFVFRFUiwgTUVNTywgZXRjLik6IFVzZSBudW1lcmljIChudWxsIGZvciBmaXJzdCwgdGhlbiAxLCAyLCAzLi4uKVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0SW5pdGlhbFJldmlzaW9uTGFiZWwodHlwZUNvZGU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICBjb25zdCBhbHBoYWJldFR5cGVzID0gWydSRkEnLCAnUkZJJ107XHJcbiAgICBpZiAoYWxwaGFiZXRUeXBlcy5pbmNsdWRlcyh0eXBlQ29kZS50b1VwcGVyQ2FzZSgpKSkge1xyXG4gICAgICByZXR1cm4gJ0EnOyAvLyBBbHBoYWJldCBmb3IgUkZBLCBSRklcclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIE51bWVyaWMgKG5vIGxhYmVsIGZvciByZXZpc2lvbiAwKVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0UmVwb3NpdG9yeShDb3JyZXNwb25kZW5jZSlcclxuICAgIHByaXZhdGUgY29ycmVzcG9uZGVuY2VSZXBvOiBSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlPixcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KENvcnJlc3BvbmRlbmNlUmV2aXNpb24pXHJcbiAgICBwcml2YXRlIHJldmlzaW9uUmVwbzogUmVwb3NpdG9yeTxDb3JyZXNwb25kZW5jZVJldmlzaW9uPixcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KENvcnJlc3BvbmRlbmNlVHlwZSlcclxuICAgIHByaXZhdGUgdHlwZVJlcG86IFJlcG9zaXRvcnk8Q29ycmVzcG9uZGVuY2VUeXBlPixcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KENvcnJlc3BvbmRlbmNlU3RhdHVzKVxyXG4gICAgcHJpdmF0ZSBzdGF0dXNSZXBvOiBSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlU3RhdHVzPixcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KENvcnJlc3BvbmRlbmNlUmVmZXJlbmNlKVxyXG4gICAgcHJpdmF0ZSByZWZlcmVuY2VSZXBvOiBSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlUmVmZXJlbmNlPixcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KENvcnJlc3BvbmRlbmNlVGFnKVxyXG4gICAgcHJpdmF0ZSB0YWdSZXBvOiBSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlVGFnPixcclxuICAgIHByaXZhdGUgbnVtYmVyaW5nU2VydmljZTogRG9jdW1lbnROdW1iZXJpbmdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBqc29uU2NoZW1hU2VydmljZTogSnNvblNjaGVtYVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHdvcmtmbG93RW5naW5lOiBXb3JrZmxvd0VuZ2luZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcclxuICAgIHByaXZhdGUgc2VhcmNoU2VydmljZTogU2VhcmNoU2VydmljZSxcclxuICAgIHByaXZhdGUgZmlsZVN0b3JhZ2VTZXJ2aWNlOiBGaWxlU3RvcmFnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHV1aWRSZXNvbHZlcjogVXVpZFJlc29sdmVyU2VydmljZSxcclxuICAgIHByaXZhdGUgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZSxcclxuICAgIEBJbmplY3RSZXBvc2l0b3J5KENvcnJlc3BvbmRlbmNlUmV2aXNpb25BdHRhY2htZW50KVxyXG4gICAgcHJpdmF0ZSByZXZBdHRhY2hSZXBvOiBSZXBvc2l0b3J5PENvcnJlc3BvbmRlbmNlUmV2aXNpb25BdHRhY2htZW50PlxyXG4gICkge31cclxuXHJcbiAgLyoqXHJcbiAgICogQnVzaW5lc3MgUnVsZSBWYWxpZGF0aW9uOiBFQy1DT1JSLTAwMyAtIENvcnJlc3BvbmRlbmNlIHRvIFNlbGZcclxuICAgKiBQcmV2ZW50IGV4dGVybmFsIGNvcnJlc3BvbmRlbmNlIHRvIHNhbWUgb3JnYW5pemF0aW9uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUNvcnJlc3BvbmRlbmNlUmVjaXBpZW50cyhcclxuICAgIGNyZWF0ZUR0bzogQ3JlYXRlQ29ycmVzcG9uZGVuY2VEdG8sXHJcbiAgICB1c2VyOiBVc2VyXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBHZXQgdXNlcidzIG9yZ2FuaXphdGlvblxyXG4gICAgbGV0IHVzZXJPcmdJZCA9IHVzZXIucHJpbWFyeU9yZ2FuaXphdGlvbklkO1xyXG4gICAgaWYgKCF1c2VyT3JnSWQpIHtcclxuICAgICAgY29uc3QgZnVsbFVzZXIgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmZpbmRPbmUodXNlci51c2VyX2lkKTtcclxuICAgICAgaWYgKGZ1bGxVc2VyKSB7XHJcbiAgICAgICAgdXNlck9yZ0lkID0gZnVsbFVzZXIucHJpbWFyeU9yZ2FuaXphdGlvbklkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF1c2VyT3JnSWQpIHtcclxuICAgICAgaWYgKGNyZWF0ZUR0by5vcmlnaW5hdG9ySWQpIHtcclxuICAgICAgICBjb25zdCBjYW5NYW5hZ2VBbGwgPSBhd2FpdCB0aGlzLmhhc1N5c3RlbU1hbmFnZUFsbFBlcm1pc3Npb24oXHJcbiAgICAgICAgICB1c2VyLnVzZXJfaWRcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChjYW5NYW5hZ2VBbGwpIHtcclxuICAgICAgICAgIHVzZXJPcmdJZCA9IGF3YWl0IHRoaXMudXVpZFJlc29sdmVyLnJlc29sdmVPcmdhbml6YXRpb25JZChcclxuICAgICAgICAgICAgY3JlYXRlRHRvLm9yaWdpbmF0b3JJZFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdXNlck9yZ0lkKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXHJcbiAgICAgICAgICAnVXNlciBtdXN0IGJlbG9uZyB0byBhbiBvcmdhbml6YXRpb24gdG8gY3JlYXRlIGRvY3VtZW50cydcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRm9yIGltcGVyc29uYXRpb24sIHVzZSB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0b3JcclxuICAgIGNvbnN0IG9yaWdpbmF0b3JPcmdJZCA9IGNyZWF0ZUR0by5vcmlnaW5hdG9ySWRcclxuICAgICAgPyBhd2FpdCB0aGlzLnV1aWRSZXNvbHZlci5yZXNvbHZlT3JnYW5pemF0aW9uSWQoY3JlYXRlRHRvLm9yaWdpbmF0b3JJZClcclxuICAgICAgOiB1c2VyT3JnSWQ7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBpbnRlcm5hbCBjb21tdW5pY2F0aW9uXHJcbiAgICBpZiAoY3JlYXRlRHRvLmlzSW50ZXJuYWwpIHtcclxuICAgICAgLy8gSW50ZXJuYWwgY29tbXVuaWNhdGlvbnMgc2hvdWxkIHVzZSBDaXJjdWxhdGlvbiBpbnN0ZWFkXHJcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxyXG4gICAgICAgICdJbnRlcm5hbCBjb21tdW5pY2F0aW9ucyBzaG91bGQgdXNlIENpcmN1bGF0aW9uIFNoZWV0IGluc3RlYWQgb2YgQ29ycmVzcG9uZGVuY2UnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVmFsaWRhdGUgcmVjaXBpZW50c1xyXG4gICAgaWYgKCFjcmVhdGVEdG8ucmVjaXBpZW50cyB8fCBjcmVhdGVEdG8ucmVjaXBpZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXHJcbiAgICAgICAgJ0F0IGxlYXN0IG9uZSByZWNpcGllbnQgKFRPIG9yIENDKSBpcyByZXF1aXJlZCdcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0b1JlY2lwaWVudHMgPSBjcmVhdGVEdG8ucmVjaXBpZW50cy5maWx0ZXIoKHIpID0+IHIudHlwZSA9PT0gJ1RPJyk7XHJcbiAgICBjb25zdCBjY1JlY2lwaWVudHMgPSBjcmVhdGVEdG8ucmVjaXBpZW50cy5maWx0ZXIoKHIpID0+IHIudHlwZSA9PT0gJ0NDJyk7XHJcblxyXG4gICAgaWYgKHRvUmVjaXBpZW50cy5sZW5ndGggPT09IDAgJiYgY2NSZWNpcGllbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcclxuICAgICAgICAnQXQgbGVhc3Qgb25lIFRPIG9yIENDIHJlY2lwaWVudCBpcyByZXF1aXJlZCdcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBmb3Igc2FtZSBvcmdhbml6YXRpb24gY29ycmVzcG9uZGVuY2VcclxuICAgIGZvciAoY29uc3QgcmVjaXBpZW50IG9mIGNyZWF0ZUR0by5yZWNpcGllbnRzKSB7XHJcbiAgICAgIGNvbnN0IHJlY2lwaWVudE9yZ0lkID0gYXdhaXQgdGhpcy51dWlkUmVzb2x2ZXIucmVzb2x2ZU9yZ2FuaXphdGlvbklkKFxyXG4gICAgICAgIHJlY2lwaWVudC5vcmdhbml6YXRpb25JZFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHJlY2lwaWVudE9yZ0lkID09PSBvcmlnaW5hdG9yT3JnSWQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcclxuICAgICAgICAgICdDYW5ub3Qgc2VuZCBjb3JyZXNwb25kZW5jZSB0byB5b3VyIG93biBvcmdhbml6YXRpb24uIFVzZSBDaXJjdWxhdGlvbiBTaGVldCBmb3IgaW50ZXJuYWwgY29tbXVuaWNhdGlvbi4nXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgY3JlYXRlKGNyZWF0ZUR0bzogQ3JlYXRlQ29ycmVzcG9uZGVuY2VEdG8sIHVzZXI6IFVzZXIpIHtcclxuICAgIC8vIEJ1c2luZXNzIFJ1bGUgVmFsaWRhdGlvbjogRUMtQ09SUi0wMDMgLSBDb3JyZXNwb25kZW5jZSB0byBTZWxmXHJcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlQ29ycmVzcG9uZGVuY2VSZWNpcGllbnRzKGNyZWF0ZUR0bywgdXNlcik7XHJcbiAgICAvLyBBRFItMDE5OiBSZXNvbHZlIFVVSUQgcmVmZXJlbmNlcyB0byBpbnRlcm5hbCBJTlQgSURzXHJcbiAgICBjb25zdCByZXNvbHZlZFByb2plY3RJZCA9IGF3YWl0IHRoaXMudXVpZFJlc29sdmVyLnJlc29sdmVQcm9qZWN0SWQoXHJcbiAgICAgIGNyZWF0ZUR0by5wcm9qZWN0SWRcclxuICAgICk7XHJcbiAgICBjb25zdCByZXNvbHZlZE9yaWdpbmF0b3JJZCA9IGNyZWF0ZUR0by5vcmlnaW5hdG9ySWRcclxuICAgICAgPyBhd2FpdCB0aGlzLnV1aWRSZXNvbHZlci5yZXNvbHZlT3JnYW5pemF0aW9uSWQoY3JlYXRlRHRvLm9yaWdpbmF0b3JJZClcclxuICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICBjb25zdCByZXNvbHZlZFJlY2lwaWVudHMgPSBjcmVhdGVEdG8ucmVjaXBpZW50c1xyXG4gICAgICA/IGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgY3JlYXRlRHRvLnJlY2lwaWVudHMubWFwKFxyXG4gICAgICAgICAgICBhc3luYyAocik6IFByb21pc2U8UmVzb2x2ZWRSZWNpcGllbnQ+ID0+ICh7XHJcbiAgICAgICAgICAgICAgb3JnYW5pemF0aW9uSWQ6IGF3YWl0IHRoaXMudXVpZFJlc29sdmVyLnJlc29sdmVPcmdhbml6YXRpb25JZChcclxuICAgICAgICAgICAgICAgIHIub3JnYW5pemF0aW9uSWRcclxuICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgIHR5cGU6IHIudHlwZSxcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIClcclxuICAgICAgICApXHJcbiAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgY29uc3QgdHlwZSA9IGF3YWl0IHRoaXMudHlwZVJlcG8uZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7IGlkOiBjcmVhdGVEdG8udHlwZUlkIH0sXHJcbiAgICB9KTtcclxuICAgIGlmICghdHlwZSkgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCdEb2N1bWVudCBUeXBlIG5vdCBmb3VuZCcpO1xyXG5cclxuICAgIGNvbnN0IHN0YXR1c0RyYWZ0ID0gYXdhaXQgdGhpcy5zdGF0dXNSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBzdGF0dXNDb2RlOiAnRFJBRlQnIH0sXHJcbiAgICB9KTtcclxuICAgIGlmICghc3RhdHVzRHJhZnQpIHtcclxuICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oXHJcbiAgICAgICAgJ1N0YXR1cyBEUkFGVCBub3QgZm91bmQgaW4gTWFzdGVyIERhdGEnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHVzZXJPcmdJZCA9IHVzZXIucHJpbWFyeU9yZ2FuaXphdGlvbklkO1xyXG5cclxuICAgIGlmICghdXNlck9yZ0lkKSB7XHJcbiAgICAgIGNvbnN0IGZ1bGxVc2VyID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5maW5kT25lKHVzZXIudXNlcl9pZCk7XHJcbiAgICAgIGlmIChmdWxsVXNlcikge1xyXG4gICAgICAgIHVzZXJPcmdJZCA9IGZ1bGxVc2VyLnByaW1hcnlPcmdhbml6YXRpb25JZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEltcGVyc29uYXRpb24gTG9naWNcclxuICAgIGlmIChyZXNvbHZlZE9yaWdpbmF0b3JJZCAmJiByZXNvbHZlZE9yaWdpbmF0b3JJZCAhPT0gdXNlck9yZ0lkKSB7XHJcbiAgICAgIGNvbnN0IGNhbk1hbmFnZUFsbCA9IGF3YWl0IHRoaXMuaGFzU3lzdGVtTWFuYWdlQWxsUGVybWlzc2lvbihcclxuICAgICAgICB1c2VyLnVzZXJfaWRcclxuICAgICAgKTtcclxuICAgICAgaWYgKCFjYW5NYW5hZ2VBbGwpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRm9yYmlkZGVuRXhjZXB0aW9uKFxyXG4gICAgICAgICAgJ1lvdSBkbyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBkb2N1bWVudHMgb24gYmVoYWxmIG9mIG90aGVyIG9yZ2FuaXphdGlvbnMuJ1xyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgdXNlck9yZ0lkID0gcmVzb2x2ZWRPcmlnaW5hdG9ySWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF1c2VyT3JnSWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXHJcbiAgICAgICAgJ1VzZXIgbXVzdCBiZWxvbmcgdG8gYW4gb3JnYW5pemF0aW9uIHRvIGNyZWF0ZSBkb2N1bWVudHMnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNyZWF0ZUR0by5kZXRhaWxzKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5qc29uU2NoZW1hU2VydmljZS52YWxpZGF0ZSh0eXBlLnR5cGVDb2RlLCBjcmVhdGVEdG8uZGV0YWlscyk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcclxuICAgICAgICAgIGBTY2hlbWEgdmFsaWRhdGlvbiB3YXJuaW5nIGZvciAke3R5cGUudHlwZUNvZGV9OiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHF1ZXJ5UnVubmVyID0gdGhpcy5kYXRhU291cmNlLmNyZWF0ZVF1ZXJ5UnVubmVyKCk7XHJcbiAgICBhd2FpdCBxdWVyeVJ1bm5lci5jb25uZWN0KCk7XHJcbiAgICBhd2FpdCBxdWVyeVJ1bm5lci5zdGFydFRyYW5zYWN0aW9uKCk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gW0ZpeCAjNl0gRmV0Y2ggcmVhbCBPUkcgQ29kZSBmcm9tIE9yZ2FuaXphdGlvbiBlbnRpdHlcclxuICAgICAgY29uc3Qgb3JpZ2luYXRvck9yZyA9IGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5tYW5hZ2VyLmZpbmRPbmUoXHJcbiAgICAgICAgT3JnYW5pemF0aW9uLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHdoZXJlOiB7IGlkOiB1c2VyT3JnSWQgfSxcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IG9yZ0NvZGUgPSBvcmlnaW5hdG9yT3JnPy5vcmdhbml6YXRpb25Db2RlID8/ICdVTksnO1xyXG5cclxuICAgICAgLy8gW3YxLjUuMV0gRXh0cmFjdCByZWNpcGllbnQgb3JnYW5pemF0aW9uIGZyb20gcmVjaXBpZW50cyBhcnJheSAoUHJpbWFyeSBUTylcclxuICAgICAgY29uc3QgdG9SZWNpcGllbnQgPSByZXNvbHZlZFJlY2lwaWVudHM/LmZpbmQoKHIpID0+IHIudHlwZSA9PT0gJ1RPJyk7XHJcbiAgICAgIGNvbnN0IHJlY2lwaWVudE9yZ2FuaXphdGlvbklkID0gdG9SZWNpcGllbnQ/Lm9yZ2FuaXphdGlvbklkO1xyXG5cclxuICAgICAgbGV0IHJlY2lwaWVudENvZGUgPSAnJztcclxuICAgICAgaWYgKHJlY2lwaWVudE9yZ2FuaXphdGlvbklkKSB7XHJcbiAgICAgICAgY29uc3QgcmVjT3JnID0gYXdhaXQgdGhpcy5kYXRhU291cmNlLm1hbmFnZXIuZmluZE9uZShPcmdhbml6YXRpb24sIHtcclxuICAgICAgICAgIHdoZXJlOiB7IGlkOiByZWNpcGllbnRPcmdhbml6YXRpb25JZCB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChyZWNPcmcpIHJlY2lwaWVudENvZGUgPSByZWNPcmcub3JnYW5pemF0aW9uQ29kZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgZG9jTnVtYmVyID0gYXdhaXQgdGhpcy5udW1iZXJpbmdTZXJ2aWNlLmdlbmVyYXRlTmV4dE51bWJlcih7XHJcbiAgICAgICAgcHJvamVjdElkOiByZXNvbHZlZFByb2plY3RJZCxcclxuICAgICAgICBvcmlnaW5hdG9yT3JnYW5pemF0aW9uSWQ6IHVzZXJPcmdJZCxcclxuICAgICAgICB0eXBlSWQ6IGNyZWF0ZUR0by50eXBlSWQsXHJcbiAgICAgICAgZGlzY2lwbGluZUlkOiBjcmVhdGVEdG8uZGlzY2lwbGluZUlkLFxyXG4gICAgICAgIHN1YlR5cGVJZDogY3JlYXRlRHRvLnN1YlR5cGVJZCxcclxuICAgICAgICByZWNpcGllbnRPcmdhbml6YXRpb25JZCwgLy8gW3YxLjUuMV0gUGFzcyByZWNpcGllbnQgZm9yIGRvY3VtZW50IG51bWJlciBmb3JtYXRcclxuICAgICAgICB5ZWFyOiBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCksXHJcbiAgICAgICAgY3VzdG9tVG9rZW5zOiB7XHJcbiAgICAgICAgICBUWVBFX0NPREU6IHR5cGUudHlwZUNvZGUsXHJcbiAgICAgICAgICBPUkdfQ09ERTogb3JnQ29kZSxcclxuICAgICAgICAgIFJFQ0lQSUVOVF9DT0RFOiByZWNpcGllbnRDb2RlLFxyXG4gICAgICAgICAgUkVDX0NPREU6IHJlY2lwaWVudENvZGUsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBjb3JyZXNwb25kZW5jZSA9IHF1ZXJ5UnVubmVyLm1hbmFnZXIuY3JlYXRlKENvcnJlc3BvbmRlbmNlLCB7XHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VOdW1iZXI6IGRvY051bWJlci5udW1iZXIsXHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VUeXBlSWQ6IGNyZWF0ZUR0by50eXBlSWQsXHJcbiAgICAgICAgZGlzY2lwbGluZUlkOiBjcmVhdGVEdG8uZGlzY2lwbGluZUlkLFxyXG4gICAgICAgIHByb2plY3RJZDogcmVzb2x2ZWRQcm9qZWN0SWQsXHJcbiAgICAgICAgb3JpZ2luYXRvcklkOiB1c2VyT3JnSWQsXHJcbiAgICAgICAgaXNJbnRlcm5hbDogY3JlYXRlRHRvLmlzSW50ZXJuYWwgfHwgZmFsc2UsXHJcbiAgICAgICAgY3JlYXRlZEJ5OiB1c2VyLnVzZXJfaWQsXHJcbiAgICAgIH0pO1xyXG4gICAgICBjb25zdCBzYXZlZENvcnIgPSBhd2FpdCBxdWVyeVJ1bm5lci5tYW5hZ2VyLnNhdmUoY29ycmVzcG9uZGVuY2UpO1xyXG5cclxuICAgICAgY29uc3QgcmV2aXNpb24gPSBxdWVyeVJ1bm5lci5tYW5hZ2VyLmNyZWF0ZShDb3JyZXNwb25kZW5jZVJldmlzaW9uLCB7XHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VJZDogc2F2ZWRDb3JyLmlkLFxyXG4gICAgICAgIHJldmlzaW9uTnVtYmVyOiAwLFxyXG4gICAgICAgIHJldmlzaW9uTGFiZWw6IHRoaXMuZ2V0SW5pdGlhbFJldmlzaW9uTGFiZWwodHlwZS50eXBlQ29kZSksXHJcbiAgICAgICAgaXNDdXJyZW50OiB0cnVlLFxyXG4gICAgICAgIHN0YXR1c0lkOiBzdGF0dXNEcmFmdC5pZCxcclxuICAgICAgICBzdWJqZWN0OiBjcmVhdGVEdG8uc3ViamVjdCxcclxuICAgICAgICBib2R5OiBjcmVhdGVEdG8uYm9keSxcclxuICAgICAgICByZW1hcmtzOiBjcmVhdGVEdG8ucmVtYXJrcyxcclxuICAgICAgICBkdWVEYXRlOiBjcmVhdGVEdG8uZHVlRGF0ZSA/IG5ldyBEYXRlKGNyZWF0ZUR0by5kdWVEYXRlKSA6IHVuZGVmaW5lZCxcclxuICAgICAgICBkb2N1bWVudERhdGU6IGNyZWF0ZUR0by5kb2N1bWVudERhdGVcclxuICAgICAgICAgID8gbmV3IERhdGUoY3JlYXRlRHRvLmRvY3VtZW50RGF0ZSlcclxuICAgICAgICAgIDogdW5kZWZpbmVkLFxyXG4gICAgICAgIGlzc3VlZERhdGU6IGNyZWF0ZUR0by5pc3N1ZWREYXRlXHJcbiAgICAgICAgICA/IG5ldyBEYXRlKGNyZWF0ZUR0by5pc3N1ZWREYXRlKVxyXG4gICAgICAgICAgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgcmVjZWl2ZWREYXRlOiBjcmVhdGVEdG8ucmVjZWl2ZWREYXRlXHJcbiAgICAgICAgICA/IG5ldyBEYXRlKGNyZWF0ZUR0by5yZWNlaXZlZERhdGUpXHJcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcclxuICAgICAgICBkZXNjcmlwdGlvbjogY3JlYXRlRHRvLmRlc2NyaXB0aW9uLFxyXG4gICAgICAgIGRldGFpbHM6IGNyZWF0ZUR0by5kZXRhaWxzLFxyXG4gICAgICAgIGNyZWF0ZWRCeTogdXNlci51c2VyX2lkLFxyXG4gICAgICAgIHNjaGVtYVZlcnNpb246IDEsXHJcbiAgICAgIH0pO1xyXG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5tYW5hZ2VyLnNhdmUocmV2aXNpb24pO1xyXG5cclxuICAgICAgLy8gU2F2ZSBSZWNpcGllbnRzICh1c2luZyByZXNvbHZlZCBJTlQgSURzKVxyXG4gICAgICBpZiAocmVzb2x2ZWRSZWNpcGllbnRzICYmIHJlc29sdmVkUmVjaXBpZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3QgcmVjaXBpZW50cyA9IHJlc29sdmVkUmVjaXBpZW50cy5tYXAoKHIpID0+XHJcbiAgICAgICAgICBxdWVyeVJ1bm5lci5tYW5hZ2VyLmNyZWF0ZShDb3JyZXNwb25kZW5jZVJlY2lwaWVudCwge1xyXG4gICAgICAgICAgICBjb3JyZXNwb25kZW5jZUlkOiBzYXZlZENvcnIuaWQsXHJcbiAgICAgICAgICAgIHJlY2lwaWVudE9yZ2FuaXphdGlvbklkOiByLm9yZ2FuaXphdGlvbklkLFxyXG4gICAgICAgICAgICByZWNpcGllbnRUeXBlOiByLnR5cGUsXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYXdhaXQgcXVlcnlSdW5uZXIubWFuYWdlci5zYXZlKHJlY2lwaWVudHMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBDb21taXQgYXR0YWNobWVudHMgZnJvbSBUZW1wIOKGkiBQZXJtYW5lbnQgKFR3by1QaGFzZSBTdG9yYWdlKVxyXG4gICAgICBpZiAoY3JlYXRlRHRvLmF0dGFjaG1lbnRUZW1wSWRzPy5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBpc3N1ZURhdGUgPSBjcmVhdGVEdG8uaXNzdWVkRGF0ZVxyXG4gICAgICAgICAgPyBuZXcgRGF0ZShjcmVhdGVEdG8uaXNzdWVkRGF0ZSlcclxuICAgICAgICAgIDogY3JlYXRlRHRvLmRvY3VtZW50RGF0ZVxyXG4gICAgICAgICAgICA/IG5ldyBEYXRlKGNyZWF0ZUR0by5kb2N1bWVudERhdGUpXHJcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICAvLyBbRklYIHYxLjguMV0gY29tbWl0IOC5hOC4lOC5iSBBdHRhY2htZW50IHJlY29yZHMg4LiB4Lil4Lix4Lia4Lih4LiyIOKGkiDguJrguLHguJnguJfguLbguIEganVuY3Rpb25cclxuICAgICAgICBjb25zdCBjb21taXR0ZWQgPSBhd2FpdCB0aGlzLmZpbGVTdG9yYWdlU2VydmljZS5jb21taXQoXHJcbiAgICAgICAgICBjcmVhdGVEdG8uYXR0YWNobWVudFRlbXBJZHMsXHJcbiAgICAgICAgICB7IGlzc3VlRGF0ZSwgZG9jdW1lbnRUeXBlOiAnQ29ycmVzcG9uZGVuY2UnIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBpZiAoY29tbWl0dGVkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGNvbnN0IGxpbmtzID0gY29tbWl0dGVkLm1hcCgoYXR0LCBpZHgpID0+XHJcbiAgICAgICAgICAgIHF1ZXJ5UnVubmVyLm1hbmFnZXIuY3JlYXRlKENvcnJlc3BvbmRlbmNlUmV2aXNpb25BdHRhY2htZW50LCB7XHJcbiAgICAgICAgICAgICAgY29ycmVzcG9uZGVuY2VSZXZpc2lvbklkOiByZXZpc2lvbi5pZCxcclxuICAgICAgICAgICAgICBhdHRhY2htZW50SWQ6IGF0dC5pZCxcclxuICAgICAgICAgICAgICBpc01haW5Eb2N1bWVudDogaWR4ID09PSAwLCAvLyDguYTguJ/guKXguYzguYHguKPguIHguYDguJvguYfguJkgbWFpbiBkb2N1bWVudFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIuc2F2ZShcclxuICAgICAgICAgICAgQ29ycmVzcG9uZGVuY2VSZXZpc2lvbkF0dGFjaG1lbnQsXHJcbiAgICAgICAgICAgIGxpbmtzXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKTtcclxuXHJcbiAgICAgIC8vIFN0YXJ0IFdvcmtmbG93IEluc3RhbmNlIChub24tYmxvY2tpbmcpXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3Qgd29ya2Zsb3dDb2RlID0gYENPUlJFU1BPTkRFTkNFXyR7dHlwZS50eXBlQ29kZX1gO1xyXG4gICAgICAgIGF3YWl0IHRoaXMud29ya2Zsb3dFbmdpbmUuY3JlYXRlSW5zdGFuY2UoXHJcbiAgICAgICAgICB3b3JrZmxvd0NvZGUsXHJcbiAgICAgICAgICAnY29ycmVzcG9uZGVuY2UnLFxyXG4gICAgICAgICAgc2F2ZWRDb3JyLmlkLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHByb2plY3RJZDogcmVzb2x2ZWRQcm9qZWN0SWQsXHJcbiAgICAgICAgICAgIG9yaWdpbmF0b3JJZDogdXNlck9yZ0lkLFxyXG4gICAgICAgICAgICBkaXNjaXBsaW5lSWQ6IGNyZWF0ZUR0by5kaXNjaXBsaW5lSWQsXHJcbiAgICAgICAgICAgIGluaXRpYXRvcklkOiB1c2VyLnVzZXJfaWQsXHJcbiAgICAgICAgICB9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XHJcbiAgICAgICAgKTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxyXG4gICAgICAgICAgYFdvcmtmbG93IG5vdCBzdGFydGVkIGZvciAke2RvY051bWJlci5udW1iZXJ9IChDb2RlOiBDT1JSRVNQT05ERU5DRV8ke3R5cGUudHlwZUNvZGV9KTogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEZpcmUtYW5kLWZvcmdldCBzZWFyY2ggaW5kZXhpbmcgKG5vbi1ibG9ja2luZywgdm9pZCBpbnRlbnRpb25hbClcclxuICAgICAgdm9pZCB0aGlzLnNlYXJjaFNlcnZpY2UuaW5kZXhEb2N1bWVudCh7XHJcbiAgICAgICAgaWQ6IHNhdmVkQ29yci5pZCxcclxuICAgICAgICBwdWJsaWNJZDogc2F2ZWRDb3JyLnB1YmxpY0lkLFxyXG4gICAgICAgIHR5cGU6ICdjb3JyZXNwb25kZW5jZScsXHJcbiAgICAgICAgZG9jTnVtYmVyOiBkb2NOdW1iZXIubnVtYmVyLFxyXG4gICAgICAgIHRpdGxlOiBjcmVhdGVEdG8uc3ViamVjdCxcclxuICAgICAgICBkZXNjcmlwdGlvbjogY3JlYXRlRHRvLmRlc2NyaXB0aW9uLFxyXG4gICAgICAgIHN0YXR1czogJ0RSQUZUJyxcclxuICAgICAgICBwcm9qZWN0SWQ6IHJlc29sdmVkUHJvamVjdElkLFxyXG4gICAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIC4uLnNhdmVkQ29ycixcclxuICAgICAgICBjdXJyZW50UmV2aXNpb246IHJldmlzaW9uLFxyXG4gICAgICB9O1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKTtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXHJcbiAgICAgICAgYEZhaWxlZCB0byBjcmVhdGUgY29ycmVzcG9uZGVuY2U6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gXHJcbiAgICAgICk7XHJcbiAgICAgIHRocm93IGVycjtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJlbGVhc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGZpbmRBbGwoc2VhcmNoRHRvOiBTZWFyY2hDb3JyZXNwb25kZW5jZUR0byA9IHt9KSB7XHJcbiAgICBjb25zdCB7XHJcbiAgICAgIHNlYXJjaCxcclxuICAgICAgdHlwZUlkLFxyXG4gICAgICBwcm9qZWN0SWQsXHJcbiAgICAgIHN0YXR1c0lkLFxyXG4gICAgICBzdGF0dXMsXHJcbiAgICAgIHBhZ2UgPSAxLFxyXG4gICAgICBsaW1pdCA9IDEwLFxyXG4gICAgfSA9IHNlYXJjaER0bztcclxuICAgIGNvbnN0IHNraXAgPSAocGFnZSAtIDEpICogbGltaXQ7XHJcblxyXG4gICAgLy8gQ2hhbmdlOiBRdWVyeSBmcm9tIFJldmlzaW9uIFJlcG9cclxuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5yZXZpc2lvblJlcG9cclxuICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigncmV2JylcclxuICAgICAgLmxlZnRKb2luQW5kU2VsZWN0KCdyZXYuY29ycmVzcG9uZGVuY2UnLCAnY29ycicpXHJcbiAgICAgIC5sZWZ0Sm9pbkFuZFNlbGVjdCgnY29yci50eXBlJywgJ3R5cGUnKVxyXG4gICAgICAubGVmdEpvaW5BbmRTZWxlY3QoJ2NvcnIucHJvamVjdCcsICdwcm9qZWN0JylcclxuICAgICAgLmxlZnRKb2luQW5kU2VsZWN0KCdjb3JyLm9yaWdpbmF0b3InLCAnb3JnJylcclxuICAgICAgLmxlZnRKb2luQW5kU2VsZWN0KCdyZXYuc3RhdHVzJywgJ3N0YXR1cycpO1xyXG5cclxuICAgIC8vIEZpbHRlciBieSBSZXZpc2lvbiBTdGF0dXNcclxuICAgIGNvbnN0IHJldlN0YXR1cyA9IHNlYXJjaER0by5yZXZpc2lvblN0YXR1cyB8fCAnQ1VSUkVOVCc7XHJcblxyXG4gICAgaWYgKHJldlN0YXR1cyA9PT0gJ0NVUlJFTlQnKSB7XHJcbiAgICAgIHF1ZXJ5LndoZXJlKCdyZXYuaXNDdXJyZW50ID0gOmlzQ3VycmVudCcsIHsgaXNDdXJyZW50OiB0cnVlIH0pO1xyXG4gICAgfSBlbHNlIGlmIChyZXZTdGF0dXMgPT09ICdPTEQnKSB7XHJcbiAgICAgIHF1ZXJ5LndoZXJlKCdyZXYuaXNDdXJyZW50ID0gOmlzQ3VycmVudCcsIHsgaXNDdXJyZW50OiBmYWxzZSB9KTtcclxuICAgIH1cclxuICAgIC8vIElmICdBTEwnLCBubyBmaWx0ZXIgbmVlZGVkIG9uIGlzQ3VycmVudFxyXG5cclxuICAgIGlmIChwcm9qZWN0SWQpIHtcclxuICAgICAgcXVlcnkuYW5kV2hlcmUoJ2NvcnIucHJvamVjdElkID0gOnByb2plY3RJZCcsIHsgcHJvamVjdElkIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlSWQpIHtcclxuICAgICAgcXVlcnkuYW5kV2hlcmUoJ2NvcnIuY29ycmVzcG9uZGVuY2VUeXBlSWQgPSA6dHlwZUlkJywgeyB0eXBlSWQgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN0YXR1c0lkKSB7XHJcbiAgICAgIHF1ZXJ5LmFuZFdoZXJlKCdyZXYuc3RhdHVzSWQgPSA6c3RhdHVzSWQnLCB7IHN0YXR1c0lkIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdGF0dXMpIHtcclxuICAgICAgcXVlcnkuYW5kV2hlcmUoJ3N0YXR1cy5zdGF0dXNDb2RlID0gOnN0YXR1cycsIHsgc3RhdHVzIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZWFyY2gpIHtcclxuICAgICAgcXVlcnkuYW5kV2hlcmUoXHJcbiAgICAgICAgJyhjb3JyLmNvcnJlc3BvbmRlbmNlTnVtYmVyIExJS0UgOnNlYXJjaCBPUiByZXYuc3ViamVjdCBMSUtFIDpzZWFyY2gpJyxcclxuICAgICAgICB7IHNlYXJjaDogYCUke3NlYXJjaH0lYCB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGVmYXVsdCBTb3J0OiBMYXRlc3QgQ3JlYXRlZFxyXG4gICAgcXVlcnkub3JkZXJCeSgncmV2LmNyZWF0ZWRBdCcsICdERVNDJykuc2tpcChza2lwKS50YWtlKGxpbWl0KTtcclxuXHJcbiAgICBjb25zdCBbaXRlbXMsIHRvdGFsXSA9IGF3YWl0IHF1ZXJ5LmdldE1hbnlBbmRDb3VudCgpO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGRhdGE6IGl0ZW1zLFxyXG4gICAgICBtZXRhOiB7XHJcbiAgICAgICAgdG90YWwsXHJcbiAgICAgICAgcGFnZSxcclxuICAgICAgICBsaW1pdCxcclxuICAgICAgICB0b3RhbFBhZ2VzOiBNYXRoLmNlaWwodG90YWwgLyBsaW1pdCksXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmluZE9uZShpZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBjb3JyZXNwb25kZW5jZSA9IGF3YWl0IHRoaXMuY29ycmVzcG9uZGVuY2VSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBpZCB9LFxyXG4gICAgICByZWxhdGlvbnM6IFtcclxuICAgICAgICAncmV2aXNpb25zJyxcclxuICAgICAgICAncmV2aXNpb25zLnN0YXR1cycsXHJcbiAgICAgICAgJ3R5cGUnLFxyXG4gICAgICAgICdwcm9qZWN0JyxcclxuICAgICAgICAnb3JpZ2luYXRvcicsXHJcbiAgICAgICAgJ3JlY2lwaWVudHMnLFxyXG4gICAgICAgICdyZWNpcGllbnRzLnJlY2lwaWVudE9yZ2FuaXphdGlvbicsIC8vIFt2MS41LjFdIEZpeGVkIHJlbGF0aW9uIG5hbWVcclxuICAgICAgXSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghY29ycmVzcG9uZGVuY2UpIHtcclxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBDb3JyZXNwb25kZW5jZSB3aXRoIElEICR7aWR9IG5vdCBmb3VuZGApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvcnJlc3BvbmRlbmNlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmluZE9uZUJ5VXVpZChwdWJsaWNJZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBjb3JyZXNwb25kZW5jZSA9IGF3YWl0IHRoaXMuY29ycmVzcG9uZGVuY2VSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBwdWJsaWNJZCB9LFxyXG4gICAgICByZWxhdGlvbnM6IFtcclxuICAgICAgICAncmV2aXNpb25zJyxcclxuICAgICAgICAncmV2aXNpb25zLnN0YXR1cycsXHJcbiAgICAgICAgJ3JldmlzaW9ucy5hdHRhY2htZW50TGlua3MnLCAvLyBbRklYIHYxLjguMV0g4LmC4Lir4Lil4LiUIGp1bmN0aW9uXHJcbiAgICAgICAgJ3JldmlzaW9ucy5hdHRhY2htZW50TGlua3MuYXR0YWNobWVudCcsIC8vIFtGSVggdjEuOC4xXSDguYLguKvguKXguJQgYXR0YWNobWVudCDguIjguKPguLTguIdcclxuICAgICAgICAndHlwZScsXHJcbiAgICAgICAgJ3Byb2plY3QnLFxyXG4gICAgICAgICdvcmlnaW5hdG9yJyxcclxuICAgICAgICAncmVjaXBpZW50cycsXHJcbiAgICAgICAgJ3JlY2lwaWVudHMucmVjaXBpZW50T3JnYW5pemF0aW9uJyxcclxuICAgICAgXSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghY29ycmVzcG9uZGVuY2UpIHtcclxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFxyXG4gICAgICAgIGBDb3JyZXNwb25kZW5jZSB3aXRoIFVVSUQgJHtwdWJsaWNJZH0gbm90IGZvdW5kYFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvcnJlc3BvbmRlbmNlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkUmVmZXJlbmNlKGlkOiBudW1iZXIsIGR0bzogQWRkUmVmZXJlbmNlRHRvKSB7XHJcbiAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCB0aGlzLmNvcnJlc3BvbmRlbmNlUmVwby5maW5kT25lKHsgd2hlcmU6IHsgaWQgfSB9KTtcclxuICAgIC8vIEFEUi0wMTk6IFJlc29sdmUgdGFyZ2V0IHB1YmxpY0lkIOKGkiBpbnRlcm5hbCBJTlQgaWRcclxuICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IHRoaXMuY29ycmVzcG9uZGVuY2VSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBwdWJsaWNJZDogZHRvLnRhcmdldFV1aWQgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghc291cmNlIHx8ICF0YXJnZXQpIHtcclxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCdTb3VyY2Ugb3IgVGFyZ2V0IGNvcnJlc3BvbmRlbmNlIG5vdCBmb3VuZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzb3VyY2UuaWQgPT09IHRhcmdldC5pZCkge1xyXG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbignQ2Fubm90IHJlZmVyZW5jZSBzZWxmJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5yZWZlcmVuY2VSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZToge1xyXG4gICAgICAgIHNvdXJjZUlkOiBpZCxcclxuICAgICAgICB0YXJnZXRJZDogdGFyZ2V0LmlkLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGV4aXN0cykge1xyXG4gICAgICByZXR1cm4gZXhpc3RzO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlZiA9IHRoaXMucmVmZXJlbmNlUmVwby5jcmVhdGUoe1xyXG4gICAgICBzb3VyY2VJZDogaWQsXHJcbiAgICAgIHRhcmdldElkOiB0YXJnZXQuaWQsXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2VSZXBvLnNhdmUocmVmKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHJlbW92ZVJlZmVyZW5jZShpZDogbnVtYmVyLCB0YXJnZXRJZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlZmVyZW5jZVJlcG8uZGVsZXRlKHtcclxuICAgICAgc291cmNlSWQ6IGlkLFxyXG4gICAgICB0YXJnZXRJZDogdGFyZ2V0SWQsXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAocmVzdWx0LmFmZmVjdGVkID09PSAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbignUmVmZXJlbmNlIG5vdCBmb3VuZCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0VGFncyhpZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy50YWdSZXBvLmZpbmQoe1xyXG4gICAgICB3aGVyZTogeyBjb3JyZXNwb25kZW5jZUlkOiBpZCB9LFxyXG4gICAgICByZWxhdGlvbnM6IFsndGFnJ10sXHJcbiAgICB9KTtcclxuICAgIHJldHVybiByb3dzLm1hcCgocikgPT4gci50YWcpLmZpbHRlcihCb29sZWFuKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZFRhZyhpZDogbnVtYmVyLCB0YWdJZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBjb3JyZXNwb25kZW5jZSA9IGF3YWl0IHRoaXMuY29ycmVzcG9uZGVuY2VSZXBvLmZpbmRPbmUoe1xyXG4gICAgICB3aGVyZTogeyBpZCB9LFxyXG4gICAgfSk7XHJcbiAgICBpZiAoIWNvcnJlc3BvbmRlbmNlKSB7XHJcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgQ29ycmVzcG9uZGVuY2UgJHtpZH0gbm90IGZvdW5kYCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGFnID0gYXdhaXQgdGhpcy5kYXRhU291cmNlLm1hbmFnZXIuZmluZE9uZShUYWcsIHtcclxuICAgICAgd2hlcmU6IHsgaWQ6IHRhZ0lkIH0sXHJcbiAgICB9KTtcclxuICAgIGlmICghdGFnKSB7XHJcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgVGFnICR7dGFnSWR9IG5vdCBmb3VuZGApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMudGFnUmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgY29ycmVzcG9uZGVuY2VJZDogaWQsIHRhZ0lkIH0sXHJcbiAgICB9KTtcclxuICAgIGlmIChleGlzdHMpIHJldHVybiBleGlzdHM7XHJcblxyXG4gICAgY29uc3Qgcm93ID0gdGhpcy50YWdSZXBvLmNyZWF0ZSh7IGNvcnJlc3BvbmRlbmNlSWQ6IGlkLCB0YWdJZCB9KTtcclxuICAgIHJldHVybiB0aGlzLnRhZ1JlcG8uc2F2ZShyb3cpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVtb3ZlVGFnKGlkOiBudW1iZXIsIHRhZ0lkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudGFnUmVwby5kZWxldGUoeyBjb3JyZXNwb25kZW5jZUlkOiBpZCwgdGFnSWQgfSk7XHJcbiAgICBpZiAocmVzdWx0LmFmZmVjdGVkID09PSAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbignVGFnIGFzc2lnbm1lbnQgbm90IGZvdW5kJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRSZWZlcmVuY2VzKGlkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG91dGdvaW5nID0gYXdhaXQgdGhpcy5yZWZlcmVuY2VSZXBvLmZpbmQoe1xyXG4gICAgICB3aGVyZTogeyBzb3VyY2VJZDogaWQgfSxcclxuICAgICAgcmVsYXRpb25zOiBbJ3RhcmdldCcsICd0YXJnZXQudHlwZSddLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgaW5jb21pbmcgPSBhd2FpdCB0aGlzLnJlZmVyZW5jZVJlcG8uZmluZCh7XHJcbiAgICAgIHdoZXJlOiB7IHRhcmdldElkOiBpZCB9LFxyXG4gICAgICByZWxhdGlvbnM6IFsnc291cmNlJywgJ3NvdXJjZS50eXBlJ10sXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4geyBvdXRnb2luZywgaW5jb21pbmcgfTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHVwZGF0ZShpZDogbnVtYmVyLCB1cGRhdGVEdG86IFVwZGF0ZUNvcnJlc3BvbmRlbmNlRHRvLCB1c2VyOiBVc2VyKSB7XHJcbiAgICAvLyAxLiBGaW5kIEN1cnJlbnQgUmV2aXNpb25cclxuICAgIGNvbnN0IHJldmlzaW9uID0gYXdhaXQgdGhpcy5yZXZpc2lvblJlcG8uZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7XHJcbiAgICAgICAgY29ycmVzcG9uZGVuY2VJZDogaWQsXHJcbiAgICAgICAgaXNDdXJyZW50OiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgICByZWxhdGlvbnM6IFsnY29ycmVzcG9uZGVuY2UnXSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghcmV2aXNpb24pIHtcclxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFxyXG4gICAgICAgIGBDdXJyZW50IHJldmlzaW9uIGZvciBjb3JyZXNwb25kZW5jZSAke2lkfSBub3QgZm91bmRgXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMi4gQ2hlY2sgUGVybWlzc2lvblxyXG4gICAgaWYgKHJldmlzaW9uLnN0YXR1c0lkKSB7XHJcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuc3RhdHVzUmVwby5maW5kT25lKHtcclxuICAgICAgICB3aGVyZTogeyBpZDogcmV2aXNpb24uc3RhdHVzSWQgfSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAoc3RhdHVzICYmIHN0YXR1cy5zdGF0dXNDb2RlICE9PSAnRFJBRlQnKSB7XHJcbiAgICAgICAgY29uc3QgcGVybWlzc2lvbnMgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJQZXJtaXNzaW9ucyhcclxuICAgICAgICAgIHVzZXIudXNlcl9pZFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgY2FuRWRpdFN1Ym1pdHRlZE9yTGF0ZXIgPVxyXG4gICAgICAgICAgcGVybWlzc2lvbnMuaW5jbHVkZXMoJ2NvcnJlc3BvbmRlbmNlLmNhbmNlbCcpIHx8XHJcbiAgICAgICAgICBwZXJtaXNzaW9ucy5pbmNsdWRlcygnc3lzdGVtLm1hbmFnZV9hbGwnKTtcclxuXHJcbiAgICAgICAgaWYgKCFjYW5FZGl0U3VibWl0dGVkT3JMYXRlcikge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEZvcmJpZGRlbkV4Y2VwdGlvbihcclxuICAgICAgICAgICAgJ09ubHkgT3JnIEFkbWluIG9yIFN1cGVyYWRtaW4gY2FuIGVkaXQgbm9uLWRyYWZ0IGNvcnJlc3BvbmRlbmNlcydcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQURSLTAxOTogUmVzb2x2ZSBVVUlEIHJlZmVyZW5jZXMgaW4gdXBkYXRlIERUT1xyXG4gICAgY29uc3QgdXBkUmVzb2x2ZWRQcm9qZWN0SWQgPSB1cGRhdGVEdG8ucHJvamVjdElkXHJcbiAgICAgID8gYXdhaXQgdGhpcy51dWlkUmVzb2x2ZXIucmVzb2x2ZVByb2plY3RJZCh1cGRhdGVEdG8ucHJvamVjdElkKVxyXG4gICAgICA6IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IHVwZFJlc29sdmVkT3JpZ2luYXRvcklkID0gdXBkYXRlRHRvLm9yaWdpbmF0b3JJZFxyXG4gICAgICA/IGF3YWl0IHRoaXMudXVpZFJlc29sdmVyLnJlc29sdmVPcmdhbml6YXRpb25JZCh1cGRhdGVEdG8ub3JpZ2luYXRvcklkKVxyXG4gICAgICA6IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IHVwZFJlc29sdmVkUmVjaXBpZW50cyA9IHVwZGF0ZUR0by5yZWNpcGllbnRzXHJcbiAgICAgID8gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICB1cGRhdGVEdG8ucmVjaXBpZW50cy5tYXAoXHJcbiAgICAgICAgICAgIGFzeW5jIChyKTogUHJvbWlzZTxSZXNvbHZlZFJlY2lwaWVudD4gPT4gKHtcclxuICAgICAgICAgICAgICBvcmdhbml6YXRpb25JZDogYXdhaXQgdGhpcy51dWlkUmVzb2x2ZXIucmVzb2x2ZU9yZ2FuaXphdGlvbklkKFxyXG4gICAgICAgICAgICAgICAgci5vcmdhbml6YXRpb25JZFxyXG4gICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgdHlwZTogci50eXBlLFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgLy8gMy4gVXBkYXRlIENvcnJlc3BvbmRlbmNlIEVudGl0eSBpZiBuZWVkZWRcclxuICAgIGNvbnN0IGNvcnJlc3BvbmRlbmNlVXBkYXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xyXG4gICAgaWYgKHVwZGF0ZUR0by5kaXNjaXBsaW5lSWQpXHJcbiAgICAgIGNvcnJlc3BvbmRlbmNlVXBkYXRlLmRpc2NpcGxpbmVJZCA9IHVwZGF0ZUR0by5kaXNjaXBsaW5lSWQ7XHJcbiAgICBpZiAodXBkUmVzb2x2ZWRQcm9qZWN0SWQpXHJcbiAgICAgIGNvcnJlc3BvbmRlbmNlVXBkYXRlLnByb2plY3RJZCA9IHVwZFJlc29sdmVkUHJvamVjdElkO1xyXG4gICAgaWYgKHVwZFJlc29sdmVkT3JpZ2luYXRvcklkKVxyXG4gICAgICBjb3JyZXNwb25kZW5jZVVwZGF0ZS5vcmlnaW5hdG9ySWQgPSB1cGRSZXNvbHZlZE9yaWdpbmF0b3JJZDtcclxuXHJcbiAgICBpZiAoT2JqZWN0LmtleXMoY29ycmVzcG9uZGVuY2VVcGRhdGUpLmxlbmd0aCA+IDApIHtcclxuICAgICAgYXdhaXQgdGhpcy5jb3JyZXNwb25kZW5jZVJlcG8udXBkYXRlKGlkLCBjb3JyZXNwb25kZW5jZVVwZGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gNC4gVXBkYXRlIFJldmlzaW9uIEVudGl0eVxyXG4gICAgY29uc3QgcmV2aXNpb25VcGRhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XHJcbiAgICBpZiAodXBkYXRlRHRvLnN1YmplY3QpIHJldmlzaW9uVXBkYXRlLnN1YmplY3QgPSB1cGRhdGVEdG8uc3ViamVjdDtcclxuICAgIGlmICh1cGRhdGVEdG8uYm9keSkgcmV2aXNpb25VcGRhdGUuYm9keSA9IHVwZGF0ZUR0by5ib2R5O1xyXG4gICAgaWYgKHVwZGF0ZUR0by5yZW1hcmtzKSByZXZpc2lvblVwZGF0ZS5yZW1hcmtzID0gdXBkYXRlRHRvLnJlbWFya3M7XHJcbiAgICAvLyBGb3JtYXQgRGF0ZSBjb3JyZWN0bHkgaWYgc3RyaW5nXHJcbiAgICBpZiAodXBkYXRlRHRvLmR1ZURhdGUpIHJldmlzaW9uVXBkYXRlLmR1ZURhdGUgPSBuZXcgRGF0ZSh1cGRhdGVEdG8uZHVlRGF0ZSk7XHJcbiAgICBpZiAodXBkYXRlRHRvLmRvY3VtZW50RGF0ZSlcclxuICAgICAgcmV2aXNpb25VcGRhdGUuZG9jdW1lbnREYXRlID0gbmV3IERhdGUodXBkYXRlRHRvLmRvY3VtZW50RGF0ZSk7XHJcbiAgICBpZiAodXBkYXRlRHRvLmlzc3VlZERhdGUpXHJcbiAgICAgIHJldmlzaW9uVXBkYXRlLmlzc3VlZERhdGUgPSBuZXcgRGF0ZSh1cGRhdGVEdG8uaXNzdWVkRGF0ZSk7XHJcbiAgICBpZiAodXBkYXRlRHRvLnJlY2VpdmVkRGF0ZSlcclxuICAgICAgcmV2aXNpb25VcGRhdGUucmVjZWl2ZWREYXRlID0gbmV3IERhdGUodXBkYXRlRHRvLnJlY2VpdmVkRGF0ZSk7XHJcbiAgICBpZiAodXBkYXRlRHRvLmRlc2NyaXB0aW9uKVxyXG4gICAgICByZXZpc2lvblVwZGF0ZS5kZXNjcmlwdGlvbiA9IHVwZGF0ZUR0by5kZXNjcmlwdGlvbjtcclxuICAgIGlmICh1cGRhdGVEdG8uZGV0YWlscykgcmV2aXNpb25VcGRhdGUuZGV0YWlscyA9IHVwZGF0ZUR0by5kZXRhaWxzO1xyXG5cclxuICAgIGlmIChPYmplY3Qua2V5cyhyZXZpc2lvblVwZGF0ZSkubGVuZ3RoID4gMCkge1xyXG4gICAgICBhd2FpdCB0aGlzLnJldmlzaW9uUmVwby51cGRhdGUocmV2aXNpb24uaWQsIHJldmlzaW9uVXBkYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyA0LjUgQ29tbWl0IG5ldyBhdHRhY2htZW50cyBmcm9tIFRlbXAg4oaSIFBlcm1hbmVudCAoVHdvLVBoYXNlIFN0b3JhZ2UpXHJcbiAgICBpZiAodXBkYXRlRHRvLmF0dGFjaG1lbnRUZW1wSWRzPy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgaXNzdWVEYXRlID0gdXBkYXRlRHRvLmlzc3VlZERhdGVcclxuICAgICAgICA/IG5ldyBEYXRlKHVwZGF0ZUR0by5pc3N1ZWREYXRlKVxyXG4gICAgICAgIDogdXBkYXRlRHRvLmRvY3VtZW50RGF0ZVxyXG4gICAgICAgICAgPyBuZXcgRGF0ZSh1cGRhdGVEdG8uZG9jdW1lbnREYXRlKVxyXG4gICAgICAgICAgOiByZXZpc2lvbi5pc3N1ZWREYXRlIHx8IHJldmlzaW9uLmRvY3VtZW50RGF0ZSB8fCB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAvLyBbRklYIHYxLjguMV0gY29tbWl0IOC5hOC4lOC5iSBBdHRhY2htZW50IHJlY29yZHMg4LiB4Lil4Lix4Lia4Lih4LiyIOKGkiDguJrguLHguJnguJfguLbguIEganVuY3Rpb25cclxuICAgICAgY29uc3QgY29tbWl0dGVkID0gYXdhaXQgdGhpcy5maWxlU3RvcmFnZVNlcnZpY2UuY29tbWl0KFxyXG4gICAgICAgIHVwZGF0ZUR0by5hdHRhY2htZW50VGVtcElkcyxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpc3N1ZURhdGU6IGlzc3VlRGF0ZSA/IG5ldyBEYXRlKGlzc3VlRGF0ZSkgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICBkb2N1bWVudFR5cGU6ICdDb3JyZXNwb25kZW5jZScsXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKGNvbW1pdHRlZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3QgbGlua3MgPSBjb21taXR0ZWQubWFwKChhdHQpID0+XHJcbiAgICAgICAgICB0aGlzLnJldkF0dGFjaFJlcG8uY3JlYXRlKHtcclxuICAgICAgICAgICAgY29ycmVzcG9uZGVuY2VSZXZpc2lvbklkOiByZXZpc2lvbi5pZCxcclxuICAgICAgICAgICAgYXR0YWNobWVudElkOiBhdHQuaWQsXHJcbiAgICAgICAgICAgIGlzTWFpbkRvY3VtZW50OiBmYWxzZSwgLy8g4LmE4Lif4Lil4LmM4LiX4Li14LmIIHVwbG9hZCDguYDguJ7guLTguYjguKHguYDguJXguLTguKHguYTguKHguYjguYPguIrguYggbWFpblxyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucmV2QXR0YWNoUmVwby5zYXZlKGxpbmtzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIDUuIFVwZGF0ZSBSZWNpcGllbnRzIGlmIHByb3ZpZGVkXHJcbiAgICBpZiAodXBkUmVzb2x2ZWRSZWNpcGllbnRzKSB7XHJcbiAgICAgIGNvbnN0IHJlY2lwaWVudFJlcG8gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShcclxuICAgICAgICBDb3JyZXNwb25kZW5jZVJlY2lwaWVudFxyXG4gICAgICApO1xyXG4gICAgICBhd2FpdCByZWNpcGllbnRSZXBvLmRlbGV0ZSh7IGNvcnJlc3BvbmRlbmNlSWQ6IGlkIH0pO1xyXG5cclxuICAgICAgY29uc3QgbmV3UmVjaXBpZW50cyA9IHVwZFJlc29sdmVkUmVjaXBpZW50cy5tYXAoKHIpID0+XHJcbiAgICAgICAgcmVjaXBpZW50UmVwby5jcmVhdGUoe1xyXG4gICAgICAgICAgY29ycmVzcG9uZGVuY2VJZDogaWQsXHJcbiAgICAgICAgICByZWNpcGllbnRPcmdhbml6YXRpb25JZDogci5vcmdhbml6YXRpb25JZCxcclxuICAgICAgICAgIHJlY2lwaWVudFR5cGU6IHIudHlwZSxcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgICBhd2FpdCByZWNpcGllbnRSZXBvLnNhdmUobmV3UmVjaXBpZW50cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gNi4gUmVnZW5lcmF0ZSBEb2N1bWVudCBOdW1iZXIgaWYgc3RydWN0dXJhbCBmaWVsZHMgY2hhbmdlZCAoUmVjaXBpZW50LCBEaXNjaXBsaW5lLCBUeXBlLCBQcm9qZWN0KVxyXG4gICAgLy8gQU5EIGl0IGlzIGEgRFJBRlQuXHJcblxyXG4gICAgLy8gRmV0Y2ggZnJlc2ggZGF0YSBmb3IgY29udGV4dCBhbmQgY29tcGFyaXNvblxyXG4gICAgY29uc3QgY3VycmVudENvcnIgPSBhd2FpdCB0aGlzLmNvcnJlc3BvbmRlbmNlUmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgaWQgfSxcclxuICAgICAgcmVsYXRpb25zOiBbJ3R5cGUnLCAncmVjaXBpZW50cycsICdyZWNpcGllbnRzLnJlY2lwaWVudE9yZ2FuaXphdGlvbiddLFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGN1cnJlbnRDb3JyKSB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRUb1JlY2lwaWVudCA9IGN1cnJlbnRDb3JyLnJlY2lwaWVudHM/LmZpbmQoXHJcbiAgICAgICAgKHIpID0+IHIucmVjaXBpZW50VHlwZSA9PT0gJ1RPJ1xyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBjdXJyZW50UmVjaXBpZW50SWQgPSBjdXJyZW50VG9SZWNpcGllbnQ/LnJlY2lwaWVudE9yZ2FuaXphdGlvbklkO1xyXG5cclxuICAgICAgLy8gQ2hlY2sgZm9yIEFDVFVBTCB2YWx1ZSBjaGFuZ2VzXHJcbiAgICAgIGNvbnN0IGlzUHJvamVjdENoYW5nZWQgPVxyXG4gICAgICAgIHVwZFJlc29sdmVkUHJvamVjdElkICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgICB1cGRSZXNvbHZlZFByb2plY3RJZCAhPT0gY3VycmVudENvcnIucHJvamVjdElkO1xyXG4gICAgICBjb25zdCBpc09yaWdpbmF0b3JDaGFuZ2VkID1cclxuICAgICAgICB1cGRSZXNvbHZlZE9yaWdpbmF0b3JJZCAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgdXBkUmVzb2x2ZWRPcmlnaW5hdG9ySWQgIT09IGN1cnJlbnRDb3JyLm9yaWdpbmF0b3JJZDtcclxuICAgICAgY29uc3QgaXNEaXNjaXBsaW5lQ2hhbmdlZCA9XHJcbiAgICAgICAgdXBkYXRlRHRvLmRpc2NpcGxpbmVJZCAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgdXBkYXRlRHRvLmRpc2NpcGxpbmVJZCAhPT0gY3VycmVudENvcnIuZGlzY2lwbGluZUlkO1xyXG4gICAgICBjb25zdCBpc1R5cGVDaGFuZ2VkID1cclxuICAgICAgICB1cGRhdGVEdG8udHlwZUlkICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgICB1cGRhdGVEdG8udHlwZUlkICE9PSBjdXJyZW50Q29yci5jb3JyZXNwb25kZW5jZVR5cGVJZDtcclxuXHJcbiAgICAgIGxldCBpc1JlY2lwaWVudENoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgbGV0IG5ld1JlY2lwaWVudElkOiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgICBpZiAodXBkUmVzb2x2ZWRSZWNpcGllbnRzKSB7XHJcbiAgICAgICAgY29uc3QgbmV3VG9SZWNpcGllbnQgPSB1cGRSZXNvbHZlZFJlY2lwaWVudHMuZmluZChcclxuICAgICAgICAgIChyKSA9PiByLnR5cGUgPT09ICdUTydcclxuICAgICAgICApO1xyXG4gICAgICAgIG5ld1JlY2lwaWVudElkID0gbmV3VG9SZWNpcGllbnQ/Lm9yZ2FuaXphdGlvbklkO1xyXG5cclxuICAgICAgICBpZiAobmV3UmVjaXBpZW50SWQgIT09IGN1cnJlbnRSZWNpcGllbnRJZCkge1xyXG4gICAgICAgICAgaXNSZWNpcGllbnRDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChcclxuICAgICAgICBpc1Byb2plY3RDaGFuZ2VkIHx8XHJcbiAgICAgICAgaXNEaXNjaXBsaW5lQ2hhbmdlZCB8fFxyXG4gICAgICAgIGlzVHlwZUNoYW5nZWQgfHxcclxuICAgICAgICBpc1JlY2lwaWVudENoYW5nZWQgfHxcclxuICAgICAgICBpc09yaWdpbmF0b3JDaGFuZ2VkXHJcbiAgICAgICkge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldFJlY2lwaWVudElkID0gaXNSZWNpcGllbnRDaGFuZ2VkXHJcbiAgICAgICAgICA/IG5ld1JlY2lwaWVudElkXHJcbiAgICAgICAgICA6IGN1cnJlbnRSZWNpcGllbnRJZDtcclxuXHJcbiAgICAgICAgLy8gUmVzb2x2ZSBSZWNpcGllbnQgQ29kZSBmb3IgdGhlIE5FVyBjb250ZXh0XHJcbiAgICAgICAgbGV0IHJlY2lwaWVudENvZGUgPSAnJztcclxuICAgICAgICBpZiAodGFyZ2V0UmVjaXBpZW50SWQpIHtcclxuICAgICAgICAgIGNvbnN0IHJlY09yZyA9IGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5tYW5hZ2VyLmZpbmRPbmUoT3JnYW5pemF0aW9uLCB7XHJcbiAgICAgICAgICAgIHdoZXJlOiB7IGlkOiB0YXJnZXRSZWNpcGllbnRJZCB9LFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBpZiAocmVjT3JnKSByZWNpcGllbnRDb2RlID0gcmVjT3JnLm9yZ2FuaXphdGlvbkNvZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBbRml4ICM2XSBGZXRjaCByZWFsIE9SRyBDb2RlIGZyb20gb3JpZ2luYXRvciBvcmdhbml6YXRpb25cclxuICAgICAgICBjb25zdCBvcmlnaW5hdG9yT3JnRm9yVXBkYXRlID0gYXdhaXQgdGhpcy5kYXRhU291cmNlLm1hbmFnZXIuZmluZE9uZShcclxuICAgICAgICAgIE9yZ2FuaXphdGlvbixcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgd2hlcmU6IHtcclxuICAgICAgICAgICAgICBpZDogdXBkUmVzb2x2ZWRPcmlnaW5hdG9ySWQgPz8gY3VycmVudENvcnIub3JpZ2luYXRvcklkID8/IDAsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBvcmdDb2RlID0gb3JpZ2luYXRvck9yZ0ZvclVwZGF0ZT8ub3JnYW5pemF0aW9uQ29kZSA/PyAnVU5LJztcclxuXHJcbiAgICAgICAgLy8gUHJlcGFyZSBDb250ZXh0c1xyXG4gICAgICAgIGNvbnN0IG9sZEN0eCA9IHtcclxuICAgICAgICAgIHByb2plY3RJZDogY3VycmVudENvcnIucHJvamVjdElkLFxyXG4gICAgICAgICAgb3JpZ2luYXRvck9yZ2FuaXphdGlvbklkOiBjdXJyZW50Q29yci5vcmlnaW5hdG9ySWQgPz8gMCxcclxuICAgICAgICAgIHR5cGVJZDogY3VycmVudENvcnIuY29ycmVzcG9uZGVuY2VUeXBlSWQsXHJcbiAgICAgICAgICBkaXNjaXBsaW5lSWQ6IGN1cnJlbnRDb3JyLmRpc2NpcGxpbmVJZCxcclxuICAgICAgICAgIHJlY2lwaWVudE9yZ2FuaXphdGlvbklkOiBjdXJyZW50UmVjaXBpZW50SWQsXHJcbiAgICAgICAgICB5ZWFyOiBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCksXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0ge1xyXG4gICAgICAgICAgcHJvamVjdElkOiB1cGRSZXNvbHZlZFByb2plY3RJZCA/PyBjdXJyZW50Q29yci5wcm9qZWN0SWQsXHJcbiAgICAgICAgICBvcmlnaW5hdG9yT3JnYW5pemF0aW9uSWQ6XHJcbiAgICAgICAgICAgIHVwZFJlc29sdmVkT3JpZ2luYXRvcklkID8/IGN1cnJlbnRDb3JyLm9yaWdpbmF0b3JJZCA/PyAwLFxyXG4gICAgICAgICAgdHlwZUlkOiB1cGRhdGVEdG8udHlwZUlkID8/IGN1cnJlbnRDb3JyLmNvcnJlc3BvbmRlbmNlVHlwZUlkLFxyXG4gICAgICAgICAgZGlzY2lwbGluZUlkOiB1cGRhdGVEdG8uZGlzY2lwbGluZUlkID8/IGN1cnJlbnRDb3JyLmRpc2NpcGxpbmVJZCxcclxuICAgICAgICAgIHJlY2lwaWVudE9yZ2FuaXphdGlvbklkOiB0YXJnZXRSZWNpcGllbnRJZCxcclxuICAgICAgICAgIHllYXI6IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSxcclxuICAgICAgICAgIHVzZXJJZDogdXNlci51c2VyX2lkLCAvLyBQYXNzIFVzZXIgSUQgZm9yIEF1ZGl0XHJcbiAgICAgICAgICBjdXN0b21Ub2tlbnM6IHtcclxuICAgICAgICAgICAgVFlQRV9DT0RFOiBjdXJyZW50Q29yci50eXBlPy50eXBlQ29kZSB8fCAnJyxcclxuICAgICAgICAgICAgT1JHX0NPREU6IG9yZ0NvZGUsXHJcbiAgICAgICAgICAgIFJFQ0lQSUVOVF9DT0RFOiByZWNpcGllbnRDb2RlLFxyXG4gICAgICAgICAgICBSRUNfQ09ERTogcmVjaXBpZW50Q29kZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy8gSWYgVHlwZSBDaGFuZ2VkLCBuZWVkIE5FVyBUeXBlIENvZGVcclxuICAgICAgICBpZiAoaXNUeXBlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgY29uc3QgbmV3VHlwZSA9IGF3YWl0IHRoaXMudHlwZVJlcG8uZmluZE9uZSh7XHJcbiAgICAgICAgICAgIHdoZXJlOiB7IGlkOiBuZXdDdHgudHlwZUlkIH0sXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGlmIChuZXdUeXBlKSBuZXdDdHguY3VzdG9tVG9rZW5zLlRZUEVfQ09ERSA9IG5ld1R5cGUudHlwZUNvZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBuZXdEb2NOdW1iZXIgPSBhd2FpdCB0aGlzLm51bWJlcmluZ1NlcnZpY2UudXBkYXRlTnVtYmVyRm9yRHJhZnQoXHJcbiAgICAgICAgICBjdXJyZW50Q29yci5jb3JyZXNwb25kZW5jZU51bWJlcixcclxuICAgICAgICAgIG9sZEN0eCxcclxuICAgICAgICAgIG5ld0N0eFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuY29ycmVzcG9uZGVuY2VSZXBvLnVwZGF0ZShpZCwge1xyXG4gICAgICAgICAgY29ycmVzcG9uZGVuY2VOdW1iZXI6IG5ld0RvY051bWJlcixcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB0aGlzLmZpbmRPbmUoaWQpO1xyXG5cclxuICAgIC8vIFJlLWluZGV4IHVwZGF0ZWQgZG9jdW1lbnQgaW4gRWxhc3RpY3NlYXJjaCAoZmlyZS1hbmQtZm9yZ2V0KVxyXG4gICAgdm9pZCB0aGlzLnNlYXJjaFNlcnZpY2UuaW5kZXhEb2N1bWVudCh7XHJcbiAgICAgIGlkOiB1cGRhdGVkLmlkLFxyXG4gICAgICBwdWJsaWNJZDogdXBkYXRlZC5wdWJsaWNJZCxcclxuICAgICAgdHlwZTogJ2NvcnJlc3BvbmRlbmNlJyxcclxuICAgICAgZG9jTnVtYmVyOiB1cGRhdGVkLmNvcnJlc3BvbmRlbmNlTnVtYmVyLFxyXG4gICAgICB0aXRsZTogdXBkYXRlRHRvLnN1YmplY3QgPz8gdXBkYXRlZC5yZXZpc2lvbnM/LlswXT8uc3ViamVjdCxcclxuICAgICAgZGVzY3JpcHRpb246IHVwZGF0ZUR0by5kZXNjcmlwdGlvbiA/PyB1cGRhdGVkLnJldmlzaW9ucz8uWzBdPy5kZXNjcmlwdGlvbixcclxuICAgICAgc3RhdHVzOiAnRFJBRlQnLFxyXG4gICAgICBwcm9qZWN0SWQ6IHVwZGF0ZWQucHJvamVjdElkLFxyXG4gICAgICBjcmVhdGVkQXQ6IHVwZGF0ZWQuY3JlYXRlZEF0LFxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHVwZGF0ZWQ7XHJcbiAgfVxyXG5cclxuICBhc3luYyBwcmV2aWV3RG9jdW1lbnROdW1iZXIoY3JlYXRlRHRvOiBDcmVhdGVDb3JyZXNwb25kZW5jZUR0bywgdXNlcjogVXNlcikge1xyXG4gICAgLy8gQURSLTAxOTogUmVzb2x2ZSBVVUlEIHJlZmVyZW5jZXNcclxuICAgIGNvbnN0IHByZXZpZXdQcm9qZWN0SWQgPSBhd2FpdCB0aGlzLnV1aWRSZXNvbHZlci5yZXNvbHZlUHJvamVjdElkKFxyXG4gICAgICBjcmVhdGVEdG8ucHJvamVjdElkXHJcbiAgICApO1xyXG4gICAgY29uc3QgcHJldmlld09yaWdpbmF0b3JJZCA9IGNyZWF0ZUR0by5vcmlnaW5hdG9ySWRcclxuICAgICAgPyBhd2FpdCB0aGlzLnV1aWRSZXNvbHZlci5yZXNvbHZlT3JnYW5pemF0aW9uSWQoY3JlYXRlRHRvLm9yaWdpbmF0b3JJZClcclxuICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICBjb25zdCBwcmV2aWV3UmVjaXBpZW50cyA9IGNyZWF0ZUR0by5yZWNpcGllbnRzXHJcbiAgICAgID8gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICBjcmVhdGVEdG8ucmVjaXBpZW50cy5tYXAoXHJcbiAgICAgICAgICAgIGFzeW5jIChyKTogUHJvbWlzZTxSZXNvbHZlZFJlY2lwaWVudD4gPT4gKHtcclxuICAgICAgICAgICAgICBvcmdhbml6YXRpb25JZDogYXdhaXQgdGhpcy51dWlkUmVzb2x2ZXIucmVzb2x2ZU9yZ2FuaXphdGlvbklkKFxyXG4gICAgICAgICAgICAgICAgci5vcmdhbml6YXRpb25JZFxyXG4gICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgdHlwZTogci50eXBlLFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIClcclxuICAgICAgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgY29uc3QgdHlwZSA9IGF3YWl0IHRoaXMudHlwZVJlcG8uZmluZE9uZSh7XHJcbiAgICAgIHdoZXJlOiB7IGlkOiBjcmVhdGVEdG8udHlwZUlkIH0sXHJcbiAgICB9KTtcclxuICAgIGlmICghdHlwZSkgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCdEb2N1bWVudCBUeXBlIG5vdCBmb3VuZCcpO1xyXG5cclxuICAgIGxldCB1c2VyT3JnSWQgPSB1c2VyLnByaW1hcnlPcmdhbml6YXRpb25JZDtcclxuICAgIGlmICghdXNlck9yZ0lkKSB7XHJcbiAgICAgIGNvbnN0IGZ1bGxVc2VyID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5maW5kT25lKHVzZXIudXNlcl9pZCk7XHJcbiAgICAgIGlmIChmdWxsVXNlcikgdXNlck9yZ0lkID0gZnVsbFVzZXIucHJpbWFyeU9yZ2FuaXphdGlvbklkO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChwcmV2aWV3T3JpZ2luYXRvcklkICYmIHByZXZpZXdPcmlnaW5hdG9ySWQgIT09IHVzZXJPcmdJZCkge1xyXG4gICAgICAvLyBBbGxvdyBpbXBlcnNvbmF0aW9uIGZvciBwcmV2aWV3XHJcbiAgICAgIHVzZXJPcmdJZCA9IHByZXZpZXdPcmlnaW5hdG9ySWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRXh0cmFjdCByZWNpcGllbnQgZnJvbSByZWNpcGllbnRzIGFycmF5XHJcbiAgICBjb25zdCB0b1JlY2lwaWVudCA9IHByZXZpZXdSZWNpcGllbnRzPy5maW5kKChyKSA9PiByLnR5cGUgPT09ICdUTycpO1xyXG4gICAgY29uc3QgcmVjaXBpZW50T3JnYW5pemF0aW9uSWQgPSB0b1JlY2lwaWVudD8ub3JnYW5pemF0aW9uSWQ7XHJcblxyXG4gICAgbGV0IHJlY2lwaWVudENvZGUgPSAnJztcclxuICAgIGlmIChyZWNpcGllbnRPcmdhbml6YXRpb25JZCkge1xyXG4gICAgICBjb25zdCByZWNPcmcgPSBhd2FpdCB0aGlzLmRhdGFTb3VyY2UubWFuYWdlci5maW5kT25lKE9yZ2FuaXphdGlvbiwge1xyXG4gICAgICAgIHdoZXJlOiB7IGlkOiByZWNpcGllbnRPcmdhbml6YXRpb25JZCB9LFxyXG4gICAgICB9KTtcclxuICAgICAgaWYgKHJlY09yZykgcmVjaXBpZW50Q29kZSA9IHJlY09yZy5vcmdhbml6YXRpb25Db2RlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLm51bWJlcmluZ1NlcnZpY2UucHJldmlld051bWJlcih7XHJcbiAgICAgIHByb2plY3RJZDogcHJldmlld1Byb2plY3RJZCxcclxuICAgICAgb3JpZ2luYXRvck9yZ2FuaXphdGlvbklkOiB1c2VyT3JnSWQhLFxyXG4gICAgICB0eXBlSWQ6IGNyZWF0ZUR0by50eXBlSWQsXHJcbiAgICAgIGRpc2NpcGxpbmVJZDogY3JlYXRlRHRvLmRpc2NpcGxpbmVJZCxcclxuICAgICAgc3ViVHlwZUlkOiBjcmVhdGVEdG8uc3ViVHlwZUlkLFxyXG4gICAgICByZWNpcGllbnRPcmdhbml6YXRpb25JZCxcclxuICAgICAgeWVhcjogbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLFxyXG4gICAgICBjdXN0b21Ub2tlbnM6IHtcclxuICAgICAgICBUWVBFX0NPREU6IHR5cGUudHlwZUNvZGUsXHJcbiAgICAgICAgUkVDSVBJRU5UX0NPREU6IHJlY2lwaWVudENvZGUsXHJcbiAgICAgICAgUkVDX0NPREU6IHJlY2lwaWVudENvZGUsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1c2luZXNzIFJ1bGUgSW1wbGVtZW50YXRpb246IEVDLUNPUlItMDAxIC0gQ2FuY2VsIENvcnJlc3BvbmRlbmNlIHdpdGggRG93bnN0cmVhbSBDaXJjdWxhdGlvblxyXG4gICAqIENhbmNlbCBjb3JyZXNwb25kZW5jZSBhbmQgaGFuZGxlIHJlbGF0ZWQgY2lyY3VsYXRpb25zXHJcbiAgICovXHJcbiAgYXN5bmMgY2FuY2VsKHB1YmxpY0lkOiBzdHJpbmcsIHJlYXNvbjogc3RyaW5nLCB1c2VyOiBVc2VyKSB7XHJcbiAgICBjb25zdCBjb3JyZXNwb25kZW5jZSA9IGF3YWl0IHRoaXMuZmluZE9uZUJ5VXVpZChwdWJsaWNJZCk7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdXNlciBoYXMgcGVybWlzc2lvbiB0byBjYW5jZWwgKE9yZyBBZG1pbiBvciBTdXBlcmFkbWluIG9ubHkpXHJcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlclBlcm1pc3Npb25zKHVzZXIudXNlcl9pZCk7XHJcbiAgICBjb25zdCBjYW5DYW5jZWwgPVxyXG4gICAgICBwZXJtaXNzaW9ucy5pbmNsdWRlcygnY29ycmVzcG9uZGVuY2UuY2FuY2VsJykgfHxcclxuICAgICAgcGVybWlzc2lvbnMuaW5jbHVkZXMoJ3N5c3RlbS5tYW5hZ2VfYWxsJyk7XHJcblxyXG4gICAgaWYgKCFjYW5DYW5jZWwpIHtcclxuICAgICAgdGhyb3cgbmV3IEZvcmJpZGRlbkV4Y2VwdGlvbihcclxuICAgICAgICAnT25seSBhZG1pbmlzdHJhdG9ycyBjYW4gY2FuY2VsIGNvcnJlc3BvbmRlbmNlcydcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IGFjdGl2ZSBjaXJjdWxhdGlvbnNcclxuICAgIGNvbnN0IGNpcmN1bGF0aW9uUmVwbyA9IHRoaXMuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KCdDaXJjdWxhdGlvbicpO1xyXG4gICAgY29uc3QgYWN0aXZlQ2lyY3VsYXRpb25zID0gYXdhaXQgY2lyY3VsYXRpb25SZXBvLmZpbmQoe1xyXG4gICAgICB3aGVyZToge1xyXG4gICAgICAgIGNvcnJlc3BvbmRlbmNlSWQ6IGNvcnJlc3BvbmRlbmNlLmlkLFxyXG4gICAgICAgIHN0YXR1czogJ09QRU4nLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3Qgd2FybmluZ01lc3NhZ2UgPVxyXG4gICAgICBhY3RpdmVDaXJjdWxhdGlvbnMubGVuZ3RoID4gMFxyXG4gICAgICAgID8gYFRoZXJlIGFyZSAke2FjdGl2ZUNpcmN1bGF0aW9ucy5sZW5ndGh9IGFjdGl2ZSBjaXJjdWxhdGlvbihzKSBmb3IgdGhpcyBjb3JyZXNwb25kZW5jZS4gQ2FuY2VsaW5nIHdpbGwgZm9yY2UgY2xvc2UgYWxsIHJlbGF0ZWQgY2lyY3VsYXRpb25zLmBcclxuICAgICAgICA6ICcnO1xyXG5cclxuICAgIC8vIEdldCB0aGUgY3VycmVudCByZXZpc2lvbiB0byB1cGRhdGUgc3RhdHVzXHJcbiAgICBjb25zdCBjdXJyZW50UmV2aXNpb24gPSBhd2FpdCB0aGlzLnJldmlzaW9uUmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHtcclxuICAgICAgICBjb3JyZXNwb25kZW5jZUlkOiBjb3JyZXNwb25kZW5jZS5pZCxcclxuICAgICAgICBpc0N1cnJlbnQ6IHRydWUsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIWN1cnJlbnRSZXZpc2lvbikge1xyXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oJ0N1cnJlbnQgcmV2aXNpb24gbm90IGZvdW5kJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gR2V0IGNhbmNlbGxlZCBzdGF0dXNcclxuICAgIGNvbnN0IGNhbmNlbGxlZFN0YXR1cyA9IGF3YWl0IHRoaXMuc3RhdHVzUmVwby5maW5kT25lKHtcclxuICAgICAgd2hlcmU6IHsgc3RhdHVzQ29kZTogJ0NBTkNFTExFRCcgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghY2FuY2VsbGVkU3RhdHVzKSB7XHJcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKCdDQU5DRUxMRUQgc3RhdHVzIG5vdCBmb3VuZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHF1ZXJ5UnVubmVyID0gdGhpcy5kYXRhU291cmNlLmNyZWF0ZVF1ZXJ5UnVubmVyKCk7XHJcbiAgICBhd2FpdCBxdWVyeVJ1bm5lci5jb25uZWN0KCk7XHJcbiAgICBhd2FpdCBxdWVyeVJ1bm5lci5zdGFydFRyYW5zYWN0aW9uKCk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gVXBkYXRlIGNvcnJlc3BvbmRlbmNlIHJldmlzaW9uIHN0YXR1cyB0byBDQU5DRUxMRURcclxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIubWFuYWdlci51cGRhdGUoXHJcbiAgICAgICAgQ29ycmVzcG9uZGVuY2VSZXZpc2lvbixcclxuICAgICAgICBjdXJyZW50UmV2aXNpb24uaWQsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgc3RhdHVzSWQ6IGNhbmNlbGxlZFN0YXR1cy5pZCxcclxuICAgICAgICAgIHJlbWFya3M6IGBDYW5jZWxsZWQ6ICR7cmVhc29ufWAsXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG5cclxuICAgICAgLy8gRm9yY2UgY2xvc2UgYWxsIGFjdGl2ZSBjaXJjdWxhdGlvbnNcclxuICAgICAgaWYgKGFjdGl2ZUNpcmN1bGF0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgYXdhaXQgcXVlcnlSdW5uZXIubWFuYWdlci51cGRhdGUoXHJcbiAgICAgICAgICAnQ2lyY3VsYXRpb24nLFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBjb3JyZXNwb25kZW5jZUlkOiBjb3JyZXNwb25kZW5jZS5pZCxcclxuICAgICAgICAgICAgc3RhdHVzOiAnT1BFTicsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBzdGF0dXM6ICdGT1JDRV9DTE9TRUQnLFxyXG4gICAgICAgICAgICBjbG9zZWRBdDogbmV3IERhdGUoKSxcclxuICAgICAgICAgICAgY2xvc2VkQnk6IHVzZXIudXNlcl9pZCxcclxuICAgICAgICAgICAgY2xvc2VSZWFzb246IGBDb3JyZXNwb25kZW5jZSBjYW5jZWxsZWQ6ICR7cmVhc29ufWAsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKTtcclxuXHJcbiAgICAgIC8vIFJlLWluZGV4IGNhbmNlbGxlZCBzdGF0dXMgaW4gRWxhc3RpY3NlYXJjaCAoZmlyZS1hbmQtZm9yZ2V0KVxyXG4gICAgICB2b2lkIHRoaXMuc2VhcmNoU2VydmljZS5pbmRleERvY3VtZW50KHtcclxuICAgICAgICBpZDogY29ycmVzcG9uZGVuY2UuaWQsXHJcbiAgICAgICAgcHVibGljSWQ6IGNvcnJlc3BvbmRlbmNlLnB1YmxpY0lkLFxyXG4gICAgICAgIHR5cGU6ICdjb3JyZXNwb25kZW5jZScsXHJcbiAgICAgICAgZG9jTnVtYmVyOiBjb3JyZXNwb25kZW5jZS5jb3JyZXNwb25kZW5jZU51bWJlcixcclxuICAgICAgICB0aXRsZTogY3VycmVudFJldmlzaW9uLnN1YmplY3QsXHJcbiAgICAgICAgc3RhdHVzOiAnQ0FOQ0VMTEVEJyxcclxuICAgICAgICBwcm9qZWN0SWQ6IGNvcnJlc3BvbmRlbmNlLnByb2plY3RJZCxcclxuICAgICAgICBjcmVhdGVkQXQ6IGNvcnJlc3BvbmRlbmNlLmNyZWF0ZWRBdCxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBOb3RpZnkgb3JpZ2luYXRvcidzIGRvYy1jb250cm9sIHVzZXIgYWJvdXQgY2FuY2VsbGF0aW9uIChmaXJlLWFuZC1mb3JnZXQpXHJcbiAgICAgIGlmIChjb3JyZXNwb25kZW5jZS5vcmlnaW5hdG9ySWQpIHtcclxuICAgICAgICB2b2lkIHRoaXMudXNlclNlcnZpY2VcclxuICAgICAgICAgIC5maW5kRG9jQ29udHJvbElkQnlPcmcoY29ycmVzcG9uZGVuY2Uub3JpZ2luYXRvcklkKVxyXG4gICAgICAgICAgLnRoZW4oKHRhcmdldFVzZXJJZCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGFyZ2V0VXNlcklkKSB7XHJcbiAgICAgICAgICAgICAgdm9pZCB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2VuZCh7XHJcbiAgICAgICAgICAgICAgICB1c2VySWQ6IHRhcmdldFVzZXJJZCxcclxuICAgICAgICAgICAgICAgIHRpdGxlOiAnQ29ycmVzcG9uZGVuY2UgQ2FuY2VsbGVkJyxcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGAke2NvcnJlc3BvbmRlbmNlLmNvcnJlc3BvbmRlbmNlTnVtYmVyfSDigJQgJHtjdXJyZW50UmV2aXNpb24uc3ViamVjdH0gaGFzIGJlZW4gY2FuY2VsbGVkLiBSZWFzb246ICR7cmVhc29ufWAsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnRU1BSUwnLFxyXG4gICAgICAgICAgICAgICAgZW50aXR5VHlwZTogJ2NvcnJlc3BvbmRlbmNlJyxcclxuICAgICAgICAgICAgICAgIGVudGl0eUlkOiBjb3JyZXNwb25kZW5jZS5pZCxcclxuICAgICAgICAgICAgICAgIGxpbms6IGAvY29ycmVzcG9uZGVuY2VzLyR7Y29ycmVzcG9uZGVuY2UucHVibGljSWR9YCxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5jYXRjaCgoZXJyOiBFcnJvcikgPT5cclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihgQ2FuY2VsIG5vdGlmaWNhdGlvbiBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9YClcclxuICAgICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICBtZXNzYWdlOiB3YXJuaW5nTWVzc2FnZSB8fCAnQ29ycmVzcG9uZGVuY2UgY2FuY2VsbGVkIHN1Y2Nlc3NmdWxseScsXHJcbiAgICAgICAgYWN0aXZlQ2lyY3VsYXRpb25zQ291bnQ6IGFjdGl2ZUNpcmN1bGF0aW9ucy5sZW5ndGgsXHJcbiAgICAgIH07XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKCk7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxyXG4gICAgICAgIGBGYWlsZWQgdG8gY2FuY2VsIGNvcnJlc3BvbmRlbmNlOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gXHJcbiAgICAgICk7XHJcbiAgICAgIHRocm93IGVycm9yO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucmVsZWFzZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgYnVsa0NhbmNlbChcclxuICAgIHB1YmxpY0lkczogc3RyaW5nW10sXHJcbiAgICByZWFzb246IHN0cmluZyxcclxuICAgIHVzZXI6IFVzZXJcclxuICApOiBQcm9taXNlPHsgc3VjY2VlZGVkOiBzdHJpbmdbXTsgZmFpbGVkOiBzdHJpbmdbXSB9PiB7XHJcbiAgICBjb25zdCBzdWNjZWVkZWQ6IHN0cmluZ1tdID0gW107XHJcbiAgICBjb25zdCBmYWlsZWQ6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBwdWJsaWNJZCBvZiBwdWJsaWNJZHMpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCB0aGlzLmNhbmNlbChwdWJsaWNJZCwgcmVhc29uLCB1c2VyKTtcclxuICAgICAgICBzdWNjZWVkZWQucHVzaChwdWJsaWNJZCk7XHJcbiAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIGZhaWxlZC5wdXNoKHB1YmxpY0lkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IHN1Y2NlZWRlZCwgZmFpbGVkIH07XHJcbiAgfVxyXG5cclxuICBhc3luYyBleHBvcnRDc3Yoc2VhcmNoRHRvOiBTZWFyY2hDb3JyZXNwb25kZW5jZUR0byk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMuZmluZEFsbChzZWFyY2hEdG8pO1xyXG5cclxuICAgIGNvbnN0IGhlYWRlciA9IFtcclxuICAgICAgJ0RvY3VtZW50IE5vLicsXHJcbiAgICAgICdSZXYnLFxyXG4gICAgICAnU3ViamVjdCcsXHJcbiAgICAgICdUeXBlJyxcclxuICAgICAgJ1N0YXR1cycsXHJcbiAgICAgICdQcm9qZWN0JyxcclxuICAgICAgJ0Zyb20nLFxyXG4gICAgICAnRHVlIERhdGUnLFxyXG4gICAgICAnQ3JlYXRlZCBBdCcsXHJcbiAgICBdO1xyXG4gICAgY29uc3Qgcm93cyA9IGRhdGEubWFwKChyZXYpID0+IHtcclxuICAgICAgY29uc3QgY29yciA9IHJldi5jb3JyZXNwb25kZW5jZSA/PyAocmV2IGFzIHVua25vd24gYXMgQ29ycmVzcG9uZGVuY2UpO1xyXG4gICAgICByZXR1cm4gW1xyXG4gICAgICAgIHRoaXMuZXNjYXBlQ3N2KGNvcnIuY29ycmVzcG9uZGVuY2VOdW1iZXIgPz8gJycpLFxyXG4gICAgICAgIHRoaXMuZXNjYXBlQ3N2KHJldi5yZXZpc2lvbkxhYmVsID8/IFN0cmluZyhyZXYucmV2aXNpb25OdW1iZXIgPz8gMCkpLFxyXG4gICAgICAgIHRoaXMuZXNjYXBlQ3N2KHJldi5zdWJqZWN0ID8/ICcnKSxcclxuICAgICAgICB0aGlzLmVzY2FwZUNzdihjb3JyLnR5cGU/LnR5cGVDb2RlID8/ICcnKSxcclxuICAgICAgICB0aGlzLmVzY2FwZUNzdihyZXYuc3RhdHVzPy5zdGF0dXNDb2RlID8/ICcnKSxcclxuICAgICAgICB0aGlzLmVzY2FwZUNzdihjb3JyLnByb2plY3Q/LnByb2plY3RDb2RlID8/ICcnKSxcclxuICAgICAgICB0aGlzLmVzY2FwZUNzdihjb3JyLm9yaWdpbmF0b3I/Lm9yZ2FuaXphdGlvbkNvZGUgPz8gJycpLFxyXG4gICAgICAgIHJldi5kdWVEYXRlID8gbmV3IERhdGUocmV2LmR1ZURhdGUpLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSA6ICcnLFxyXG4gICAgICAgIG5ldyBEYXRlKHJldi5jcmVhdGVkQXQpLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSxcclxuICAgICAgXS5qb2luKCcsJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gW2hlYWRlci5qb2luKCcsJyksIC4uLnJvd3NdLmpvaW4oJ1xcbicpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlc2NhcGVDc3YodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAodmFsdWUuaW5jbHVkZXMoJywnKSB8fCB2YWx1ZS5pbmNsdWRlcygnXCInKSB8fCB2YWx1ZS5pbmNsdWRlcygnXFxuJykpIHtcclxuICAgICAgcmV0dXJuIGBcIiR7dmFsdWUucmVwbGFjZSgvXCIvZywgJ1wiXCInKX1cImA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG59XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/correspondenceservice_e6c952ee6661779150c964b393cfe3e9.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/correspondenceservice_e6c952ee6661779150c964b393cfe3e9.map new file mode 100644 index 0000000..329b545 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/correspondenceservice_e6c952ee6661779150c964b393cfe3e9.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.service.ts"],"sourcesContent":["// File: src/modules/correspondence/correspondence.service.ts\r\n\r\nimport {\r\n Injectable,\r\n NotFoundException,\r\n BadRequestException,\r\n InternalServerErrorException,\r\n ForbiddenException,\r\n Logger,\r\n} from '@nestjs/common';\r\nimport { InjectRepository } from '@nestjs/typeorm';\r\nimport { Repository, DataSource } from 'typeorm';\r\n\r\n// Entities\r\nimport { Correspondence } from './entities/correspondence.entity';\r\nimport { CorrespondenceRevision } from './entities/correspondence-revision.entity';\r\nimport { CorrespondenceType } from './entities/correspondence-type.entity';\r\nimport { CorrespondenceStatus } from './entities/correspondence-status.entity';\r\nimport { CorrespondenceReference } from './entities/correspondence-reference.entity';\r\nimport { CorrespondenceRecipient } from './entities/correspondence-recipient.entity';\r\nimport { CorrespondenceTag } from './entities/correspondence-tag.entity';\r\nimport { Tag } from '../master/entities/tag.entity';\r\nimport { User } from '../user/entities/user.entity';\r\nimport { Organization } from '../organization/entities/organization.entity';\r\nimport { CorrespondenceRevisionAttachment } from './entities/correspondence-revision-attachment.entity';\r\n\r\n// DTOs\r\nimport { CreateCorrespondenceDto } from './dto/create-correspondence.dto';\r\nimport { UpdateCorrespondenceDto } from './dto/update-correspondence.dto';\r\nimport { AddReferenceDto } from './dto/add-reference.dto';\r\nimport { SearchCorrespondenceDto } from './dto/search-correspondence.dto';\r\n\r\n// Services\r\nimport { DocumentNumberingService } from '../document-numbering/services/document-numbering.service';\r\nimport { JsonSchemaService } from '../json-schema/json-schema.service';\r\nimport { WorkflowEngineService } from '../workflow-engine/workflow-engine.service';\r\nimport { UserService } from '../user/user.service';\r\nimport { SearchService } from '../search/search.service';\r\nimport { FileStorageService } from '../../common/file-storage/file-storage.service';\r\nimport { UuidResolverService } from '../../common/services/uuid-resolver.service';\r\nimport { NotificationService } from '../notification/notification.service';\r\n\r\n/**\r\n * CorrespondenceService - Document management (CRUD)\r\n */\r\ninterface ResolvedRecipient {\r\n organizationId: number;\r\n type: 'TO' | 'CC';\r\n}\r\n@Injectable()\r\nexport class CorrespondenceService {\r\n private readonly logger = new Logger(CorrespondenceService.name);\r\n\r\n private async hasSystemManageAllPermission(userId: number): Promise {\r\n const permissions = await this.userService.getUserPermissions(userId);\r\n return permissions.includes('system.manage_all');\r\n }\r\n\r\n /**\r\n * Business Rule: Revision Label Strategy\r\n * - RFA, RFI: Use alphabet starting with 'A' (A, B, C...)\r\n * - Other types (LETTER, MEMO, etc.): Use numeric (null for first, then 1, 2, 3...)\r\n */\r\n private getInitialRevisionLabel(typeCode: string): string | undefined {\r\n const alphabetTypes = ['RFA', 'RFI'];\r\n if (alphabetTypes.includes(typeCode.toUpperCase())) {\r\n return 'A'; // Alphabet for RFA, RFI\r\n }\r\n return undefined; // Numeric (no label for revision 0)\r\n }\r\n\r\n constructor(\r\n @InjectRepository(Correspondence)\r\n private correspondenceRepo: Repository,\r\n @InjectRepository(CorrespondenceRevision)\r\n private revisionRepo: Repository,\r\n @InjectRepository(CorrespondenceType)\r\n private typeRepo: Repository,\r\n @InjectRepository(CorrespondenceStatus)\r\n private statusRepo: Repository,\r\n @InjectRepository(CorrespondenceReference)\r\n private referenceRepo: Repository,\r\n @InjectRepository(CorrespondenceTag)\r\n private tagRepo: Repository,\r\n private numberingService: DocumentNumberingService,\r\n private jsonSchemaService: JsonSchemaService,\r\n private workflowEngine: WorkflowEngineService,\r\n private userService: UserService,\r\n private dataSource: DataSource,\r\n private searchService: SearchService,\r\n private fileStorageService: FileStorageService,\r\n private uuidResolver: UuidResolverService,\r\n private notificationService: NotificationService,\r\n @InjectRepository(CorrespondenceRevisionAttachment)\r\n private revAttachRepo: Repository\r\n ) {}\r\n\r\n /**\r\n * Business Rule Validation: EC-CORR-003 - Correspondence to Self\r\n * Prevent external correspondence to same organization\r\n */\r\n private async validateCorrespondenceRecipients(\r\n createDto: CreateCorrespondenceDto,\r\n user: User\r\n ): Promise {\r\n // Get user's organization\r\n let userOrgId = user.primaryOrganizationId;\r\n if (!userOrgId) {\r\n const fullUser = await this.userService.findOne(user.user_id);\r\n if (fullUser) {\r\n userOrgId = fullUser.primaryOrganizationId;\r\n }\r\n }\r\n\r\n if (!userOrgId) {\r\n if (createDto.originatorId) {\r\n const canManageAll = await this.hasSystemManageAllPermission(\r\n user.user_id\r\n );\r\n if (canManageAll) {\r\n userOrgId = await this.uuidResolver.resolveOrganizationId(\r\n createDto.originatorId\r\n );\r\n }\r\n }\r\n\r\n if (!userOrgId) {\r\n throw new BadRequestException(\r\n 'User must belong to an organization to create documents'\r\n );\r\n }\r\n }\r\n\r\n // For impersonation, use the specified originator\r\n const originatorOrgId = createDto.originatorId\r\n ? await this.uuidResolver.resolveOrganizationId(createDto.originatorId)\r\n : userOrgId;\r\n\r\n // Check if it's internal communication\r\n if (createDto.isInternal) {\r\n // Internal communications should use Circulation instead\r\n throw new BadRequestException(\r\n 'Internal communications should use Circulation Sheet instead of Correspondence'\r\n );\r\n }\r\n\r\n // Validate recipients\r\n if (!createDto.recipients || createDto.recipients.length === 0) {\r\n throw new BadRequestException(\r\n 'At least one recipient (TO or CC) is required'\r\n );\r\n }\r\n\r\n const toRecipients = createDto.recipients.filter((r) => r.type === 'TO');\r\n const ccRecipients = createDto.recipients.filter((r) => r.type === 'CC');\r\n\r\n if (toRecipients.length === 0 && ccRecipients.length === 0) {\r\n throw new BadRequestException(\r\n 'At least one TO or CC recipient is required'\r\n );\r\n }\r\n\r\n // Check for same organization correspondence\r\n for (const recipient of createDto.recipients) {\r\n const recipientOrgId = await this.uuidResolver.resolveOrganizationId(\r\n recipient.organizationId\r\n );\r\n\r\n if (recipientOrgId === originatorOrgId) {\r\n throw new BadRequestException(\r\n 'Cannot send correspondence to your own organization. Use Circulation Sheet for internal communication.'\r\n );\r\n }\r\n }\r\n }\r\n\r\n async create(createDto: CreateCorrespondenceDto, user: User) {\r\n // Business Rule Validation: EC-CORR-003 - Correspondence to Self\r\n await this.validateCorrespondenceRecipients(createDto, user);\r\n // ADR-019: Resolve UUID references to internal INT IDs\r\n const resolvedProjectId = await this.uuidResolver.resolveProjectId(\r\n createDto.projectId\r\n );\r\n const resolvedOriginatorId = createDto.originatorId\r\n ? await this.uuidResolver.resolveOrganizationId(createDto.originatorId)\r\n : undefined;\r\n const resolvedRecipients = createDto.recipients\r\n ? await Promise.all(\r\n createDto.recipients.map(\r\n async (r): Promise => ({\r\n organizationId: await this.uuidResolver.resolveOrganizationId(\r\n r.organizationId\r\n ),\r\n type: r.type,\r\n })\r\n )\r\n )\r\n : undefined;\r\n const type = await this.typeRepo.findOne({\r\n where: { id: createDto.typeId },\r\n });\r\n if (!type) throw new NotFoundException('Document Type not found');\r\n\r\n const statusDraft = await this.statusRepo.findOne({\r\n where: { statusCode: 'DRAFT' },\r\n });\r\n if (!statusDraft) {\r\n throw new InternalServerErrorException(\r\n 'Status DRAFT not found in Master Data'\r\n );\r\n }\r\n\r\n let userOrgId = user.primaryOrganizationId;\r\n\r\n if (!userOrgId) {\r\n const fullUser = await this.userService.findOne(user.user_id);\r\n if (fullUser) {\r\n userOrgId = fullUser.primaryOrganizationId;\r\n }\r\n }\r\n\r\n // Impersonation Logic\r\n if (resolvedOriginatorId && resolvedOriginatorId !== userOrgId) {\r\n const canManageAll = await this.hasSystemManageAllPermission(\r\n user.user_id\r\n );\r\n if (!canManageAll) {\r\n throw new ForbiddenException(\r\n 'You do not have permission to create documents on behalf of other organizations.'\r\n );\r\n }\r\n userOrgId = resolvedOriginatorId;\r\n }\r\n\r\n if (!userOrgId) {\r\n throw new BadRequestException(\r\n 'User must belong to an organization to create documents'\r\n );\r\n }\r\n\r\n if (createDto.details) {\r\n try {\r\n await this.jsonSchemaService.validate(type.typeCode, createDto.details);\r\n } catch (error: unknown) {\r\n this.logger.warn(\r\n `Schema validation warning for ${type.typeCode}: ${(error as Error).message}`\r\n );\r\n }\r\n }\r\n\r\n const queryRunner = this.dataSource.createQueryRunner();\r\n await queryRunner.connect();\r\n await queryRunner.startTransaction();\r\n\r\n try {\r\n // [Fix #6] Fetch real ORG Code from Organization entity\r\n const originatorOrg = await this.dataSource.manager.findOne(\r\n Organization,\r\n {\r\n where: { id: userOrgId },\r\n }\r\n );\r\n const orgCode = originatorOrg?.organizationCode ?? 'UNK';\r\n\r\n // [v1.5.1] Extract recipient organization from recipients array (Primary TO)\r\n const toRecipient = resolvedRecipients?.find((r) => r.type === 'TO');\r\n const recipientOrganizationId = toRecipient?.organizationId;\r\n\r\n let recipientCode = '';\r\n if (recipientOrganizationId) {\r\n const recOrg = await this.dataSource.manager.findOne(Organization, {\r\n where: { id: recipientOrganizationId },\r\n });\r\n if (recOrg) recipientCode = recOrg.organizationCode;\r\n }\r\n\r\n const docNumber = await this.numberingService.generateNextNumber({\r\n projectId: resolvedProjectId,\r\n originatorOrganizationId: userOrgId,\r\n typeId: createDto.typeId,\r\n disciplineId: createDto.disciplineId,\r\n subTypeId: createDto.subTypeId,\r\n recipientOrganizationId, // [v1.5.1] Pass recipient for document number format\r\n year: new Date().getFullYear(),\r\n customTokens: {\r\n TYPE_CODE: type.typeCode,\r\n ORG_CODE: orgCode,\r\n RECIPIENT_CODE: recipientCode,\r\n REC_CODE: recipientCode,\r\n },\r\n });\r\n\r\n const correspondence = queryRunner.manager.create(Correspondence, {\r\n correspondenceNumber: docNumber.number,\r\n correspondenceTypeId: createDto.typeId,\r\n disciplineId: createDto.disciplineId,\r\n projectId: resolvedProjectId,\r\n originatorId: userOrgId,\r\n isInternal: createDto.isInternal || false,\r\n createdBy: user.user_id,\r\n });\r\n const savedCorr = await queryRunner.manager.save(correspondence);\r\n\r\n const revision = queryRunner.manager.create(CorrespondenceRevision, {\r\n correspondenceId: savedCorr.id,\r\n revisionNumber: 0,\r\n revisionLabel: this.getInitialRevisionLabel(type.typeCode),\r\n isCurrent: true,\r\n statusId: statusDraft.id,\r\n subject: createDto.subject,\r\n body: createDto.body,\r\n remarks: createDto.remarks,\r\n dueDate: createDto.dueDate ? new Date(createDto.dueDate) : undefined,\r\n documentDate: createDto.documentDate\r\n ? new Date(createDto.documentDate)\r\n : undefined,\r\n issuedDate: createDto.issuedDate\r\n ? new Date(createDto.issuedDate)\r\n : undefined,\r\n receivedDate: createDto.receivedDate\r\n ? new Date(createDto.receivedDate)\r\n : undefined,\r\n description: createDto.description,\r\n details: createDto.details,\r\n createdBy: user.user_id,\r\n schemaVersion: 1,\r\n });\r\n await queryRunner.manager.save(revision);\r\n\r\n // Save Recipients (using resolved INT IDs)\r\n if (resolvedRecipients && resolvedRecipients.length > 0) {\r\n const recipients = resolvedRecipients.map((r) =>\r\n queryRunner.manager.create(CorrespondenceRecipient, {\r\n correspondenceId: savedCorr.id,\r\n recipientOrganizationId: r.organizationId,\r\n recipientType: r.type,\r\n })\r\n );\r\n await queryRunner.manager.save(recipients);\r\n }\r\n\r\n // Commit attachments from Temp → Permanent (Two-Phase Storage)\r\n if (createDto.attachmentTempIds?.length) {\r\n const issueDate = createDto.issuedDate\r\n ? new Date(createDto.issuedDate)\r\n : createDto.documentDate\r\n ? new Date(createDto.documentDate)\r\n : undefined;\r\n\r\n // [FIX v1.8.1] commit ได้ Attachment records กลับมา → บันทึก junction\r\n const committed = await this.fileStorageService.commit(\r\n createDto.attachmentTempIds,\r\n { issueDate, documentType: 'Correspondence' }\r\n );\r\n\r\n if (committed.length > 0) {\r\n const links = committed.map((att, idx) =>\r\n queryRunner.manager.create(CorrespondenceRevisionAttachment, {\r\n correspondenceRevisionId: revision.id,\r\n attachmentId: att.id,\r\n isMainDocument: idx === 0, // ไฟล์แรกเป็น main document\r\n })\r\n );\r\n await queryRunner.manager.save(\r\n CorrespondenceRevisionAttachment,\r\n links\r\n );\r\n }\r\n }\r\n\r\n await queryRunner.commitTransaction();\r\n\r\n // Start Workflow Instance (non-blocking)\r\n try {\r\n const workflowCode = `CORRESPONDENCE_${type.typeCode}`;\r\n await this.workflowEngine.createInstance(\r\n workflowCode,\r\n 'correspondence',\r\n savedCorr.id.toString(),\r\n {\r\n projectId: resolvedProjectId,\r\n originatorId: userOrgId,\r\n disciplineId: createDto.disciplineId,\r\n initiatorId: user.user_id,\r\n } as Record\r\n );\r\n } catch (error: unknown) {\r\n this.logger.warn(\r\n `Workflow not started for ${docNumber.number} (Code: CORRESPONDENCE_${type.typeCode}): ${(error as Error).message}`\r\n );\r\n }\r\n\r\n // Fire-and-forget search indexing (non-blocking, void intentional)\r\n void this.searchService.indexDocument({\r\n id: savedCorr.id,\r\n publicId: savedCorr.publicId,\r\n type: 'correspondence',\r\n docNumber: docNumber.number,\r\n title: createDto.subject,\r\n description: createDto.description,\r\n status: 'DRAFT',\r\n projectId: resolvedProjectId,\r\n createdAt: new Date(),\r\n });\r\n\r\n return {\r\n ...savedCorr,\r\n currentRevision: revision,\r\n };\r\n } catch (err) {\r\n await queryRunner.rollbackTransaction();\r\n this.logger.error(\r\n `Failed to create correspondence: ${(err as Error).message}`\r\n );\r\n throw err;\r\n } finally {\r\n await queryRunner.release();\r\n }\r\n }\r\n\r\n async findAll(searchDto: SearchCorrespondenceDto = {}) {\r\n const {\r\n search,\r\n typeId,\r\n projectId,\r\n statusId,\r\n status,\r\n page = 1,\r\n limit = 10,\r\n } = searchDto;\r\n const skip = (page - 1) * limit;\r\n\r\n // Change: Query from Revision Repo\r\n const query = this.revisionRepo\r\n .createQueryBuilder('rev')\r\n .leftJoinAndSelect('rev.correspondence', 'corr')\r\n .leftJoinAndSelect('corr.type', 'type')\r\n .leftJoinAndSelect('corr.project', 'project')\r\n .leftJoinAndSelect('corr.originator', 'org')\r\n .leftJoinAndSelect('rev.status', 'status');\r\n\r\n // Filter by Revision Status\r\n const revStatus = searchDto.revisionStatus || 'CURRENT';\r\n\r\n if (revStatus === 'CURRENT') {\r\n query.where('rev.isCurrent = :isCurrent', { isCurrent: true });\r\n } else if (revStatus === 'OLD') {\r\n query.where('rev.isCurrent = :isCurrent', { isCurrent: false });\r\n }\r\n // If 'ALL', no filter needed on isCurrent\r\n\r\n if (projectId) {\r\n query.andWhere('corr.projectId = :projectId', { projectId });\r\n }\r\n\r\n if (typeId) {\r\n query.andWhere('corr.correspondenceTypeId = :typeId', { typeId });\r\n }\r\n\r\n if (statusId) {\r\n query.andWhere('rev.statusId = :statusId', { statusId });\r\n }\r\n\r\n if (status) {\r\n query.andWhere('status.statusCode = :status', { status });\r\n }\r\n\r\n if (search) {\r\n query.andWhere(\r\n '(corr.correspondenceNumber LIKE :search OR rev.subject LIKE :search)',\r\n { search: `%${search}%` }\r\n );\r\n }\r\n\r\n // Default Sort: Latest Created\r\n query.orderBy('rev.createdAt', 'DESC').skip(skip).take(limit);\r\n\r\n const [items, total] = await query.getManyAndCount();\r\n\r\n return {\r\n data: items,\r\n meta: {\r\n total,\r\n page,\r\n limit,\r\n totalPages: Math.ceil(total / limit),\r\n },\r\n };\r\n }\r\n\r\n async findOne(id: number) {\r\n const correspondence = await this.correspondenceRepo.findOne({\r\n where: { id },\r\n relations: [\r\n 'revisions',\r\n 'revisions.status',\r\n 'type',\r\n 'project',\r\n 'originator',\r\n 'recipients',\r\n 'recipients.recipientOrganization', // [v1.5.1] Fixed relation name\r\n ],\r\n });\r\n\r\n if (!correspondence) {\r\n throw new NotFoundException(`Correspondence with ID ${id} not found`);\r\n }\r\n return correspondence;\r\n }\r\n\r\n async findOneByUuid(publicId: string) {\r\n const correspondence = await this.correspondenceRepo.findOne({\r\n where: { publicId },\r\n relations: [\r\n 'revisions',\r\n 'revisions.status',\r\n 'revisions.attachmentLinks', // [FIX v1.8.1] โหลด junction\r\n 'revisions.attachmentLinks.attachment', // [FIX v1.8.1] โหลด attachment จริง\r\n 'type',\r\n 'project',\r\n 'originator',\r\n 'recipients',\r\n 'recipients.recipientOrganization',\r\n ],\r\n });\r\n\r\n if (!correspondence) {\r\n throw new NotFoundException(\r\n `Correspondence with UUID ${publicId} not found`\r\n );\r\n }\r\n return correspondence;\r\n }\r\n\r\n async addReference(id: number, dto: AddReferenceDto) {\r\n const source = await this.correspondenceRepo.findOne({ where: { id } });\r\n // ADR-019: Resolve target publicId → internal INT id\r\n const target = await this.correspondenceRepo.findOne({\r\n where: { publicId: dto.targetUuid },\r\n });\r\n\r\n if (!source || !target) {\r\n throw new NotFoundException('Source or Target correspondence not found');\r\n }\r\n\r\n if (source.id === target.id) {\r\n throw new BadRequestException('Cannot reference self');\r\n }\r\n\r\n const exists = await this.referenceRepo.findOne({\r\n where: {\r\n sourceId: id,\r\n targetId: target.id,\r\n },\r\n });\r\n\r\n if (exists) {\r\n return exists;\r\n }\r\n\r\n const ref = this.referenceRepo.create({\r\n sourceId: id,\r\n targetId: target.id,\r\n });\r\n\r\n return this.referenceRepo.save(ref);\r\n }\r\n\r\n async removeReference(id: number, targetId: number) {\r\n const result = await this.referenceRepo.delete({\r\n sourceId: id,\r\n targetId: targetId,\r\n });\r\n\r\n if (result.affected === 0) {\r\n throw new NotFoundException('Reference not found');\r\n }\r\n }\r\n\r\n async getTags(id: number) {\r\n const rows = await this.tagRepo.find({\r\n where: { correspondenceId: id },\r\n relations: ['tag'],\r\n });\r\n return rows.map((r) => r.tag).filter(Boolean);\r\n }\r\n\r\n async addTag(id: number, tagId: number) {\r\n const correspondence = await this.correspondenceRepo.findOne({\r\n where: { id },\r\n });\r\n if (!correspondence) {\r\n throw new NotFoundException(`Correspondence ${id} not found`);\r\n }\r\n\r\n const tag = await this.dataSource.manager.findOne(Tag, {\r\n where: { id: tagId },\r\n });\r\n if (!tag) {\r\n throw new NotFoundException(`Tag ${tagId} not found`);\r\n }\r\n\r\n const exists = await this.tagRepo.findOne({\r\n where: { correspondenceId: id, tagId },\r\n });\r\n if (exists) return exists;\r\n\r\n const row = this.tagRepo.create({ correspondenceId: id, tagId });\r\n return this.tagRepo.save(row);\r\n }\r\n\r\n async removeTag(id: number, tagId: number) {\r\n const result = await this.tagRepo.delete({ correspondenceId: id, tagId });\r\n if (result.affected === 0) {\r\n throw new NotFoundException('Tag assignment not found');\r\n }\r\n }\r\n\r\n async getReferences(id: number) {\r\n const outgoing = await this.referenceRepo.find({\r\n where: { sourceId: id },\r\n relations: ['target', 'target.type'],\r\n });\r\n\r\n const incoming = await this.referenceRepo.find({\r\n where: { targetId: id },\r\n relations: ['source', 'source.type'],\r\n });\r\n\r\n return { outgoing, incoming };\r\n }\r\n\r\n async update(id: number, updateDto: UpdateCorrespondenceDto, user: User) {\r\n // 1. Find Current Revision\r\n const revision = await this.revisionRepo.findOne({\r\n where: {\r\n correspondenceId: id,\r\n isCurrent: true,\r\n },\r\n relations: ['correspondence'],\r\n });\r\n\r\n if (!revision) {\r\n throw new NotFoundException(\r\n `Current revision for correspondence ${id} not found`\r\n );\r\n }\r\n\r\n // 2. Check Permission\r\n if (revision.statusId) {\r\n const status = await this.statusRepo.findOne({\r\n where: { id: revision.statusId },\r\n });\r\n\r\n if (status && status.statusCode !== 'DRAFT') {\r\n const permissions = await this.userService.getUserPermissions(\r\n user.user_id\r\n );\r\n const canEditSubmittedOrLater =\r\n permissions.includes('correspondence.cancel') ||\r\n permissions.includes('system.manage_all');\r\n\r\n if (!canEditSubmittedOrLater) {\r\n throw new ForbiddenException(\r\n 'Only Org Admin or Superadmin can edit non-draft correspondences'\r\n );\r\n }\r\n }\r\n }\r\n\r\n // ADR-019: Resolve UUID references in update DTO\r\n const updResolvedProjectId = updateDto.projectId\r\n ? await this.uuidResolver.resolveProjectId(updateDto.projectId)\r\n : undefined;\r\n const updResolvedOriginatorId = updateDto.originatorId\r\n ? await this.uuidResolver.resolveOrganizationId(updateDto.originatorId)\r\n : undefined;\r\n const updResolvedRecipients = updateDto.recipients\r\n ? await Promise.all(\r\n updateDto.recipients.map(\r\n async (r): Promise => ({\r\n organizationId: await this.uuidResolver.resolveOrganizationId(\r\n r.organizationId\r\n ),\r\n type: r.type,\r\n })\r\n )\r\n )\r\n : undefined;\r\n\r\n // 3. Update Correspondence Entity if needed\r\n const correspondenceUpdate: Record = {};\r\n if (updateDto.disciplineId)\r\n correspondenceUpdate.disciplineId = updateDto.disciplineId;\r\n if (updResolvedProjectId)\r\n correspondenceUpdate.projectId = updResolvedProjectId;\r\n if (updResolvedOriginatorId)\r\n correspondenceUpdate.originatorId = updResolvedOriginatorId;\r\n\r\n if (Object.keys(correspondenceUpdate).length > 0) {\r\n await this.correspondenceRepo.update(id, correspondenceUpdate);\r\n }\r\n\r\n // 4. Update Revision Entity\r\n const revisionUpdate: Record = {};\r\n if (updateDto.subject) revisionUpdate.subject = updateDto.subject;\r\n if (updateDto.body) revisionUpdate.body = updateDto.body;\r\n if (updateDto.remarks) revisionUpdate.remarks = updateDto.remarks;\r\n // Format Date correctly if string\r\n if (updateDto.dueDate) revisionUpdate.dueDate = new Date(updateDto.dueDate);\r\n if (updateDto.documentDate)\r\n revisionUpdate.documentDate = new Date(updateDto.documentDate);\r\n if (updateDto.issuedDate)\r\n revisionUpdate.issuedDate = new Date(updateDto.issuedDate);\r\n if (updateDto.receivedDate)\r\n revisionUpdate.receivedDate = new Date(updateDto.receivedDate);\r\n if (updateDto.description)\r\n revisionUpdate.description = updateDto.description;\r\n if (updateDto.details) revisionUpdate.details = updateDto.details;\r\n\r\n if (Object.keys(revisionUpdate).length > 0) {\r\n await this.revisionRepo.update(revision.id, revisionUpdate);\r\n }\r\n\r\n // 4.5 Commit new attachments from Temp → Permanent (Two-Phase Storage)\r\n if (updateDto.attachmentTempIds?.length) {\r\n const issueDate = updateDto.issuedDate\r\n ? new Date(updateDto.issuedDate)\r\n : updateDto.documentDate\r\n ? new Date(updateDto.documentDate)\r\n : revision.issuedDate || revision.documentDate || undefined;\r\n\r\n // [FIX v1.8.1] commit ได้ Attachment records กลับมา → บันทึก junction\r\n const committed = await this.fileStorageService.commit(\r\n updateDto.attachmentTempIds,\r\n {\r\n issueDate: issueDate ? new Date(issueDate) : undefined,\r\n documentType: 'Correspondence',\r\n }\r\n );\r\n\r\n if (committed.length > 0) {\r\n const links = committed.map((att) =>\r\n this.revAttachRepo.create({\r\n correspondenceRevisionId: revision.id,\r\n attachmentId: att.id,\r\n isMainDocument: false, // ไฟล์ที่ upload เพิ่มเติมไม่ใช่ main\r\n })\r\n );\r\n await this.revAttachRepo.save(links);\r\n }\r\n }\r\n\r\n // 5. Update Recipients if provided\r\n if (updResolvedRecipients) {\r\n const recipientRepo = this.dataSource.getRepository(\r\n CorrespondenceRecipient\r\n );\r\n await recipientRepo.delete({ correspondenceId: id });\r\n\r\n const newRecipients = updResolvedRecipients.map((r) =>\r\n recipientRepo.create({\r\n correspondenceId: id,\r\n recipientOrganizationId: r.organizationId,\r\n recipientType: r.type,\r\n })\r\n );\r\n await recipientRepo.save(newRecipients);\r\n }\r\n\r\n // 6. Regenerate Document Number if structural fields changed (Recipient, Discipline, Type, Project)\r\n // AND it is a DRAFT.\r\n\r\n // Fetch fresh data for context and comparison\r\n const currentCorr = await this.correspondenceRepo.findOne({\r\n where: { id },\r\n relations: ['type', 'recipients', 'recipients.recipientOrganization'],\r\n });\r\n\r\n if (currentCorr) {\r\n const currentToRecipient = currentCorr.recipients?.find(\r\n (r) => r.recipientType === 'TO'\r\n );\r\n const currentRecipientId = currentToRecipient?.recipientOrganizationId;\r\n\r\n // Check for ACTUAL value changes\r\n const isProjectChanged =\r\n updResolvedProjectId !== undefined &&\r\n updResolvedProjectId !== currentCorr.projectId;\r\n const isOriginatorChanged =\r\n updResolvedOriginatorId !== undefined &&\r\n updResolvedOriginatorId !== currentCorr.originatorId;\r\n const isDisciplineChanged =\r\n updateDto.disciplineId !== undefined &&\r\n updateDto.disciplineId !== currentCorr.disciplineId;\r\n const isTypeChanged =\r\n updateDto.typeId !== undefined &&\r\n updateDto.typeId !== currentCorr.correspondenceTypeId;\r\n\r\n let isRecipientChanged = false;\r\n let newRecipientId: number | undefined;\r\n\r\n if (updResolvedRecipients) {\r\n const newToRecipient = updResolvedRecipients.find(\r\n (r) => r.type === 'TO'\r\n );\r\n newRecipientId = newToRecipient?.organizationId;\r\n\r\n if (newRecipientId !== currentRecipientId) {\r\n isRecipientChanged = true;\r\n }\r\n }\r\n\r\n if (\r\n isProjectChanged ||\r\n isDisciplineChanged ||\r\n isTypeChanged ||\r\n isRecipientChanged ||\r\n isOriginatorChanged\r\n ) {\r\n const targetRecipientId = isRecipientChanged\r\n ? newRecipientId\r\n : currentRecipientId;\r\n\r\n // Resolve Recipient Code for the NEW context\r\n let recipientCode = '';\r\n if (targetRecipientId) {\r\n const recOrg = await this.dataSource.manager.findOne(Organization, {\r\n where: { id: targetRecipientId },\r\n });\r\n if (recOrg) recipientCode = recOrg.organizationCode;\r\n }\r\n\r\n // [Fix #6] Fetch real ORG Code from originator organization\r\n const originatorOrgForUpdate = await this.dataSource.manager.findOne(\r\n Organization,\r\n {\r\n where: {\r\n id: updResolvedOriginatorId ?? currentCorr.originatorId ?? 0,\r\n },\r\n }\r\n );\r\n const orgCode = originatorOrgForUpdate?.organizationCode ?? 'UNK';\r\n\r\n // Prepare Contexts\r\n const oldCtx = {\r\n projectId: currentCorr.projectId,\r\n originatorOrganizationId: currentCorr.originatorId ?? 0,\r\n typeId: currentCorr.correspondenceTypeId,\r\n disciplineId: currentCorr.disciplineId,\r\n recipientOrganizationId: currentRecipientId,\r\n year: new Date().getFullYear(),\r\n };\r\n\r\n const newCtx = {\r\n projectId: updResolvedProjectId ?? currentCorr.projectId,\r\n originatorOrganizationId:\r\n updResolvedOriginatorId ?? currentCorr.originatorId ?? 0,\r\n typeId: updateDto.typeId ?? currentCorr.correspondenceTypeId,\r\n disciplineId: updateDto.disciplineId ?? currentCorr.disciplineId,\r\n recipientOrganizationId: targetRecipientId,\r\n year: new Date().getFullYear(),\r\n userId: user.user_id, // Pass User ID for Audit\r\n customTokens: {\r\n TYPE_CODE: currentCorr.type?.typeCode || '',\r\n ORG_CODE: orgCode,\r\n RECIPIENT_CODE: recipientCode,\r\n REC_CODE: recipientCode,\r\n },\r\n };\r\n\r\n // If Type Changed, need NEW Type Code\r\n if (isTypeChanged) {\r\n const newType = await this.typeRepo.findOne({\r\n where: { id: newCtx.typeId },\r\n });\r\n if (newType) newCtx.customTokens.TYPE_CODE = newType.typeCode;\r\n }\r\n\r\n const newDocNumber = await this.numberingService.updateNumberForDraft(\r\n currentCorr.correspondenceNumber,\r\n oldCtx,\r\n newCtx\r\n );\r\n\r\n await this.correspondenceRepo.update(id, {\r\n correspondenceNumber: newDocNumber,\r\n });\r\n }\r\n }\r\n\r\n const updated = await this.findOne(id);\r\n\r\n // Re-index updated document in Elasticsearch (fire-and-forget)\r\n void this.searchService.indexDocument({\r\n id: updated.id,\r\n publicId: updated.publicId,\r\n type: 'correspondence',\r\n docNumber: updated.correspondenceNumber,\r\n title: updateDto.subject ?? updated.revisions?.[0]?.subject,\r\n description: updateDto.description ?? updated.revisions?.[0]?.description,\r\n status: 'DRAFT',\r\n projectId: updated.projectId,\r\n createdAt: updated.createdAt,\r\n });\r\n\r\n return updated;\r\n }\r\n\r\n async previewDocumentNumber(createDto: CreateCorrespondenceDto, user: User) {\r\n // ADR-019: Resolve UUID references\r\n const previewProjectId = await this.uuidResolver.resolveProjectId(\r\n createDto.projectId\r\n );\r\n const previewOriginatorId = createDto.originatorId\r\n ? await this.uuidResolver.resolveOrganizationId(createDto.originatorId)\r\n : undefined;\r\n const previewRecipients = createDto.recipients\r\n ? await Promise.all(\r\n createDto.recipients.map(\r\n async (r): Promise => ({\r\n organizationId: await this.uuidResolver.resolveOrganizationId(\r\n r.organizationId\r\n ),\r\n type: r.type,\r\n })\r\n )\r\n )\r\n : undefined;\r\n\r\n const type = await this.typeRepo.findOne({\r\n where: { id: createDto.typeId },\r\n });\r\n if (!type) throw new NotFoundException('Document Type not found');\r\n\r\n let userOrgId = user.primaryOrganizationId;\r\n if (!userOrgId) {\r\n const fullUser = await this.userService.findOne(user.user_id);\r\n if (fullUser) userOrgId = fullUser.primaryOrganizationId;\r\n }\r\n\r\n if (previewOriginatorId && previewOriginatorId !== userOrgId) {\r\n // Allow impersonation for preview\r\n userOrgId = previewOriginatorId;\r\n }\r\n\r\n // Extract recipient from recipients array\r\n const toRecipient = previewRecipients?.find((r) => r.type === 'TO');\r\n const recipientOrganizationId = toRecipient?.organizationId;\r\n\r\n let recipientCode = '';\r\n if (recipientOrganizationId) {\r\n const recOrg = await this.dataSource.manager.findOne(Organization, {\r\n where: { id: recipientOrganizationId },\r\n });\r\n if (recOrg) recipientCode = recOrg.organizationCode;\r\n }\r\n\r\n return this.numberingService.previewNumber({\r\n projectId: previewProjectId,\r\n originatorOrganizationId: userOrgId!,\r\n typeId: createDto.typeId,\r\n disciplineId: createDto.disciplineId,\r\n subTypeId: createDto.subTypeId,\r\n recipientOrganizationId,\r\n year: new Date().getFullYear(),\r\n customTokens: {\r\n TYPE_CODE: type.typeCode,\r\n RECIPIENT_CODE: recipientCode,\r\n REC_CODE: recipientCode,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Business Rule Implementation: EC-CORR-001 - Cancel Correspondence with Downstream Circulation\r\n * Cancel correspondence and handle related circulations\r\n */\r\n async cancel(publicId: string, reason: string, user: User) {\r\n const correspondence = await this.findOneByUuid(publicId);\r\n\r\n // Check if user has permission to cancel (Org Admin or Superadmin only)\r\n const permissions = await this.userService.getUserPermissions(user.user_id);\r\n const canCancel =\r\n permissions.includes('correspondence.cancel') ||\r\n permissions.includes('system.manage_all');\r\n\r\n if (!canCancel) {\r\n throw new ForbiddenException(\r\n 'Only administrators can cancel correspondences'\r\n );\r\n }\r\n\r\n // Check if there are any active circulations\r\n const circulationRepo = this.dataSource.getRepository('Circulation');\r\n const activeCirculations = await circulationRepo.find({\r\n where: {\r\n correspondenceId: correspondence.id,\r\n status: 'OPEN',\r\n },\r\n });\r\n\r\n const warningMessage =\r\n activeCirculations.length > 0\r\n ? `There are ${activeCirculations.length} active circulation(s) for this correspondence. Canceling will force close all related circulations.`\r\n : '';\r\n\r\n // Get the current revision to update status\r\n const currentRevision = await this.revisionRepo.findOne({\r\n where: {\r\n correspondenceId: correspondence.id,\r\n isCurrent: true,\r\n },\r\n });\r\n\r\n if (!currentRevision) {\r\n throw new NotFoundException('Current revision not found');\r\n }\r\n\r\n // Get cancelled status\r\n const cancelledStatus = await this.statusRepo.findOne({\r\n where: { statusCode: 'CANCELLED' },\r\n });\r\n\r\n if (!cancelledStatus) {\r\n throw new InternalServerErrorException('CANCELLED status not found');\r\n }\r\n\r\n const queryRunner = this.dataSource.createQueryRunner();\r\n await queryRunner.connect();\r\n await queryRunner.startTransaction();\r\n\r\n try {\r\n // Update correspondence revision status to CANCELLED\r\n await queryRunner.manager.update(\r\n CorrespondenceRevision,\r\n currentRevision.id,\r\n {\r\n statusId: cancelledStatus.id,\r\n remarks: `Cancelled: ${reason}`,\r\n }\r\n );\r\n\r\n // Force close all active circulations\r\n if (activeCirculations.length > 0) {\r\n await queryRunner.manager.update(\r\n 'Circulation',\r\n {\r\n correspondenceId: correspondence.id,\r\n status: 'OPEN',\r\n },\r\n {\r\n status: 'FORCE_CLOSED',\r\n closedAt: new Date(),\r\n closedBy: user.user_id,\r\n closeReason: `Correspondence cancelled: ${reason}`,\r\n }\r\n );\r\n }\r\n\r\n await queryRunner.commitTransaction();\r\n\r\n // Re-index cancelled status in Elasticsearch (fire-and-forget)\r\n void this.searchService.indexDocument({\r\n id: correspondence.id,\r\n publicId: correspondence.publicId,\r\n type: 'correspondence',\r\n docNumber: correspondence.correspondenceNumber,\r\n title: currentRevision.subject,\r\n status: 'CANCELLED',\r\n projectId: correspondence.projectId,\r\n createdAt: correspondence.createdAt,\r\n });\r\n\r\n // Notify originator's doc-control user about cancellation (fire-and-forget)\r\n if (correspondence.originatorId) {\r\n void this.userService\r\n .findDocControlIdByOrg(correspondence.originatorId)\r\n .then((targetUserId) => {\r\n if (targetUserId) {\r\n void this.notificationService.send({\r\n userId: targetUserId,\r\n title: 'Correspondence Cancelled',\r\n message: `${correspondence.correspondenceNumber} — ${currentRevision.subject} has been cancelled. Reason: ${reason}`,\r\n type: 'EMAIL',\r\n entityType: 'correspondence',\r\n entityId: correspondence.id,\r\n link: `/correspondences/${correspondence.publicId}`,\r\n });\r\n }\r\n })\r\n .catch((err: Error) =>\r\n this.logger.warn(`Cancel notification failed: ${err.message}`)\r\n );\r\n }\r\n\r\n return {\r\n success: true,\r\n message: warningMessage || 'Correspondence cancelled successfully',\r\n activeCirculationsCount: activeCirculations.length,\r\n };\r\n } catch (error) {\r\n await queryRunner.rollbackTransaction();\r\n this.logger.error(\r\n `Failed to cancel correspondence: ${(error as Error).message}`\r\n );\r\n throw error;\r\n } finally {\r\n await queryRunner.release();\r\n }\r\n }\r\n\r\n async bulkCancel(\r\n publicIds: string[],\r\n reason: string,\r\n user: User\r\n ): Promise<{ succeeded: string[]; failed: string[] }> {\r\n const succeeded: string[] = [];\r\n const failed: string[] = [];\r\n\r\n for (const publicId of publicIds) {\r\n try {\r\n await this.cancel(publicId, reason, user);\r\n succeeded.push(publicId);\r\n } catch {\r\n failed.push(publicId);\r\n }\r\n }\r\n\r\n return { succeeded, failed };\r\n }\r\n\r\n async exportCsv(searchDto: SearchCorrespondenceDto): Promise {\r\n const { data } = await this.findAll(searchDto);\r\n\r\n const header = [\r\n 'Document No.',\r\n 'Rev',\r\n 'Subject',\r\n 'Type',\r\n 'Status',\r\n 'Project',\r\n 'From',\r\n 'Due Date',\r\n 'Created At',\r\n ];\r\n const rows = data.map((rev) => {\r\n const corr = rev.correspondence ?? (rev as unknown as Correspondence);\r\n return [\r\n this.escapeCsv(corr.correspondenceNumber ?? ''),\r\n this.escapeCsv(rev.revisionLabel ?? String(rev.revisionNumber ?? 0)),\r\n this.escapeCsv(rev.subject ?? ''),\r\n this.escapeCsv(corr.type?.typeCode ?? ''),\r\n this.escapeCsv(rev.status?.statusCode ?? ''),\r\n this.escapeCsv(corr.project?.projectCode ?? ''),\r\n this.escapeCsv(corr.originator?.organizationCode ?? ''),\r\n rev.dueDate ? new Date(rev.dueDate).toISOString().split('T')[0] : '',\r\n new Date(rev.createdAt).toISOString().split('T')[0],\r\n ].join(',');\r\n });\r\n\r\n return [header.join(','), ...rows].join('\\n');\r\n }\r\n\r\n private escapeCsv(value: string): string {\r\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\r\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\r\n }\r\n return value;\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/migrationcontrollerspec_e621314ae9ea57aa03badc4fddd55cfb b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/migrationcontrollerspec_e621314ae9ea57aa03badc4fddd55cfb new file mode 100644 index 0000000..767aae8 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/migrationcontrollerspec_e621314ae9ea57aa03badc4fddd55cfb @@ -0,0 +1,47 @@ +0e0c0bc2d8479de6b3790451b006cf97 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const testing_1 = require("@nestjs/testing"); +const migration_controller_1 = require("./migration.controller"); +const migration_service_1 = require("./migration.service"); +describe('MigrationController', () => { + let controller; + let service; + beforeEach(async () => { + const module = await testing_1.Test.createTestingModule({ + controllers: [migration_controller_1.MigrationController], + providers: [ + { + provide: migration_service_1.MigrationService, + useValue: { + importCorrespondence: jest + .fn() + .mockResolvedValue({ message: 'Success' }), + }, + }, + ], + }).compile(); + controller = module.get(migration_controller_1.MigrationController); + service = module.get(migration_service_1.MigrationService); + }); + it('should be defined', () => { + expect(controller).toBeDefined(); + }); + it('should call importCorrespondence on service', async () => { + const dto = { + document_number: 'DOC-001', + subject: 'Legacy Record', + category: 'Correspondence', + source_file_path: '/staging_ai/test.pdf', + migrated_by: 'SYSTEM_IMPORT', + batch_id: 'batch1', + project_id: 1, + }; + const idempotencyKey = 'key123'; + const user = { userId: 5 }; + const result = await controller.importCorrespondence(dto, idempotencyKey, user); + expect(result).toEqual({ message: 'Success' }); + expect(service.importCorrespondence).toHaveBeenCalledWith(dto, idempotencyKey, 5); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcbWlncmF0aW9uXFxtaWdyYXRpb24uY29udHJvbGxlci5zcGVjLnRzIiwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQXNEO0FBQ3RELGlFQUE2RDtBQUM3RCwyREFBdUQ7QUFHdkQsUUFBUSxDQUFDLHFCQUFxQixFQUFFLEdBQUcsRUFBRTtJQUNuQyxJQUFJLFVBQStCLENBQUM7SUFDcEMsSUFBSSxPQUF5QixDQUFDO0lBRTlCLFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNwQixNQUFNLE1BQU0sR0FBa0IsTUFBTSxjQUFJLENBQUMsbUJBQW1CLENBQUM7WUFDM0QsV0FBVyxFQUFFLENBQUMsMENBQW1CLENBQUM7WUFDbEMsU0FBUyxFQUFFO2dCQUNUO29CQUNFLE9BQU8sRUFBRSxvQ0FBZ0I7b0JBQ3pCLFFBQVEsRUFBRTt3QkFDUixvQkFBb0IsRUFBRSxJQUFJOzZCQUN2QixFQUFFLEVBQUU7NkJBQ0osaUJBQWlCLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUM7cUJBQzdDO2lCQUNGO2FBQ0Y7U0FDRixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFYixVQUFVLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBc0IsMENBQW1CLENBQUMsQ0FBQztRQUNsRSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBbUIsb0NBQWdCLENBQUMsQ0FBQztJQUMzRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUU7UUFDM0IsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ25DLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDZDQUE2QyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzNELE1BQU0sR0FBRyxHQUE0QjtZQUNuQyxlQUFlLEVBQUUsU0FBUztZQUMxQixPQUFPLEVBQUUsZUFBZTtZQUN4QixRQUFRLEVBQUUsZ0JBQWdCO1lBQzFCLGdCQUFnQixFQUFFLHNCQUFzQjtZQUN4QyxXQUFXLEVBQUUsZUFBZTtZQUM1QixRQUFRLEVBQUUsUUFBUTtZQUNsQixVQUFVLEVBQUUsQ0FBQztTQUNkLENBQUM7UUFFRixNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUM7UUFDaEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFFM0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsb0JBQW9CLENBQ2xELEdBQUcsRUFDSCxjQUFjLEVBQ2QsSUFBSSxDQUNMLENBQUM7UUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDL0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLG9CQUFvQixDQUN2RCxHQUFHLEVBQ0gsY0FBYyxFQUNkLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxtaWdyYXRpb25cXG1pZ3JhdGlvbi5jb250cm9sbGVyLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVzdCwgVGVzdGluZ01vZHVsZSB9IGZyb20gJ0BuZXN0anMvdGVzdGluZyc7XG5pbXBvcnQgeyBNaWdyYXRpb25Db250cm9sbGVyIH0gZnJvbSAnLi9taWdyYXRpb24uY29udHJvbGxlcic7XG5pbXBvcnQgeyBNaWdyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9taWdyYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBJbXBvcnRDb3JyZXNwb25kZW5jZUR0byB9IGZyb20gJy4vZHRvL2ltcG9ydC1jb3JyZXNwb25kZW5jZS5kdG8nO1xuXG5kZXNjcmliZSgnTWlncmF0aW9uQ29udHJvbGxlcicsICgpID0+IHtcbiAgbGV0IGNvbnRyb2xsZXI6IE1pZ3JhdGlvbkNvbnRyb2xsZXI7XG4gIGxldCBzZXJ2aWNlOiBNaWdyYXRpb25TZXJ2aWNlO1xuXG4gIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG1vZHVsZTogVGVzdGluZ01vZHVsZSA9IGF3YWl0IFRlc3QuY3JlYXRlVGVzdGluZ01vZHVsZSh7XG4gICAgICBjb250cm9sbGVyczogW01pZ3JhdGlvbkNvbnRyb2xsZXJdLFxuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBNaWdyYXRpb25TZXJ2aWNlLFxuICAgICAgICAgIHVzZVZhbHVlOiB7XG4gICAgICAgICAgICBpbXBvcnRDb3JyZXNwb25kZW5jZTogamVzdFxuICAgICAgICAgICAgICAuZm4oKVxuICAgICAgICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWUoeyBtZXNzYWdlOiAnU3VjY2VzcycgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSkuY29tcGlsZSgpO1xuXG4gICAgY29udHJvbGxlciA9IG1vZHVsZS5nZXQ8TWlncmF0aW9uQ29udHJvbGxlcj4oTWlncmF0aW9uQ29udHJvbGxlcik7XG4gICAgc2VydmljZSA9IG1vZHVsZS5nZXQ8TWlncmF0aW9uU2VydmljZT4oTWlncmF0aW9uU2VydmljZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYmUgZGVmaW5lZCcsICgpID0+IHtcbiAgICBleHBlY3QoY29udHJvbGxlcikudG9CZURlZmluZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBjYWxsIGltcG9ydENvcnJlc3BvbmRlbmNlIG9uIHNlcnZpY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZHRvOiBJbXBvcnRDb3JyZXNwb25kZW5jZUR0byA9IHtcbiAgICAgIGRvY3VtZW50X251bWJlcjogJ0RPQy0wMDEnLFxuICAgICAgc3ViamVjdDogJ0xlZ2FjeSBSZWNvcmQnLFxuICAgICAgY2F0ZWdvcnk6ICdDb3JyZXNwb25kZW5jZScsXG4gICAgICBzb3VyY2VfZmlsZV9wYXRoOiAnL3N0YWdpbmdfYWkvdGVzdC5wZGYnLFxuICAgICAgbWlncmF0ZWRfYnk6ICdTWVNURU1fSU1QT1JUJyxcbiAgICAgIGJhdGNoX2lkOiAnYmF0Y2gxJyxcbiAgICAgIHByb2plY3RfaWQ6IDEsXG4gICAgfTtcblxuICAgIGNvbnN0IGlkZW1wb3RlbmN5S2V5ID0gJ2tleTEyMyc7XG4gICAgY29uc3QgdXNlciA9IHsgdXNlcklkOiA1IH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb250cm9sbGVyLmltcG9ydENvcnJlc3BvbmRlbmNlKFxuICAgICAgZHRvLFxuICAgICAgaWRlbXBvdGVuY3lLZXksXG4gICAgICB1c2VyXG4gICAgKTtcbiAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHsgbWVzc2FnZTogJ1N1Y2Nlc3MnIH0pO1xuICAgIGV4cGVjdChzZXJ2aWNlLmltcG9ydENvcnJlc3BvbmRlbmNlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIGR0byxcbiAgICAgIGlkZW1wb3RlbmN5S2V5LFxuICAgICAgNVxuICAgICk7XG4gIH0pO1xufSk7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/migrationcontrollerspec_e621314ae9ea57aa03badc4fddd55cfb.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/migrationcontrollerspec_e621314ae9ea57aa03badc4fddd55cfb.map new file mode 100644 index 0000000..a7763e2 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e6/migrationcontrollerspec_e621314ae9ea57aa03badc4fddd55cfb.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\migration.controller.spec.ts","mappings":";;AAAA,6CAAsD;AACtD,iEAA6D;AAC7D,2DAAuD;AAGvD,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,IAAI,UAA+B,CAAC;IACpC,IAAI,OAAyB,CAAC;IAE9B,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,MAAM,GAAkB,MAAM,cAAI,CAAC,mBAAmB,CAAC;YAC3D,WAAW,EAAE,CAAC,0CAAmB,CAAC;YAClC,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,oCAAgB;oBACzB,QAAQ,EAAE;wBACR,oBAAoB,EAAE,IAAI;6BACvB,EAAE,EAAE;6BACJ,iBAAiB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;qBAC7C;iBACF;aACF;SACF,CAAC,CAAC,OAAO,EAAE,CAAC;QAEb,UAAU,GAAG,MAAM,CAAC,GAAG,CAAsB,0CAAmB,CAAC,CAAC;QAClE,OAAO,GAAG,MAAM,CAAC,GAAG,CAAmB,oCAAgB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,GAAG,GAA4B;YACnC,eAAe,EAAE,SAAS;YAC1B,OAAO,EAAE,eAAe;YACxB,QAAQ,EAAE,gBAAgB;YAC1B,gBAAgB,EAAE,sBAAsB;YACxC,WAAW,EAAE,eAAe;YAC5B,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,CAAC;SACd,CAAC;QAEF,MAAM,cAAc,GAAG,QAAQ,CAAC;QAChC,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAE3B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,oBAAoB,CAClD,GAAG,EACH,cAAc,EACd,IAAI,CACL,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,oBAAoB,CACvD,GAAG,EACH,cAAc,EACd,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\migration.controller.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing';\nimport { MigrationController } from './migration.controller';\nimport { MigrationService } from './migration.service';\nimport { ImportCorrespondenceDto } from './dto/import-correspondence.dto';\n\ndescribe('MigrationController', () => {\n let controller: MigrationController;\n let service: MigrationService;\n\n beforeEach(async () => {\n const module: TestingModule = await Test.createTestingModule({\n controllers: [MigrationController],\n providers: [\n {\n provide: MigrationService,\n useValue: {\n importCorrespondence: jest\n .fn()\n .mockResolvedValue({ message: 'Success' }),\n },\n },\n ],\n }).compile();\n\n controller = module.get(MigrationController);\n service = module.get(MigrationService);\n });\n\n it('should be defined', () => {\n expect(controller).toBeDefined();\n });\n\n it('should call importCorrespondence on service', async () => {\n const dto: ImportCorrespondenceDto = {\n document_number: 'DOC-001',\n subject: 'Legacy Record',\n category: 'Correspondence',\n source_file_path: '/staging_ai/test.pdf',\n migrated_by: 'SYSTEM_IMPORT',\n batch_id: 'batch1',\n project_id: 1,\n };\n\n const idempotencyKey = 'key123';\n const user = { userId: 5 };\n\n const result = await controller.importCorrespondence(\n dto,\n idempotencyKey,\n user\n );\n expect(result).toEqual({ message: 'Success' });\n expect(service.importCorrespondence).toHaveBeenCalledWith(\n dto,\n idempotencyKey,\n 5\n );\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e9/rfatypeentity_e9a71dc19d0a819fbe0ae761ce9a21f2 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e9/rfatypeentity_e9a71dc19d0a819fbe0ae761ce9a21f2 new file mode 100644 index 0000000..0ae90a4 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e9/rfatypeentity_e9a71dc19d0a819fbe0ae761ce9a21f2 @@ -0,0 +1,67 @@ +a89b193d148fe99e60c19f6a0e18634d +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RfaType = void 0; +const typeorm_1 = require("typeorm"); +const contract_entity_1 = require("../../contract/entities/contract.entity"); +let RfaType = class RfaType { + populateVirtualFields() { + this.typeName = this.typeNameEn; + // Map remark to description if needed, or just let description be undefined + // this['description'] = this.remark; + } +}; +exports.RfaType = RfaType; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], RfaType.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'contract_id' }), + __metadata("design:type", Number) +], RfaType.prototype, "contractId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'type_code', length: 20 }), + __metadata("design:type", String) +], RfaType.prototype, "typeCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'type_name_th', length: 100 }), + __metadata("design:type", String) +], RfaType.prototype, "typeNameTh", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'type_name_en', length: 100 }), + __metadata("design:type", String) +], RfaType.prototype, "typeNameEn", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], RfaType.prototype, "remark", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true }), + __metadata("design:type", Boolean) +], RfaType.prototype, "isActive", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => contract_entity_1.Contract), + (0, typeorm_1.JoinColumn)({ name: 'contract_id' }), + __metadata("design:type", typeof (_a = typeof contract_entity_1.Contract !== "undefined" && contract_entity_1.Contract) === "function" ? _a : Object) +], RfaType.prototype, "contract", void 0); +__decorate([ + (0, typeorm_1.AfterLoad)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", void 0) +], RfaType.prototype, "populateVirtualFields", null); +exports.RfaType = RfaType = __decorate([ + (0, typeorm_1.Entity)('rfa_types') +], RfaType); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccmZhXFxlbnRpdGllc1xccmZhLXR5cGUuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FPaUI7QUFDakIsNkVBQW1FO0FBRzVELElBQU0sT0FBTyxHQUFiLE1BQU0sT0FBTztJQStCbEIscUJBQXFCO1FBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNoQyw0RUFBNEU7UUFDNUUscUNBQXFDO0lBQ3ZDLENBQUM7Q0FDRixDQUFBO0FBcENZLDBCQUFPO0FBRWxCO0lBREMsSUFBQSxnQ0FBc0IsR0FBRTs7bUNBQ2I7QUFHWjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQzs7MkNBQ1o7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQzs7eUNBQ3hCO0FBR2xCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7OzJDQUMxQjtBQUdwQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOzsyQ0FDMUI7QUFHcEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7dUNBQ3pCO0FBR2hCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7O3lDQUMxQjtBQUtuQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQywwQkFBUSxDQUFDO0lBQ3pCLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQztrREFDekIsMEJBQVEsb0JBQVIsMEJBQVE7eUNBQUM7QUFNcEI7SUFEQyxJQUFBLG1CQUFTLEdBQUU7Ozs7b0RBS1g7a0JBbkNVLE9BQU87SUFEbkIsSUFBQSxnQkFBTSxFQUFDLFdBQVcsQ0FBQztHQUNQLE9BQU8sQ0FvQ25CIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXHJmYVxcZW50aXRpZXNcXHJmYS10eXBlLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHksXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXG4gIENvbHVtbixcbiAgQWZ0ZXJMb2FkLFxuICBNYW55VG9PbmUsXG4gIEpvaW5Db2x1bW4sXG59IGZyb20gJ3R5cGVvcm0nO1xuaW1wb3J0IHsgQ29udHJhY3QgfSBmcm9tICcuLi8uLi9jb250cmFjdC9lbnRpdGllcy9jb250cmFjdC5lbnRpdHknO1xuXG5ARW50aXR5KCdyZmFfdHlwZXMnKVxuZXhwb3J0IGNsYXNzIFJmYVR5cGUge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIGlkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnY29udHJhY3RfaWQnIH0pXG4gIGNvbnRyYWN0SWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICd0eXBlX2NvZGUnLCBsZW5ndGg6IDIwIH0pXG4gIHR5cGVDb2RlITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAndHlwZV9uYW1lX3RoJywgbGVuZ3RoOiAxMDAgfSlcbiAgdHlwZU5hbWVUaCE6IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ3R5cGVfbmFtZV9lbicsIGxlbmd0aDogMTAwIH0pXG4gIHR5cGVOYW1lRW4hOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgcmVtYXJrPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXNfYWN0aXZlJywgZGVmYXVsdDogdHJ1ZSB9KVxuICBpc0FjdGl2ZSE6IGJvb2xlYW47XG5cbiAgLy8gUmVsYXRpb25zXG4gIEBNYW55VG9PbmUoKCkgPT4gQ29udHJhY3QpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2NvbnRyYWN0X2lkJyB9KVxuICBjb250cmFjdD86IENvbnRyYWN0O1xuXG4gIC8vIFZpcnR1YWwgcHJvcGVydHkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgdHlwZU5hbWUhOiBzdHJpbmc7XG5cbiAgQEFmdGVyTG9hZCgpXG4gIHBvcHVsYXRlVmlydHVhbEZpZWxkcygpIHtcbiAgICB0aGlzLnR5cGVOYW1lID0gdGhpcy50eXBlTmFtZUVuO1xuICAgIC8vIE1hcCByZW1hcmsgdG8gZGVzY3JpcHRpb24gaWYgbmVlZGVkLCBvciBqdXN0IGxldCBkZXNjcmlwdGlvbiBiZSB1bmRlZmluZWRcbiAgICAvLyB0aGlzWydkZXNjcmlwdGlvbiddID0gdGhpcy5yZW1hcms7XG4gIH1cbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e9/rfatypeentity_e9a71dc19d0a819fbe0ae761ce9a21f2.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e9/rfatypeentity_e9a71dc19d0a819fbe0ae761ce9a21f2.map new file mode 100644 index 0000000..a123c33 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/e9/rfatypeentity_e9a71dc19d0a819fbe0ae761ce9a21f2.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-type.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAOiB;AACjB,6EAAmE;AAG5D,IAAM,OAAO,GAAb,MAAM,OAAO;IA+BlB,qBAAqB;QACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;QAChC,4EAA4E;QAC5E,qCAAqC;IACvC,CAAC;CACF,CAAA;AApCY,0BAAO;AAElB;IADC,IAAA,gCAAsB,GAAE;;mCACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;2CACZ;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;yCACxB;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;2CAC1B;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;2CAC1B;AAGpB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;uCACzB;AAGhB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;yCAC1B;AAKnB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,0BAAQ,CAAC;IACzB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;kDACzB,0BAAQ,oBAAR,0BAAQ;yCAAC;AAMpB;IADC,IAAA,mBAAS,GAAE;;;;oDAKX;kBAnCU,OAAO;IADnB,IAAA,gBAAM,EAAC,WAAW,CAAC;GACP,OAAO,CAoCnB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa-type.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n AfterLoad,\n ManyToOne,\n JoinColumn,\n} from 'typeorm';\nimport { Contract } from '../../contract/entities/contract.entity';\n\n@Entity('rfa_types')\nexport class RfaType {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'contract_id' })\n contractId!: number;\n\n @Column({ name: 'type_code', length: 20 })\n typeCode!: string;\n\n @Column({ name: 'type_name_th', length: 100 })\n typeNameTh!: string;\n\n @Column({ name: 'type_name_en', length: 100 })\n typeNameEn!: string;\n\n @Column({ type: 'text', nullable: true })\n remark?: string;\n\n @Column({ name: 'is_active', default: true })\n isActive!: boolean;\n\n // Relations\n @ManyToOne(() => Contract)\n @JoinColumn({ name: 'contract_id' })\n contract?: Contract;\n\n // Virtual property for backward compatibility\n typeName!: string;\n\n @AfterLoad()\n populateVirtualFields() {\n this.typeName = this.typeNameEn;\n // Map remark to description if needed, or just let description be undefined\n // this['description'] = this.remark;\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ea/logindto_ea9943d8075027b5c18f2644b208cae7 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ea/logindto_ea9943d8075027b5c18f2644b208cae7 new file mode 100644 index 0000000..4ee5af8 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ea/logindto_ea9943d8075027b5c18f2644b208cae7 @@ -0,0 +1,34 @@ +b6d56f01c223547179a13c597f403b18 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.LoginDto = void 0; +const class_validator_1 = require("class-validator"); +const swagger_1 = require("@nestjs/swagger"); +class LoginDto { +} +exports.LoginDto = LoginDto; +__decorate([ + (0, swagger_1.ApiProperty)({ + description: 'Username (Email)', + example: 'admin@np-dms.work', + }), + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], LoginDto.prototype, "username", void 0); +__decorate([ + (0, swagger_1.ApiProperty)({ description: 'Password', example: 'password123' }), + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsNotEmpty)(), + __metadata("design:type", String) +], LoginDto.prototype, "password", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxhdXRoXFxkdG9cXGxvZ2luLmR0by50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxxREFBdUQ7QUFDdkQsNkNBQThDO0FBRTlDLE1BQWEsUUFBUTtDQWFwQjtBQWJELDRCQWFDO0FBTkM7SUFOQyxJQUFBLHFCQUFXLEVBQUM7UUFDWCxXQUFXLEVBQUUsa0JBQWtCO1FBQy9CLE9BQU8sRUFBRSxtQkFBbUI7S0FDN0IsQ0FBQztJQUNELElBQUEsMEJBQVEsR0FBRTtJQUNWLElBQUEsNEJBQVUsR0FBRTs7MENBQ0s7QUFLbEI7SUFIQyxJQUFBLHFCQUFXLEVBQUMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQztJQUNoRSxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7OzBDQUNLIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXGNvbW1vblxcYXV0aFxcZHRvXFxsb2dpbi5kdG8udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSXNOb3RFbXB0eSwgSXNTdHJpbmcgfSBmcm9tICdjbGFzcy12YWxpZGF0b3InO1xuaW1wb3J0IHsgQXBpUHJvcGVydHkgfSBmcm9tICdAbmVzdGpzL3N3YWdnZXInO1xuXG5leHBvcnQgY2xhc3MgTG9naW5EdG8ge1xuICBAQXBpUHJvcGVydHkoe1xuICAgIGRlc2NyaXB0aW9uOiAnVXNlcm5hbWUgKEVtYWlsKScsXG4gICAgZXhhbXBsZTogJ2FkbWluQG5wLWRtcy53b3JrJyxcbiAgfSlcbiAgQElzU3RyaW5nKClcbiAgQElzTm90RW1wdHkoKVxuICB1c2VybmFtZSE6IHN0cmluZztcblxuICBAQXBpUHJvcGVydHkoeyBkZXNjcmlwdGlvbjogJ1Bhc3N3b3JkJywgZXhhbXBsZTogJ3Bhc3N3b3JkMTIzJyB9KVxuICBASXNTdHJpbmcoKVxuICBASXNOb3RFbXB0eSgpXG4gIHBhc3N3b3JkITogc3RyaW5nO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ea/logindto_ea9943d8075027b5c18f2644b208cae7.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ea/logindto_ea9943d8075027b5c18f2644b208cae7.map new file mode 100644 index 0000000..fe65196 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ea/logindto_ea9943d8075027b5c18f2644b208cae7.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\auth\\dto\\login.dto.ts","mappings":";;;;;;;;;;;;AAAA,qDAAuD;AACvD,6CAA8C;AAE9C,MAAa,QAAQ;CAapB;AAbD,4BAaC;AANC;IANC,IAAA,qBAAW,EAAC;QACX,WAAW,EAAE,kBAAkB;QAC/B,OAAO,EAAE,mBAAmB;KAC7B,CAAC;IACD,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;0CACK;AAKlB;IAHC,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;IAChE,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;0CACK","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\auth\\dto\\login.dto.ts"],"sourcesContent":["import { IsNotEmpty, IsString } from 'class-validator';\nimport { ApiProperty } from '@nestjs/swagger';\n\nexport class LoginDto {\n @ApiProperty({\n description: 'Username (Email)',\n example: 'admin@np-dms.work',\n })\n @IsString()\n @IsNotEmpty()\n username!: string;\n\n @ApiProperty({ description: 'Password', example: 'password123' })\n @IsString()\n @IsNotEmpty()\n password!: string;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/eb/submitcorrespondencedto_ebb04387677382f14e1f652c45891954 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/eb/submitcorrespondencedto_ebb04387677382f14e1f652c45891954 new file mode 100644 index 0000000..c172062 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/eb/submitcorrespondencedto_ebb04387677382f14e1f652c45891954 @@ -0,0 +1,32 @@ +29005155072f3edefc0149cd3c8a6b82 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SubmitCorrespondenceDto = void 0; +const class_validator_1 = require("class-validator"); +const swagger_1 = require("@nestjs/swagger"); +/** + * DTO for submitting correspondence to workflow + * Uses Unified Workflow Engine - no templateId required + */ +class SubmitCorrespondenceDto { +} +exports.SubmitCorrespondenceDto = SubmitCorrespondenceDto; +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ + description: 'Optional note for the submission', + example: 'Submitting for review', + }), + (0, class_validator_1.IsString)(), + (0, class_validator_1.IsOptional)(), + __metadata("design:type", String) +], SubmitCorrespondenceDto.prototype, "note", void 0); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcY29ycmVzcG9uZGVuY2VcXGR0b1xcc3VibWl0LWNvcnJlc3BvbmRlbmNlLmR0by50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxxREFBdUQ7QUFDdkQsNkNBQXNEO0FBRXREOzs7R0FHRztBQUNILE1BQWEsdUJBQXVCO0NBUW5DO0FBUkQsMERBUUM7QUFEQztJQU5DLElBQUEsNkJBQW1CLEVBQUM7UUFDbkIsV0FBVyxFQUFFLGtDQUFrQztRQUMvQyxPQUFPLEVBQUUsdUJBQXVCO0tBQ2pDLENBQUM7SUFDRCxJQUFBLDBCQUFRLEdBQUU7SUFDVixJQUFBLDRCQUFVLEdBQUU7O3FEQUNDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXGNvcnJlc3BvbmRlbmNlXFxkdG9cXHN1Ym1pdC1jb3JyZXNwb25kZW5jZS5kdG8udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSXNPcHRpb25hbCwgSXNTdHJpbmcgfSBmcm9tICdjbGFzcy12YWxpZGF0b3InO1xuaW1wb3J0IHsgQXBpUHJvcGVydHlPcHRpb25hbCB9IGZyb20gJ0BuZXN0anMvc3dhZ2dlcic7XG5cbi8qKlxuICogRFRPIGZvciBzdWJtaXR0aW5nIGNvcnJlc3BvbmRlbmNlIHRvIHdvcmtmbG93XG4gKiBVc2VzIFVuaWZpZWQgV29ya2Zsb3cgRW5naW5lIC0gbm8gdGVtcGxhdGVJZCByZXF1aXJlZFxuICovXG5leHBvcnQgY2xhc3MgU3VibWl0Q29ycmVzcG9uZGVuY2VEdG8ge1xuICBAQXBpUHJvcGVydHlPcHRpb25hbCh7XG4gICAgZGVzY3JpcHRpb246ICdPcHRpb25hbCBub3RlIGZvciB0aGUgc3VibWlzc2lvbicsXG4gICAgZXhhbXBsZTogJ1N1Ym1pdHRpbmcgZm9yIHJldmlldycsXG4gIH0pXG4gIEBJc1N0cmluZygpXG4gIEBJc09wdGlvbmFsKClcbiAgbm90ZT86IHN0cmluZztcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/eb/submitcorrespondencedto_ebb04387677382f14e1f652c45891954.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/eb/submitcorrespondencedto_ebb04387677382f14e1f652c45891954.map new file mode 100644 index 0000000..dc11f62 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/eb/submitcorrespondencedto_ebb04387677382f14e1f652c45891954.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\submit-correspondence.dto.ts","mappings":";;;;;;;;;;;;AAAA,qDAAuD;AACvD,6CAAsD;AAEtD;;;GAGG;AACH,MAAa,uBAAuB;CAQnC;AARD,0DAQC;AADC;IANC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,kCAAkC;QAC/C,OAAO,EAAE,uBAAuB;KACjC,CAAC;IACD,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;qDACC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\dto\\submit-correspondence.dto.ts"],"sourcesContent":["import { IsOptional, IsString } from 'class-validator';\nimport { ApiPropertyOptional } from '@nestjs/swagger';\n\n/**\n * DTO for submitting correspondence to workflow\n * Uses Unified Workflow Engine - no templateId required\n */\nexport class SubmitCorrespondenceDto {\n @ApiPropertyOptional({\n description: 'Optional note for the submission',\n example: 'Submitting for review',\n })\n @IsString()\n @IsOptional()\n note?: string;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ec/v1ToV6_ec131fd3e0527fc11743e8d943583a0f b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ec/v1ToV6_ec131fd3e0527fc11743e8d943583a0f new file mode 100644 index 0000000..a084cb0 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ec/v1ToV6_ec131fd3e0527fc11743e8d943583a0f @@ -0,0 +1,15 @@ +e92e16bf9beb6ceb0f0b149e96e3c81f +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const parse_js_1 = require("./parse.js"); +const stringify_js_1 = require("./stringify.js"); +function v1ToV6(uuid) { + const v1Bytes = typeof uuid === 'string' ? (0, parse_js_1.default)(uuid) : uuid; + const v6Bytes = _v1ToV6(v1Bytes); + return typeof uuid === 'string' ? (0, stringify_js_1.unsafeStringify)(v6Bytes) : v6Bytes; +} +exports.default = v1ToV6; +function _v1ToV6(v1Bytes) { + return Uint8Array.of(((v1Bytes[6] & 0x0f) << 4) | ((v1Bytes[7] >> 4) & 0x0f), ((v1Bytes[7] & 0x0f) << 4) | ((v1Bytes[4] & 0xf0) >> 4), ((v1Bytes[4] & 0x0f) << 4) | ((v1Bytes[5] & 0xf0) >> 4), ((v1Bytes[5] & 0x0f) << 4) | ((v1Bytes[0] & 0xf0) >> 4), ((v1Bytes[0] & 0x0f) << 4) | ((v1Bytes[1] & 0xf0) >> 4), ((v1Bytes[1] & 0x0f) << 4) | ((v1Bytes[2] & 0xf0) >> 4), 0x60 | (v1Bytes[2] & 0x0f), v1Bytes[3], v1Bytes[8], v1Bytes[9], v1Bytes[10], v1Bytes[11], v1Bytes[12], v1Bytes[13], v1Bytes[14], v1Bytes[15]); +} +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdjFUb1Y2LmpzIiwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUNiLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUN6QyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUNqRCxTQUFTLE1BQU0sQ0FBQyxJQUFJO0lBQ2hCLE1BQU0sT0FBTyxHQUFHLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDaEYsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUM3RixDQUFDO0FBQ0QsT0FBTyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7QUFDekIsU0FBUyxPQUFPLENBQUMsT0FBTztJQUNwQixPQUFPLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDN2YsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcbm9kZV9tb2R1bGVzXFwucG5wbVxcdXVpZEAxMS4xLjBcXG5vZGVfbW9kdWxlc1xcdXVpZFxcZGlzdFxcY2pzXFx2MVRvVjYuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBwYXJzZV9qc18xID0gcmVxdWlyZShcIi4vcGFyc2UuanNcIik7XG5jb25zdCBzdHJpbmdpZnlfanNfMSA9IHJlcXVpcmUoXCIuL3N0cmluZ2lmeS5qc1wiKTtcbmZ1bmN0aW9uIHYxVG9WNih1dWlkKSB7XG4gICAgY29uc3QgdjFCeXRlcyA9IHR5cGVvZiB1dWlkID09PSAnc3RyaW5nJyA/ICgwLCBwYXJzZV9qc18xLmRlZmF1bHQpKHV1aWQpIDogdXVpZDtcbiAgICBjb25zdCB2NkJ5dGVzID0gX3YxVG9WNih2MUJ5dGVzKTtcbiAgICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnID8gKDAsIHN0cmluZ2lmeV9qc18xLnVuc2FmZVN0cmluZ2lmeSkodjZCeXRlcykgOiB2NkJ5dGVzO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gdjFUb1Y2O1xuZnVuY3Rpb24gX3YxVG9WNih2MUJ5dGVzKSB7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkub2YoKCh2MUJ5dGVzWzZdICYgMHgwZikgPDwgNCkgfCAoKHYxQnl0ZXNbN10gPj4gNCkgJiAweDBmKSwgKCh2MUJ5dGVzWzddICYgMHgwZikgPDwgNCkgfCAoKHYxQnl0ZXNbNF0gJiAweGYwKSA+PiA0KSwgKCh2MUJ5dGVzWzRdICYgMHgwZikgPDwgNCkgfCAoKHYxQnl0ZXNbNV0gJiAweGYwKSA+PiA0KSwgKCh2MUJ5dGVzWzVdICYgMHgwZikgPDwgNCkgfCAoKHYxQnl0ZXNbMF0gJiAweGYwKSA+PiA0KSwgKCh2MUJ5dGVzWzBdICYgMHgwZikgPDwgNCkgfCAoKHYxQnl0ZXNbMV0gJiAweGYwKSA+PiA0KSwgKCh2MUJ5dGVzWzFdICYgMHgwZikgPDwgNCkgfCAoKHYxQnl0ZXNbMl0gJiAweGYwKSA+PiA0KSwgMHg2MCB8ICh2MUJ5dGVzWzJdICYgMHgwZiksIHYxQnl0ZXNbM10sIHYxQnl0ZXNbOF0sIHYxQnl0ZXNbOV0sIHYxQnl0ZXNbMTBdLCB2MUJ5dGVzWzExXSwgdjFCeXRlc1sxMl0sIHYxQnl0ZXNbMTNdLCB2MUJ5dGVzWzE0XSwgdjFCeXRlc1sxNV0pO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ec/v1ToV6_ec131fd3e0527fc11743e8d943583a0f.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ec/v1ToV6_ec131fd3e0527fc11743e8d943583a0f.map new file mode 100644 index 0000000..7e97d0c --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ec/v1ToV6_ec131fd3e0527fc11743e8d943583a0f.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v1ToV6.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;AACzC,MAAM,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AACjD,SAAS,MAAM,CAAC,IAAI;IAChB,MAAM,OAAO,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC7F,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;AACzB,SAAS,OAAO,CAAC,OAAO;IACpB,OAAO,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7f,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v1ToV6.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst parse_js_1 = require(\"./parse.js\");\nconst stringify_js_1 = require(\"./stringify.js\");\nfunction v1ToV6(uuid) {\n const v1Bytes = typeof uuid === 'string' ? (0, parse_js_1.default)(uuid) : uuid;\n const v6Bytes = _v1ToV6(v1Bytes);\n return typeof uuid === 'string' ? (0, stringify_js_1.unsafeStringify)(v6Bytes) : v6Bytes;\n}\nexports.default = v1ToV6;\nfunction _v1ToV6(v1Bytes) {\n return Uint8Array.of(((v1Bytes[6] & 0x0f) << 4) | ((v1Bytes[7] >> 4) & 0x0f), ((v1Bytes[7] & 0x0f) << 4) | ((v1Bytes[4] & 0xf0) >> 4), ((v1Bytes[4] & 0x0f) << 4) | ((v1Bytes[5] & 0xf0) >> 4), ((v1Bytes[5] & 0x0f) << 4) | ((v1Bytes[0] & 0xf0) >> 4), ((v1Bytes[0] & 0x0f) << 4) | ((v1Bytes[1] & 0xf0) >> 4), ((v1Bytes[1] & 0x0f) << 4) | ((v1Bytes[2] & 0xf0) >> 4), 0x60 | (v1Bytes[2] & 0x0f), v1Bytes[3], v1Bytes[8], v1Bytes[9], v1Bytes[10], v1Bytes[11], v1Bytes[12], v1Bytes[13], v1Bytes[14], v1Bytes[15]);\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ee/attachmententity_ee6169e7532be32869b3706b38c31ae6 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ee/attachmententity_ee6169e7532be32869b3706b38c31ae6 new file mode 100644 index 0000000..4e0778b --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ee/attachmententity_ee6169e7532be32869b3706b38c31ae6 @@ -0,0 +1,83 @@ +b3e8d734de8ac3b4c98f29fc8f434bc9 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Attachment = void 0; +const typeorm_1 = require("typeorm"); +const user_entity_1 = require("../../../modules/user/entities/user.entity"); +const uuid_base_entity_1 = require("../../entities/uuid-base.entity"); +const class_transformer_1 = require("class-transformer"); +let Attachment = class Attachment extends uuid_base_entity_1.UuidBaseEntity { +}; +exports.Attachment = Attachment; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], Attachment.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'original_filename', length: 255 }), + __metadata("design:type", String) +], Attachment.prototype, "originalFilename", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'stored_filename', length: 255 }), + __metadata("design:type", String) +], Attachment.prototype, "storedFilename", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'file_path', length: 500 }), + __metadata("design:type", String) +], Attachment.prototype, "filePath", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'mime_type', length: 100 }), + __metadata("design:type", String) +], Attachment.prototype, "mimeType", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'file_size' }), + __metadata("design:type", Number) +], Attachment.prototype, "fileSize", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_temporary', default: true }), + __metadata("design:type", Boolean) +], Attachment.prototype, "isTemporary", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'temp_id', length: 100, nullable: true }), + __metadata("design:type", String) +], Attachment.prototype, "tempId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'expires_at', type: 'datetime', nullable: true }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], Attachment.prototype, "expiresAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ length: 64, nullable: true }), + __metadata("design:type", String) +], Attachment.prototype, "checksum", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'reference_date', type: 'date', nullable: true }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], Attachment.prototype, "referenceDate", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'uploaded_by_user_id' }), + __metadata("design:type", Number) +], Attachment.prototype, "uploadedByUserId", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], Attachment.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'uploaded_by_user_id' }), + __metadata("design:type", typeof (_d = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _d : Object) +], Attachment.prototype, "uploadedBy", void 0); +exports.Attachment = Attachment = __decorate([ + (0, typeorm_1.Entity)('attachments') +], Attachment); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxmaWxlLXN0b3JhZ2VcXGVudGl0aWVzXFxhdHRhY2htZW50LmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBT2lCO0FBQ2pCLDRFQUFrRTtBQUNsRSxzRUFBaUU7QUFDakUseURBQTRDO0FBR3JDLElBQU0sVUFBVSxHQUFoQixNQUFNLFVBQVcsU0FBUSxpQ0FBYztDQTZDN0MsQ0FBQTtBQTdDWSxnQ0FBVTtBQUdyQjtJQUZDLElBQUEsZ0NBQXNCLEdBQUU7SUFDeEIsSUFBQSwyQkFBTyxHQUFFOztzQ0FDRTtBQUdaO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7b0RBQ3pCO0FBRzFCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7a0RBQ3pCO0FBR3hCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7OzRDQUN6QjtBQUdsQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOzs0Q0FDekI7QUFHbEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7OzRDQUNaO0FBR2xCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7OytDQUMxQjtBQUd0QjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7OzBDQUN6QztBQUdoQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7a0RBQ3JELElBQUksb0JBQUosSUFBSTs2Q0FBQztBQUdqQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzs0Q0FDckI7QUFHbEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7a0RBQ2pELElBQUksb0JBQUosSUFBSTtpREFBQztBQUdyQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxDQUFDOztvREFDZDtBQUcxQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTs2Q0FBQztBQUtqQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBSSxDQUFDO0lBQ3JCLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxDQUFDO2tEQUMvQixrQkFBSSxvQkFBSixrQkFBSTs4Q0FBQztxQkE1Q1AsVUFBVTtJQUR0QixJQUFBLGdCQUFNLEVBQUMsYUFBYSxDQUFDO0dBQ1QsVUFBVSxDQTZDdEIiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcY29tbW9uXFxmaWxlLXN0b3JhZ2VcXGVudGl0aWVzXFxhdHRhY2htZW50LmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHksXG4gIENvbHVtbixcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbiAgQ3JlYXRlRGF0ZUNvbHVtbixcbiAgTWFueVRvT25lLFxuICBKb2luQ29sdW1uLFxufSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi8uLi8uLi9tb2R1bGVzL3VzZXIvZW50aXRpZXMvdXNlci5lbnRpdHknO1xuaW1wb3J0IHsgVXVpZEJhc2VFbnRpdHkgfSBmcm9tICcuLi8uLi9lbnRpdGllcy91dWlkLWJhc2UuZW50aXR5JztcbmltcG9ydCB7IEV4Y2x1ZGUgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XG5cbkBFbnRpdHkoJ2F0dGFjaG1lbnRzJylcbmV4cG9ydCBjbGFzcyBBdHRhY2htZW50IGV4dGVuZHMgVXVpZEJhc2VFbnRpdHkge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIEBFeGNsdWRlKClcbiAgaWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdvcmlnaW5hbF9maWxlbmFtZScsIGxlbmd0aDogMjU1IH0pXG4gIG9yaWdpbmFsRmlsZW5hbWUhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdzdG9yZWRfZmlsZW5hbWUnLCBsZW5ndGg6IDI1NSB9KVxuICBzdG9yZWRGaWxlbmFtZSE6IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ2ZpbGVfcGF0aCcsIGxlbmd0aDogNTAwIH0pXG4gIGZpbGVQYXRoITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnbWltZV90eXBlJywgbGVuZ3RoOiAxMDAgfSlcbiAgbWltZVR5cGUhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdmaWxlX3NpemUnIH0pXG4gIGZpbGVTaXplITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXNfdGVtcG9yYXJ5JywgZGVmYXVsdDogdHJ1ZSB9KVxuICBpc1RlbXBvcmFyeSE6IGJvb2xlYW47XG5cbiAgQENvbHVtbih7IG5hbWU6ICd0ZW1wX2lkJywgbGVuZ3RoOiAxMDAsIG51bGxhYmxlOiB0cnVlIH0pXG4gIHRlbXBJZD86IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ2V4cGlyZXNfYXQnLCB0eXBlOiAnZGF0ZXRpbWUnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBleHBpcmVzQXQ/OiBEYXRlO1xuXG4gIEBDb2x1bW4oeyBsZW5ndGg6IDY0LCBudWxsYWJsZTogdHJ1ZSB9KVxuICBjaGVja3N1bT86IHN0cmluZztcblxuICBAQ29sdW1uKHsgbmFtZTogJ3JlZmVyZW5jZV9kYXRlJywgdHlwZTogJ2RhdGUnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICByZWZlcmVuY2VEYXRlPzogRGF0ZTtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3VwbG9hZGVkX2J5X3VzZXJfaWQnIH0pXG4gIHVwbG9hZGVkQnlVc2VySWQhOiBudW1iZXI7XG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICAvLyBSZWxhdGlvbiDguIHguLHguJogVXNlciAo4LiE4LiZ4Lit4Lix4Lib4LmC4Lir4Lil4LiUKVxuICBATWFueVRvT25lKCgpID0+IFVzZXIpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3VwbG9hZGVkX2J5X3VzZXJfaWQnIH0pXG4gIHVwbG9hZGVkQnk/OiBVc2VyO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ee/attachmententity_ee6169e7532be32869b3706b38c31ae6.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ee/attachmententity_ee6169e7532be32869b3706b38c31ae6.map new file mode 100644 index 0000000..d471340 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ee/attachmententity_ee6169e7532be32869b3706b38c31ae6.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\common\\file-storage\\entities\\attachment.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAOiB;AACjB,4EAAkE;AAClE,sEAAiE;AACjE,yDAA4C;AAGrC,IAAM,UAAU,GAAhB,MAAM,UAAW,SAAQ,iCAAc;CA6C7C,CAAA;AA7CY,gCAAU;AAGrB;IAFC,IAAA,gCAAsB,GAAE;IACxB,IAAA,2BAAO,GAAE;;sCACE;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;oDACzB;AAG1B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;kDACzB;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;4CACzB;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;4CACzB;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;;4CACZ;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;+CAC1B;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;0CACzC;AAGhB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACrD,IAAI,oBAAJ,IAAI;6CAAC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4CACrB;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACjD,IAAI,oBAAJ,IAAI;iDAAC;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;;oDACd;AAG1B;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;6CAAC;AAKjB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,CAAC;IACrB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;kDAC/B,kBAAI,oBAAJ,kBAAI;8CAAC;qBA5CP,UAAU;IADtB,IAAA,gBAAM,EAAC,aAAa,CAAC;GACT,UAAU,CA6CtB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\common\\file-storage\\entities\\attachment.entity.ts"],"sourcesContent":["import {\n Entity,\n Column,\n PrimaryGeneratedColumn,\n CreateDateColumn,\n ManyToOne,\n JoinColumn,\n} from 'typeorm';\nimport { User } from '../../../modules/user/entities/user.entity';\nimport { UuidBaseEntity } from '../../entities/uuid-base.entity';\nimport { Exclude } from 'class-transformer';\n\n@Entity('attachments')\nexport class Attachment extends UuidBaseEntity {\n @PrimaryGeneratedColumn()\n @Exclude()\n id!: number;\n\n @Column({ name: 'original_filename', length: 255 })\n originalFilename!: string;\n\n @Column({ name: 'stored_filename', length: 255 })\n storedFilename!: string;\n\n @Column({ name: 'file_path', length: 500 })\n filePath!: string;\n\n @Column({ name: 'mime_type', length: 100 })\n mimeType!: string;\n\n @Column({ name: 'file_size' })\n fileSize!: number;\n\n @Column({ name: 'is_temporary', default: true })\n isTemporary!: boolean;\n\n @Column({ name: 'temp_id', length: 100, nullable: true })\n tempId?: string;\n\n @Column({ name: 'expires_at', type: 'datetime', nullable: true })\n expiresAt?: Date;\n\n @Column({ length: 64, nullable: true })\n checksum?: string;\n\n @Column({ name: 'reference_date', type: 'date', nullable: true })\n referenceDate?: Date;\n\n @Column({ name: 'uploaded_by_user_id' })\n uploadedByUserId!: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n // Relation กับ User (คนอัปโหลด)\n @ManyToOne(() => User)\n @JoinColumn({ name: 'uploaded_by_user_id' })\n uploadedBy?: User;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ee/workflowinstanceentity_eeff4ca20af4844957e9c398a4e1a62f b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ee/workflowinstanceentity_eeff4ca20af4844957e9c398a4e1a62f new file mode 100644 index 0000000..b062429 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ee/workflowinstanceentity_eeff4ca20af4844957e9c398a4e1a62f @@ -0,0 +1,95 @@ +20ec77fc0f60950bbd1662e0b41ad4db +"use strict"; +// File: src/modules/workflow-engine/entities/workflow-instance.entity.ts +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WorkflowInstance = exports.WorkflowStatus = void 0; +const typeorm_1 = require("typeorm"); +const workflow_definition_entity_1 = require("./workflow-definition.entity"); +var WorkflowStatus; +(function (WorkflowStatus) { + WorkflowStatus["ACTIVE"] = "ACTIVE"; + WorkflowStatus["COMPLETED"] = "COMPLETED"; + WorkflowStatus["CANCELLED"] = "CANCELLED"; + WorkflowStatus["TERMINATED"] = "TERMINATED"; +})(WorkflowStatus || (exports.WorkflowStatus = WorkflowStatus = {})); +/** + * เก็บสถานะการเดินเรื่องของเอกสารแต่ละใบ (Runtime State) + */ +let WorkflowInstance = class WorkflowInstance { +}; +exports.WorkflowInstance = WorkflowInstance; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)('uuid'), + __metadata("design:type", String) +], WorkflowInstance.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => workflow_definition_entity_1.WorkflowDefinition), + (0, typeorm_1.JoinColumn)({ name: 'definition_id' }), + __metadata("design:type", typeof (_a = typeof workflow_definition_entity_1.WorkflowDefinition !== "undefined" && workflow_definition_entity_1.WorkflowDefinition) === "function" ? _a : Object) +], WorkflowInstance.prototype, "definition", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'definition_id' }), + __metadata("design:type", String) +], WorkflowInstance.prototype, "definitionId", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'entity_type', + length: 50, + comment: 'ประเภทเอกสาร เช่น rfa, correspondence', + }), + __metadata("design:type", String) +], WorkflowInstance.prototype, "entityType", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'entity_id', + length: 50, + comment: 'ID ของเอกสาร (String/UUID)', + }), + __metadata("design:type", String) +], WorkflowInstance.prototype, "entityId", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'current_state', + length: 50, + comment: 'ชื่อ State ปัจจุบัน เช่น DRAFT, IN_REVIEW', + }), + __metadata("design:type", String) +], WorkflowInstance.prototype, "currentState", void 0); +__decorate([ + (0, typeorm_1.Column)({ + type: 'enum', + enum: WorkflowStatus, + default: WorkflowStatus.ACTIVE, + comment: 'สถานะภาพรวมของ Instance', + }), + __metadata("design:type", String) +], WorkflowInstance.prototype, "status", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'json', nullable: true, comment: 'Runtime Context Data' }), + __metadata("design:type", typeof (_b = typeof Record !== "undefined" && Record) === "function" ? _b : Object) +], WorkflowInstance.prototype, "context", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], WorkflowInstance.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_d = typeof Date !== "undefined" && Date) === "function" ? _d : Object) +], WorkflowInstance.prototype, "updatedAt", void 0); +exports.WorkflowInstance = WorkflowInstance = __decorate([ + (0, typeorm_1.Entity)('workflow_instances'), + (0, typeorm_1.Index)(['entityType', 'entityId']) // เพื่อค้นหาว่าเอกสารนี้ (เช่น RFA-001) อยู่ขั้นตอนไหน + , + (0, typeorm_1.Index)(['currentState']) // เพื่อ Dashboard: "มีงานค้างที่ขั้นตอนไหนบ้าง" +], WorkflowInstance); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcd29ya2Zsb3ctZW5naW5lXFxlbnRpdGllc1xcd29ya2Zsb3ctaW5zdGFuY2UuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7QUFBQSx5RUFBeUU7Ozs7Ozs7Ozs7Ozs7QUFFekUscUNBU2lCO0FBQ2pCLDZFQUFrRTtBQUVsRSxJQUFZLGNBS1g7QUFMRCxXQUFZLGNBQWM7SUFDeEIsbUNBQWlCLENBQUE7SUFDakIseUNBQXVCLENBQUE7SUFDdkIseUNBQXVCLENBQUE7SUFDdkIsMkNBQXlCLENBQUE7QUFDM0IsQ0FBQyxFQUxXLGNBQWMsOEJBQWQsY0FBYyxRQUt6QjtBQUVEOztHQUVHO0FBSUksSUFBTSxnQkFBZ0IsR0FBdEIsTUFBTSxnQkFBZ0I7Q0FvRDVCLENBQUE7QUFwRFksNENBQWdCO0FBRTNCO0lBREMsSUFBQSxnQ0FBc0IsRUFBQyxNQUFNLENBQUM7OzRDQUNuQjtBQUtaO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLCtDQUFrQixDQUFDO0lBQ25DLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQztrREFDekIsK0NBQWtCLG9CQUFsQiwrQ0FBa0I7b0RBQUM7QUFHaEM7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLENBQUM7O3NEQUNaO0FBUXRCO0lBTEMsSUFBQSxnQkFBTSxFQUFDO1FBQ04sSUFBSSxFQUFFLGFBQWE7UUFDbkIsTUFBTSxFQUFFLEVBQUU7UUFDVixPQUFPLEVBQUUsdUNBQXVDO0tBQ2pELENBQUM7O29EQUNrQjtBQU9wQjtJQUxDLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSxXQUFXO1FBQ2pCLE1BQU0sRUFBRSxFQUFFO1FBQ1YsT0FBTyxFQUFFLDRCQUE0QjtLQUN0QyxDQUFDOztrREFDZ0I7QUFPbEI7SUFMQyxJQUFBLGdCQUFNLEVBQUM7UUFDTixJQUFJLEVBQUUsZUFBZTtRQUNyQixNQUFNLEVBQUUsRUFBRTtRQUNWLE9BQU8sRUFBRSwyQ0FBMkM7S0FDckQsQ0FBQzs7c0RBQ29CO0FBUXRCO0lBTkMsSUFBQSxnQkFBTSxFQUFDO1FBQ04sSUFBSSxFQUFFLE1BQU07UUFDWixJQUFJLEVBQUUsY0FBYztRQUNwQixPQUFPLEVBQUUsY0FBYyxDQUFDLE1BQU07UUFDOUIsT0FBTyxFQUFFLHlCQUF5QjtLQUNuQyxDQUFDOztnREFDc0I7QUFLeEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLENBQUM7a0RBQ2hFLE1BQU0sb0JBQU4sTUFBTTtpREFBa0I7QUFHbEM7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7bURBQUM7QUFHakI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7bURBQUM7MkJBbkROLGdCQUFnQjtJQUg1QixJQUFBLGdCQUFNLEVBQUMsb0JBQW9CLENBQUM7SUFDNUIsSUFBQSxlQUFLLEVBQUMsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyx1REFBdUQ7O0lBQ3pGLElBQUEsZUFBSyxFQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxnREFBZ0Q7R0FDNUQsZ0JBQWdCLENBb0Q1QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFx3b3JrZmxvdy1lbmdpbmVcXGVudGl0aWVzXFx3b3JrZmxvdy1pbnN0YW5jZS5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRmlsZTogc3JjL21vZHVsZXMvd29ya2Zsb3ctZW5naW5lL2VudGl0aWVzL3dvcmtmbG93LWluc3RhbmNlLmVudGl0eS50c1xuXG5pbXBvcnQge1xuICBDb2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIEVudGl0eSxcbiAgSW5kZXgsXG4gIEpvaW5Db2x1bW4sXG4gIE1hbnlUb09uZSxcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbiAgVXBkYXRlRGF0ZUNvbHVtbixcbn0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBXb3JrZmxvd0RlZmluaXRpb24gfSBmcm9tICcuL3dvcmtmbG93LWRlZmluaXRpb24uZW50aXR5JztcblxuZXhwb3J0IGVudW0gV29ya2Zsb3dTdGF0dXMge1xuICBBQ1RJVkUgPSAnQUNUSVZFJywgLy8g4LiB4Liz4Lil4Lix4LiH4LiU4Liz4LmA4LiZ4Li04LiZ4LiB4Liy4LijXG4gIENPTVBMRVRFRCA9ICdDT01QTEVURUQnLCAvLyDguIjguJrguIHguKPguLDguJrguKfguJnguIHguLLguKMgKOC4luC4tuC4hyBUZXJtaW5hbCBTdGF0ZSlcbiAgQ0FOQ0VMTEVEID0gJ0NBTkNFTExFRCcsIC8vIOC4luC4ueC4geC4ouC4geC5gOC4peC4tOC4geC4geC4peC4suC4h+C4hOC4seC4mVxuICBURVJNSU5BVEVEID0gJ1RFUk1JTkFURUQnLCAvLyDguJbguLnguIHguJrguLHguIfguITguLHguJrguIjguJrguYLguJTguKLguKPguLDguJrguJog4Lir4Lij4Li34LitIEVycm9yXG59XG5cbi8qKlxuICog4LmA4LiB4LmH4Lia4Liq4LiW4Liy4LiZ4Liw4LiB4Liy4Lij4LmA4LiU4Li04LiZ4LmA4Lij4Li34LmI4Lit4LiH4LiC4Lit4LiH4LmA4Lit4LiB4Liq4Liy4Lij4LmB4LiV4LmI4Lil4Liw4LmD4LiaIChSdW50aW1lIFN0YXRlKVxuICovXG5ARW50aXR5KCd3b3JrZmxvd19pbnN0YW5jZXMnKVxuQEluZGV4KFsnZW50aXR5VHlwZScsICdlbnRpdHlJZCddKSAvLyDguYDguJ7guLfguYjguK3guITguYnguJnguKvguLLguKfguYjguLLguYDguK3guIHguKrguLLguKPguJnguLXguYkgKOC5gOC4iuC5iOC4mSBSRkEtMDAxKSDguK3guKLguLnguYjguILguLHguYnguJnguJXguK3guJnguYTguKvguJlcbkBJbmRleChbJ2N1cnJlbnRTdGF0ZSddKSAvLyDguYDguJ7guLfguYjguK0gRGFzaGJvYXJkOiBcIuC4oeC4teC4h+C4suC4meC4hOC5ieC4suC4h+C4l+C4teC5iOC4guC4seC5ieC4meC4leC4reC4meC5hOC4q+C4meC4muC5ieC4suC4h1wiXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dJbnN0YW5jZSB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKCd1dWlkJylcbiAgaWQhOiBzdHJpbmc7XG5cbiAgLy8g4Lic4Li54LiB4LiB4Lix4LiaIERlZmluaXRpb24g4LmA4Lie4Li34LmI4Lit4Lij4Li54LmJ4Lin4LmI4Liy4LmD4LiK4LmJ4LiB4LiO4LiK4Li44LiU4LmE4Lir4LiZIChWZXJzaW9uIOC5hOC4q+C4mSlcbiAgQE1hbnlUb09uZSgoKSA9PiBXb3JrZmxvd0RlZmluaXRpb24pXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2RlZmluaXRpb25faWQnIH0pXG4gIGRlZmluaXRpb24hOiBXb3JrZmxvd0RlZmluaXRpb247XG5cbiAgQENvbHVtbih7IG5hbWU6ICdkZWZpbml0aW9uX2lkJyB9KVxuICBkZWZpbml0aW9uSWQhOiBzdHJpbmc7XG5cbiAgLy8gUG9seW1vcnBoaWMgUmVsYXRpb246IOC5gOC4iuC4t+C5iOC4reC4oeC4geC4seC4muC5gOC4reC4geC4quC4suC4o+C5hOC4lOC5ieC4q+C4peC4suC4ouC4m+C4o+C4sOC5gOC4oOC4lyAoUkZBLCBDT1JSLCBldGMuKSDguYLguJTguKLguYTguKHguYjguJXguYnguK3guIcgRm9yZWlnbiBLZXkg4LiI4Lij4Li04LiHXG4gIEBDb2x1bW4oe1xuICAgIG5hbWU6ICdlbnRpdHlfdHlwZScsXG4gICAgbGVuZ3RoOiA1MCxcbiAgICBjb21tZW50OiAn4Lib4Lij4Liw4LmA4Lig4LiX4LmA4Lit4LiB4Liq4Liy4LijIOC5gOC4iuC5iOC4mSByZmEsIGNvcnJlc3BvbmRlbmNlJyxcbiAgfSlcbiAgZW50aXR5VHlwZSE6IHN0cmluZztcblxuICBAQ29sdW1uKHtcbiAgICBuYW1lOiAnZW50aXR5X2lkJyxcbiAgICBsZW5ndGg6IDUwLFxuICAgIGNvbW1lbnQ6ICdJRCDguILguK3guIfguYDguK3guIHguKrguLLguKMgKFN0cmluZy9VVUlEKScsXG4gIH0pXG4gIGVudGl0eUlkITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oe1xuICAgIG5hbWU6ICdjdXJyZW50X3N0YXRlJyxcbiAgICBsZW5ndGg6IDUwLFxuICAgIGNvbW1lbnQ6ICfguIrguLfguYjguK0gU3RhdGUg4Lib4Lix4LiI4LiI4Li44Lia4Lix4LiZIOC5gOC4iuC5iOC4mSBEUkFGVCwgSU5fUkVWSUVXJyxcbiAgfSlcbiAgY3VycmVudFN0YXRlITogc3RyaW5nO1xuXG4gIEBDb2x1bW4oe1xuICAgIHR5cGU6ICdlbnVtJyxcbiAgICBlbnVtOiBXb3JrZmxvd1N0YXR1cyxcbiAgICBkZWZhdWx0OiBXb3JrZmxvd1N0YXR1cy5BQ1RJVkUsXG4gICAgY29tbWVudDogJ+C4quC4luC4suC4meC4sOC4oOC4suC4nuC4o+C4p+C4oeC4guC4reC4hyBJbnN0YW5jZScsXG4gIH0pXG4gIHN0YXR1cyE6IFdvcmtmbG93U3RhdHVzO1xuXG4gIC8vIENvbnRleHQ6IOC5gOC4geC5h+C4muC4leC4seC4p+C5geC4m+C4o+C4l+C4teC5iOC4iOC4s+C5gOC4m+C5h+C4meC4quC4s+C4q+C4o+C4seC4muC4geC4suC4o+C4leC4seC4lOC4quC4tOC4meC5g+C4iOC5g+C4mSBXb3JrZmxvd1xuICAvLyDguYDguIrguYjguJkgeyBcImFtb3VudFwiOiA1MDAwMDAsIFwicmVxdWVzdGVyX3JvbGVcIjogXCJFTkdJTkVFUlwiLCBcImFwcHJvdmVyX2lkc1wiOiBbMSwgMl0gfVxuICBAQ29sdW1uKHsgdHlwZTogJ2pzb24nLCBudWxsYWJsZTogdHJ1ZSwgY29tbWVudDogJ1J1bnRpbWUgQ29udGV4dCBEYXRhJyB9KVxuICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxuICB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ee/workflowinstanceentity_eeff4ca20af4844957e9c398a4e1a62f.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ee/workflowinstanceentity_eeff4ca20af4844957e9c398a4e1a62f.map new file mode 100644 index 0000000..5edfda8 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ee/workflowinstanceentity_eeff4ca20af4844957e9c398a4e1a62f.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\entities\\workflow-instance.entity.ts","mappings":";AAAA,yEAAyE;;;;;;;;;;;;;AAEzE,qCASiB;AACjB,6EAAkE;AAElE,IAAY,cAKX;AALD,WAAY,cAAc;IACxB,mCAAiB,CAAA;IACjB,yCAAuB,CAAA;IACvB,yCAAuB,CAAA;IACvB,2CAAyB,CAAA;AAC3B,CAAC,EALW,cAAc,8BAAd,cAAc,QAKzB;AAED;;GAEG;AAII,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;CAoD5B,CAAA;AApDY,4CAAgB;AAE3B;IADC,IAAA,gCAAsB,EAAC,MAAM,CAAC;;4CACnB;AAKZ;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,+CAAkB,CAAC;IACnC,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;kDACzB,+CAAkB,oBAAlB,+CAAkB;oDAAC;AAGhC;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;;sDACZ;AAQtB;IALC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,uCAAuC;KACjD,CAAC;;oDACkB;AAOpB;IALC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,4BAA4B;KACtC,CAAC;;kDACgB;AAOlB;IALC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,eAAe;QACrB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,2CAA2C;KACrD,CAAC;;sDACoB;AAQtB;IANC,IAAA,gBAAM,EAAC;QACN,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,cAAc,CAAC,MAAM;QAC9B,OAAO,EAAE,yBAAyB;KACnC,CAAC;;gDACsB;AAKxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC;kDAChE,MAAM,oBAAN,MAAM;iDAAkB;AAGlC;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;mDAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;mDAAC;2BAnDN,gBAAgB;IAH5B,IAAA,gBAAM,EAAC,oBAAoB,CAAC;IAC5B,IAAA,eAAK,EAAC,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,uDAAuD;;IACzF,IAAA,eAAK,EAAC,CAAC,cAAc,CAAC,CAAC,CAAC,gDAAgD;GAC5D,gBAAgB,CAoD5B","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\entities\\workflow-instance.entity.ts"],"sourcesContent":["// File: src/modules/workflow-engine/entities/workflow-instance.entity.ts\n\nimport {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n JoinColumn,\n ManyToOne,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from 'typeorm';\nimport { WorkflowDefinition } from './workflow-definition.entity';\n\nexport enum WorkflowStatus {\n ACTIVE = 'ACTIVE', // กำลังดำเนินการ\n COMPLETED = 'COMPLETED', // จบกระบวนการ (ถึง Terminal State)\n CANCELLED = 'CANCELLED', // ถูกยกเลิกกลางคัน\n TERMINATED = 'TERMINATED', // ถูกบังคับจบโดยระบบ หรือ Error\n}\n\n/**\n * เก็บสถานะการเดินเรื่องของเอกสารแต่ละใบ (Runtime State)\n */\n@Entity('workflow_instances')\n@Index(['entityType', 'entityId']) // เพื่อค้นหาว่าเอกสารนี้ (เช่น RFA-001) อยู่ขั้นตอนไหน\n@Index(['currentState']) // เพื่อ Dashboard: \"มีงานค้างที่ขั้นตอนไหนบ้าง\"\nexport class WorkflowInstance {\n @PrimaryGeneratedColumn('uuid')\n id!: string;\n\n // ผูกกับ Definition เพื่อรู้ว่าใช้กฎชุดไหน (Version ไหน)\n @ManyToOne(() => WorkflowDefinition)\n @JoinColumn({ name: 'definition_id' })\n definition!: WorkflowDefinition;\n\n @Column({ name: 'definition_id' })\n definitionId!: string;\n\n // Polymorphic Relation: เชื่อมกับเอกสารได้หลายประเภท (RFA, CORR, etc.) โดยไม่ต้อง Foreign Key จริง\n @Column({\n name: 'entity_type',\n length: 50,\n comment: 'ประเภทเอกสาร เช่น rfa, correspondence',\n })\n entityType!: string;\n\n @Column({\n name: 'entity_id',\n length: 50,\n comment: 'ID ของเอกสาร (String/UUID)',\n })\n entityId!: string;\n\n @Column({\n name: 'current_state',\n length: 50,\n comment: 'ชื่อ State ปัจจุบัน เช่น DRAFT, IN_REVIEW',\n })\n currentState!: string;\n\n @Column({\n type: 'enum',\n enum: WorkflowStatus,\n default: WorkflowStatus.ACTIVE,\n comment: 'สถานะภาพรวมของ Instance',\n })\n status!: WorkflowStatus;\n\n // Context: เก็บตัวแปรที่จำเป็นสำหรับการตัดสินใจใน Workflow\n // เช่น { \"amount\": 500000, \"requester_role\": \"ENGINEER\", \"approver_ids\": [1, 2] }\n @Column({ type: 'json', nullable: true, comment: 'Runtime Context Data' })\n context?: Record;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ef/searchservice_efc26b5aacfbd6df8c915e34775e0b66 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ef/searchservice_efc26b5aacfbd6df8c915e34775e0b66 new file mode 100644 index 0000000..e888ba4 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ef/searchservice_efc26b5aacfbd6df8c915e34775e0b66 @@ -0,0 +1,186 @@ +bae4fb474a3591f7ce1fded0fb3309ff +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var SearchService_1; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SearchService = void 0; +const common_1 = require("@nestjs/common"); +const elasticsearch_1 = require("@nestjs/elasticsearch"); +const config_1 = require("@nestjs/config"); +let SearchService = SearchService_1 = class SearchService { + constructor(esService, configService) { + this.esService = esService; + this.configService = configService; + this.logger = new common_1.Logger(SearchService_1.name); + this.indexName = 'dms_documents'; + this.isElasticsearchAvailable = false; + } + async onModuleInit() { + // Test Elasticsearch connection first + try { + await this.esService.ping(); + this.logger.log('Elasticsearch connection successful'); + this.isElasticsearchAvailable = true; + } + catch (error) { + this.logger.error(`Elasticsearch connection failed: ${error.message}`, error.stack); + this.isElasticsearchAvailable = false; + return; // Don't try to create index if connection fails + } + await this.createIndexIfNotExists(); + } + /** + * สร้าง Index และกำหนด Mapping (Schema) + */ + async createIndexIfNotExists() { + try { + const indexExists = await this.esService.indices.exists({ + index: this.indexName, + }); + if (!indexExists) { + // ✅ FIX: Cast 'body' เป็น any เพื่อแก้ปัญหา Type Mismatch ของ Library + await this.esService.indices.create({ + index: this.indexName, + body: { + mappings: { + properties: { + id: { type: 'integer' }, + uuid: { type: 'keyword' }, // ADR-019: public identifier + type: { type: 'keyword' }, // correspondence, rfa, drawing + docNumber: { type: 'text' }, + title: { type: 'text', analyzer: 'standard' }, + description: { type: 'text', analyzer: 'standard' }, + status: { type: 'keyword' }, + projectId: { type: 'integer' }, + createdAt: { type: 'date' }, + tags: { type: 'text' }, + }, + }, + }, + }); + this.logger.log(`Elasticsearch index '${this.indexName}' created.`); + } + } + catch (error) { + this.logger.error(`Failed to create index: ${error.message}`); + } + } + /** + * Index เอกสาร (Create/Update) + */ + async indexDocument(doc) { + try { + return await this.esService.index({ + index: this.indexName, + id: doc.publicId + ? `${doc.type}_${doc.publicId}` + : `${doc.type}_${doc.id}`, // ADR-019: prefer publicId key + document: doc, // ✅ Library รุ่นใหม่ใช้ 'document' แทน 'body' ในบางเวอร์ชัน + }); + } + catch (error) { + this.logger.error(`Failed to index document: ${error.message}`); + } + } + /** + * ลบเอกสารออกจาก Index + */ + async removeDocument(type, id) { + try { + await this.esService.delete({ + index: this.indexName, + id: `${type}_${id}`, + }); + } + catch (error) { + this.logger.error(`Failed to remove document: ${error.message}`); + } + } + /** + * ค้นหาเอกสาร (Full-text Search) + */ + async search(queryDto) { + const { q, type, status, projectId, page = 1, limit = 20 } = queryDto; + const from = (page - 1) * limit; + // Early fallback if Elasticsearch is not available + if (!this.isElasticsearchAvailable) { + this.logger.warn('Search unavailable - Elasticsearch not connected'); + return { data: [], meta: { total: 0, page, limit, took: 0 } }; + } + const mustQueries = []; + // 1. Full-text search logic + if (q) { + mustQueries.push({ + multi_match: { + query: q, + fields: ['title^3', 'docNumber^2', 'description', 'tags'], // Boost ความสำคัญ + fuzziness: 'AUTO', + }, + }); + } + else { + mustQueries.push({ match_all: {} }); + } + // 2. Filter logic + const filterQueries = []; + if (type) + filterQueries.push({ term: { type } }); + if (status) + filterQueries.push({ term: { status } }); + if (projectId) + filterQueries.push({ term: { projectId } }); + try { + const result = await this.esService.search({ + index: this.indexName, + from, + size: limit, + // ✅ ส่ง Query Structure โดยตรง + query: { + bool: { + must: mustQueries, + filter: filterQueries, + }, + }, + sort: [{ createdAt: { order: 'desc' } }], + }); + // 3. Format Result + const hits = result.hits.hits; + const total = typeof result.hits.total === 'number' + ? result.hits.total + : result.hits.total?.value || 0; + return { + data: hits.map((hit) => hit._source), + meta: { + total, + page, + limit, + took: result.took, + }, + }; + } + catch (error) { + const err = error; + this.logger.error(`Search failed: ${err.message}`, err.stack); + this.logger.debug(`Search query context: ${JSON.stringify({ + query: queryDto, + esNode: String(this.configService.get('ELASTICSEARCH_NODE') ?? ''), + })}`); + return { data: [], meta: { total: 0, page, limit, took: 0 } }; + } + } +}; +exports.SearchService = SearchService; +exports.SearchService = SearchService = SearchService_1 = __decorate([ + (0, common_1.Injectable)(), + __metadata("design:paramtypes", [typeof (_a = typeof elasticsearch_1.ElasticsearchService !== "undefined" && elasticsearch_1.ElasticsearchService) === "function" ? _a : Object, typeof (_b = typeof config_1.ConfigService !== "undefined" && config_1.ConfigService) === "function" ? _b : Object]) +], SearchService); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcc2VhcmNoXFxzZWFyY2guc2VydmljZS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUFrRTtBQUNsRSx5REFBNkQ7QUFDN0QsMkNBQStDO0FBSXhDLElBQU0sYUFBYSxxQkFBbkIsTUFBTSxhQUFhO0lBS3hCLFlBQ21CLFNBQStCLEVBQy9CLGFBQTRCO1FBRDVCLGNBQVMsR0FBVCxTQUFTLENBQXNCO1FBQy9CLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBTjlCLFdBQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxlQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsY0FBUyxHQUFHLGVBQWUsQ0FBQztRQUNyQyw2QkFBd0IsR0FBRyxLQUFLLENBQUM7SUFLdEMsQ0FBQztJQUVKLEtBQUssQ0FBQyxZQUFZO1FBQ2hCLHNDQUFzQztRQUN0QyxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMscUNBQXFDLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO1FBQ3ZDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2Ysb0NBQXFDLEtBQWUsQ0FBQyxPQUFPLEVBQUUsRUFDN0QsS0FBZSxDQUFDLEtBQUssQ0FDdkIsQ0FBQztZQUNGLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7WUFDdEMsT0FBTyxDQUFDLGdEQUFnRDtRQUMxRCxDQUFDO1FBRUQsTUFBTSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsc0JBQXNCO1FBQ2xDLElBQUksQ0FBQztZQUNILE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLFNB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RSxNQUFNLENBQUMsSUFBSTtpQkFDbEI7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLEdBQUcsR0FBRyxLQUFjLENBQUM7WUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2YseUJBQXlCLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ3RDLEtBQUssRUFBRSxRQUFRO2dCQUNmLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDbkUsQ0FBQyxFQUFFLENBQ0wsQ0FBQztZQUNGLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNoRSxDQUFDO0lBQ0gsQ0FBQztDQUNGLENBQUE7QUF2TFksc0NBQWE7d0JBQWIsYUFBYTtJQUR6QixJQUFBLG1CQUFVLEdBQUU7eURBT21CLG9DQUFvQixvQkFBcEIsb0NBQW9CLG9EQUNoQixzQkFBYSxvQkFBYixzQkFBYTtHQVBwQyxhQUFhLENBdUx6QiIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxzZWFyY2hcXHNlYXJjaC5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIExvZ2dlciwgT25Nb2R1bGVJbml0IH0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xyXG5pbXBvcnQgeyBFbGFzdGljc2VhcmNoU2VydmljZSB9IGZyb20gJ0BuZXN0anMvZWxhc3RpY3NlYXJjaCc7XHJcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICdAbmVzdGpzL2NvbmZpZyc7XHJcbmltcG9ydCB7IFNlYXJjaFF1ZXJ5RHRvIH0gZnJvbSAnLi9kdG8vc2VhcmNoLXF1ZXJ5LmR0byc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBTZWFyY2hTZXJ2aWNlIGltcGxlbWVudHMgT25Nb2R1bGVJbml0IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoU2VhcmNoU2VydmljZS5uYW1lKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGluZGV4TmFtZSA9ICdkbXNfZG9jdW1lbnRzJztcclxuICBwcml2YXRlIGlzRWxhc3RpY3NlYXJjaEF2YWlsYWJsZSA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXNTZXJ2aWNlOiBFbGFzdGljc2VhcmNoU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZVxyXG4gICkge31cclxuXHJcbiAgYXN5bmMgb25Nb2R1bGVJbml0KCkge1xyXG4gICAgLy8gVGVzdCBFbGFzdGljc2VhcmNoIGNvbm5lY3Rpb24gZmlyc3RcclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZXNTZXJ2aWNlLnBpbmcoKTtcclxuICAgICAgdGhpcy5sb2dnZXIubG9nKCdFbGFzdGljc2VhcmNoIGNvbm5lY3Rpb24gc3VjY2Vzc2Z1bCcpO1xyXG4gICAgICB0aGlzLmlzRWxhc3RpY3NlYXJjaEF2YWlsYWJsZSA9IHRydWU7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcclxuICAgICAgICBgRWxhc3RpY3NlYXJjaCBjb25uZWN0aW9uIGZhaWxlZDogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCxcclxuICAgICAgICAoZXJyb3IgYXMgRXJyb3IpLnN0YWNrXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuaXNFbGFzdGljc2VhcmNoQXZhaWxhYmxlID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjsgLy8gRG9uJ3QgdHJ5IHRvIGNyZWF0ZSBpbmRleCBpZiBjb25uZWN0aW9uIGZhaWxzXHJcbiAgICB9XHJcblxyXG4gICAgYXdhaXQgdGhpcy5jcmVhdGVJbmRleElmTm90RXhpc3RzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDguKrguKPguYnguLLguIcgSW5kZXgg4LmB4Lil4Liw4LiB4Liz4Lir4LiZ4LiUIE1hcHBpbmcgKFNjaGVtYSlcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZUluZGV4SWZOb3RFeGlzdHMoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBpbmRleEV4aXN0cyA9IGF3YWl0IHRoaXMuZXNTZXJ2aWNlLmluZGljZXMuZXhpc3RzKHtcclxuICAgICAgICBpbmRleDogdGhpcy5pbmRleE5hbWUsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKCFpbmRleEV4aXN0cykge1xyXG4gICAgICAgIC8vIOKchSBGSVg6IENhc3QgJ2JvZHknIOC5gOC4m+C5h+C4mSBhbnkg4LmA4Lie4Li34LmI4Lit4LmB4LiB4LmJ4Lib4Lix4LiN4Lir4LiyIFR5cGUgTWlzbWF0Y2gg4LiC4Lit4LiHIExpYnJhcnlcclxuICAgICAgICBhd2FpdCB0aGlzLmVzU2VydmljZS5pbmRpY2VzLmNyZWF0ZSh7XHJcbiAgICAgICAgICBpbmRleDogdGhpcy5pbmRleE5hbWUsXHJcbiAgICAgICAgICBib2R5OiB7XHJcbiAgICAgICAgICAgIG1hcHBpbmdzOiB7XHJcbiAgICAgICAgICAgICAgcHJvcGVydGllczoge1xyXG4gICAgICAgICAgICAgICAgaWQ6IHsgdHlwZTogJ2ludGVnZXInIH0sXHJcbiAgICAgICAgICAgICAgICB1dWlkOiB7IHR5cGU6ICdrZXl3b3JkJyB9LCAvLyBBRFItMDE5OiBwdWJsaWMgaWRlbnRpZmllclxyXG4gICAgICAgICAgICAgICAgdHlwZTogeyB0eXBlOiAna2V5d29yZCcgfSwgLy8gY29ycmVzcG9uZGVuY2UsIHJmYSwgZHJhd2luZ1xyXG4gICAgICAgICAgICAgICAgZG9jTnVtYmVyOiB7IHR5cGU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6IHsgdHlwZTogJ3RleHQnLCBhbmFseXplcjogJ3N0YW5kYXJkJyB9LFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHsgdHlwZTogJ3RleHQnLCBhbmFseXplcjogJ3N0YW5kYXJkJyB9LFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiB7IHR5cGU6ICdrZXl3b3JkJyB9LFxyXG4gICAgICAgICAgICAgICAgcHJvamVjdElkOiB7IHR5cGU6ICdpbnRlZ2VyJyB9LFxyXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiB7IHR5cGU6ICdkYXRlJyB9LFxyXG4gICAgICAgICAgICAgICAgdGFnczogeyB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhgRWxhc3RpY3NlYXJjaCBpbmRleCAnJHt0aGlzLmluZGV4TmFtZX0nIGNyZWF0ZWQuYCk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGluZGV4OiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluZGV4IOC5gOC4reC4geC4quC4suC4oyAoQ3JlYXRlL1VwZGF0ZSlcclxuICAgKi9cclxuICBhc3luYyBpbmRleERvY3VtZW50KFxyXG4gICAgZG9jOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiAmIHtcclxuICAgICAgdHlwZTogc3RyaW5nO1xyXG4gICAgICBpZD86IG51bWJlcjtcclxuICAgICAgcHVibGljSWQ/OiBzdHJpbmc7XHJcbiAgICB9XHJcbiAgKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5lc1NlcnZpY2UuaW5kZXgoe1xyXG4gICAgICAgIGluZGV4OiB0aGlzLmluZGV4TmFtZSxcclxuICAgICAgICBpZDogZG9jLnB1YmxpY0lkXHJcbiAgICAgICAgICA/IGAke2RvYy50eXBlfV8ke2RvYy5wdWJsaWNJZH1gXHJcbiAgICAgICAgICA6IGAke2RvYy50eXBlfV8ke2RvYy5pZH1gLCAvLyBBRFItMDE5OiBwcmVmZXIgcHVibGljSWQga2V5XHJcbiAgICAgICAgZG9jdW1lbnQ6IGRvYywgLy8g4pyFIExpYnJhcnkg4Lij4Li44LmI4LiZ4LmD4Lir4Lih4LmI4LmD4LiK4LmJICdkb2N1bWVudCcg4LmB4LiX4LiZICdib2R5JyDguYPguJnguJrguLLguIfguYDguKfguK3guKPguYzguIrguLHguJlcclxuICAgICAgfSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcclxuICAgICAgICBgRmFpbGVkIHRvIGluZGV4IGRvY3VtZW50OiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDguKXguJrguYDguK3guIHguKrguLLguKPguK3guK3guIHguIjguLLguIEgSW5kZXhcclxuICAgKi9cclxuICBhc3luYyByZW1vdmVEb2N1bWVudCh0eXBlOiBzdHJpbmcsIGlkOiBudW1iZXIpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZXNTZXJ2aWNlLmRlbGV0ZSh7XHJcbiAgICAgICAgaW5kZXg6IHRoaXMuaW5kZXhOYW1lLFxyXG4gICAgICAgIGlkOiBgJHt0eXBlfV8ke2lkfWAsXHJcbiAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXHJcbiAgICAgICAgYEZhaWxlZCB0byByZW1vdmUgZG9jdW1lbnQ6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWBcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOC4hOC5ieC4meC4q+C4suC5gOC4reC4geC4quC4suC4oyAoRnVsbC10ZXh0IFNlYXJjaClcclxuICAgKi9cclxuICBhc3luYyBzZWFyY2gocXVlcnlEdG86IFNlYXJjaFF1ZXJ5RHRvKSB7XHJcbiAgICBjb25zdCB7IHEsIHR5cGUsIHN0YXR1cywgcHJvamVjdElkLCBwYWdlID0gMSwgbGltaXQgPSAyMCB9ID0gcXVlcnlEdG87XHJcbiAgICBjb25zdCBmcm9tID0gKHBhZ2UgLSAxKSAqIGxpbWl0O1xyXG5cclxuICAgIC8vIEVhcmx5IGZhbGxiYWNrIGlmIEVsYXN0aWNzZWFyY2ggaXMgbm90IGF2YWlsYWJsZVxyXG4gICAgaWYgKCF0aGlzLmlzRWxhc3RpY3NlYXJjaEF2YWlsYWJsZSkge1xyXG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCdTZWFyY2ggdW5hdmFpbGFibGUgLSBFbGFzdGljc2VhcmNoIG5vdCBjb25uZWN0ZWQnKTtcclxuICAgICAgcmV0dXJuIHsgZGF0YTogW10sIG1ldGE6IHsgdG90YWw6IDAsIHBhZ2UsIGxpbWl0LCB0b29rOiAwIH0gfTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtdXN0UXVlcmllczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xyXG5cclxuICAgIC8vIDEuIEZ1bGwtdGV4dCBzZWFyY2ggbG9naWNcclxuICAgIGlmIChxKSB7XHJcbiAgICAgIG11c3RRdWVyaWVzLnB1c2goe1xyXG4gICAgICAgIG11bHRpX21hdGNoOiB7XHJcbiAgICAgICAgICBxdWVyeTogcSxcclxuICAgICAgICAgIGZpZWxkczogWyd0aXRsZV4zJywgJ2RvY051bWJlcl4yJywgJ2Rlc2NyaXB0aW9uJywgJ3RhZ3MnXSwgLy8gQm9vc3Qg4LiE4Lin4Liy4Lih4Liq4Liz4LiE4Lix4LiNXHJcbiAgICAgICAgICBmdXp6aW5lc3M6ICdBVVRPJyxcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG11c3RRdWVyaWVzLnB1c2goeyBtYXRjaF9hbGw6IHt9IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDIuIEZpbHRlciBsb2dpY1xyXG4gICAgY29uc3QgZmlsdGVyUXVlcmllczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xyXG4gICAgaWYgKHR5cGUpIGZpbHRlclF1ZXJpZXMucHVzaCh7IHRlcm06IHsgdHlwZSB9IH0pO1xyXG4gICAgaWYgKHN0YXR1cykgZmlsdGVyUXVlcmllcy5wdXNoKHsgdGVybTogeyBzdGF0dXMgfSB9KTtcclxuICAgIGlmIChwcm9qZWN0SWQpIGZpbHRlclF1ZXJpZXMucHVzaCh7IHRlcm06IHsgcHJvamVjdElkIH0gfSk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5lc1NlcnZpY2Uuc2VhcmNoKHtcclxuICAgICAgICBpbmRleDogdGhpcy5pbmRleE5hbWUsXHJcbiAgICAgICAgZnJvbSxcclxuICAgICAgICBzaXplOiBsaW1pdCxcclxuICAgICAgICAvLyDinIUg4Liq4LmI4LiHIFF1ZXJ5IFN0cnVjdHVyZSDguYLguJTguKLguJXguKPguIdcclxuICAgICAgICBxdWVyeToge1xyXG4gICAgICAgICAgYm9vbDoge1xyXG4gICAgICAgICAgICBtdXN0OiBtdXN0UXVlcmllcyxcclxuICAgICAgICAgICAgZmlsdGVyOiBmaWx0ZXJRdWVyaWVzLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNvcnQ6IFt7IGNyZWF0ZWRBdDogeyBvcmRlcjogJ2Rlc2MnIGFzIGNvbnN0IH0gfV0sXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gMy4gRm9ybWF0IFJlc3VsdFxyXG4gICAgICBjb25zdCBoaXRzID0gcmVzdWx0LmhpdHMuaGl0cztcclxuICAgICAgY29uc3QgdG90YWwgPVxyXG4gICAgICAgIHR5cGVvZiByZXN1bHQuaGl0cy50b3RhbCA9PT0gJ251bWJlcidcclxuICAgICAgICAgID8gcmVzdWx0LmhpdHMudG90YWxcclxuICAgICAgICAgIDogcmVzdWx0LmhpdHMudG90YWw/LnZhbHVlIHx8IDA7XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGRhdGE6IGhpdHMubWFwKChoaXQpID0+IGhpdC5fc291cmNlKSxcclxuICAgICAgICBtZXRhOiB7XHJcbiAgICAgICAgICB0b3RhbCxcclxuICAgICAgICAgIHBhZ2UsXHJcbiAgICAgICAgICBsaW1pdCxcclxuICAgICAgICAgIHRvb2s6IHJlc3VsdC50b29rLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zdCBlcnIgPSBlcnJvciBhcyBFcnJvcjtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYFNlYXJjaCBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9YCwgZXJyLnN0YWNrKTtcclxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXHJcbiAgICAgICAgYFNlYXJjaCBxdWVyeSBjb250ZXh0OiAke0pTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgIHF1ZXJ5OiBxdWVyeUR0byxcclxuICAgICAgICAgIGVzTm9kZTogU3RyaW5nKHRoaXMuY29uZmlnU2VydmljZS5nZXQoJ0VMQVNUSUNTRUFSQ0hfTk9ERScpID8/ICcnKSxcclxuICAgICAgICB9KX1gXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiB7IGRhdGE6IFtdLCBtZXRhOiB7IHRvdGFsOiAwLCBwYWdlLCBsaW1pdCwgdG9vazogMCB9IH07XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ef/searchservice_efc26b5aacfbd6df8c915e34775e0b66.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ef/searchservice_efc26b5aacfbd6df8c915e34775e0b66.map new file mode 100644 index 0000000..dc2e8da --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ef/searchservice_efc26b5aacfbd6df8c915e34775e0b66.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\search\\search.service.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\search\\search.service.ts"],"sourcesContent":["import { Injectable, Logger, OnModuleInit } from '@nestjs/common';\r\nimport { ElasticsearchService } from '@nestjs/elasticsearch';\r\nimport { ConfigService } from '@nestjs/config';\r\nimport { SearchQueryDto } from './dto/search-query.dto';\r\n\r\n@Injectable()\r\nexport class SearchService implements OnModuleInit {\r\n private readonly logger = new Logger(SearchService.name);\r\n private readonly indexName = 'dms_documents';\r\n private isElasticsearchAvailable = false;\r\n\r\n constructor(\r\n private readonly esService: ElasticsearchService,\r\n private readonly configService: ConfigService\r\n ) {}\r\n\r\n async onModuleInit() {\r\n // Test Elasticsearch connection first\r\n try {\r\n await this.esService.ping();\r\n this.logger.log('Elasticsearch connection successful');\r\n this.isElasticsearchAvailable = true;\r\n } catch (error) {\r\n this.logger.error(\r\n `Elasticsearch connection failed: ${(error as Error).message}`,\r\n (error as Error).stack\r\n );\r\n this.isElasticsearchAvailable = false;\r\n return; // Don't try to create index if connection fails\r\n }\r\n\r\n await this.createIndexIfNotExists();\r\n }\r\n\r\n /**\r\n * สร้าง Index และกำหนด Mapping (Schema)\r\n */\r\n private async createIndexIfNotExists() {\r\n try {\r\n const indexExists = await this.esService.indices.exists({\r\n index: this.indexName,\r\n });\r\n\r\n if (!indexExists) {\r\n // ✅ FIX: Cast 'body' เป็น any เพื่อแก้ปัญหา Type Mismatch ของ Library\r\n await this.esService.indices.create({\r\n index: this.indexName,\r\n body: {\r\n mappings: {\r\n properties: {\r\n id: { type: 'integer' },\r\n uuid: { type: 'keyword' }, // ADR-019: public identifier\r\n type: { type: 'keyword' }, // correspondence, rfa, drawing\r\n docNumber: { type: 'text' },\r\n title: { type: 'text', analyzer: 'standard' },\r\n description: { type: 'text', analyzer: 'standard' },\r\n status: { type: 'keyword' },\r\n projectId: { type: 'integer' },\r\n createdAt: { type: 'date' },\r\n tags: { type: 'text' },\r\n },\r\n },\r\n } as unknown as Record,\r\n });\r\n this.logger.log(`Elasticsearch index '${this.indexName}' created.`);\r\n }\r\n } catch (error) {\r\n this.logger.error(`Failed to create index: ${(error as Error).message}`);\r\n }\r\n }\r\n\r\n /**\r\n * Index เอกสาร (Create/Update)\r\n */\r\n async indexDocument(\r\n doc: Record & {\r\n type: string;\r\n id?: number;\r\n publicId?: string;\r\n }\r\n ) {\r\n try {\r\n return await this.esService.index({\r\n index: this.indexName,\r\n id: doc.publicId\r\n ? `${doc.type}_${doc.publicId}`\r\n : `${doc.type}_${doc.id}`, // ADR-019: prefer publicId key\r\n document: doc, // ✅ Library รุ่นใหม่ใช้ 'document' แทน 'body' ในบางเวอร์ชัน\r\n });\r\n } catch (error) {\r\n this.logger.error(\r\n `Failed to index document: ${(error as Error).message}`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * ลบเอกสารออกจาก Index\r\n */\r\n async removeDocument(type: string, id: number) {\r\n try {\r\n await this.esService.delete({\r\n index: this.indexName,\r\n id: `${type}_${id}`,\r\n });\r\n } catch (error) {\r\n this.logger.error(\r\n `Failed to remove document: ${(error as Error).message}`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * ค้นหาเอกสาร (Full-text Search)\r\n */\r\n async search(queryDto: SearchQueryDto) {\r\n const { q, type, status, projectId, page = 1, limit = 20 } = queryDto;\r\n const from = (page - 1) * limit;\r\n\r\n // Early fallback if Elasticsearch is not available\r\n if (!this.isElasticsearchAvailable) {\r\n this.logger.warn('Search unavailable - Elasticsearch not connected');\r\n return { data: [], meta: { total: 0, page, limit, took: 0 } };\r\n }\r\n\r\n const mustQueries: Record[] = [];\r\n\r\n // 1. Full-text search logic\r\n if (q) {\r\n mustQueries.push({\r\n multi_match: {\r\n query: q,\r\n fields: ['title^3', 'docNumber^2', 'description', 'tags'], // Boost ความสำคัญ\r\n fuzziness: 'AUTO',\r\n },\r\n });\r\n } else {\r\n mustQueries.push({ match_all: {} });\r\n }\r\n\r\n // 2. Filter logic\r\n const filterQueries: Record[] = [];\r\n if (type) filterQueries.push({ term: { type } });\r\n if (status) filterQueries.push({ term: { status } });\r\n if (projectId) filterQueries.push({ term: { projectId } });\r\n\r\n try {\r\n const result = await this.esService.search({\r\n index: this.indexName,\r\n from,\r\n size: limit,\r\n // ✅ ส่ง Query Structure โดยตรง\r\n query: {\r\n bool: {\r\n must: mustQueries,\r\n filter: filterQueries,\r\n },\r\n },\r\n sort: [{ createdAt: { order: 'desc' as const } }],\r\n });\r\n\r\n // 3. Format Result\r\n const hits = result.hits.hits;\r\n const total =\r\n typeof result.hits.total === 'number'\r\n ? result.hits.total\r\n : result.hits.total?.value || 0;\r\n\r\n return {\r\n data: hits.map((hit) => hit._source),\r\n meta: {\r\n total,\r\n page,\r\n limit,\r\n took: result.took,\r\n },\r\n };\r\n } catch (error) {\r\n const err = error as Error;\r\n this.logger.error(`Search failed: ${err.message}`, err.stack);\r\n this.logger.debug(\r\n `Search query context: ${JSON.stringify({\r\n query: queryDto,\r\n esNode: String(this.configService.get('ELASTICSEARCH_NODE') ?? ''),\r\n })}`\r\n );\r\n return { data: [], meta: { total: 0, page, limit, took: 0 } };\r\n }\r\n }\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f0/rfaentity_f073b741f89f84f3a87b305bb53a4285 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f0/rfaentity_f073b741f89f84f3a87b305bb53a4285 new file mode 100644 index 0000000..848f4b5 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f0/rfaentity_f073b741f89f84f3a87b305bb53a4285 @@ -0,0 +1,60 @@ +ea64f2030d4f43110ef5aff050dfe2ca +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Rfa = void 0; +const typeorm_1 = require("typeorm"); +const user_entity_1 = require("../../user/entities/user.entity"); +const correspondence_entity_1 = require("../../correspondence/entities/correspondence.entity"); // Import +const rfa_type_entity_1 = require("./rfa-type.entity"); +let Rfa = class Rfa { +}; +exports.Rfa = Rfa; +__decorate([ + (0, typeorm_1.PrimaryColumn)(), + __metadata("design:type", Number) +], Rfa.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.OneToOne)(() => correspondence_entity_1.Correspondence, { onDelete: 'CASCADE' }), + (0, typeorm_1.JoinColumn)({ name: 'id' }), + __metadata("design:type", typeof (_a = typeof correspondence_entity_1.Correspondence !== "undefined" && correspondence_entity_1.Correspondence) === "function" ? _a : Object) +], Rfa.prototype, "correspondence", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'rfa_type_id' }), + __metadata("design:type", Number) +], Rfa.prototype, "rfaTypeId", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], Rfa.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'created_by', nullable: true }), + __metadata("design:type", Number) +], Rfa.prototype, "createdBy", void 0); +__decorate([ + (0, typeorm_1.DeleteDateColumn)({ name: 'deleted_at' }), + __metadata("design:type", typeof (_c = typeof Date !== "undefined" && Date) === "function" ? _c : Object) +], Rfa.prototype, "deletedAt", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => rfa_type_entity_1.RfaType), + (0, typeorm_1.JoinColumn)({ name: 'rfa_type_id' }), + __metadata("design:type", typeof (_d = typeof rfa_type_entity_1.RfaType !== "undefined" && rfa_type_entity_1.RfaType) === "function" ? _d : Object) +], Rfa.prototype, "rfaType", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => user_entity_1.User), + (0, typeorm_1.JoinColumn)({ name: 'created_by' }), + __metadata("design:type", typeof (_e = typeof user_entity_1.User !== "undefined" && user_entity_1.User) === "function" ? _e : Object) +], Rfa.prototype, "creator", void 0); +exports.Rfa = Rfa = __decorate([ + (0, typeorm_1.Entity)('rfas') +], Rfa); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccmZhXFxlbnRpdGllc1xccmZhLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBU2lCO0FBRWpCLGlFQUF1RDtBQUN2RCwrRkFBcUYsQ0FBQyxTQUFTO0FBQy9GLHVEQUE0QztBQUdyQyxJQUFNLEdBQUcsR0FBVCxNQUFNLEdBQUc7Q0E4QmYsQ0FBQTtBQTlCWSxrQkFBRztBQUVkO0lBREMsSUFBQSx1QkFBYSxHQUFFOzsrQkFDSjtBQUlaO0lBRkMsSUFBQSxrQkFBUSxFQUFDLEdBQUcsRUFBRSxDQUFDLHNDQUFjLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDdkQsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO2tEQUNWLHNDQUFjLG9CQUFkLHNDQUFjOzJDQUFDO0FBR2hDO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDOztzQ0FDYjtBQUduQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTtzQ0FBQztBQUdqQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOztzQ0FDNUI7QUFHbkI7SUFEQyxJQUFBLDBCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUM3QixJQUFJLG9CQUFKLElBQUk7c0NBQUM7QUFLakI7SUFGQyxJQUFBLG1CQUFTLEVBQUMsR0FBRyxFQUFFLENBQUMseUJBQU8sQ0FBQztJQUN4QixJQUFBLG9CQUFVLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLENBQUM7a0RBQzFCLHlCQUFPLG9CQUFQLHlCQUFPO29DQUFDO0FBSWxCO0lBRkMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFJLENBQUM7SUFDckIsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO2tEQUN6QixrQkFBSSxvQkFBSixrQkFBSTtvQ0FBQztjQTNCSixHQUFHO0lBRGYsSUFBQSxnQkFBTSxFQUFDLE1BQU0sQ0FBQztHQUNGLEdBQUcsQ0E4QmYiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xccmZhXFxlbnRpdGllc1xccmZhLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIERlbGV0ZURhdGVDb2x1bW4sXG4gIEVudGl0eSxcbiAgSm9pbkNvbHVtbixcbiAgTWFueVRvT25lLFxuICBQcmltYXJ5Q29sdW1uLFxuICBPbmVUb09uZSxcbn0gZnJvbSAndHlwZW9ybSc7XG5cbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi8uLi91c2VyL2VudGl0aWVzL3VzZXIuZW50aXR5JztcbmltcG9ydCB7IENvcnJlc3BvbmRlbmNlIH0gZnJvbSAnLi4vLi4vY29ycmVzcG9uZGVuY2UvZW50aXRpZXMvY29ycmVzcG9uZGVuY2UuZW50aXR5JzsgLy8gSW1wb3J0XG5pbXBvcnQgeyBSZmFUeXBlIH0gZnJvbSAnLi9yZmEtdHlwZS5lbnRpdHknO1xuXG5ARW50aXR5KCdyZmFzJylcbmV4cG9ydCBjbGFzcyBSZmEge1xuICBAUHJpbWFyeUNvbHVtbigpXG4gIGlkITogbnVtYmVyO1xuXG4gIEBPbmVUb09uZSgoKSA9PiBDb3JyZXNwb25kZW5jZSwgeyBvbkRlbGV0ZTogJ0NBU0NBREUnIH0pXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2lkJyB9KVxuICBjb3JyZXNwb25kZW5jZSE6IENvcnJlc3BvbmRlbmNlO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncmZhX3R5cGVfaWQnIH0pXG4gIHJmYVR5cGVJZCE6IG51bWJlcjtcblxuICBAQ3JlYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICdjcmVhdGVkX2F0JyB9KVxuICBjcmVhdGVkQXQhOiBEYXRlO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9ieScsIG51bGxhYmxlOiB0cnVlIH0pXG4gIGNyZWF0ZWRCeT86IG51bWJlcjtcblxuICBARGVsZXRlRGF0ZUNvbHVtbih7IG5hbWU6ICdkZWxldGVkX2F0JyB9KVxuICBkZWxldGVkQXQ/OiBEYXRlO1xuXG4gIC8vIFJlbGF0aW9uc1xuICBATWFueVRvT25lKCgpID0+IFJmYVR5cGUpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3JmYV90eXBlX2lkJyB9KVxuICByZmFUeXBlITogUmZhVHlwZTtcblxuICBATWFueVRvT25lKCgpID0+IFVzZXIpXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ2NyZWF0ZWRfYnknIH0pXG4gIGNyZWF0b3I/OiBVc2VyO1xuXG4gIC8vIFJldmlzaW9ucyBhcmUgYWNjZXNzZWQgdmlhIGNvcnJlc3BvbmRlbmNlLnJldmlzaW9ucyAtPiByZmFSZXZpc2lvblxufVxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f0/rfaentity_f073b741f89f84f3a87b305bb53a4285.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f0/rfaentity_f073b741f89f84f3a87b305bb53a4285.map new file mode 100644 index 0000000..5b29b92 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f0/rfaentity_f073b741f89f84f3a87b305bb53a4285.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCASiB;AAEjB,iEAAuD;AACvD,+FAAqF,CAAC,SAAS;AAC/F,uDAA4C;AAGrC,IAAM,GAAG,GAAT,MAAM,GAAG;CA8Bf,CAAA;AA9BY,kBAAG;AAEd;IADC,IAAA,uBAAa,GAAE;;+BACJ;AAIZ;IAFC,IAAA,kBAAQ,EAAC,GAAG,EAAE,CAAC,sCAAc,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACvD,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;kDACV,sCAAc,oBAAd,sCAAc;2CAAC;AAGhC;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;sCACb;AAGnB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;sCAAC;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sCAC5B;AAGnB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;sCAAC;AAKjB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,yBAAO,CAAC;IACxB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;kDAC1B,yBAAO,oBAAP,yBAAO;oCAAC;AAIlB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kBAAI,CAAC;IACrB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,kBAAI,oBAAJ,kBAAI;oCAAC;cA3BJ,GAAG;IADf,IAAA,gBAAM,EAAC,MAAM,CAAC;GACF,GAAG,CA8Bf","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\rfa\\entities\\rfa.entity.ts"],"sourcesContent":["import {\n Column,\n CreateDateColumn,\n DeleteDateColumn,\n Entity,\n JoinColumn,\n ManyToOne,\n PrimaryColumn,\n OneToOne,\n} from 'typeorm';\n\nimport { User } from '../../user/entities/user.entity';\nimport { Correspondence } from '../../correspondence/entities/correspondence.entity'; // Import\nimport { RfaType } from './rfa-type.entity';\n\n@Entity('rfas')\nexport class Rfa {\n @PrimaryColumn()\n id!: number;\n\n @OneToOne(() => Correspondence, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'id' })\n correspondence!: Correspondence;\n\n @Column({ name: 'rfa_type_id' })\n rfaTypeId!: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @Column({ name: 'created_by', nullable: true })\n createdBy?: number;\n\n @DeleteDateColumn({ name: 'deleted_at' })\n deletedAt?: Date;\n\n // Relations\n @ManyToOne(() => RfaType)\n @JoinColumn({ name: 'rfa_type_id' })\n rfaType!: RfaType;\n\n @ManyToOne(() => User)\n @JoinColumn({ name: 'created_by' })\n creator?: User;\n\n // Revisions are accessed via correspondence.revisions -> rfaRevision\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f0/v6_f0e9bebcaffc237d2d87341e893e8a15 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f0/v6_f0e9bebcaffc237d2d87341e893e8a15 new file mode 100644 index 0000000..c327004 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f0/v6_f0e9bebcaffc237d2d87341e893e8a15 @@ -0,0 +1,21 @@ +3c6110ba362330cccb4dc850c183a921 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const stringify_js_1 = require("./stringify.js"); +const v1_js_1 = require("./v1.js"); +const v1ToV6_js_1 = require("./v1ToV6.js"); +function v6(options, buf, offset) { + options ??= {}; + offset ??= 0; + let bytes = (0, v1_js_1.default)({ ...options, _v6: true }, new Uint8Array(16)); + bytes = (0, v1ToV6_js_1.default)(bytes); + if (buf) { + for (let i = 0; i < 16; i++) { + buf[offset + i] = bytes[i]; + } + return buf; + } + return (0, stringify_js_1.unsafeStringify)(bytes); +} +exports.default = v6; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdjYuanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDO0FBQ2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUQsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDakQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUMzQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU07SUFDNUIsT0FBTyxLQUFLLEVBQUUsQ0FBQztJQUNmLE1BQU0sS0FBSyxDQUFDLENBQUM7SUFDYixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRixLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDTixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDMUIsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUNELE9BQU8sQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFDRCxPQUFPLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcbm9kZV9tb2R1bGVzXFwucG5wbVxcdXVpZEAxMS4xLjBcXG5vZGVfbW9kdWxlc1xcdXVpZFxcZGlzdFxcY2pzXFx2Ni5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHN0cmluZ2lmeV9qc18xID0gcmVxdWlyZShcIi4vc3RyaW5naWZ5LmpzXCIpO1xuY29uc3QgdjFfanNfMSA9IHJlcXVpcmUoXCIuL3YxLmpzXCIpO1xuY29uc3QgdjFUb1Y2X2pzXzEgPSByZXF1aXJlKFwiLi92MVRvVjYuanNcIik7XG5mdW5jdGlvbiB2NihvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICAgIG9wdGlvbnMgPz89IHt9O1xuICAgIG9mZnNldCA/Pz0gMDtcbiAgICBsZXQgYnl0ZXMgPSAoMCwgdjFfanNfMS5kZWZhdWx0KSh7IC4uLm9wdGlvbnMsIF92NjogdHJ1ZSB9LCBuZXcgVWludDhBcnJheSgxNikpO1xuICAgIGJ5dGVzID0gKDAsIHYxVG9WNl9qc18xLmRlZmF1bHQpKGJ5dGVzKTtcbiAgICBpZiAoYnVmKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgICAgICAgYnVmW29mZnNldCArIGldID0gYnl0ZXNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG4gICAgcmV0dXJuICgwLCBzdHJpbmdpZnlfanNfMS51bnNhZmVTdHJpbmdpZnkpKGJ5dGVzKTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IHY2O1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f0/v6_f0e9bebcaffc237d2d87341e893e8a15.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f0/v6_f0e9bebcaffc237d2d87341e893e8a15.map new file mode 100644 index 0000000..e0ae320 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f0/v6_f0e9bebcaffc237d2d87341e893e8a15.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v6.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,MAAM,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AACjD,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AACnC,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAC3C,SAAS,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM;IAC5B,OAAO,KAAK,EAAE,CAAC;IACf,MAAM,KAAK,CAAC,CAAC;IACb,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IAChF,KAAK,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,GAAG,EAAE,CAAC;QACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1B,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IACD,OAAO,CAAC,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC;AACD,OAAO,CAAC,OAAO,GAAG,EAAE,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v6.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst stringify_js_1 = require(\"./stringify.js\");\nconst v1_js_1 = require(\"./v1.js\");\nconst v1ToV6_js_1 = require(\"./v1ToV6.js\");\nfunction v6(options, buf, offset) {\n options ??= {};\n offset ??= 0;\n let bytes = (0, v1_js_1.default)({ ...options, _v6: true }, new Uint8Array(16));\n bytes = (0, v1ToV6_js_1.default)(bytes);\n if (buf) {\n for (let i = 0; i < 16; i++) {\n buf[offset + i] = bytes[i];\n }\n return buf;\n }\n return (0, stringify_js_1.unsafeStringify)(bytes);\n}\nexports.default = v6;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f7/contractdrawingcategoryentity_f7e4dfe86e367746d72c3af0ff6cf9f8 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f7/contractdrawingcategoryentity_f7e4dfe86e367746d72c3af0ff6cf9f8 new file mode 100644 index 0000000..497a104 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f7/contractdrawingcategoryentity_f7e4dfe86e367746d72c3af0ff6cf9f8 @@ -0,0 +1,60 @@ +d07a108f4201dfee75306d69b994fde2 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ContractDrawingCategory = void 0; +const typeorm_1 = require("typeorm"); +const project_entity_1 = require("../../project/entities/project.entity"); +let ContractDrawingCategory = class ContractDrawingCategory { +}; +exports.ContractDrawingCategory = ContractDrawingCategory; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)(), + __metadata("design:type", Number) +], ContractDrawingCategory.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id' }), + __metadata("design:type", Number) +], ContractDrawingCategory.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'cat_code', length: 50 }), + __metadata("design:type", String) +], ContractDrawingCategory.prototype, "catCode", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'cat_name', length: 255 }), + __metadata("design:type", String) +], ContractDrawingCategory.prototype, "catName", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'text', nullable: true }), + __metadata("design:type", String) +], ContractDrawingCategory.prototype, "description", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'sort_order', default: 0 }), + __metadata("design:type", Number) +], ContractDrawingCategory.prototype, "sortOrder", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], ContractDrawingCategory.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], ContractDrawingCategory.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => project_entity_1.Project), + (0, typeorm_1.JoinColumn)({ name: 'project_id' }), + __metadata("design:type", typeof (_c = typeof project_entity_1.Project !== "undefined" && project_entity_1.Project) === "function" ? _c : Object) +], ContractDrawingCategory.prototype, "project", void 0); +exports.ContractDrawingCategory = ContractDrawingCategory = __decorate([ + (0, typeorm_1.Entity)('contract_drawing_cats') +], ContractDrawingCategory); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZHJhd2luZ1xcZW50aXRpZXNcXGNvbnRyYWN0LWRyYXdpbmctY2F0ZWdvcnkuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxxQ0FRaUI7QUFDakIsMEVBQWdFO0FBR3pELElBQU0sdUJBQXVCLEdBQTdCLE1BQU0sdUJBQXVCO0NBNEJuQyxDQUFBO0FBNUJZLDBEQUF1QjtBQUVsQztJQURDLElBQUEsZ0NBQXNCLEdBQUU7O21EQUNiO0FBR1o7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7OzBEQUNaO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7O3dEQUN4QjtBQUdqQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOzt3REFDekI7QUFHakI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7NERBQ3BCO0FBR3JCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7OzBEQUN4QjtBQUduQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTswREFBQztBQUdqQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTswREFBQztBQUlqQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyx3QkFBTyxDQUFDO0lBQ3hCLElBQUEsb0JBQVUsRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztrREFDekIsd0JBQU8sb0JBQVAsd0JBQU87d0RBQUM7a0NBM0JQLHVCQUF1QjtJQURuQyxJQUFBLGdCQUFNLEVBQUMsdUJBQXVCLENBQUM7R0FDbkIsdUJBQXVCLENBNEJuQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcYmFja2VuZFxcc3JjXFxtb2R1bGVzXFxkcmF3aW5nXFxlbnRpdGllc1xcY29udHJhY3QtZHJhd2luZy1jYXRlZ29yeS5lbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW50aXR5LFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBDb2x1bW4sXG4gIENyZWF0ZURhdGVDb2x1bW4sXG4gIFVwZGF0ZURhdGVDb2x1bW4sXG4gIE1hbnlUb09uZSxcbiAgSm9pbkNvbHVtbixcbn0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC9lbnRpdGllcy9wcm9qZWN0LmVudGl0eSc7XG5cbkBFbnRpdHkoJ2NvbnRyYWN0X2RyYXdpbmdfY2F0cycpXG5leHBvcnQgY2xhc3MgQ29udHJhY3REcmF3aW5nQ2F0ZWdvcnkge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIGlkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAncHJvamVjdF9pZCcgfSlcbiAgcHJvamVjdElkITogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAnY2F0X2NvZGUnLCBsZW5ndGg6IDUwIH0pXG4gIGNhdENvZGUhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdjYXRfbmFtZScsIGxlbmd0aDogMjU1IH0pXG4gIGNhdE5hbWUhOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdzb3J0X29yZGVyJywgZGVmYXVsdDogMCB9KVxuICBzb3J0T3JkZXIhOiBudW1iZXI7XG5cbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxuICB1cGRhdGVkQXQhOiBEYXRlO1xuXG4gIEBNYW55VG9PbmUoKCkgPT4gUHJvamVjdClcbiAgQEpvaW5Db2x1bW4oeyBuYW1lOiAncHJvamVjdF9pZCcgfSlcbiAgcHJvamVjdCE6IFByb2plY3Q7XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f7/contractdrawingcategoryentity_f7e4dfe86e367746d72c3af0ff6cf9f8.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f7/contractdrawingcategoryentity_f7e4dfe86e367746d72c3af0ff6cf9f8.map new file mode 100644 index 0000000..6d2b3a1 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/f7/contractdrawingcategoryentity_f7e4dfe86e367746d72c3af0ff6cf9f8.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\contract-drawing-category.entity.ts","mappings":";;;;;;;;;;;;;AAAA,qCAQiB;AACjB,0EAAgE;AAGzD,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;CA4BnC,CAAA;AA5BY,0DAAuB;AAElC;IADC,IAAA,gCAAsB,GAAE;;mDACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;0DACZ;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;wDACxB;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;wDACzB;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4DACpB;AAGrB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;0DACxB;AAGnB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;0DAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;0DAAC;AAIjB;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,wBAAO,CAAC;IACxB,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDACzB,wBAAO,oBAAP,wBAAO;wDAAC;kCA3BP,uBAAuB;IADnC,IAAA,gBAAM,EAAC,uBAAuB,CAAC;GACnB,uBAAuB,CA4BnC","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\drawing\\entities\\contract-drawing-category.entity.ts"],"sourcesContent":["import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n CreateDateColumn,\n UpdateDateColumn,\n ManyToOne,\n JoinColumn,\n} from 'typeorm';\nimport { Project } from '../../project/entities/project.entity';\n\n@Entity('contract_drawing_cats')\nexport class ContractDrawingCategory {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @Column({ name: 'project_id' })\n projectId!: number;\n\n @Column({ name: 'cat_code', length: 50 })\n catCode!: string;\n\n @Column({ name: 'cat_name', length: 255 })\n catName!: string;\n\n @Column({ type: 'text', nullable: true })\n description?: string;\n\n @Column({ name: 'sort_order', default: 0 })\n sortOrder!: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n @ManyToOne(() => Project)\n @JoinColumn({ name: 'project_id' })\n project!: Project;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fc/documentnumberreservationentity_fc2513a9000bc0c62e55ef0a27371865 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fc/documentnumberreservationentity_fc2513a9000bc0c62e55ef0a27371865 new file mode 100644 index 0000000..3eb76a7 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fc/documentnumberreservationentity_fc2513a9000bc0c62e55ef0a27371865 @@ -0,0 +1,126 @@ +fc5abb1e0c451d2735d26a92e2094427 +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DocumentNumberReservation = exports.ReservationStatus = void 0; +const typeorm_1 = require("typeorm"); +var ReservationStatus; +(function (ReservationStatus) { + ReservationStatus["RESERVED"] = "RESERVED"; + ReservationStatus["CONFIRMED"] = "CONFIRMED"; + ReservationStatus["CANCELLED"] = "CANCELLED"; + ReservationStatus["VOID"] = "VOID"; +})(ReservationStatus || (exports.ReservationStatus = ReservationStatus = {})); +let DocumentNumberReservation = class DocumentNumberReservation { +}; +exports.DocumentNumberReservation = DocumentNumberReservation; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)({ type: 'int' }), + __metadata("design:type", Number) +], DocumentNumberReservation.prototype, "id", void 0); +__decorate([ + (0, typeorm_1.Index)(), + (0, typeorm_1.Column)({ type: 'varchar', length: 36, unique: true }), + __metadata("design:type", String) +], DocumentNumberReservation.prototype, "token", void 0); +__decorate([ + (0, typeorm_1.Index)(), + (0, typeorm_1.Column)({ + name: 'document_number', + type: 'varchar', + length: 100, + unique: true, + }), + __metadata("design:type", String) +], DocumentNumberReservation.prototype, "documentNumber", void 0); +__decorate([ + (0, typeorm_1.Index)(), + (0, typeorm_1.Column)({ + name: 'document_number_status', + type: 'enum', + enum: ReservationStatus, + default: ReservationStatus.RESERVED, + }), + __metadata("design:type", String) +], DocumentNumberReservation.prototype, "status", void 0); +__decorate([ + (0, typeorm_1.Index)(), + (0, typeorm_1.Column)({ name: 'document_id', type: 'int', nullable: true }), + __metadata("design:type", Object) +], DocumentNumberReservation.prototype, "documentId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'project_id', type: 'int' }), + __metadata("design:type", Number) +], DocumentNumberReservation.prototype, "projectId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'correspondence_type_id', type: 'int' }), + __metadata("design:type", Number) +], DocumentNumberReservation.prototype, "correspondenceTypeId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'originator_organization_id', type: 'int' }), + __metadata("design:type", Number) +], DocumentNumberReservation.prototype, "originatorOrganizationId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'recipient_organization_id', type: 'int', default: 0 }), + __metadata("design:type", Number) +], DocumentNumberReservation.prototype, "recipientOrganizationId", void 0); +__decorate([ + (0, typeorm_1.Index)(), + (0, typeorm_1.Column)({ name: 'user_id', type: 'int' }), + __metadata("design:type", Number) +], DocumentNumberReservation.prototype, "userId", void 0); +__decorate([ + (0, typeorm_1.Index)(), + (0, typeorm_1.CreateDateColumn)({ name: 'reserved_at', type: 'datetime', precision: 6 }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], DocumentNumberReservation.prototype, "reservedAt", void 0); +__decorate([ + (0, typeorm_1.Index)(), + (0, typeorm_1.Column)({ name: 'expires_at', type: 'datetime', precision: 6 }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], DocumentNumberReservation.prototype, "expiresAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'confirmed_at', + type: 'datetime', + precision: 6, + nullable: true, + }), + __metadata("design:type", Object) +], DocumentNumberReservation.prototype, "confirmedAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ + name: 'cancelled_at', + type: 'datetime', + precision: 6, + nullable: true, + }), + __metadata("design:type", Object) +], DocumentNumberReservation.prototype, "cancelledAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'ip_address', type: 'varchar', length: 45, nullable: true }), + __metadata("design:type", Object) +], DocumentNumberReservation.prototype, "ipAddress", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'user_agent', type: 'text', nullable: true }), + __metadata("design:type", Object) +], DocumentNumberReservation.prototype, "userAgent", void 0); +__decorate([ + (0, typeorm_1.Column)({ type: 'json', nullable: true }), + __metadata("design:type", Object) +], DocumentNumberReservation.prototype, "metadata", void 0); +exports.DocumentNumberReservation = DocumentNumberReservation = __decorate([ + (0, typeorm_1.Entity)('document_number_reservations'), + (0, typeorm_1.Index)('idx_token', ['token']), + (0, typeorm_1.Index)('idx_status_expires', ['status', 'expiresAt']) +], DocumentNumberReservation); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxlbnRpdGllc1xcZG9jdW1lbnQtbnVtYmVyLXJlc2VydmF0aW9uLmVudGl0eS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEscUNBTWlCO0FBRWpCLElBQVksaUJBS1g7QUFMRCxXQUFZLGlCQUFpQjtJQUMzQiwwQ0FBcUIsQ0FBQTtJQUNyQiw0Q0FBdUIsQ0FBQTtJQUN2Qiw0Q0FBdUIsQ0FBQTtJQUN2QixrQ0FBYSxDQUFBO0FBQ2YsQ0FBQyxFQUxXLGlCQUFpQixpQ0FBakIsaUJBQWlCLFFBSzVCO0FBS00sSUFBTSx5QkFBeUIsR0FBL0IsTUFBTSx5QkFBeUI7Q0E4RXJDLENBQUE7QUE5RVksOERBQXlCO0FBRXBDO0lBREMsSUFBQSxnQ0FBc0IsRUFBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7cURBQzVCO0FBSVo7SUFGQyxJQUFBLGVBQUssR0FBRTtJQUNQLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7O3dEQUN2QztBQVNmO0lBUEMsSUFBQSxlQUFLLEdBQUU7SUFDUCxJQUFBLGdCQUFNLEVBQUM7UUFDTixJQUFJLEVBQUUsaUJBQWlCO1FBQ3ZCLElBQUksRUFBRSxTQUFTO1FBQ2YsTUFBTSxFQUFFLEdBQUc7UUFDWCxNQUFNLEVBQUUsSUFBSTtLQUNiLENBQUM7O2lFQUNzQjtBQVN4QjtJQVBDLElBQUEsZUFBSyxHQUFFO0lBQ1AsSUFBQSxnQkFBTSxFQUFDO1FBQ04sSUFBSSxFQUFFLHdCQUF3QjtRQUM5QixJQUFJLEVBQUUsTUFBTTtRQUNaLElBQUksRUFBRSxpQkFBaUI7UUFDdkIsT0FBTyxFQUFFLGlCQUFpQixDQUFDLFFBQVE7S0FDcEMsQ0FBQzs7eURBQ3lCO0FBSTNCO0lBRkMsSUFBQSxlQUFLLEdBQUU7SUFDUCxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzs2REFDbEM7QUFHM0I7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7NERBQ3pCO0FBR25CO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLHdCQUF3QixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7dUVBQzFCO0FBRzlCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLDRCQUE0QixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7MkVBQzFCO0FBR2xDO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLDJCQUEyQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDOzswRUFDdEM7QUFJakM7SUFGQyxJQUFBLGVBQUssR0FBRTtJQUNQLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDOzt5REFDekI7QUFJaEI7SUFGQyxJQUFBLGVBQUssR0FBRTtJQUNQLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDO2tEQUM3RCxJQUFJLG9CQUFKLElBQUk7NkRBQUM7QUFJbEI7SUFGQyxJQUFBLGVBQUssR0FBRTtJQUNQLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7a0RBQ25ELElBQUksb0JBQUosSUFBSTs0REFBQztBQVFqQjtJQU5DLElBQUEsZ0JBQU0sRUFBQztRQUNOLElBQUksRUFBRSxjQUFjO1FBQ3BCLElBQUksRUFBRSxVQUFVO1FBQ2hCLFNBQVMsRUFBRSxDQUFDO1FBQ1osUUFBUSxFQUFFLElBQUk7S0FDZixDQUFDOzs4REFDd0I7QUFRMUI7SUFOQyxJQUFBLGdCQUFNLEVBQUM7UUFDTixJQUFJLEVBQUUsY0FBYztRQUNwQixJQUFJLEVBQUUsVUFBVTtRQUNoQixTQUFTLEVBQUUsQ0FBQztRQUNaLFFBQVEsRUFBRSxJQUFJO0tBQ2YsQ0FBQzs7OERBQ3dCO0FBRzFCO0lBREMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzs0REFDbEQ7QUFHMUI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOzs0REFDbkM7QUFHMUI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7MkRBQ0M7b0NBN0UvQix5QkFBeUI7SUFIckMsSUFBQSxnQkFBTSxFQUFDLDhCQUE4QixDQUFDO0lBQ3RDLElBQUEsZUFBSyxFQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdCLElBQUEsZUFBSyxFQUFDLG9CQUFvQixFQUFFLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0dBQ3hDLHlCQUF5QixDQThFckMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcZG9jdW1lbnQtbnVtYmVyaW5nXFxlbnRpdGllc1xcZG9jdW1lbnQtbnVtYmVyLXJlc2VydmF0aW9uLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHksXG4gIENvbHVtbixcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbiAgQ3JlYXRlRGF0ZUNvbHVtbixcbiAgSW5kZXgsXG59IGZyb20gJ3R5cGVvcm0nO1xuXG5leHBvcnQgZW51bSBSZXNlcnZhdGlvblN0YXR1cyB7XG4gIFJFU0VSVkVEID0gJ1JFU0VSVkVEJyxcbiAgQ09ORklSTUVEID0gJ0NPTkZJUk1FRCcsXG4gIENBTkNFTExFRCA9ICdDQU5DRUxMRUQnLFxuICBWT0lEID0gJ1ZPSUQnLFxufVxuXG5ARW50aXR5KCdkb2N1bWVudF9udW1iZXJfcmVzZXJ2YXRpb25zJylcbkBJbmRleCgnaWR4X3Rva2VuJywgWyd0b2tlbiddKVxuQEluZGV4KCdpZHhfc3RhdHVzX2V4cGlyZXMnLCBbJ3N0YXR1cycsICdleHBpcmVzQXQnXSlcbmV4cG9ydCBjbGFzcyBEb2N1bWVudE51bWJlclJlc2VydmF0aW9uIHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oeyB0eXBlOiAnaW50JyB9KVxuICBpZCE6IG51bWJlcjtcblxuICBASW5kZXgoKVxuICBAQ29sdW1uKHsgdHlwZTogJ3ZhcmNoYXInLCBsZW5ndGg6IDM2LCB1bmlxdWU6IHRydWUgfSlcbiAgdG9rZW4hOiBzdHJpbmc7XG5cbiAgQEluZGV4KClcbiAgQENvbHVtbih7XG4gICAgbmFtZTogJ2RvY3VtZW50X251bWJlcicsXG4gICAgdHlwZTogJ3ZhcmNoYXInLFxuICAgIGxlbmd0aDogMTAwLFxuICAgIHVuaXF1ZTogdHJ1ZSxcbiAgfSlcbiAgZG9jdW1lbnROdW1iZXIhOiBzdHJpbmc7XG5cbiAgQEluZGV4KClcbiAgQENvbHVtbih7XG4gICAgbmFtZTogJ2RvY3VtZW50X251bWJlcl9zdGF0dXMnLFxuICAgIHR5cGU6ICdlbnVtJyxcbiAgICBlbnVtOiBSZXNlcnZhdGlvblN0YXR1cyxcbiAgICBkZWZhdWx0OiBSZXNlcnZhdGlvblN0YXR1cy5SRVNFUlZFRCxcbiAgfSlcbiAgc3RhdHVzITogUmVzZXJ2YXRpb25TdGF0dXM7XG5cbiAgQEluZGV4KClcbiAgQENvbHVtbih7IG5hbWU6ICdkb2N1bWVudF9pZCcsIHR5cGU6ICdpbnQnLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBkb2N1bWVudElkITogbnVtYmVyIHwgbnVsbDtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3Byb2plY3RfaWQnLCB0eXBlOiAnaW50JyB9KVxuICBwcm9qZWN0SWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdjb3JyZXNwb25kZW5jZV90eXBlX2lkJywgdHlwZTogJ2ludCcgfSlcbiAgY29ycmVzcG9uZGVuY2VUeXBlSWQhOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdvcmlnaW5hdG9yX29yZ2FuaXphdGlvbl9pZCcsIHR5cGU6ICdpbnQnIH0pXG4gIG9yaWdpbmF0b3JPcmdhbml6YXRpb25JZCE6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbmFtZTogJ3JlY2lwaWVudF9vcmdhbml6YXRpb25faWQnLCB0eXBlOiAnaW50JywgZGVmYXVsdDogMCB9KVxuICByZWNpcGllbnRPcmdhbml6YXRpb25JZCE6IG51bWJlcjtcblxuICBASW5kZXgoKVxuICBAQ29sdW1uKHsgbmFtZTogJ3VzZXJfaWQnLCB0eXBlOiAnaW50JyB9KVxuICB1c2VySWQhOiBudW1iZXI7XG5cbiAgQEluZGV4KClcbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAncmVzZXJ2ZWRfYXQnLCB0eXBlOiAnZGF0ZXRpbWUnLCBwcmVjaXNpb246IDYgfSlcbiAgcmVzZXJ2ZWRBdCE6IERhdGU7XG5cbiAgQEluZGV4KClcbiAgQENvbHVtbih7IG5hbWU6ICdleHBpcmVzX2F0JywgdHlwZTogJ2RhdGV0aW1lJywgcHJlY2lzaW9uOiA2IH0pXG4gIGV4cGlyZXNBdCE6IERhdGU7XG5cbiAgQENvbHVtbih7XG4gICAgbmFtZTogJ2NvbmZpcm1lZF9hdCcsXG4gICAgdHlwZTogJ2RhdGV0aW1lJyxcbiAgICBwcmVjaXNpb246IDYsXG4gICAgbnVsbGFibGU6IHRydWUsXG4gIH0pXG4gIGNvbmZpcm1lZEF0ITogRGF0ZSB8IG51bGw7XG5cbiAgQENvbHVtbih7XG4gICAgbmFtZTogJ2NhbmNlbGxlZF9hdCcsXG4gICAgdHlwZTogJ2RhdGV0aW1lJyxcbiAgICBwcmVjaXNpb246IDYsXG4gICAgbnVsbGFibGU6IHRydWUsXG4gIH0pXG4gIGNhbmNlbGxlZEF0ITogRGF0ZSB8IG51bGw7XG5cbiAgQENvbHVtbih7IG5hbWU6ICdpcF9hZGRyZXNzJywgdHlwZTogJ3ZhcmNoYXInLCBsZW5ndGg6IDQ1LCBudWxsYWJsZTogdHJ1ZSB9KVxuICBpcEFkZHJlc3MhOiBzdHJpbmcgfCBudWxsO1xuXG4gIEBDb2x1bW4oeyBuYW1lOiAndXNlcl9hZ2VudCcsIHR5cGU6ICd0ZXh0JywgbnVsbGFibGU6IHRydWUgfSlcbiAgdXNlckFnZW50ITogc3RyaW5nIHwgbnVsbDtcblxuICBAQ29sdW1uKHsgdHlwZTogJ2pzb24nLCBudWxsYWJsZTogdHJ1ZSB9KVxuICBtZXRhZGF0YSE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbDtcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fc/documentnumberreservationentity_fc2513a9000bc0c62e55ef0a27371865.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fc/documentnumberreservationentity_fc2513a9000bc0c62e55ef0a27371865.map new file mode 100644 index 0000000..7d4e743 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fc/documentnumberreservationentity_fc2513a9000bc0c62e55ef0a27371865.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\entities\\document-number-reservation.entity.ts","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\entities\\document-number-reservation.entity.ts"],"sourcesContent":["import {\n Entity,\n Column,\n PrimaryGeneratedColumn,\n CreateDateColumn,\n Index,\n} from 'typeorm';\n\nexport enum ReservationStatus {\n RESERVED = 'RESERVED',\n CONFIRMED = 'CONFIRMED',\n CANCELLED = 'CANCELLED',\n VOID = 'VOID',\n}\n\n@Entity('document_number_reservations')\n@Index('idx_token', ['token'])\n@Index('idx_status_expires', ['status', 'expiresAt'])\nexport class DocumentNumberReservation {\n @PrimaryGeneratedColumn({ type: 'int' })\n id!: number;\n\n @Index()\n @Column({ type: 'varchar', length: 36, unique: true })\n token!: string;\n\n @Index()\n @Column({\n name: 'document_number',\n type: 'varchar',\n length: 100,\n unique: true,\n })\n documentNumber!: string;\n\n @Index()\n @Column({\n name: 'document_number_status',\n type: 'enum',\n enum: ReservationStatus,\n default: ReservationStatus.RESERVED,\n })\n status!: ReservationStatus;\n\n @Index()\n @Column({ name: 'document_id', type: 'int', nullable: true })\n documentId!: number | null;\n\n @Column({ name: 'project_id', type: 'int' })\n projectId!: number;\n\n @Column({ name: 'correspondence_type_id', type: 'int' })\n correspondenceTypeId!: number;\n\n @Column({ name: 'originator_organization_id', type: 'int' })\n originatorOrganizationId!: number;\n\n @Column({ name: 'recipient_organization_id', type: 'int', default: 0 })\n recipientOrganizationId!: number;\n\n @Index()\n @Column({ name: 'user_id', type: 'int' })\n userId!: number;\n\n @Index()\n @CreateDateColumn({ name: 'reserved_at', type: 'datetime', precision: 6 })\n reservedAt!: Date;\n\n @Index()\n @Column({ name: 'expires_at', type: 'datetime', precision: 6 })\n expiresAt!: Date;\n\n @Column({\n name: 'confirmed_at',\n type: 'datetime',\n precision: 6,\n nullable: true,\n })\n confirmedAt!: Date | null;\n\n @Column({\n name: 'cancelled_at',\n type: 'datetime',\n precision: 6,\n nullable: true,\n })\n cancelledAt!: Date | null;\n\n @Column({ name: 'ip_address', type: 'varchar', length: 45, nullable: true })\n ipAddress!: string | null;\n\n @Column({ name: 'user_agent', type: 'text', nullable: true })\n userAgent!: string | null;\n\n @Column({ type: 'json', nullable: true })\n metadata!: Record | null;\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fc/regex_fc3895a35aab4118dfe668d885715538 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fc/regex_fc3895a35aab4118dfe668d885715538 new file mode 100644 index 0000000..d715d5f --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fc/regex_fc3895a35aab4118dfe668d885715538 @@ -0,0 +1,5 @@ +5e0212b1ae7e2046c1727fbc3b758e08 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xccmVnZXguanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDO0FBQ2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUQsT0FBTyxDQUFDLE9BQU8sR0FBRywwSkFBMEosQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyJEOlxcbmFwLWRtcy5sY2JwM1xcbm9kZV9tb2R1bGVzXFwucG5wbVxcdXVpZEAxMS4xLjBcXG5vZGVfbW9kdWxlc1xcdXVpZFxcZGlzdFxcY2pzXFxyZWdleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdCA9IC9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtOF1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwfGZmZmZmZmZmLWZmZmYtZmZmZi1mZmZmLWZmZmZmZmZmZmZmZikkL2k7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fc/regex_fc3895a35aab4118dfe668d885715538.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fc/regex_fc3895a35aab4118dfe668d885715538.map new file mode 100644 index 0000000..c9ec2dd --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fc/regex_fc3895a35aab4118dfe668d885715538.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\regex.js","mappings":"AAAA,YAAY,CAAC;AACb,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,OAAO,CAAC,OAAO,GAAG,0JAA0J,CAAC","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\regex.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fd/userentity_fdca98e7b265cfba4cee3f0fcd57da00 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fd/userentity_fdca98e7b265cfba4cee3f0fcd57da00 new file mode 100644 index 0000000..c7678a4 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fd/userentity_fdca98e7b265cfba4cee3f0fcd57da00 @@ -0,0 +1,110 @@ +a0f2e0837ba334bb61318f5ef094c823 +"use strict"; +// File: src/modules/user/entities/user.entity.ts +// บันทึกการแก้ไข: เพิ่ม Relations กับ UserAssignment และ UserPreference (T1.3) +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a, _b, _c, _d, _e, _f, _g; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.User = void 0; +const typeorm_1 = require("typeorm"); +const organization_entity_1 = require("../../organization/entities/organization.entity"); // Adjust path as needed +const user_assignment_entity_1 = require("./user-assignment.entity"); +const user_preference_entity_1 = require("./user-preference.entity"); +const uuid_base_entity_1 = require("../../../common/entities/uuid-base.entity"); +const class_transformer_1 = require("class-transformer"); +let User = class User extends uuid_base_entity_1.UuidBaseEntity { + // ADR-019: Expose UUID instead of INT ID + get primaryOrganizationPublicId() { + return this.organization?.publicId; + } +}; +exports.User = User; +__decorate([ + (0, typeorm_1.PrimaryGeneratedColumn)({ name: 'user_id' }), + (0, class_transformer_1.Exclude)(), + __metadata("design:type", Number) +], User.prototype, "user_id", void 0); +__decorate([ + (0, typeorm_1.Column)({ unique: true, length: 50 }), + __metadata("design:type", String) +], User.prototype, "username", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'password_hash', select: false }) // ไม่ Select Password โดย Default + , + __metadata("design:type", String) +], User.prototype, "password", void 0); +__decorate([ + (0, typeorm_1.Column)({ unique: true, length: 100 }), + __metadata("design:type", String) +], User.prototype, "email", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'first_name', nullable: true, length: 50 }), + __metadata("design:type", String) +], User.prototype, "firstName", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'last_name', nullable: true, length: 50 }), + __metadata("design:type", String) +], User.prototype, "lastName", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'is_active', default: true }), + __metadata("design:type", Boolean) +], User.prototype, "isActive", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'failed_attempts', default: 0 }), + __metadata("design:type", Number) +], User.prototype, "failedAttempts", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'locked_until', type: 'datetime', nullable: true }), + __metadata("design:type", typeof (_a = typeof Date !== "undefined" && Date) === "function" ? _a : Object) +], User.prototype, "lockedUntil", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'last_login_at', type: 'timestamp', nullable: true }), + __metadata("design:type", typeof (_b = typeof Date !== "undefined" && Date) === "function" ? _b : Object) +], User.prototype, "lastLoginAt", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'line_id', nullable: true, length: 100 }), + __metadata("design:type", String) +], User.prototype, "lineId", void 0); +__decorate([ + (0, typeorm_1.Column)({ name: 'primary_organization_id', nullable: true }), + (0, class_transformer_1.Exclude)() // INT ID - never expose, use primaryOrganizationPublicId instead (ADR-019) + , + __metadata("design:type", Number) +], User.prototype, "primaryOrganizationId", void 0); +__decorate([ + (0, typeorm_1.ManyToOne)(() => organization_entity_1.Organization, { nullable: true, onDelete: 'SET NULL' }), + (0, typeorm_1.JoinColumn)({ name: 'primary_organization_id' }), + __metadata("design:type", typeof (_c = typeof organization_entity_1.Organization !== "undefined" && organization_entity_1.Organization) === "function" ? _c : Object) +], User.prototype, "organization", void 0); +__decorate([ + (0, typeorm_1.OneToMany)(() => user_assignment_entity_1.UserAssignment, (assignment) => assignment.user), + __metadata("design:type", Array) +], User.prototype, "assignments", void 0); +__decorate([ + (0, typeorm_1.OneToOne)(() => user_preference_entity_1.UserPreference, (pref) => pref.user, { cascade: true }), + __metadata("design:type", typeof (_d = typeof user_preference_entity_1.UserPreference !== "undefined" && user_preference_entity_1.UserPreference) === "function" ? _d : Object) +], User.prototype, "preference", void 0); +__decorate([ + (0, typeorm_1.CreateDateColumn)({ name: 'created_at' }), + __metadata("design:type", typeof (_e = typeof Date !== "undefined" && Date) === "function" ? _e : Object) +], User.prototype, "createdAt", void 0); +__decorate([ + (0, typeorm_1.UpdateDateColumn)({ name: 'updated_at' }), + __metadata("design:type", typeof (_f = typeof Date !== "undefined" && Date) === "function" ? _f : Object) +], User.prototype, "updatedAt", void 0); +__decorate([ + (0, typeorm_1.DeleteDateColumn)({ name: 'deleted_at', select: false }), + __metadata("design:type", typeof (_g = typeof Date !== "undefined" && Date) === "function" ? _g : Object) +], User.prototype, "deletedAt", void 0); +exports.User = User = __decorate([ + (0, typeorm_1.Entity)('users') +], User); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcdXNlclxcZW50aXRpZXNcXHVzZXIuZW50aXR5LnRzIiwibWFwcGluZ3MiOiI7QUFBQSxpREFBaUQ7QUFDakQsK0VBQStFOzs7Ozs7Ozs7Ozs7O0FBRS9FLHFDQVdpQjtBQUNqQix5RkFBK0UsQ0FBQyx3QkFBd0I7QUFDeEcscUVBQTBEO0FBQzFELHFFQUEwRDtBQUMxRCxnRkFBMkU7QUFDM0UseURBQTRDO0FBR3JDLElBQU0sSUFBSSxHQUFWLE1BQU0sSUFBSyxTQUFRLGlDQUFjO0lBNEN0Qyx5Q0FBeUM7SUFDekMsSUFBSSwyQkFBMkI7UUFDN0IsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQztJQUNyQyxDQUFDO0NBbUJGLENBQUE7QUFsRVksb0JBQUk7QUFHZjtJQUZDLElBQUEsZ0NBQXNCLEVBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDM0MsSUFBQSwyQkFBTyxHQUFFOztxQ0FDTztBQUdqQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDOztzQ0FDbkI7QUFHbEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLGtDQUFrQzs7O3NDQUNsRTtBQUdsQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOzttQ0FDdkI7QUFHZjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7O3VDQUN4QztBQUduQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7O3NDQUN4QztBQUdsQjtJQURDLElBQUEsZ0JBQU0sRUFBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDOztzQ0FDMUI7QUFHbkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDOzs0Q0FDeEI7QUFHeEI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO2tEQUNyRCxJQUFJLG9CQUFKLElBQUk7eUNBQUM7QUFHbkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO2tEQUN2RCxJQUFJLG9CQUFKLElBQUk7eUNBQUM7QUFHbkI7SUFEQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDOztvQ0FDekM7QUFLaEI7SUFGQyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxJQUFJLEVBQUUseUJBQXlCLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzNELElBQUEsMkJBQU8sR0FBRSxDQUFDLDJFQUEyRTs7O21EQUN2RDtBQUkvQjtJQUZDLElBQUEsbUJBQVMsRUFBQyxHQUFHLEVBQUUsQ0FBQyxrQ0FBWSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUM7SUFDdkUsSUFBQSxvQkFBVSxFQUFDLEVBQUUsSUFBSSxFQUFFLHlCQUF5QixFQUFFLENBQUM7a0RBQ2pDLGtDQUFZLG9CQUFaLGtDQUFZOzBDQUFDO0FBUzVCO0lBREMsSUFBQSxtQkFBUyxFQUFDLEdBQUcsRUFBRSxDQUFDLHVDQUFjLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7O3lDQUNsQztBQUkvQjtJQURDLElBQUEsa0JBQVEsRUFBQyxHQUFHLEVBQUUsQ0FBQyx1Q0FBYyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO2tEQUMxRCx1Q0FBYyxvQkFBZCx1Q0FBYzt3Q0FBQztBQUk1QjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTt1Q0FBQztBQUdqQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7a0RBQzdCLElBQUksb0JBQUosSUFBSTt1Q0FBQztBQUdqQjtJQURDLElBQUEsMEJBQWdCLEVBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztrREFDNUMsSUFBSSxvQkFBSixJQUFJO3VDQUFDO2VBakVOLElBQUk7SUFEaEIsSUFBQSxnQkFBTSxFQUFDLE9BQU8sQ0FBQztHQUNILElBQUksQ0FrRWhCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXHVzZXJcXGVudGl0aWVzXFx1c2VyLmVudGl0eS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGaWxlOiBzcmMvbW9kdWxlcy91c2VyL2VudGl0aWVzL3VzZXIuZW50aXR5LnRzXHJcbi8vIOC4muC4seC4meC4l+C4tuC4geC4geC4suC4o+C5geC4geC5ieC5hOC4gjog4LmA4Lie4Li04LmI4LihIFJlbGF0aW9ucyDguIHguLHguJogVXNlckFzc2lnbm1lbnQg4LmB4Lil4LiwIFVzZXJQcmVmZXJlbmNlIChUMS4zKVxyXG5cclxuaW1wb3J0IHtcclxuICBFbnRpdHksXHJcbiAgQ29sdW1uLFxyXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXHJcbiAgQ3JlYXRlRGF0ZUNvbHVtbixcclxuICBVcGRhdGVEYXRlQ29sdW1uLFxyXG4gIERlbGV0ZURhdGVDb2x1bW4sXHJcbiAgTWFueVRvT25lLFxyXG4gIE9uZVRvTWFueSxcclxuICBPbmVUb09uZSxcclxuICBKb2luQ29sdW1uLFxyXG59IGZyb20gJ3R5cGVvcm0nO1xyXG5pbXBvcnQgeyBPcmdhbml6YXRpb24gfSBmcm9tICcuLi8uLi9vcmdhbml6YXRpb24vZW50aXRpZXMvb3JnYW5pemF0aW9uLmVudGl0eSc7IC8vIEFkanVzdCBwYXRoIGFzIG5lZWRlZFxyXG5pbXBvcnQgeyBVc2VyQXNzaWdubWVudCB9IGZyb20gJy4vdXNlci1hc3NpZ25tZW50LmVudGl0eSc7XHJcbmltcG9ydCB7IFVzZXJQcmVmZXJlbmNlIH0gZnJvbSAnLi91c2VyLXByZWZlcmVuY2UuZW50aXR5JztcclxuaW1wb3J0IHsgVXVpZEJhc2VFbnRpdHkgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZW50aXRpZXMvdXVpZC1iYXNlLmVudGl0eSc7XHJcbmltcG9ydCB7IEV4Y2x1ZGUgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XHJcblxyXG5ARW50aXR5KCd1c2VycycpXHJcbmV4cG9ydCBjbGFzcyBVc2VyIGV4dGVuZHMgVXVpZEJhc2VFbnRpdHkge1xyXG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKHsgbmFtZTogJ3VzZXJfaWQnIH0pXHJcbiAgQEV4Y2x1ZGUoKVxyXG4gIHVzZXJfaWQhOiBudW1iZXI7XHJcblxyXG4gIEBDb2x1bW4oeyB1bmlxdWU6IHRydWUsIGxlbmd0aDogNTAgfSlcclxuICB1c2VybmFtZSE6IHN0cmluZztcclxuXHJcbiAgQENvbHVtbih7IG5hbWU6ICdwYXNzd29yZF9oYXNoJywgc2VsZWN0OiBmYWxzZSB9KSAvLyDguYTguKHguYggU2VsZWN0IFBhc3N3b3JkIOC5guC4lOC4oiBEZWZhdWx0XHJcbiAgcGFzc3dvcmQhOiBzdHJpbmc7XHJcblxyXG4gIEBDb2x1bW4oeyB1bmlxdWU6IHRydWUsIGxlbmd0aDogMTAwIH0pXHJcbiAgZW1haWwhOiBzdHJpbmc7XHJcblxyXG4gIEBDb2x1bW4oeyBuYW1lOiAnZmlyc3RfbmFtZScsIG51bGxhYmxlOiB0cnVlLCBsZW5ndGg6IDUwIH0pXHJcbiAgZmlyc3ROYW1lPzogc3RyaW5nO1xyXG5cclxuICBAQ29sdW1uKHsgbmFtZTogJ2xhc3RfbmFtZScsIG51bGxhYmxlOiB0cnVlLCBsZW5ndGg6IDUwIH0pXHJcbiAgbGFzdE5hbWU/OiBzdHJpbmc7XHJcblxyXG4gIEBDb2x1bW4oeyBuYW1lOiAnaXNfYWN0aXZlJywgZGVmYXVsdDogdHJ1ZSB9KVxyXG4gIGlzQWN0aXZlITogYm9vbGVhbjtcclxuXHJcbiAgQENvbHVtbih7IG5hbWU6ICdmYWlsZWRfYXR0ZW1wdHMnLCBkZWZhdWx0OiAwIH0pXHJcbiAgZmFpbGVkQXR0ZW1wdHMhOiBudW1iZXI7XHJcblxyXG4gIEBDb2x1bW4oeyBuYW1lOiAnbG9ja2VkX3VudGlsJywgdHlwZTogJ2RhdGV0aW1lJywgbnVsbGFibGU6IHRydWUgfSlcclxuICBsb2NrZWRVbnRpbD86IERhdGU7XHJcblxyXG4gIEBDb2x1bW4oeyBuYW1lOiAnbGFzdF9sb2dpbl9hdCcsIHR5cGU6ICd0aW1lc3RhbXAnLCBudWxsYWJsZTogdHJ1ZSB9KVxyXG4gIGxhc3RMb2dpbkF0PzogRGF0ZTtcclxuXHJcbiAgQENvbHVtbih7IG5hbWU6ICdsaW5lX2lkJywgbnVsbGFibGU6IHRydWUsIGxlbmd0aDogMTAwIH0pXHJcbiAgbGluZUlkPzogc3RyaW5nO1xyXG5cclxuICAvLyBSZWxhdGlvbiDguIHguLHguJogT3JnYW5pemF0aW9uICjguKrguLHguIfguIHguLHguJTguKvguKXguLHguIEpXHJcbiAgQENvbHVtbih7IG5hbWU6ICdwcmltYXJ5X29yZ2FuaXphdGlvbl9pZCcsIG51bGxhYmxlOiB0cnVlIH0pXHJcbiAgQEV4Y2x1ZGUoKSAvLyBJTlQgSUQgLSBuZXZlciBleHBvc2UsIHVzZSBwcmltYXJ5T3JnYW5pemF0aW9uUHVibGljSWQgaW5zdGVhZCAoQURSLTAxOSlcclxuICBwcmltYXJ5T3JnYW5pemF0aW9uSWQ/OiBudW1iZXI7XHJcblxyXG4gIEBNYW55VG9PbmUoKCkgPT4gT3JnYW5pemF0aW9uLCB7IG51bGxhYmxlOiB0cnVlLCBvbkRlbGV0ZTogJ1NFVCBOVUxMJyB9KVxyXG4gIEBKb2luQ29sdW1uKHsgbmFtZTogJ3ByaW1hcnlfb3JnYW5pemF0aW9uX2lkJyB9KVxyXG4gIG9yZ2FuaXphdGlvbj86IE9yZ2FuaXphdGlvbjtcclxuXHJcbiAgLy8gQURSLTAxOTogRXhwb3NlIFVVSUQgaW5zdGVhZCBvZiBJTlQgSURcclxuICBnZXQgcHJpbWFyeU9yZ2FuaXphdGlvblB1YmxpY0lkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5vcmdhbml6YXRpb24/LnB1YmxpY0lkO1xyXG4gIH1cclxuXHJcbiAgLy8gUmVsYXRpb24g4LiB4Lix4LiaIEFzc2lnbm1lbnRzIChSQkFDKVxyXG4gIEBPbmVUb01hbnkoKCkgPT4gVXNlckFzc2lnbm1lbnQsIChhc3NpZ25tZW50KSA9PiBhc3NpZ25tZW50LnVzZXIpXHJcbiAgYXNzaWdubWVudHM/OiBVc2VyQXNzaWdubWVudFtdO1xyXG5cclxuICAvLyBSZWxhdGlvbiDguIHguLHguJogUHJlZmVyZW5jZXMgKDE6MSlcclxuICBAT25lVG9PbmUoKCkgPT4gVXNlclByZWZlcmVuY2UsIChwcmVmKSA9PiBwcmVmLnVzZXIsIHsgY2FzY2FkZTogdHJ1ZSB9KVxyXG4gIHByZWZlcmVuY2U/OiBVc2VyUHJlZmVyZW5jZTtcclxuXHJcbiAgLy8gQmFzZSBFbnRpdHkgRmllbGRzXHJcbiAgQENyZWF0ZURhdGVDb2x1bW4oeyBuYW1lOiAnY3JlYXRlZF9hdCcgfSlcclxuICBjcmVhdGVkQXQhOiBEYXRlO1xyXG5cclxuICBAVXBkYXRlRGF0ZUNvbHVtbih7IG5hbWU6ICd1cGRhdGVkX2F0JyB9KVxyXG4gIHVwZGF0ZWRBdCE6IERhdGU7XHJcblxyXG4gIEBEZWxldGVEYXRlQ29sdW1uKHsgbmFtZTogJ2RlbGV0ZWRfYXQnLCBzZWxlY3Q6IGZhbHNlIH0pXHJcbiAgZGVsZXRlZEF0PzogRGF0ZTtcclxufVxyXG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fd/userentity_fdca98e7b265cfba4cee3f0fcd57da00.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fd/userentity_fdca98e7b265cfba4cee3f0fcd57da00.map new file mode 100644 index 0000000..61db0be --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fd/userentity_fdca98e7b265cfba4cee3f0fcd57da00.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\entities\\user.entity.ts","mappings":";AAAA,iDAAiD;AACjD,+EAA+E;;;;;;;;;;;;;AAE/E,qCAWiB;AACjB,yFAA+E,CAAC,wBAAwB;AACxG,qEAA0D;AAC1D,qEAA0D;AAC1D,gFAA2E;AAC3E,yDAA4C;AAGrC,IAAM,IAAI,GAAV,MAAM,IAAK,SAAQ,iCAAc;IA4CtC,yCAAyC;IACzC,IAAI,2BAA2B;QAC7B,OAAO,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC;IACrC,CAAC;CAmBF,CAAA;AAlEY,oBAAI;AAGf;IAFC,IAAA,gCAAsB,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC3C,IAAA,2BAAO,GAAE;;qCACO;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;sCACnB;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,kCAAkC;;;sCAClE;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;mCACvB;AAGf;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;uCACxC;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;sCACxC;AAGlB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;sCAC1B;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;4CACxB;AAGxB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACrD,IAAI,oBAAJ,IAAI;yCAAC;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;kDACvD,IAAI,oBAAJ,IAAI;yCAAC;AAGnB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;oCACzC;AAKhB;IAFC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC3D,IAAA,2BAAO,GAAE,CAAC,2EAA2E;;;mDACvD;AAI/B;IAFC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,kCAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvE,IAAA,oBAAU,EAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC;kDACjC,kCAAY,oBAAZ,kCAAY;0CAAC;AAS5B;IADC,IAAA,mBAAS,EAAC,GAAG,EAAE,CAAC,uCAAc,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;;yCAClC;AAI/B;IADC,IAAA,kBAAQ,EAAC,GAAG,EAAE,CAAC,uCAAc,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;kDAC1D,uCAAc,oBAAd,uCAAc;wCAAC;AAI5B;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;uCAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;kDAC7B,IAAI,oBAAJ,IAAI;uCAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;kDAC5C,IAAI,oBAAJ,IAAI;uCAAC;eAjEN,IAAI;IADhB,IAAA,gBAAM,EAAC,OAAO,CAAC;GACH,IAAI,CAkEhB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\entities\\user.entity.ts"],"sourcesContent":["// File: src/modules/user/entities/user.entity.ts\r\n// บันทึกการแก้ไข: เพิ่ม Relations กับ UserAssignment และ UserPreference (T1.3)\r\n\r\nimport {\r\n Entity,\r\n Column,\r\n PrimaryGeneratedColumn,\r\n CreateDateColumn,\r\n UpdateDateColumn,\r\n DeleteDateColumn,\r\n ManyToOne,\r\n OneToMany,\r\n OneToOne,\r\n JoinColumn,\r\n} from 'typeorm';\r\nimport { Organization } from '../../organization/entities/organization.entity'; // Adjust path as needed\r\nimport { UserAssignment } from './user-assignment.entity';\r\nimport { UserPreference } from './user-preference.entity';\r\nimport { UuidBaseEntity } from '../../../common/entities/uuid-base.entity';\r\nimport { Exclude } from 'class-transformer';\r\n\r\n@Entity('users')\r\nexport class User extends UuidBaseEntity {\r\n @PrimaryGeneratedColumn({ name: 'user_id' })\r\n @Exclude()\r\n user_id!: number;\r\n\r\n @Column({ unique: true, length: 50 })\r\n username!: string;\r\n\r\n @Column({ name: 'password_hash', select: false }) // ไม่ Select Password โดย Default\r\n password!: string;\r\n\r\n @Column({ unique: true, length: 100 })\r\n email!: string;\r\n\r\n @Column({ name: 'first_name', nullable: true, length: 50 })\r\n firstName?: string;\r\n\r\n @Column({ name: 'last_name', nullable: true, length: 50 })\r\n lastName?: string;\r\n\r\n @Column({ name: 'is_active', default: true })\r\n isActive!: boolean;\r\n\r\n @Column({ name: 'failed_attempts', default: 0 })\r\n failedAttempts!: number;\r\n\r\n @Column({ name: 'locked_until', type: 'datetime', nullable: true })\r\n lockedUntil?: Date;\r\n\r\n @Column({ name: 'last_login_at', type: 'timestamp', nullable: true })\r\n lastLoginAt?: Date;\r\n\r\n @Column({ name: 'line_id', nullable: true, length: 100 })\r\n lineId?: string;\r\n\r\n // Relation กับ Organization (สังกัดหลัก)\r\n @Column({ name: 'primary_organization_id', nullable: true })\r\n @Exclude() // INT ID - never expose, use primaryOrganizationPublicId instead (ADR-019)\r\n primaryOrganizationId?: number;\r\n\r\n @ManyToOne(() => Organization, { nullable: true, onDelete: 'SET NULL' })\r\n @JoinColumn({ name: 'primary_organization_id' })\r\n organization?: Organization;\r\n\r\n // ADR-019: Expose UUID instead of INT ID\r\n get primaryOrganizationPublicId(): string | undefined {\r\n return this.organization?.publicId;\r\n }\r\n\r\n // Relation กับ Assignments (RBAC)\r\n @OneToMany(() => UserAssignment, (assignment) => assignment.user)\r\n assignments?: UserAssignment[];\r\n\r\n // Relation กับ Preferences (1:1)\r\n @OneToOne(() => UserPreference, (pref) => pref.user, { cascade: true })\r\n preference?: UserPreference;\r\n\r\n // Base Entity Fields\r\n @CreateDateColumn({ name: 'created_at' })\r\n createdAt!: Date;\r\n\r\n @UpdateDateColumn({ name: 'updated_at' })\r\n updatedAt!: Date;\r\n\r\n @DeleteDateColumn({ name: 'deleted_at', select: false })\r\n deletedAt?: Date;\r\n}\r\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fd/workflowinterface_fd7580bd648c3465dfcf9cf53ba3d4ea b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fd/workflowinterface_fd7580bd648c3465dfcf9cf53ba3d4ea new file mode 100644 index 0000000..c1721ed --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fd/workflowinterface_fd7580bd648c3465dfcf9cf53ba3d4ea @@ -0,0 +1,22 @@ +8f382bf25c0e1695c1c19d67b54839f2 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WorkflowAction = exports.StepStatus = void 0; +// สถานะของการดำเนินการในแต่ละขั้นตอน +var StepStatus; +(function (StepStatus) { + StepStatus["PENDING"] = "PENDING"; + StepStatus["IN_PROGRESS"] = "IN_PROGRESS"; + StepStatus["COMPLETED"] = "COMPLETED"; + StepStatus["REJECTED"] = "REJECTED"; + StepStatus["SKIPPED"] = "SKIPPED"; +})(StepStatus || (exports.StepStatus = StepStatus = {})); +// การกระทำที่ผู้ใช้ทำได้ +var WorkflowAction; +(function (WorkflowAction) { + WorkflowAction["APPROVE"] = "APPROVE"; + WorkflowAction["REJECT"] = "REJECT"; + WorkflowAction["RETURN"] = "RETURN"; + WorkflowAction["ACKNOWLEDGE"] = "ACKNOWLEDGE"; +})(WorkflowAction || (exports.WorkflowAction = WorkflowAction = {})); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXGJhY2tlbmRcXHNyY1xcbW9kdWxlc1xcd29ya2Zsb3ctZW5naW5lXFxpbnRlcmZhY2VzXFx3b3JrZmxvdy5pbnRlcmZhY2UudHMiLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUNBQXFDO0FBQ3JDLElBQVksVUFNWDtBQU5ELFdBQVksVUFBVTtJQUNwQixpQ0FBbUIsQ0FBQTtJQUNuQix5Q0FBMkIsQ0FBQTtJQUMzQixxQ0FBdUIsQ0FBQTtJQUN2QixtQ0FBcUIsQ0FBQTtJQUNyQixpQ0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBTlcsVUFBVSwwQkFBVixVQUFVLFFBTXJCO0FBRUQseUJBQXlCO0FBQ3pCLElBQVksY0FLWDtBQUxELFdBQVksY0FBYztJQUN4QixxQ0FBbUIsQ0FBQTtJQUNuQixtQ0FBaUIsQ0FBQTtJQUNqQixtQ0FBaUIsQ0FBQTtJQUNqQiw2Q0FBMkIsQ0FBQTtBQUM3QixDQUFDLEVBTFcsY0FBYyw4QkFBZCxjQUFjLFFBS3pCIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIkQ6XFxuYXAtZG1zLmxjYnAzXFxiYWNrZW5kXFxzcmNcXG1vZHVsZXNcXHdvcmtmbG93LWVuZ2luZVxcaW50ZXJmYWNlc1xcd29ya2Zsb3cuaW50ZXJmYWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIOC4quC4luC4suC4meC4sOC4guC4reC4h+C4geC4suC4o+C4lOC4s+C5gOC4meC4tOC4meC4geC4suC4o+C5g+C4meC5geC4leC5iOC4peC4sOC4guC4seC5ieC4meC4leC4reC4mVxuZXhwb3J0IGVudW0gU3RlcFN0YXR1cyB7XG4gIFBFTkRJTkcgPSAnUEVORElORycsIC8vIOC4o+C4reC4luC4tuC4h+C4hOC4tOC4p1xuICBJTl9QUk9HUkVTUyA9ICdJTl9QUk9HUkVTUycsIC8vIOC4luC4tuC4h+C4hOC4tOC4p+C5geC4peC5ieC4pyDguKPguK0gYWN0aW9uXG4gIENPTVBMRVRFRCA9ICdDT01QTEVURUQnLCAvLyDguK3guJnguLjguKHguLHguJXguLQv4LiU4Liz4LmA4LiZ4Li04LiZ4LiB4Liy4Lij4LmA4Lij4Li14Lii4Lia4Lij4LmJ4Lit4LiiXG4gIFJFSkVDVEVEID0gJ1JFSkVDVEVEJywgLy8g4LiW4Li54LiB4Lib4Lix4LiU4LiV4LiBXG4gIFNLSVBQRUQgPSAnU0tJUFBFRCcsIC8vIOC4luC4ueC4geC4guC5ieC4suC4oVxufVxuXG4vLyDguIHguLLguKPguIHguKPguLDguJfguLPguJfguLXguYjguJzguLnguYnguYPguIrguYnguJfguLPguYTguJTguYlcbmV4cG9ydCBlbnVtIFdvcmtmbG93QWN0aW9uIHtcbiAgQVBQUk9WRSA9ICdBUFBST1ZFJywgLy8g4Lit4LiZ4Li44Lih4Lix4LiV4Li0IC8g4Lii4Li34LiZ4Lii4Lix4LiZIC8g4Liq4LmI4LiH4LiV4LmI4LitXG4gIFJFSkVDVCA9ICdSRUpFQ1QnLCAvLyDguJvguI/guLTguYDguKrguJggKOC4iOC4miB3b3JrZmxvdyDguJfguLHguJnguJfguLUpXG4gIFJFVFVSTiA9ICdSRVRVUk4nLCAvLyDguKrguYjguIfguIHguKXguLHguJogKOC5hOC4m+C5geC4geC5ieC4oeC4suC5g+C4q+C4oeC5iClcbiAgQUNLTk9XTEVER0UgPSAnQUNLTk9XTEVER0UnLCAvLyDguKPguLHguJrguJfguKPguLLguJogKOC4quC4s+C4q+C4o+C4seC4miBGb3IgSW5mbylcbn1cblxuLy8g4LiC4LmJ4Lit4Lih4Li54Lil4Lie4Li34LmJ4LiZ4LiQ4Liy4LiZ4LiC4Lit4LiH4LiC4Lix4LmJ4LiZ4LiV4Lit4LiZIChTdGVwKSDguJfguLXguYggRW5naW5lIOC4leC5ieC4reC4h+C4o+C4ueC5iVxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd1N0ZXAge1xuICBzZXF1ZW5jZTogbnVtYmVyOyAvLyDguKXguLPguJTguLHguJrguJfguLXguYggKDEsIDIsIDMuLi4pXG4gIGFzc2lnbmVlSWQ/OiBudW1iZXI7IC8vIFVzZXIgSUQg4LiX4Li14LmI4Lij4Lix4Lia4Lic4Li04LiU4LiK4Lit4LiaICjguJbguYnguLLguYDguIjguLLguLDguIjguIfguITguJkpXG4gIG9yZ2FuaXphdGlvbklkPzogbnVtYmVyOyAvLyBPcmcgSUQg4LiX4Li14LmI4Lij4Lix4Lia4Lic4Li04LiU4LiK4Lit4LiaICjguJbguYnguLLguYDguIjguLLguLDguIjguIfguKvguJnguYjguKfguKLguIfguLLguJkpXG4gIHJvbGVJZD86IG51bWJlcjsgLy8gUm9sZSBJRCDguJfguLXguYjguKPguLHguJrguJzguLTguJTguIrguK3guJogKOC4luC5ieC4suC5gOC4iOC4suC4sOC4iOC4h+C4leC4s+C5geC4q+C4meC5iOC4hylcbiAgc3RhdHVzOiBTdGVwU3RhdHVzOyAvLyDguKrguJbguLLguJnguLDguJvguLHguIjguIjguLjguJrguLHguJlcbn1cblxuLy8g4Lic4Lil4Lil4Lix4Lie4LiY4LmM4LiX4Li14LmIIEVuZ2luZSDguIjguLDguJrguK3guIHguYDguKPguLLguKvguKXguLHguIfguIjguLLguIHguJvguKPguLDguKHguKfguKXguJzguKXguYDguKrguKPguYfguIhcbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNpdGlvblJlc3VsdCB7XG4gIG5leHRTdGVwU2VxdWVuY2U6IG51bWJlciB8IG51bGw7IC8vIOC4guC4seC5ieC4meC4leC4reC4meC4leC5iOC4reC5hOC4m+C4hOC4t+C4reC5gOC4peC4guC4l+C4teC5iOC5gOC4l+C5iOC4suC5hOC4q+C4o+C5iCAobnVsbCA9IOC4iOC4miB3b3JrZmxvdylcbiAgc2hvdWxkVXBkYXRlU3RhdHVzOiBib29sZWFuOyAvLyDguJXguYnguK3guIfguK3guLHguJvguYDguJTguJXguKrguJbguLLguJnguLDguYDguK3guIHguKrguLLguKPguKvguKXguLHguIHguYTguKvguKE/ICjguYDguIrguYjguJkg4LmA4Lib4Lil4Li14LmI4Lii4LiZ4LiI4Liy4LiBIElOX1JFVklFVyDguYDguJvguYfguJkgQVBQUk9WRUQpXG4gIGRvY3VtZW50U3RhdHVzPzogc3RyaW5nOyAvLyDguKrguJbguLLguJnguLDguYDguK3guIHguKrguLLguKPguKvguKXguLHguIHguJfguLXguYjguITguKfguKPguIjguLDguYDguJvguYfguJlcbn1cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fd/workflowinterface_fd7580bd648c3465dfcf9cf53ba3d4ea.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fd/workflowinterface_fd7580bd648c3465dfcf9cf53ba3d4ea.map new file mode 100644 index 0000000..f3a748e --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/fd/workflowinterface_fd7580bd648c3465dfcf9cf53ba3d4ea.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\interfaces\\workflow.interface.ts","mappings":";;;AAAA,qCAAqC;AACrC,IAAY,UAMX;AAND,WAAY,UAAU;IACpB,iCAAmB,CAAA;IACnB,yCAA2B,CAAA;IAC3B,qCAAuB,CAAA;IACvB,mCAAqB,CAAA;IACrB,iCAAmB,CAAA;AACrB,CAAC,EANW,UAAU,0BAAV,UAAU,QAMrB;AAED,yBAAyB;AACzB,IAAY,cAKX;AALD,WAAY,cAAc;IACxB,qCAAmB,CAAA;IACnB,mCAAiB,CAAA;IACjB,mCAAiB,CAAA;IACjB,6CAA2B,CAAA;AAC7B,CAAC,EALW,cAAc,8BAAd,cAAc,QAKzB","names":[],"sources":["D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\interfaces\\workflow.interface.ts"],"sourcesContent":["// สถานะของการดำเนินการในแต่ละขั้นตอน\nexport enum StepStatus {\n PENDING = 'PENDING', // รอถึงคิว\n IN_PROGRESS = 'IN_PROGRESS', // ถึงคิวแล้ว รอ action\n COMPLETED = 'COMPLETED', // อนุมัติ/ดำเนินการเรียบร้อย\n REJECTED = 'REJECTED', // ถูกปัดตก\n SKIPPED = 'SKIPPED', // ถูกข้าม\n}\n\n// การกระทำที่ผู้ใช้ทำได้\nexport enum WorkflowAction {\n APPROVE = 'APPROVE', // อนุมัติ / ยืนยัน / ส่งต่อ\n REJECT = 'REJECT', // ปฏิเสธ (จบ workflow ทันที)\n RETURN = 'RETURN', // ส่งกลับ (ไปแก้มาใหม่)\n ACKNOWLEDGE = 'ACKNOWLEDGE', // รับทราบ (สำหรับ For Info)\n}\n\n// ข้อมูลพื้นฐานของขั้นตอน (Step) ที่ Engine ต้องรู้\nexport interface WorkflowStep {\n sequence: number; // ลำดับที่ (1, 2, 3...)\n assigneeId?: number; // User ID ที่รับผิดชอบ (ถ้าเจาะจงคน)\n organizationId?: number; // Org ID ที่รับผิดชอบ (ถ้าเจาะจงหน่วยงาน)\n roleId?: number; // Role ID ที่รับผิดชอบ (ถ้าเจาะจงตำแหน่ง)\n status: StepStatus; // สถานะปัจจุบัน\n}\n\n// ผลลัพธ์ที่ Engine จะบอกเราหลังจากประมวลผลเสร็จ\nexport interface TransitionResult {\n nextStepSequence: number | null; // ขั้นตอนต่อไปคือเลขที่เท่าไหร่ (null = จบ workflow)\n shouldUpdateStatus: boolean; // ต้องอัปเดตสถานะเอกสารหลักไหม? (เช่น เปลี่ยนจาก IN_REVIEW เป็น APPROVED)\n documentStatus?: string; // สถานะเอกสารหลักที่ควรจะเป็น\n}\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ff/v1_ff3aea057c914bf134f062778c2320f8 b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ff/v1_ff3aea057c914bf134f062778c2320f8 new file mode 100644 index 0000000..08713bd --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ff/v1_ff3aea057c914bf134f062778c2320f8 @@ -0,0 +1,89 @@ +10eaccf67b98165b4253a699cd422108 +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.updateV1State = void 0; +const rng_js_1 = require("./rng.js"); +const stringify_js_1 = require("./stringify.js"); +const _state = {}; +function v1(options, buf, offset) { + let bytes; + const isV6 = options?._v6 ?? false; + if (options) { + const optionsKeys = Object.keys(options); + if (optionsKeys.length === 1 && optionsKeys[0] === '_v6') { + options = undefined; + } + } + if (options) { + bytes = v1Bytes(options.random ?? options.rng?.() ?? (0, rng_js_1.default)(), options.msecs, options.nsecs, options.clockseq, options.node, buf, offset); + } + else { + const now = Date.now(); + const rnds = (0, rng_js_1.default)(); + updateV1State(_state, now, rnds); + bytes = v1Bytes(rnds, _state.msecs, _state.nsecs, isV6 ? undefined : _state.clockseq, isV6 ? undefined : _state.node, buf, offset); + } + return buf ?? (0, stringify_js_1.unsafeStringify)(bytes); +} +function updateV1State(state, now, rnds) { + state.msecs ??= -Infinity; + state.nsecs ??= 0; + if (now === state.msecs) { + state.nsecs++; + if (state.nsecs >= 10000) { + state.node = undefined; + state.nsecs = 0; + } + } + else if (now > state.msecs) { + state.nsecs = 0; + } + else if (now < state.msecs) { + state.node = undefined; + } + if (!state.node) { + state.node = rnds.slice(10, 16); + state.node[0] |= 0x01; + state.clockseq = ((rnds[8] << 8) | rnds[9]) & 0x3fff; + } + state.msecs = now; + return state; +} +exports.updateV1State = updateV1State; +function v1Bytes(rnds, msecs, nsecs, clockseq, node, buf, offset = 0) { + if (rnds.length < 16) { + throw new Error('Random bytes length must be >= 16'); + } + if (!buf) { + buf = new Uint8Array(16); + offset = 0; + } + else { + if (offset < 0 || offset + 16 > buf.length) { + throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`); + } + } + msecs ??= Date.now(); + nsecs ??= 0; + clockseq ??= ((rnds[8] << 8) | rnds[9]) & 0x3fff; + node ??= rnds.slice(10, 16); + msecs += 12219292800000; + const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; + buf[offset++] = (tl >>> 24) & 0xff; + buf[offset++] = (tl >>> 16) & 0xff; + buf[offset++] = (tl >>> 8) & 0xff; + buf[offset++] = tl & 0xff; + const tmh = ((msecs / 0x100000000) * 10000) & 0xfffffff; + buf[offset++] = (tmh >>> 8) & 0xff; + buf[offset++] = tmh & 0xff; + buf[offset++] = ((tmh >>> 24) & 0xf) | 0x10; + buf[offset++] = (tmh >>> 16) & 0xff; + buf[offset++] = (clockseq >>> 8) | 0x80; + buf[offset++] = clockseq & 0xff; + for (let n = 0; n < 6; ++n) { + buf[offset++] = node[n]; + } + return buf; +} +exports.default = v1; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdjEuanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDO0FBQ2IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUQsT0FBTyxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUMvQixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDckMsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDakQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLFNBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTTtJQUM1QixJQUFJLEtBQUssQ0FBQztJQUNWLE1BQU0sSUFBSSxHQUFHLE9BQU8sRUFBRSxHQUFHLElBQUksS0FBSyxDQUFDO0lBQ25DLElBQUksT0FBTyxFQUFFLENBQUM7UUFDVixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pDLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ3ZELE9BQU8sR0FBRyxTQUFTLENBQUM7UUFDeEIsQ0FBQztJQUNMLENBQUM7SUFDRCxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ1YsS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUSxF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QUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDbkMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztJQUMzQixHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUM1QyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDcEMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3hDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3pCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDZixDQUFDO0FBQ0QsT0FBTyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiRDpcXG5hcC1kbXMubGNicDNcXG5vZGVfbW9kdWxlc1xcLnBucG1cXHV1aWRAMTEuMS4wXFxub2RlX21vZHVsZXNcXHV1aWRcXGRpc3RcXGNqc1xcdjEuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnVwZGF0ZVYxU3RhdGUgPSB2b2lkIDA7XG5jb25zdCBybmdfanNfMSA9IHJlcXVpcmUoXCIuL3JuZy5qc1wiKTtcbmNvbnN0IHN0cmluZ2lmeV9qc18xID0gcmVxdWlyZShcIi4vc3RyaW5naWZ5LmpzXCIpO1xuY29uc3QgX3N0YXRlID0ge307XG5mdW5jdGlvbiB2MShvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICAgIGxldCBieXRlcztcbiAgICBjb25zdCBpc1Y2ID0gb3B0aW9ucz8uX3Y2ID8/IGZhbHNlO1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNLZXlzID0gT2JqZWN0LmtleXMob3B0aW9ucyk7XG4gICAgICAgIGlmIChvcHRpb25zS2V5cy5sZW5ndGggPT09IDEgJiYgb3B0aW9uc0tleXNbMF0gPT09ICdfdjYnKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgIGJ5dGVzID0gdjFCeXRlcyhvcHRpb25zLnJhbmRvbSA/PyBvcHRpb25zLnJuZz8uKCkgPz8gKDAsIHJuZ19qc18xLmRlZmF1bHQpKCksIG9wdGlvbnMubXNlY3MsIG9wdGlvbnMubnNlY3MsIG9wdGlvbnMuY2xvY2tzZXEsIG9wdGlvbnMubm9kZSwgYnVmLCBvZmZzZXQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3Qgcm5kcyA9ICgwLCBybmdfanNfMS5kZWZhdWx0KSgpO1xuICAgICAgICB1cGRhdGVWMVN0YXRlKF9zdGF0ZSwgbm93LCBybmRzKTtcbiAgICAgICAgYnl0ZXMgPSB2MUJ5dGVzKHJuZHMsIF9zdGF0ZS5tc2VjcywgX3N0YXRlLm5zZWNzLCBpc1Y2ID8gdW5kZWZpbmVkIDogX3N0YXRlLmNsb2Nrc2VxLCBpc1Y2ID8gdW5kZWZpbmVkIDogX3N0YXRlLm5vZGUsIGJ1Ziwgb2Zmc2V0KTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZiA/PyAoMCwgc3RyaW5naWZ5X2pzXzEudW5zYWZlU3RyaW5naWZ5KShieXRlcyk7XG59XG5mdW5jdGlvbiB1cGRhdGVWMVN0YXRlKHN0YXRlLCBub3csIHJuZHMpIHtcbiAgICBzdGF0ZS5tc2VjcyA/Pz0gLUluZmluaXR5O1xuICAgIHN0YXRlLm5zZWNzID8/PSAwO1xuICAgIGlmIChub3cgPT09IHN0YXRlLm1zZWNzKSB7XG4gICAgICAgIHN0YXRlLm5zZWNzKys7XG4gICAgICAgIGlmIChzdGF0ZS5uc2VjcyA+PSAxMDAwMCkge1xuICAgICAgICAgICAgc3RhdGUubm9kZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHN0YXRlLm5zZWNzID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChub3cgPiBzdGF0ZS5tc2Vjcykge1xuICAgICAgICBzdGF0ZS5uc2VjcyA9IDA7XG4gICAgfVxuICAgIGVsc2UgaWYgKG5vdyA8IHN0YXRlLm1zZWNzKSB7XG4gICAgICAgIHN0YXRlLm5vZGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICghc3RhdGUubm9kZSkge1xuICAgICAgICBzdGF0ZS5ub2RlID0gcm5kcy5zbGljZSgxMCwgMTYpO1xuICAgICAgICBzdGF0ZS5ub2RlWzBdIHw9IDB4MDE7XG4gICAgICAgIHN0YXRlLmNsb2Nrc2VxID0gKChybmRzWzhdIDw8IDgpIHwgcm5kc1s5XSkgJiAweDNmZmY7XG4gICAgfVxuICAgIHN0YXRlLm1zZWNzID0gbm93O1xuICAgIHJldHVybiBzdGF0ZTtcbn1cbmV4cG9ydHMudXBkYXRlVjFTdGF0ZSA9IHVwZGF0ZVYxU3RhdGU7XG5mdW5jdGlvbiB2MUJ5dGVzKHJuZHMsIG1zZWNzLCBuc2VjcywgY2xvY2tzZXEsIG5vZGUsIGJ1Ziwgb2Zmc2V0ID0gMCkge1xuICAgIGlmIChybmRzLmxlbmd0aCA8IDE2KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmFuZG9tIGJ5dGVzIGxlbmd0aCBtdXN0IGJlID49IDE2Jyk7XG4gICAgfVxuICAgIGlmICghYnVmKSB7XG4gICAgICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCArIDE2ID4gYnVmLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVVSUQgYnl0ZSByYW5nZSAke29mZnNldH06JHtvZmZzZXQgKyAxNX0gaXMgb3V0IG9mIGJ1ZmZlciBib3VuZHNgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtc2VjcyA/Pz0gRGF0ZS5ub3coKTtcbiAgICBuc2VjcyA/Pz0gMDtcbiAgICBjbG9ja3NlcSA/Pz0gKChybmRzWzhdIDw8IDgpIHwgcm5kc1s5XSkgJiAweDNmZmY7XG4gICAgbm9kZSA/Pz0gcm5kcy5zbGljZSgxMCwgMTYpO1xuICAgIG1zZWNzICs9IDEyMjE5MjkyODAwMDAwO1xuICAgIGNvbnN0IHRsID0gKChtc2VjcyAmIDB4ZmZmZmZmZikgKiAxMDAwMCArIG5zZWNzKSAlIDB4MTAwMDAwMDAwO1xuICAgIGJ1ZltvZmZzZXQrK10gPSAodGwgPj4+IDI0KSAmIDB4ZmY7XG4gICAgYnVmW29mZnNldCsrXSA9ICh0bCA+Pj4gMTYpICYgMHhmZjtcbiAgICBidWZbb2Zmc2V0KytdID0gKHRsID4+PiA4KSAmIDB4ZmY7XG4gICAgYnVmW29mZnNldCsrXSA9IHRsICYgMHhmZjtcbiAgICBjb25zdCB0bWggPSAoKG1zZWNzIC8gMHgxMDAwMDAwMDApICogMTAwMDApICYgMHhmZmZmZmZmO1xuICAgIGJ1ZltvZmZzZXQrK10gPSAodG1oID4+PiA4KSAmIDB4ZmY7XG4gICAgYnVmW29mZnNldCsrXSA9IHRtaCAmIDB4ZmY7XG4gICAgYnVmW29mZnNldCsrXSA9ICgodG1oID4+PiAyNCkgJiAweGYpIHwgMHgxMDtcbiAgICBidWZbb2Zmc2V0KytdID0gKHRtaCA+Pj4gMTYpICYgMHhmZjtcbiAgICBidWZbb2Zmc2V0KytdID0gKGNsb2Nrc2VxID4+PiA4KSB8IDB4ODA7XG4gICAgYnVmW29mZnNldCsrXSA9IGNsb2Nrc2VxICYgMHhmZjtcbiAgICBmb3IgKGxldCBuID0gMDsgbiA8IDY7ICsrbikge1xuICAgICAgICBidWZbb2Zmc2V0KytdID0gbm9kZVtuXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1Zjtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IHYxO1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ff/v1_ff3aea057c914bf134f062778c2320f8.map b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ff/v1_ff3aea057c914bf134f062778c2320f8.map new file mode 100644 index 0000000..f0ce856 --- /dev/null +++ b/backend/src/.jest-cache/jest-transform-cache-51fed4c0665a260afb7eef9c4f4e1366-12533232bd0f05f65688e7a7764bf3fb/ff/v1_ff3aea057c914bf134f062778c2320f8.map @@ -0,0 +1 @@ +{"file":"D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v1.js","mappings":"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","names":[],"sources":["D:\\nap-dms.lcbp3\\node_modules\\.pnpm\\uuid@11.1.0\\node_modules\\uuid\\dist\\cjs\\v1.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.updateV1State = void 0;\nconst rng_js_1 = require(\"./rng.js\");\nconst stringify_js_1 = require(\"./stringify.js\");\nconst _state = {};\nfunction v1(options, buf, offset) {\n let bytes;\n const isV6 = options?._v6 ?? false;\n if (options) {\n const optionsKeys = Object.keys(options);\n if (optionsKeys.length === 1 && optionsKeys[0] === '_v6') {\n options = undefined;\n }\n }\n if (options) {\n bytes = v1Bytes(options.random ?? options.rng?.() ?? (0, rng_js_1.default)(), options.msecs, options.nsecs, options.clockseq, options.node, buf, offset);\n }\n else {\n const now = Date.now();\n const rnds = (0, rng_js_1.default)();\n updateV1State(_state, now, rnds);\n bytes = v1Bytes(rnds, _state.msecs, _state.nsecs, isV6 ? undefined : _state.clockseq, isV6 ? undefined : _state.node, buf, offset);\n }\n return buf ?? (0, stringify_js_1.unsafeStringify)(bytes);\n}\nfunction updateV1State(state, now, rnds) {\n state.msecs ??= -Infinity;\n state.nsecs ??= 0;\n if (now === state.msecs) {\n state.nsecs++;\n if (state.nsecs >= 10000) {\n state.node = undefined;\n state.nsecs = 0;\n }\n }\n else if (now > state.msecs) {\n state.nsecs = 0;\n }\n else if (now < state.msecs) {\n state.node = undefined;\n }\n if (!state.node) {\n state.node = rnds.slice(10, 16);\n state.node[0] |= 0x01;\n state.clockseq = ((rnds[8] << 8) | rnds[9]) & 0x3fff;\n }\n state.msecs = now;\n return state;\n}\nexports.updateV1State = updateV1State;\nfunction v1Bytes(rnds, msecs, nsecs, clockseq, node, buf, offset = 0) {\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n if (!buf) {\n buf = new Uint8Array(16);\n offset = 0;\n }\n else {\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n }\n msecs ??= Date.now();\n nsecs ??= 0;\n clockseq ??= ((rnds[8] << 8) | rnds[9]) & 0x3fff;\n node ??= rnds.slice(10, 16);\n msecs += 12219292800000;\n const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n buf[offset++] = (tl >>> 24) & 0xff;\n buf[offset++] = (tl >>> 16) & 0xff;\n buf[offset++] = (tl >>> 8) & 0xff;\n buf[offset++] = tl & 0xff;\n const tmh = ((msecs / 0x100000000) * 10000) & 0xfffffff;\n buf[offset++] = (tmh >>> 8) & 0xff;\n buf[offset++] = tmh & 0xff;\n buf[offset++] = ((tmh >>> 24) & 0xf) | 0x10;\n buf[offset++] = (tmh >>> 16) & 0xff;\n buf[offset++] = (clockseq >>> 8) | 0x80;\n buf[offset++] = clockseq & 0xff;\n for (let n = 0; n < 6; ++n) {\n buf[offset++] = node[n];\n }\n return buf;\n}\nexports.default = v1;\n"],"version":3} \ No newline at end of file diff --git a/backend/src/.jest-cache/perf-cache-51fed4c0665a260afb7eef9c4f4e1366-da39a3ee5e6b4b0d3255bfef95601890 b/backend/src/.jest-cache/perf-cache-51fed4c0665a260afb7eef9c4f4e1366-da39a3ee5e6b4b0d3255bfef95601890 index de99ba9..b7ff333 100644 --- a/backend/src/.jest-cache/perf-cache-51fed4c0665a260afb7eef9c4f4e1366-da39a3ee5e6b4b0d3255bfef95601890 +++ b/backend/src/.jest-cache/perf-cache-51fed4c0665a260afb7eef9c4f4e1366-da39a3ee5e6b4b0d3255bfef95601890 @@ -1 +1 @@ -{"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\document-numbering.service.spec.ts":[1,1747],"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.service.spec.ts":[0,2351],"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.controller.spec.ts":[1,2764],"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\migration.service.spec.ts":[1,1560],"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\due-date-reminder.service.spec.ts":[1,1866],"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\migration.controller.spec.ts":[1,1897]} \ No newline at end of file +{"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\document-numbering.service.spec.ts":[1,852],"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.service.spec.ts":[1,1935],"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\correspondence.controller.spec.ts":[1,2180],"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\migration.service.spec.ts":[1,628],"D:\\nap-dms.lcbp3\\backend\\src\\modules\\correspondence\\due-date-reminder.service.spec.ts":[1,1141],"D:\\nap-dms.lcbp3\\backend\\src\\modules\\migration\\migration.controller.spec.ts":[1,1507],"D:\\nap-dms.lcbp3\\backend\\src\\common\\pipes\\parse-uuid.pipe.spec.ts":[1,1043],"D:\\nap-dms.lcbp3\\backend\\src\\common\\services\\uuid-resolver.service.spec.ts":[1,2018],"D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\workflow-engine.service.spec.ts":[1,2079],"D:\\nap-dms.lcbp3\\backend\\src\\modules\\user\\user.service.spec.ts":[1,2089],"D:\\nap-dms.lcbp3\\backend\\src\\common\\auth\\casl\\ability.factory.spec.ts":[1,2135],"D:\\nap-dms.lcbp3\\backend\\src\\common\\file-storage\\file-storage.service.spec.ts":[1,2194],"D:\\nap-dms.lcbp3\\backend\\src\\modules\\project\\project.service.spec.ts":[1,1198],"D:\\nap-dms.lcbp3\\backend\\src\\common\\entities\\uuid-base.entity.spec.ts":[1,267],"D:\\nap-dms.lcbp3\\backend\\src\\modules\\workflow-engine\\dsl\\parser.service.spec.ts":[1,2354],"D:\\nap-dms.lcbp3\\backend\\src\\common\\auth\\auth.service.spec.ts":[1,2520],"D:\\nap-dms.lcbp3\\backend\\src\\app.controller.spec.ts":[1,362],"D:\\nap-dms.lcbp3\\backend\\src\\modules\\document-numbering\\services\\manual-override.service.spec.ts":[1,566],"D:\\nap-dms.lcbp3\\backend\\src\\common\\file-storage\\file-storage.controller.spec.ts":[1,1091],"D:\\nap-dms.lcbp3\\backend\\src\\modules\\project\\project.controller.spec.ts":[1,1249],"D:\\nap-dms.lcbp3\\backend\\src\\common\\auth\\auth.controller.spec.ts":[1,1564],"D:\\nap-dms.lcbp3\\backend\\src\\modules\\json-schema\\json-schema.controller.spec.ts":[1,1508]} \ No newline at end of file diff --git a/backend/src/modules/correspondence/correspondence.service.spec.ts b/backend/src/modules/correspondence/correspondence.service.spec.ts index aa72c36..f9442a7 100644 --- a/backend/src/modules/correspondence/correspondence.service.spec.ts +++ b/backend/src/modules/correspondence/correspondence.service.spec.ts @@ -11,6 +11,7 @@ import { CorrespondenceReference } from './entities/correspondence-reference.ent import { CorrespondenceTag } from './entities/correspondence-tag.entity'; import { Organization } from '../organization/entities/organization.entity'; import { CorrespondenceRecipient } from './entities/correspondence-recipient.entity'; +import { CorrespondenceRevisionAttachment } from './entities/correspondence-revision-attachment.entity'; import { DocumentNumberingService } from '../document-numbering/services/document-numbering.service'; import { JsonSchemaService } from '../json-schema/json-schema.service'; import { WorkflowEngineService } from '../workflow-engine/workflow-engine.service'; @@ -153,6 +154,10 @@ describe('CorrespondenceService', () => { provide: NotificationService, useValue: { send: jest.fn().mockResolvedValue(undefined) }, }, + { + provide: getRepositoryToken(CorrespondenceRevisionAttachment), + useValue: createMockRepository(), + }, ], }).compile();