229 Commits
Author SHA1 Message Date
ivanszabo 1f4fce1e42 X 2025-05-15 14:45:00 +02:00
ivanszabo 73a4b9a445 Na most kaptam TOKENT!!! 2025-05-15 09:39:33 +02:00
ivanszabo 9df2854a3c Firebase teszthez 2025-05-15 09:28:08 +02:00
ivanszabo 7efd090b86 Forebird.CloudMessages implementálása 2025-05-14 21:56:33 +02:00
ivanszabo 9ffbcd87f2 Business és Audit log hozzáadva, WEB-en letölthető 2025-04-28 11:35:30 +02:00
ivanszabo 2fae17fed4 CheckListTemplateHeader törlése WEB-ről 2025-04-25 11:38:09 +02:00
ivanszabo 4025224821 Merge branch 'master' of https://tfs.nuvolar.hu:8443/tfs/AtomERP/_git/WorkFlowCheck 2025-04-25 10:32:08 +02:00
ivanszabo 89c330aa0d CheckListHeader-be új infók 2025-04-25 10:31:43 +02:00
ivanszabo c028b78f1c CheckListHeader-be új infók 2025-04-25 10:31:42 +02:00
ivanszabo a324f5f852 1.1.019 verzió kiadása 2025-04-25 10:31:42 +02:00
ivanszabo 62419a2c28 MOBILE BUGFIX-ek 2025-04-25 10:29:14 +02:00
ivanszabo 1294a00219 Merge branch 'master' of https://tfs.nuvolar.hu:8443/tfs/AtomERP/_git/WorkFlowCheck 2025-04-22 18:38:42 +02:00
ivanszabo 0de851f7d9 Version MOBILE 2025-04-22 18:38:33 +02:00
ivanszabo f80029bd07 API URL beállítása 2025-04-22 18:12:57 +02:00
ivanszabo a8b4aa7b22 ProgramVersion - Backend 2025-04-22 18:05:31 +02:00
ivanszabo 4b674d67ab v1.1.018 Backend 2025-04-22 14:40:02 +02:00
ivanszabo f6e21418b6 v1.1.018 MOBILE 2025-04-22 14:38:43 +02:00
ivanszabo bb8d866778 Javítás a Blokkolt tételekre is. 2025-04-22 14:18:06 +02:00
ivanszabo 3c394f632d Most működik egy tesztelhető verzió. 2025-04-22 14:17:11 +02:00
ivanszabo cba9181a2d Kis kerek gombok + Egyéb nyalánkságok 2025-04-21 19:16:58 +02:00
ivanszabo dbc2f30a27 Jóváhagyás gomb MOBIL-on 2025-04-17 14:39:50 +02:00
ivanszabo 2798aeaf0d Merge branch 'master' of https://tfs.nuvolar.hu:8443/tfs/AtomERP/_git/WorkFlowCheck 2025-04-17 13:30:33 +02:00
ivanszabo bce3c9e401 Feloldás mobilról 2025-04-17 08:41:56 +02:00
ivanszabo 5acf9ff954 PDF könyvtár letöltése 2025-04-16 13:29:07 +02:00
ivanszabo a1d683b955 Fényképek letöltése programból 2025-04-16 12:34:00 +02:00
ivanszabo 335f00367d DeviceMessages-hez backend fejlesztése 2025-04-16 08:42:14 +02:00
ivanszabo 8815df06b3 Figyelmeztető üzenet javítása + hangjelzés 2025-04-16 08:41:30 +02:00
ivanszabo ab86c845ab Merge branch 'master' of https://tfs.nuvolar.hu:8443/tfs/AtomERP/_git/WorkFlowCheck 2025-04-15 19:42:56 +02:00
ivanszabo e151590860 Userhez is lehet már NFC kódot rendelni 2025-04-15 19:42:48 +02:00
ivanszabo 4dbda1aac3 User NFCCode is rögzítésre kerüljön 2025-04-15 19:42:39 +02:00
ivanszabo c51ee750f9 MobileUserDTO javítása 2025-04-15 18:38:16 +02:00
ivanszabo 50dcf3aff6 MobilUser lekérdezése 2025-04-15 15:13:08 +02:00
ivanszabo ae7257a3ff Auditok rendes implementálása 2025-04-15 10:17:19 +02:00
ivanszabo 9c179feeca Teljes log most jó 2025-04-15 08:50:13 +02:00
ivanszabo 380b6ac030 Különböző logok, különböző file-ba 2025-04-14 20:15:00 +02:00
ivanszabo ca71bd2194 Lezárt nem szerkeszthető már 2025-04-14 14:31:35 +02:00
ivanszabo b0a4da67d0 Lezáró az adatbázisba 2025-04-14 14:15:09 +02:00
ivanszabo 8dc902d2fb Lezárás oka a logba 2025-04-14 14:14:18 +02:00
ivanszabo 0811111865 Ellenőrzés lezárása 2025-04-14 14:11:57 +02:00
ivanszabo 29200ae418 Jelszó módosítása 2025-04-14 12:31:50 +02:00
ivanszabo 44e6719c3d Merge branch 'master' of https://tfs.nuvolar.hu:8443/tfs/AtomERP/_git/WorkFlowCheck 2025-04-11 16:19:05 +02:00
ivanszabo 5c5a852ead Release +Version Backend 2025-04-11 16:18:58 +02:00
ivanszabo 70dd745889 Release + version 2025-04-11 16:18:23 +02:00
ivanszabo fad1398668 Csak a Web beállított léphet be 2025-04-11 10:56:51 +02:00
ivanszabo 7a757e84b2 Login továbbfejlesztése 2025-04-11 10:56:51 +02:00
ivanszabo 6d276e73b8 UI rendberakása 2025-04-11 10:55:40 +02:00
ivanszabo 9d107e8c0b Na most van kész a 2 faktoros authentikáció ! :) 2025-04-10 23:32:36 +02:00
ivanszabo aca0a86a6a Két faktor másik lába is kész. 2025-04-10 21:20:55 +02:00
ivanszabo d5a7895efa Kétfaktoros első része ok 2025-04-10 20:49:01 +02:00
ivanszabo 623a3c49b1 MailKit-tel
email küldése
2025-04-10 19:04:59 +02:00
ivanszabo 5356ef7424 Na most már jó lesz. 2025-04-10 16:29:36 +02:00
ivanszabo 1ea8e4fbe7 Verzió a láblécbe 2025-04-10 16:20:07 +02:00
ivanszabo 13b9d943b9 Na most menti a képet is a PDF-be 2025-04-10 16:18:33 +02:00
ivanszabo 06f5a5dd62 UserService Delete metódusai + controller 2025-04-10 14:07:20 +02:00
ivanszabo cd57fc46bc Felhasználó és szabály törlésének befejezése 2025-04-10 13:37:39 +02:00
ivanszabo 7109da0d95 Logger imolemetálása 2025-04-10 10:58:47 +02:00
ivanszabo 6137baff72 publishoz MOBILE 2025-04-10 08:51:04 +02:00
ivanszabo 621d61e08e Publishoz 2025-04-10 08:46:41 +02:00
ivanszabo 02cef1bf23 BUGFIX 2025-04-09 15:38:53 +02:00
ivanszabo e3ee93c74c UI BUGFIX 2025-04-09 15:37:30 +02:00
ivanszabo d383ccccbd Photo beküldésekor 2025-04-09 13:56:36 +02:00
ivanszabo 4eaffbcc4f DeviceMessage 2025-04-08 21:06:03 +02:00
ivanszabo a201e2028e JsonSerialize javítása 2025-04-08 21:05:12 +02:00
ivanszabo 7720f4944a Beküldés javítása 2025-04-08 17:50:47 +02:00
ivanszabo a394c643a2 Javítás 2025-04-08 17:46:22 +02:00
ivanszabo ac48e676df Na most jó a blokkolós cucc 2025-04-08 15:14:19 +02:00
ivanszabo d21ff69cc8 UI blokkolás, feloldás 2025-04-08 15:04:21 +02:00
ivanszabo b5d4a163fd Blokkolás, feloldás 2025-04-08 14:59:35 +02:00
ivanszabo cdaceb1961 Blokkolás, jóváhagyás, ilyesmi. 2025-04-08 14:59:05 +02:00
ivanszabo 2dbcbd1ed8 Mentés fölé csík 2025-04-08 07:42:25 +02:00
ivanszabo c8b8f6ae92 Merge branch 'master' of https://tfs.nuvolar.hu:8443/tfs/AtomERP/_git/WorkFlowCheck 2025-04-07 17:05:44 +02:00
ivanszabo b02fb58f2e Üzenetküldés frontenden 2025-04-07 17:05:40 +02:00
ivanszabo 85976547f6 Most működik az üzenetküldés Backenden 2025-04-07 17:05:27 +02:00
ivanszabo a3be387ee1 Még egy kis UI rendezés 2025-04-07 08:24:04 +02:00
ivanszabo e306139aec Egy kis UI rendezés 2025-04-07 07:57:10 +02:00
ivanszabo 2513765e51 Merge branch 'master' of https://tfs.nuvolar.hu:8443/tfs/AtomERP/_git/WorkFlowCheck 2025-04-06 19:34:29 +02:00
ivanszabo 3366884965 Program letöltés backend zsír!!! 2025-04-06 19:34:12 +02:00
ivanszabo a64304a05f Megy a program letöltése is... 2025-04-06 19:33:47 +02:00
ivanszabo 66744e0526 NFC azonosítás is kész 2025-04-06 14:42:34 +02:00
ivanszabo dc3e6e2f7b NFC azonosítás is beállítva 2025-04-06 14:41:36 +02:00
ivanszabo 71a5850d65 Merge branch 'master' of https://tfs.nuvolar.hu:8443/tfs/AtomERP/_git/WorkFlowCheck 2025-04-05 18:11:57 +02:00
ivanszabo 33232bae75 FÉLKÉSZ 2025-04-05 18:11:42 +02:00
ivanszabo 8dc13c702c DeviceMessages endpoint 2025-04-05 14:53:14 +02:00
ivanszabo 4951fc0c7a Kis tisztogatás, de fordul. 2025-04-05 12:50:57 +02:00
ivanszabo 429ccd2d70 Merge branch 'master' of https://tfs.nuvolar.hu:8443/tfs/AtomERP/_git/WorkFlowCheck 2025-04-05 11:31:16 +02:00
ivanszabo abc90dcec1 com.nuvolar.wfcapp beállítása 2025-04-05 11:31:09 +02:00
ivanszabo 476c9ead4c DisplayNameHelper kifejlesztése 2025-04-04 13:38:07 +02:00
ivanszabo 5b1f7fb642 Továbbfejlesztés 2025-04-04 12:42:47 +02:00
ivanszabo de8b95eda1 Alap töréls Web Locations működik. 2025-04-04 11:30:06 +02:00
ivanszabo fa48365d98 Egy kis lapozás ... 2025-04-03 17:07:12 +02:00
ivanszabo d5e11bc2e4 BaseService BL projektbe 2025-04-03 12:06:40 +02:00
ivanszabo a97c944f12 Merge branch 'master' of https://tfs.nuvolar.hu:8443/tfs/AtomERP/_git/WorkFlowCheck 2025-04-02 16:52:30 +02:00
ivanszabo 92c15072b8 Beküldés és mentés javítása 2025-04-02 16:52:25 +02:00
ivanszabo 001c59a669 LibreOffice-val dokumentum konvertálása PDF-re most jó 2025-04-02 16:51:11 +02:00
ivanszabo 90637b3848 PDF készítés DevExpressel. 2025-04-02 13:01:49 +02:00
ivanszabo 12bf69aadd Photo rendberakása + EF migráció 2025-04-02 10:32:27 +02:00
ivanszabo fe7b52efde Photo rendberakása 2025-04-02 10:32:27 +02:00
ivanszabo c7a3a608ba UI javítás + beküldés, képméretezés 2025-04-02 09:04:28 +02:00
ivanszabo c3fda85182 Merge branch 'master' of https://tfs.nuvolar.hu:8443/tfs/AtomERP/_git/WorkFlowCheck 2025-03-31 22:13:33 +02:00
ivanszabo ea305ebbf4 BUGFIXEK UI oldalon 2025-03-31 22:13:28 +02:00
ivanszabo 5207f32712 BUGFIX-ek 2025-03-31 22:13:17 +02:00
ivanszabo 61dd5bc9a1 Jó kis javítás, fejlesztés TESZT-hez 2025-03-31 19:31:22 +02:00
ivanszabo a7e913b3ee CheckStatus + UI fejlesztése 2025-03-31 15:20:16 +02:00
ivanszabo 7996f887ba IsEnabled a CheckPoint-hoz 2025-03-31 13:39:02 +02:00
ivanszabo 56f17681be RoleCheckPoint 2025-03-31 11:55:24 +02:00
ivanszabo d7c198acfa UI fejlesztés 2025-03-30 22:48:57 +02:00
ivanszabo 8566889cf9 swagger javítása 2025-03-29 09:12:55 +01:00
ivanszabo ce432e1ab0 Merge branch 'master' of https://tfs.nuvolar.hu:8443/tfs/AtomERP/_git/WorkFlowCheck 2025-03-28 20:51:04 +01:00
ivanszabo 146402a96a Snackbar meg ilyesmik 2025-03-28 20:51:00 +01:00
ivanszabo 66cf378556 SyncControl 2025-03-28 20:47:13 +01:00
ivanszabo d3bfeadc50 CheckListService extending 2025-03-28 19:25:35 +01:00
ivanszabo 77796f3247 CheckListRow edit 2025-03-28 17:35:29 +01:00
ivanszabo 728b6a8a9e Merge branch 'NFCTEST' 2025-03-28 15:37:49 +01:00
ivanszabo b69f9af6f3 NFC csak Androidra javítás ... 2025-03-28 15:37:14 +01:00
ivanszabo 148ea094ce UserRole javítása 2025-03-28 13:56:56 +01:00
ivanszabo ddc898cc2e RoleCheckListHeaderTemplate befejezése új/módosítás 2025-03-28 12:55:10 +01:00
ivanszabo f119b196ea RoleCheckListTemplateHeader lista nézet 2025-03-27 12:11:34 +01:00
ivanszabo 04cca012f4 WORD -> PDF 2025-03-27 11:13:42 +01:00
ivanszabo cb38e869a1 CheckListHeader TAB-osítva ... 2025-03-26 10:23:39 +01:00
ivanszabo 83980667d7 CheckListRow megjelenítése 2025-03-26 09:14:27 +01:00
ivanszabo ace4130f31 Entity javítás 2025-03-24 23:29:29 +01:00
ivanszabo 2341b186ef BEMUTATÓRA kész. 2025-03-24 23:26:25 +01:00
ivanszabo ab1de236be Na most jó a beküldéshez a Binding 2025-03-24 20:40:38 +01:00
ivanszabo 3d44804bad Most működik a fénykép 2025-03-24 18:25:12 +01:00
ivanszabo 8f38408646 UI fejlesztése 2025-03-24 16:47:28 +01:00
ivanszabo 29d94c9256 Merge branch 'master' of https://tfs.nuvolar.hu:8443/tfs/AtomERP/_git/WorkFlowCheck 2025-03-24 14:02:29 +01:00
ivanszabo ebe33abf69 Login, NFCWaiter 2025-03-24 14:02:25 +01:00
ivanszabo 50a7eb5521 Egyéb javítások 2025-03-24 14:01:58 +01:00
ivanszabo d55dee91e9 Controller javítása userId-vel 2025-03-22 14:19:00 +01:00
ivanszabo 3a4db4dd14 Van új és folytatható CheckLista 2025-03-22 14:18:25 +01:00
ivanszabo 6d78762275 CheckListHeader lista javítva 2025-03-22 11:19:18 +01:00
ivanszabo 15e6aac88c MAUI belépés OK 2025-03-21 17:28:46 +01:00
ivanszabo 2a5ad1d1c1 CheckListHeader már indul 2025-03-21 17:28:11 +01:00
ivanszabo 3b7fd07dda Elég sok minden... 2025-03-21 16:18:35 +01:00
ivanszabo efecf55dd8 Middleware javítás 2025-03-21 09:57:07 +01:00
ivanszabo 6dcc4989ac Equipment sync javítása 2025-03-20 13:44:24 +01:00
ivanszabo b48b8dbb6c Location is. 2025-03-20 13:20:00 +01:00
ivanszabo ae7ba2342e Equipment is kész. 2025-03-20 13:12:05 +01:00
ivanszabo bd60138a89 Módosítások fejlesztéshez 2025-03-20 09:00:01 +01:00
ivanszabo 7a158ed10d További finomítások 2025-03-19 18:22:45 +01:00
ivanszabo 2e335e7b8a CheckListServices továbbfejlesztése 2025-03-19 18:16:34 +01:00
ivanszabo 63b9beef35 Elég sok minden ... 2025-03-19 14:38:04 +01:00
ivanszabo f74922d01e HU a datatables-hez 2025-03-19 09:59:42 +01:00
ivanszabo 2fd147bb36 UserRole is benn van, de még nem tökéletes. 2025-03-18 13:56:35 +01:00
ivanszabo 9297ff3970 Bootstrap Icon hozzáadása 2025-03-18 13:12:17 +01:00
ivanszabo 8c1966ef4c Role lista hozzáadása 2025-03-18 12:12:12 +01:00
ivanszabo 5097757cfb Web BaseStockService extend 2025-03-18 08:36:55 +01:00
ivanszabo f83765378c User ... DTO extend 2025-03-18 08:36:44 +01:00
ivanszabo b8fcdd5c3d Na most egy validator is beköszönt 2025-03-17 15:01:50 +01:00
ivanszabo 8c1e60889d User továbbgondolása 2025-03-17 12:10:41 +01:00
ivanszabo 0e06382eee Egyéb 2025-03-16 20:31:49 +01:00
ivanszabo 9d113d0b49 IUserService fejlesztése 2025-03-16 20:25:04 +01:00
ivanszabo 8793a1c77c User dolgok javítása 2025-03-15 14:27:08 +01:00
ivanszabo 2d13b0909e Menü kialakítása 2025-03-15 14:18:25 +01:00
ivanszabo 9f1c3df5d6 Equipment, Lokáció de még csak a lista 2025-03-15 14:05:05 +01:00
ivanszabo a72c9b342e MAUI-ba is jól bele lett rakva a Bearer token, ha van. 2025-03-14 12:19:16 +01:00
ivanszabo 50b14e8122 Kis reszelés és jó is lett. 2025-03-14 11:36:42 +01:00
ivanszabo 7f01ca243a Merge branch 'master' of https://tfs.nuvolar.hu:8443/tfs/AtomERP/_git/WorkFlowCheck 2025-03-14 11:34:18 +01:00
ivanszabo 07f617df87 messageModal,confirmModal stb beállítva és működik is. 2025-03-14 11:34:10 +01:00
ivanszabo 52ac278316 JwtMiddleware berakva 2025-03-14 10:25:24 +01:00
ivanszabo 9d0a577c1f Mentés + JwtMiddleware-ből a dolgok berakva 2025-03-14 10:25:08 +01:00
ivanszabo ca789cfbc3 Merge branch 'master' of https://tfs.nuvolar.hu:8443/tfs/AtomERP/_git/WorkFlowCheck 2025-03-14 08:31:55 +01:00
ivanszabo 323af1e600 LogoutModal javítása 2025-03-14 07:55:14 +01:00
ivanszabo e0bca55fc2 Update már Add is ... 2025-03-13 14:41:07 +01:00
ivanszabo d2106514ba POST hogy tudjunk menteni is. 2025-03-13 14:23:19 +01:00
ivanszabo a301a2a168 Na most elvileg jó a saját form postdata cucc 2025-03-13 13:53:16 +01:00
ivanszabo f5a6041a1c Most már ki is tudok jelentkezni 2025-03-12 15:19:03 +01:00
ivanszabo 3091faa94c Most működik alapból 2025-03-12 15:00:37 +01:00
ivanszabo 7c1d89d783 Fontos javítás a bejelentkezéshez 2025-03-12 11:59:03 +01:00
ivanszabo 439d8cafd5 Login fejlesztése 2025-03-12 11:57:16 +01:00
ivanszabo c9ffad0d91 Van normális bejelenkezési ablak 2025-03-12 10:38:30 +01:00
ivanszabo 29e6efc9e0 JwtToken 1.0 2025-03-12 09:48:57 +01:00
ivanszabo da27f7e882 Middleware 1.0 2025-03-11 20:23:14 +01:00
ivanszabo 3071ac7080 API módosítása 2025-03-11 17:01:26 +01:00
ivanszabo 8f9e5df847 WEB most jól működik Datatables-sel. 2025-03-11 16:54:50 +01:00
ivanszabo e5b1649c42 Datatables add 2025-03-11 08:38:14 +01:00
ivanszabo 48b5fb5090 Merge branch 'master' of https://tfs.nuvolar.hu:8443/tfs/AtomERP/_git/WorkFlowCheck 2025-03-11 08:08:35 +01:00
ivanszabo ff33a59e5c Web added to MOBILE 2025-03-11 08:08:29 +01:00
ivanszabo 399ff8f88f lib added to source 2025-03-11 08:07:48 +01:00
ivanszabo cb6e627fea Érték megadása is lehetséges 2025-03-10 15:38:05 +01:00
ivanszabo 3be8a597d0 BUGFIX WhiteSmoke 2025-03-10 15:05:58 +01:00
ivanszabo 1ee1e8fa32 Érték megadása is ! 2025-03-10 15:05:26 +01:00
ivanszabo 762eb19af2 TemplateSelector végre jó! 2025-03-10 13:55:07 +01:00
ivanszabo 943e2a716d Lejönnek a CheckPointhoz tartozó sorok 2025-03-10 09:32:39 +01:00
ivanszabo af607f6079 CheckPoint -y CheckListTemplateRow 2025-03-04 13:26:22 +01:00
ivanszabo 62dee24619 Na most kezd valami kinézni 2025-03-03 19:26:25 +01:00
ivanszabo 1e9fdf7ea5 Még csak lépések vannak ... 2025-03-03 17:03:41 +01:00
ivanszabo 2ad8ba2d51 Még nem tökéletes, EF javítása 2025-03-03 16:56:11 +01:00
ivanszabo d4bad04103 Ez is itt félig kész ... 2025-03-03 13:24:57 +01:00
ivanszabo 499daa0e17 Ez most félig kész ... 2025-03-03 13:24:23 +01:00
ivanszabo dca4f3ba73 MainPage elrendezés beállítva I. 2025-03-03 10:43:25 +01:00
Iván Szabó c7784e7fef Sync-kibővítése 2025-02-27 15:46:07 +01:00
ivanszabo 883ae6b845 ISyncService bővítése 2025-02-27 12:47:58 +01:00
ivanszabo 5512120306 NFC a CheckPoints-hoz 2025-02-27 07:53:26 +01:00
ivanszabo 1ac31d7d76 .NET 8 LTS-ben MediaPicker-rel kép készítése 2025-02-25 16:07:11 +01:00
Iván Szabó 5396fc0dcb Kamera használatához alapok 2025-02-24 13:39:05 +01:00
Iván Szabó f3ef12ccc4 DevExpress test 2025-02-20 10:55:30 +01:00
ivanszabo bf97db26e5 DevExpress MAUI hozzáadása 2025-02-19 18:05:53 +01:00
ivanszabo 5aae8fd067 SyncCheckListTemplates implementálása 2025-02-19 16:23:34 +01:00
ivanszabo 790f92a940 API és endpoint kiegészítése 2025-02-19 15:49:53 +01:00
ivanszabo 2ae985c6e0 DTO javítás 2025-02-19 14:17:52 +01:00
ivanszabo 2f0b9e1452 Kis adatbázis és miegymás 2025-02-19 14:12:39 +01:00
ivanszabo 872e7b3a4f NFC teszt és egyebek javítása, fejlesztése 2025-02-14 16:15:33 +01:00
ivanszabo f400bbf3c8 Ezt még ki kell reszelni rendesen 2025-02-12 23:01:38 +01:00
ivanszabo f57fef804d Alap funkció működés CheckPoints 2025-02-12 20:00:49 +01:00
Iván Szabó ac80a8a9bb Mapper NETMAUI-ba 2025-02-06 16:06:09 +01:00
Iván Szabó b233347a7d SyncService + SyncPage added 2025-02-06 14:46:31 +01:00
ivanszabo b5e5158f1e SyncController API 2025-02-06 14:02:18 +01:00
ivanszabo 7570908177 Entities + Migration 2025-02-05 13:48:19 +01:00
ivanszabo 4570c071a7 SQLLite vol 1. 2025-02-05 13:47:11 +01:00
ivanszabo aaa5862c80 Entities + Configuration base 2025-02-03 16:05:18 +01:00
ivanszabo 8d5bdc2c37 For merge to DEVTEST 2025-02-03 15:28:27 +01:00
ivanszabo 01f16c616a WorkFlowCheck.Web hozzáadása 2025-02-03 15:20:40 +01:00
ivanszabo 9175f1ec76 Merge branch 'master' of https://tfs.nuvolar.hu:8443/tfs/AtomERP/_git/WorkFlowCheck 2025-01-29 16:58:09 +01:00
ivanszabo d5cbeea8f4 API oldaláról sokminden 2025-01-29 16:56:10 +01:00
ivanszabo ad14623749 NFC barmolás 2025-01-28 14:39:52 +01:00
ivanszabo 3669267898 Némi API hozzáadás 2025-01-28 14:38:28 +01:00
ivanszabo e74df61ca0 NFC Test vol 1. 2025-01-24 14:37:21 +01:00
ivanszabo 0d44cd48fb Sikeres POST az eszközről 2025-01-24 11:15:17 +01:00
ivanszabo 862f0a148b POST-os hívás tesztje az authentikációhoz 2025-01-21 16:21:48 +01:00
ivanszabo 177aa668a6 Authenticate is jó a passwordhas-sel 2025-01-21 16:20:55 +01:00
ivanszabo 30d82fc9bf Egy kis authentikáció 2025-01-21 15:52:30 +01:00
ivanszabo 3b11c6adc5 Mobilról működik a hívás https-en :) 2025-01-21 12:50:36 +01:00
ivanszabo 6a46975cfd Na most működig SWAGGER és 5000 porton publishban is ! 2025-01-15 17:26:09 +01:00
ivanszabo a2906cc113 Na most működik az API + adatbázis 2025-01-15 14:01:58 +01:00
Iván Szabó 474dce1aa7 certifikációhoz 2025-01-06 16:39:22 +01:00
Iván Szabó 92801fefb9 Na, majd otthon ... 2025-01-06 12:49:34 +01:00
ivanszabo a80870b5c3 Some other func 2025-01-06 08:58:17 +01:00
ivanszabo 8bbcbfab09 INIT vol 1. 2024-12-17 19:23:15 +01:00
413 changed files with 118398 additions and 426 deletions
+3
View File
@@ -339,3 +339,6 @@ ASALocalRun/
# BeatPulse healthcheck temp database
healthchecksdb
/src/WorkFlowCheck.API/Images
*.pdf
/src/WorkFlowCheck.API/Pdf/c86f3a6a-c646-4627-823c-7e24134b7725.docx
+5
View File
@@ -0,0 +1,5 @@
echo off
echo "dotnet ef migrations add InitialCreate --project WorkFlowCheck.DL --startup-project WorkFlowCheck.API"
echo "dotnet ef database update --project WorkFlowCheck.DL --startup-project WorkFlowCheck.API"
echo "dotnet ef migrations remove --project WorkFlowCheck.DL --startup-project WorkFlowCheck.API"
pause
+2 -1
View File
@@ -2,7 +2,8 @@
<PropertyGroup>
<!--Work around so the conditions work below-->
<TargetFrameworks>netstandard1.0;netstandard2.0;Xamarin.iOS10;MonoAndroid10.0;net8.0;net8.0-android;net8.0-ios</TargetFrameworks>
<!--<TargetFrameworks>netstandard1.0;netstandard2.0;Xamarin.iOS10;MonoAndroid10.0;net8.0;net8.0-android;net8.0-ios</TargetFrameworks>-->
<TargetFrameworks>net8.0;net8.0-android;net8.0-ios</TargetFrameworks>
<AssemblyName>Plugin.NFC</AssemblyName>
<RootNamespace>Plugin.NFC</RootNamespace>
+46
View File
@@ -0,0 +1,46 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.12.35527.113
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WorkFlowCheck.API", "WorkFlowCheck.API\WorkFlowCheck.API.csproj", "{2466E04A-CB0C-4421-9074-A928F819926C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WorkFlowCheck.DL", "WorkFlowCheck.DL\WorkFlowCheck.DL.csproj", "{25A8C0E7-18C7-4672-ABE8-29596E7E9B72}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WorkFlowCheck.BL", "WorkFlowCheck.BL\WorkFlowCheck.BL.csproj", "{73049F81-7A5D-4819-ADB8-A9926672365E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WorkFlowCheck.Common", "WorkFlowCheck.Common\WorkFlowCheck.Common.csproj", "{7F94D6CB-3358-4687-88E1-FA46053D6B71}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WorkFlowCheck.Web", "WorkFlowCheck.Web\WorkFlowCheck.Web.csproj", "{B4D9960A-9BCF-41DA-9103-5DABA8D2623F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{2466E04A-CB0C-4421-9074-A928F819926C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2466E04A-CB0C-4421-9074-A928F819926C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2466E04A-CB0C-4421-9074-A928F819926C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2466E04A-CB0C-4421-9074-A928F819926C}.Release|Any CPU.Build.0 = Release|Any CPU
{25A8C0E7-18C7-4672-ABE8-29596E7E9B72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{25A8C0E7-18C7-4672-ABE8-29596E7E9B72}.Debug|Any CPU.Build.0 = Debug|Any CPU
{25A8C0E7-18C7-4672-ABE8-29596E7E9B72}.Release|Any CPU.ActiveCfg = Release|Any CPU
{25A8C0E7-18C7-4672-ABE8-29596E7E9B72}.Release|Any CPU.Build.0 = Release|Any CPU
{73049F81-7A5D-4819-ADB8-A9926672365E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{73049F81-7A5D-4819-ADB8-A9926672365E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{73049F81-7A5D-4819-ADB8-A9926672365E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{73049F81-7A5D-4819-ADB8-A9926672365E}.Release|Any CPU.Build.0 = Release|Any CPU
{7F94D6CB-3358-4687-88E1-FA46053D6B71}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7F94D6CB-3358-4687-88E1-FA46053D6B71}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7F94D6CB-3358-4687-88E1-FA46053D6B71}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7F94D6CB-3358-4687-88E1-FA46053D6B71}.Release|Any CPU.Build.0 = Release|Any CPU
{B4D9960A-9BCF-41DA-9103-5DABA8D2623F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B4D9960A-9BCF-41DA-9103-5DABA8D2623F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B4D9960A-9BCF-41DA-9103-5DABA8D2623F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B4D9960A-9BCF-41DA-9103-5DABA8D2623F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
@@ -0,0 +1,13 @@
{
"version": 1,
"isRoot": true,
"tools": {
"dotnet-ef": {
"version": "9.0.0",
"commands": [
"dotnet-ef"
],
"rollForward": false
}
}
}
@@ -0,0 +1,417 @@
using Microsoft.AspNetCore.Mvc;
using Serilog;
using WorkFlowCheck.BL.Services;
using WorkFlowCheck.BL.Services.Interfaces;
using WorkFlowCheck.Common.DTO;
namespace WorkFlowCheck.API.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class CheckListController : ControllerBase
{
private ICheckListService _checkListService;
public CheckListController(ICheckListService checkListService)
{
_checkListService = checkListService;
}
[HttpGet("GetCheckListHeader/{id}")]
public async Task<ApiResponseDTO<CheckListHeaderDTO>> GetCheckListHeader(int id)
{
var retVal = new ApiResponseDTO<CheckListHeaderDTO>()
{
IsSuccess = true,
};
var checkListHeaderDTO = await _checkListService.GetCheckListHeaderAsync(id);
if (checkListHeaderDTO != null)
{
retVal.IsSuccess = true;
retVal.Data = checkListHeaderDTO;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("CreatePDF/{id}")]
public async Task<ApiResponseDTO<byte[]>> CreatePDF(int id)
{
var retVal = new ApiResponseDTO<byte[]>()
{
IsSuccess = true,
};
var checkListHeader = await _checkListService.GetCheckListHeaderAsync(id);
var response = await _checkListService.CreateCheckListHeaderPDFAsync(id);
if (response != null)
{
retVal.IsSuccess = true;
retVal.Data = response;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("GetAllCheckListHeaders")]
public async Task<ApiResponseDTO<List<CheckListHeaderDTO>>> GetAllCheckListHeadersAsync()
{
var retVal = new ApiResponseDTO<List<CheckListHeaderDTO>>()
{
IsSuccess = true,
};
var checkPointListDTO = await _checkListService.GetAllCheckListHeaderAsync();
if (checkPointListDTO != null)
{
retVal.IsSuccess = true;
retVal.Data = checkPointListDTO;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpPost("UpdateCheckListHeader")]
public async Task<ApiResponseDTO<CheckListHeaderDTO>> UpdateCheckListHeader([FromBody] CheckListHeaderDTO checkListHeaderDTO)
{
var retVal = new ApiResponseDTO<CheckListHeaderDTO>()
{
IsSuccess = true
};
try
{
var result = await _checkListService.UpdateCheckListHeaderAsync(checkListHeaderDTO);
retVal.Data = result;
}
catch (Exception ex)
{
retVal.IsSuccess = false;
Log.Error(ex.Message);
}
return retVal;
}
[HttpPost("StartNewCheckList")]
public async Task<ApiResponseDTO<CheckListHeaderDTO>> StartNew([FromBody] CheckListHeaderNewDTO checkListHeaderNewDTO)
{
var retVal = new ApiResponseDTO<CheckListHeaderDTO>()
{
IsSuccess = true
};
try
{
var response = await _checkListService.StartNewCheckListAsync(checkListHeaderNewDTO);
if (response != null)
{
retVal.Data = response;
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
[HttpPost("CloseCheckListHeader")]
public async Task<ApiResponseDTO<bool>> CloseCheckListHeader([FromBody] CheckListHeaderCloseDTO checkListHeaderCloseDTO)
{
var retVal = new ApiResponseDTO<bool>() { IsSuccess = false };
try
{
var result = await _checkListService.CloseCheckListHeader(checkListHeaderCloseDTO);
retVal.Data = result;
}
catch (Exception ex)
{
retVal.IsSuccess = false;
Log.Error(ex.Message);
}
return retVal;
}
[HttpGet("AcceptCheckListHeader/{id}/{userId}")]
public async Task<ApiResponseDTO<bool>> AcceptCheckListHeader(int id, int userId)
{
var retVal = new ApiResponseDTO<bool> { IsSuccess = false };
var response = await _checkListService.AcceptCheckListHeaderAsync(id, userId);
if (response)
{
retVal.IsSuccess = true;
retVal.Data = response;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("BlockCheckListHeader/{id}/{userId}")]
public async Task<ApiResponseDTO<bool>> BlockCheckListHeader(int id, int userId)
{
var retVal = new ApiResponseDTO<bool> { IsSuccess = false };
var response = await _checkListService.BlockCheckListHeaderAsync(id, userId);
if (response)
{
retVal.IsSuccess = true;
retVal.Data = response;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("UnBlockCheckListHeader/{id}/{userId}")]
public async Task<ApiResponseDTO<bool>> UnBlockCheckListHeader(int id, int userId)
{
var retVal = new ApiResponseDTO<bool> { IsSuccess = false };
var response = await _checkListService.UnBlockCheckListHeaderAsync(id, userId);
if (response)
{
retVal.IsSuccess = true;
retVal.Data = response;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("GetCheckListTemplateHeader/{id}")]
public async Task<ApiResponseDTO<CheckListTemplateHeaderDTO>> GetCheckListTemplateHeader(int id)
{
var retVal = new ApiResponseDTO<CheckListTemplateHeaderDTO>()
{
IsSuccess = true,
};
var CheckListTemplateHeaderDTO = await _checkListService.GetCheckListTemplateHeaderAsync(id);
if (CheckListTemplateHeaderDTO != null)
{
retVal.IsSuccess = true;
retVal.Data = CheckListTemplateHeaderDTO;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("GetAllCheckListTemplateHeaders")]
public async Task<ApiResponseDTO<List<CheckListTemplateHeaderDTO>>> GetAllCheckListTemplateHeadersAsync()
{
var retVal = new ApiResponseDTO<List<CheckListTemplateHeaderDTO>>()
{
IsSuccess = true,
};
var checkPointListDTO = await _checkListService.GetAllCheckListTemplateHeaderAsync();
if (checkPointListDTO != null)
{
retVal.IsSuccess = true;
retVal.Data = checkPointListDTO;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpPost("UpdateCheckListTemplateHeader")]
public async Task<ApiResponseDTO<CheckListTemplateHeaderDTO>> UpdateCheckListTemplateHeader([FromBody] CheckListTemplateHeaderDTO CheckListTemplateHeaderDTO)
{
var retVal = new ApiResponseDTO<CheckListTemplateHeaderDTO>()
{
IsSuccess = true
};
try
{
var result = await _checkListService.UpdateCheckListTemplateHeaderAsync(CheckListTemplateHeaderDTO);
retVal.Data = result;
}
catch (Exception ex)
{
retVal.IsSuccess = false;
Log.Error(ex.Message);
}
return retVal;
}
[HttpGet("DeleteCheckListTemplateHeader/{id}")]
public async Task<ApiResponseDTO<bool>> DeleteCheckListTemplateHeader(int id)
{
var retVal = new ApiResponseDTO<bool>()
{
IsSuccess = true,
};
var result = await _checkListService.DeleteCheckListTemplateHeaderAsync(id);
if (result != null)
{
retVal.IsSuccess = true;
retVal.Data = result;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("GetCheckListTemplateRow/{id}")]
public async Task<ApiResponseDTO<CheckListTemplateRowDTO>> GetCheckListTemplateRow(int id)
{
var retVal = new ApiResponseDTO<CheckListTemplateRowDTO>()
{
IsSuccess = true,
};
var checkListTemplateRowDTO = await _checkListService.GetCheckListTemplateRowAsync(id);
if (checkListTemplateRowDTO != null)
{
retVal.IsSuccess = true;
retVal.Data = checkListTemplateRowDTO;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("DeleteCheckListTemplateRow/{id}")]
public async Task<ApiResponseDTO<bool>> DeleteCheckListTemplateRow(int id)
{
var retVal = new ApiResponseDTO<bool>()
{
IsSuccess = true,
};
var result = await _checkListService.DeleteCheckListTemplateRowAsync(id);
if (result != null)
{
retVal.IsSuccess = true;
retVal.Data = result;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpPost("UpdateCheckListTemplateRow")]
public async Task<ApiResponseDTO<CheckListTemplateRowDTO>> UpdateCheckListTemplateRow([FromBody] CheckListTemplateRowDTO CheckListTemplateRowDTO)
{
var retVal = new ApiResponseDTO<CheckListTemplateRowDTO>()
{
IsSuccess = true
};
try
{
var result = await _checkListService.UpdateCheckListTemplateRowAsync(CheckListTemplateRowDTO);
retVal.Data = result;
}
catch (Exception ex)
{
retVal.IsSuccess = false;
Log.Error(ex.Message);
}
return retVal;
}
[HttpGet("GetCheckListRow/{id}")]
public async Task<ApiResponseDTO<CheckListRowDTO>> GetCheckListRow(int id)
{
var retVal = new ApiResponseDTO<CheckListRowDTO>()
{
IsSuccess = true,
};
var checkListRowDTO = await _checkListService.GetCheckListRowAsync(id);
if (checkListRowDTO != null)
{
retVal.IsSuccess = true;
retVal.Data = checkListRowDTO;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpPost("UpdateCheckListRow")]
public async Task<ApiResponseDTO<CheckListRowDTO>> UpdateCheckListRow([FromBody] CheckListRowDTO CheckListRowDTO)
{
var retVal = new ApiResponseDTO<CheckListRowDTO>()
{
IsSuccess = true
};
try
{
var result = await _checkListService.UpdateCheckListRowAsync(CheckListRowDTO);
retVal.Data = result;
}
catch (Exception ex)
{
retVal.IsSuccess = false;
Log.Error(ex.Message);
}
return retVal;
}
}
}
@@ -0,0 +1,610 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using Serilog;
using System.Text;
using WorkFlowCheck.BL.Services;
using WorkFlowCheck.BL.Services.Interfaces;
using WorkFlowCheck.Common.DTO;
using WorkFlowCheck.DL.Entities;
namespace WorkFlowCheck.API.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class SyncController : ControllerBase
{
private ISyncService _syncService;
private INumberGeneratorService _numberGeneratorService;
private IMessageService _messageService;
private IUserService _userService;
public SyncController(ISyncService syncService,
INumberGeneratorService numberGeneratorService,
IUserService userService,
IMessageService messageService)
{
_syncService = syncService;
_numberGeneratorService = numberGeneratorService;
_messageService = messageService;
_userService = userService;
}
[HttpGet("GetCheckPoint/{id}")]
public async Task<ApiResponseDTO<CheckPointDTO>> GetCheckpointAsync(int id)
{
var retVal = new ApiResponseDTO<CheckPointDTO>()
{
IsSuccess = true,
};
var checkPointDTO = await _syncService.GetCheckPointAsync(id);
if (checkPointDTO != null)
{
retVal.IsSuccess = true;
retVal.Data = checkPointDTO;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("DeleteCheckPoint/{id}")]
public async Task<ApiResponseDTO<bool>> DeleteCheckpointAsync(int id)
{
var retVal = new ApiResponseDTO<bool>()
{
IsSuccess = true,
};
var response = await _syncService.DeleteCheckPointAsync(id);
if (response != null)
{
retVal.IsSuccess = true;
retVal.Data = response;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("GetAllCheckPoints")]
public async Task<ApiResponseDTO<List<CheckPointDTO>>> GetAllCheckpointsAsync()
{
var retVal = new ApiResponseDTO<List<CheckPointDTO>>()
{
IsSuccess = true,
};
var checkPointListDTO = await _syncService.GetAllCheckPointAsync();
if (checkPointListDTO != null)
{
retVal.IsSuccess = true;
retVal.Data = checkPointListDTO;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpPost("UpdateCheckPoint")]
public async Task<ApiResponseDTO<CheckPointDTO>> UpdateCheckPoint([FromBody] CheckPointDTO checkPointDTO)
{
var retVal = new ApiResponseDTO<CheckPointDTO>()
{
IsSuccess = true
};
try
{
var result = await _syncService.UpdateCheckPointAsync(checkPointDTO);
retVal.Data = result;
}
catch (Exception ex)
{
retVal.IsSuccess = false;
Log.Error(ex.Message);
}
return retVal;
}
[HttpPost("UpdateAllCheckPoint")]
public async Task<ApiResponseDTO<List<CheckPointDTO>>> UpdateAllCheckPoint([FromBody] List<CheckPointDTO> checkPointListDTO)
{
var retVal = new ApiResponseDTO<List<CheckPointDTO>>()
{
IsSuccess = true
};
try
{
var result = await _syncService.UpdateAllCheckPointAsync(checkPointListDTO);
retVal.Data = result;
}
catch (Exception ex)
{
retVal.IsSuccess = false;
Log.Error(ex.Message);
}
return retVal;
}
[HttpGet("GetEquipment/{id}")]
public async Task<ApiResponseDTO<EquipmentDTO>> GetEquipmentAsync(int id)
{
var retVal = new ApiResponseDTO<EquipmentDTO>()
{
IsSuccess = true,
};
var equipmentDTO = await _syncService.GetEquipmentAsync(id);
if (equipmentDTO != null)
{
retVal.IsSuccess = true;
retVal.Data = equipmentDTO;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("DeleteEquipment/{id}")]
public async Task<ApiResponseDTO<bool>> DeleteEquipmentAsync(int id)
{
var retVal = new ApiResponseDTO<bool>()
{
IsSuccess = true,
};
var response = await _syncService.DeleteEquipmentAsync(id);
if (response != null)
{
retVal.IsSuccess = true;
retVal.Data = response;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("GetAllEquipments")]
public async Task<ApiResponseDTO<List<EquipmentDTO>>> GetAllEquipmentsAsync()
{
var retVal = new ApiResponseDTO<List<EquipmentDTO>>()
{
IsSuccess = true,
};
var equipmentListDTO = await _syncService.GetAllEquipmentAsync();
if (equipmentListDTO != null)
{
retVal.IsSuccess = true;
retVal.Data = equipmentListDTO;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpPost("UpdateEquipment")]
public async Task<ApiResponseDTO<EquipmentDTO>> UpdateEquipment([FromBody] EquipmentDTO EquipmentDTO)
{
var retVal = new ApiResponseDTO<EquipmentDTO>()
{
IsSuccess = true
};
try
{
var result = await _syncService.UpdateEquipmentAsync(EquipmentDTO);
retVal.Data = result;
}
catch (Exception ex)
{
retVal.IsSuccess = false;
Log.Error(ex.Message);
}
return retVal;
}
[HttpGet("GetLocation/{id}")]
public async Task<ApiResponseDTO<LocationDTO>> GetLocationAsync(int id)
{
var retVal = new ApiResponseDTO<LocationDTO>()
{
IsSuccess = true,
};
var locationDTO = await _syncService.GetLocationAsync(id);
if (locationDTO != null)
{
retVal.IsSuccess = true;
retVal.Data = locationDTO;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("DeleteLocation/{id}")]
public async Task<ApiResponseDTO<bool>> DeleteLocationAsync(int id)
{
var retVal = new ApiResponseDTO<bool>()
{
IsSuccess = true,
};
var response = await _syncService.DeleteLocationAsync(id);
if (response != null)
{
retVal.IsSuccess = true;
retVal.Data = response;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("GetAllLocations")]
public async Task<ApiResponseDTO<List<LocationDTO>>> GetAllLocationsAsync()
{
var retVal = new ApiResponseDTO<List<LocationDTO>>()
{
IsSuccess = true,
};
var locationListDTO = await _syncService.GetAllLocationAsync();
if (locationListDTO != null)
{
retVal.IsSuccess = true;
retVal.Data = locationListDTO;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpPost("UpdateLocation")]
public async Task<ApiResponseDTO<LocationDTO>> UpdateLocation([FromBody] LocationDTO LocationDTO)
{
var retVal = new ApiResponseDTO<LocationDTO>()
{
IsSuccess = true
};
try
{
var result = await _syncService.UpdateLocationAsync(LocationDTO);
retVal.Data = result;
}
catch (Exception ex)
{
retVal.IsSuccess = false;
Log.Error(ex.Message);
}
return retVal;
}
[HttpGet("GetAllCheckListTemplateHeader/{userId}")]
public async Task<ApiResponseDTO<List<CheckListTemplateHeaderDTO>>> GetAllCheckListTemplateHeaderAsync(int userId)
{
var retVal = new ApiResponseDTO<List<CheckListTemplateHeaderDTO>>()
{
IsSuccess = true,
};
var response = await _syncService.GetAllCheckListTemplateAsync(userId);
if (response != null)
{
retVal.IsSuccess = true;
retVal.Data = response;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("GetAllCheckListHeader/{userId}")]
public async Task<ApiResponseDTO<List<CheckListHeaderDTO>>> GetAllCheckListHeaderAsync(int userId)
{
var retVal = new ApiResponseDTO<List<CheckListHeaderDTO>>()
{
IsSuccess = true,
};
var response = await _syncService.GetAllCheckListAsync(userId);
if (response != null)
{
retVal.IsSuccess = true;
retVal.Data = response;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpPost("SendCheckListHeader")]
public async Task<ApiResponseDTO<string>> SendCheckListHeader([FromBody] CheckListHeaderDTO checkListHeaderDTO)
{
var retVal = new ApiResponseDTO<string>()
{
IsSuccess = true
};
try
{
var result = await _syncService.SendCheckListHeaderAsync(checkListHeaderDTO);
retVal.Data = "Sikeres beküldés!";
}
catch (Exception ex)
{
retVal.IsSuccess = false;
retVal.Errors.Add(ex.Message);
Log.Error(ex.Message);
}
return retVal;
}
[HttpGet("GetAllNumbergenerators")]
public async Task<ApiResponseDTO<List<NumberGeneratorTemplateDTO>>> GetAllNumbergeneratorsAsync()
{
var retVal = new ApiResponseDTO<List<NumberGeneratorTemplateDTO>>()
{
IsSuccess = true,
};
var locationListDTO = await _numberGeneratorService.GetAllNumbergeneratorsAsync();
if (locationListDTO != null)
{
retVal.IsSuccess = true;
retVal.Data = locationListDTO;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpPost("DeviceMessageSend")]
public async Task<ApiResponseDTO<bool>> DeviceMessageSend([FromBody] DeviceMessageDTO deviceMessageDTO)
{
var retVal = new ApiResponseDTO<bool>()
{
IsSuccess = true
};
try
{
var result = await _syncService.DeviceMessageSend(deviceMessageDTO);
retVal.Data = true;
}
catch (Exception ex)
{
retVal.IsSuccess = false;
retVal.Errors.Add(ex.Message);
Log.Error(ex.Message);
}
return retVal;
}
[HttpGet("DeviceMessageReadUnreaded/{deviceIdBase64}")]
public async Task<ApiResponseDTO<List<DeviceMessageDTO>>> DeviceMessageReadUnreaded(string deviceIdBase64)
{
var retVal = new ApiResponseDTO<List<DeviceMessageDTO>>()
{
IsSuccess = true,
};
byte[] byteArray = Base64UrlEncoder.DecodeBytes(deviceIdBase64);
string deviceId = Encoding.UTF8.GetString(byteArray);
var response = await _syncService.DeviceMessageReadUnreaded(deviceId);
if (response != null)
{
retVal.IsSuccess = true;
retVal.Data = response;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("DeviceMessageReadUnreadedRole/{roleId}")]
public async Task<ApiResponseDTO<List<DeviceMessageDTO>>> DeviceMessageReadUnreadedRole(int roleId)
{
var retVal = new ApiResponseDTO<List<DeviceMessageDTO>>()
{
IsSuccess = true,
};
var response = await _syncService.DeviceMessageReadUnreadedRole(roleId);
if (response != null)
{
retVal.IsSuccess = true;
retVal.Data = response;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("Download")]
public async Task<IActionResult> DownloadAPKFileAsync()
{
try
{
string fileName = "com.nuvolar.wfcapp-Signed.apk";
string downloadFolder = Path.Combine(Directory.GetCurrentDirectory(), "Downloads", "APK");
string filePath = Path.Combine(downloadFolder, fileName);
if (!System.IO.File.Exists(filePath))
{
return NotFound("File not found.");
}
var fileBytes = await System.IO.File.ReadAllBytesAsync(filePath);
var fileType = "application/octet-stream";
Response.Headers.Add("Content-Length", fileBytes.Length.ToString());
return File(fileBytes, fileType, fileName);
}
catch (Exception ex)
{
return StatusCode(500, $"Error: {ex.Message}");
}
}
[HttpGet("SendTestMail")]
public async Task<ApiResponseDTO<bool>> SendTestMail()
{
var retVal = new ApiResponseDTO<bool>()
{
IsSuccess = true
};
try
{
var result = await _messageService.SendMailAsync(
new List<string>()
{
"ivan.szabo.sis@gmail.com",
}, "Teszt", "Ok");
retVal.Data = true;
}
catch (Exception ex)
{
retVal.IsSuccess = false;
retVal.Errors.Add(ex.Message);
Log.Error(ex.Message);
}
return retVal;
}
[HttpGet("GetAllMobileUsers")]
public async Task<ApiResponseDTO<List<MobileUserDTO>>> GetAllMobileUsers()
{
var retVal = new ApiResponseDTO<List<MobileUserDTO>>()
{
IsSuccess = true,
Data = new List<MobileUserDTO>()
};
var usersListDTO = await _userService.GetAllUserAsync();
retVal.Data.AddRange(usersListDTO
.Where(user => user.RoleDTO.Any(role => role.CanUseMobilApp))
.Select(user => new MobileUserDTO
{
Id = user.Id,
Email = user.Email,
FirstName = user.FirstName,
LastName = user.LastName,
NFCActive = user.NFCActive,
NFCCode = user.NFCCode,
UserName = user.UserName
})
);
if (retVal.Data == null || retVal.Data.Count <= 0) { retVal.IsSuccess = false; retVal.Errors.Add("No data!"); }
return retVal;
}
[HttpPost("UpdateAllMobileUser")]
public async Task<ApiResponseDTO<List<MobileUserDTO>>> UpdateAllMobileUser([FromBody] List<MobileUserDTO> mobileUserListDTO)
{
var retVal = new ApiResponseDTO<List<MobileUserDTO>>()
{
IsSuccess = true
};
try
{
foreach (var mobileUserDTO in mobileUserListDTO)
{
var userDTO = await _userService.GetUserAsync(mobileUserDTO.Id);
if (userDTO != null && userDTO.Id == mobileUserDTO.Id)
{
userDTO.NFCCode = mobileUserDTO.NFCCode;
var result = await _userService.UpdateUserAsync(userDTO);
}
}
}
catch (Exception ex)
{
retVal.IsSuccess = false;
Log.Error(ex.Message);
}
return retVal;
}
}
}
@@ -0,0 +1,399 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Serilog;
using WorkFlowCheck.BL.Services.Interfaces;
using WorkFlowCheck.Common.DTO;
namespace WorkFlowCheck.API.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class SystemController : ControllerBase
{
private readonly ISystemService _systemService;
public SystemController(ISystemService systemService)
{
_systemService = systemService;
}
[HttpGet("GetDatabaseAndVersionInfo")]
public async Task<ApiResponseDTO<string>> GetDatabaseAndVersionInfo()
{
var retVal = new ApiResponseDTO<string>()
{
IsSuccess = true,
};
var result = await _systemService.GetDatabaseAndVersionInfoAsync();
if (result != null)
{
retVal.IsSuccess = true;
retVal.Data = result;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("GetAllImageFiles")]
public async Task<ApiResponseDTO<List<ImageFileDTO>>> GetAllImageFilesAsync()
{
var retVal = new ApiResponseDTO<List<ImageFileDTO>>()
{
IsSuccess = true,
};
try
{
var allowedExtensions = new[] { ".png", ".jpg", ".jpeg", ".bmp", ".gif", ".webp", ".tiff" };
var imageFolder = Path.Combine(Directory.GetCurrentDirectory(), "Images");
var files = Directory.GetFiles(imageFolder)
.Where(f => allowedExtensions.Contains(Path.GetExtension(f).ToLower()))
.Select(f =>
{
var fileInfo = new FileInfo(f);
return new
{
FileName = fileInfo.Name,
FileSize = FormatFileSize(fileInfo.Length),
CreatedDate = fileInfo.CreationTime.ToString("yyyy.MM.dd HH:mm"),
};
});
var checkListFileInfos = new List<ImageFileDTO>();
foreach (var file in files.OrderBy(o => o.FileName).ToList())
{
var checkListFileInfoDTO = new ImageFileDTO()
{
FileName = file.FileName,
FileSize = file.FileSize,
CreateDate = file.CreatedDate,
};
checkListFileInfos.Add(checkListFileInfoDTO);
}
if (checkListFileInfos != null)
{
retVal.IsSuccess = true;
retVal.Data = checkListFileInfos;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
[HttpGet("GetAllPDFFiles")]
public async Task<ApiResponseDTO<List<ImageFileDTO>>> GetAllPDFilesAsync()
{
var retVal = new ApiResponseDTO<List<ImageFileDTO>>()
{
IsSuccess = true,
};
try
{
var pdfFolder = Path.Combine(Directory.GetCurrentDirectory(), "PDF");
var files = Directory.GetFiles(pdfFolder, "*.pdf")
.Select(f =>
{
var fileInfo = new FileInfo(f);
return new
{
FileName = fileInfo.Name,
FileSize = FormatFileSize(fileInfo.Length),
CreatedDate = fileInfo.CreationTime.ToString("yyyy.MM.dd HH:mm"),
};
});
var checkListFileInfos = new List<ImageFileDTO>();
foreach (var file in files.OrderBy(o => o.FileName).ToList())
{
var checkListFileInfoDTO = new ImageFileDTO()
{
FileName = file.FileName,
FileSize = file.FileSize,
CreateDate = file.CreatedDate,
};
checkListFileInfos.Add(checkListFileInfoDTO);
}
if (checkListFileInfos != null)
{
retVal.IsSuccess = true;
retVal.Data = checkListFileInfos;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
[HttpGet("GetAllLogAuditFiles")]
public async Task<ApiResponseDTO<List<LogFileDTO>>> GetAllLogAuditFilesAsync()
{
var retVal = new ApiResponseDTO<List<LogFileDTO>>()
{
IsSuccess = true,
};
try
{
var logAuditFiles = Path.Combine(Directory.GetCurrentDirectory(), "Logs\\AuditFlow");
var files = Directory.GetFiles(logAuditFiles, "*.log")
.Select(f =>
{
var fileInfo = new FileInfo(f);
return new
{
FileName = fileInfo.Name,
FileSize = FormatFileSize(fileInfo.Length),
CreatedDate = fileInfo.CreationTime.ToString("yyyy.MM.dd HH:mm"),
};
});
var checkListFileInfos = new List<LogFileDTO>();
foreach (var file in files.OrderBy(o => o.FileName).ToList())
{
var checkListFileInfoDTO = new LogFileDTO()
{
FileName = file.FileName,
FileSize = file.FileSize,
CreateDate = file.CreatedDate,
};
checkListFileInfos.Add(checkListFileInfoDTO);
}
if (checkListFileInfos != null)
{
retVal.IsSuccess = true;
retVal.Data = checkListFileInfos;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
[HttpGet("GetAllLogBusinessFiles")]
public async Task<ApiResponseDTO<List<LogFileDTO>>> GetAllLogBusinessFilesAsync()
{
var retVal = new ApiResponseDTO<List<LogFileDTO>>()
{
IsSuccess = true,
};
try
{
var logBusinessFiles = Path.Combine(Directory.GetCurrentDirectory(), "Logs\\BusinessFlow");
var files = Directory.GetFiles(logBusinessFiles, "*.log")
.Select(f =>
{
var fileInfo = new FileInfo(f);
return new
{
FileName = fileInfo.Name,
FileSize = FormatFileSize(fileInfo.Length),
CreatedDate = fileInfo.CreationTime.ToString("yyyy.MM.dd HH:mm"),
};
});
var checkListFileInfos = new List<LogFileDTO>();
foreach (var file in files.OrderBy(o => o.FileName).ToList())
{
var checkListFileInfoDTO = new LogFileDTO()
{
FileName = file.FileName,
FileSize = file.FileSize,
CreateDate = file.CreatedDate,
};
checkListFileInfos.Add(checkListFileInfoDTO);
}
if (checkListFileInfos != null)
{
retVal.IsSuccess = true;
retVal.Data = checkListFileInfos;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
[HttpGet("DownloadFile/{filename}")]
public async Task<ApiResponseDTO<byte[]>> DownloadFile(string filename)
{
var retVal = new ApiResponseDTO<byte[]>()
{
IsSuccess = false,
};
var imageFile = Path.Combine(Directory.GetCurrentDirectory(), "Images", filename);
if (!System.IO.File.Exists(imageFile))
{
retVal.Errors.Add($"{filename} does not exist");
return retVal;
}
byte[] response = System.IO.File.ReadAllBytes(imageFile);
if (response != null)
{
retVal.IsSuccess = true;
retVal.Data = response;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("DownloadPDFFile/{filename}")]
public async Task<ApiResponseDTO<byte[]>> DownloadPDFFile(string filename)
{
var retVal = new ApiResponseDTO<byte[]>()
{
IsSuccess = false,
};
var imageFile = Path.Combine(Directory.GetCurrentDirectory(), "PDF", filename);
if (!System.IO.File.Exists(imageFile))
{
retVal.Errors.Add($"{filename} does not exist");
return retVal;
}
byte[] response = System.IO.File.ReadAllBytes(imageFile);
if (response != null)
{
retVal.IsSuccess = true;
retVal.Data = response;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("DownloadAuditLogFile/{filename}")]
public async Task<ApiResponseDTO<byte[]>> DownloadAuditLogFile(string filename)
{
var retVal = new ApiResponseDTO<byte[]>()
{
IsSuccess = false,
};
var imageFile = Path.Combine(Directory.GetCurrentDirectory(), "Logs\\AuditFlow", filename);
if (!System.IO.File.Exists(imageFile))
{
retVal.Errors.Add($"{filename} does not exist");
return retVal;
}
byte[] response = System.IO.File.ReadAllBytes(imageFile);
if (response != null)
{
retVal.IsSuccess = true;
retVal.Data = response;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("DownloadBusinessLogFile/{filename}")]
public async Task<ApiResponseDTO<byte[]>> DownloadBusinessLogFile(string filename)
{
var retVal = new ApiResponseDTO<byte[]>()
{
IsSuccess = false,
};
var imageFile = Path.Combine(Directory.GetCurrentDirectory(), "Logs\\BusinessFlow", filename);
if (!System.IO.File.Exists(imageFile))
{
retVal.Errors.Add($"{filename} does not exist");
return retVal;
}
byte[] response = System.IO.File.ReadAllBytes(imageFile);
if (response != null)
{
retVal.IsSuccess = true;
retVal.Data = response;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
private string FormatFileSize(long bytes)
{
string[] sizes = { "B", "KB", "MB", "GB", "TB" };
double len = bytes;
int order = 0;
while (len >= 1024 && order < sizes.Length - 1)
{
order++;
len /= 1024;
}
return $"{len:0.##} {sizes[order]}";
}
}
}
@@ -0,0 +1,756 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using WorkFlowCheck.Common.DTO;
using WorkFlowCheck.BL.Services.Interfaces;
using Serilog;
using WorkFlowCheck.BL.Services;
namespace WorkFlowCheck.API.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class UserController : ControllerBase
{
private IUserService _userService;
public UserController(IUserService userService)
{
_userService = userService;
}
[HttpGet("GetUser/{id}")]
public async Task<ApiResponseDTO<UserDTO>> GetUser(int id)
{
var retVal = new ApiResponseDTO<UserDTO>()
{
IsSuccess = true,
};
var userDTO = await _userService.GetUserAsync(id);
if (userDTO != null)
{
if (userDTO.Id == 0)
{
retVal.IsSuccess = false;
retVal.Errors.Add("No match!");
retVal.Data = userDTO;
}
else
{
retVal.IsSuccess = true;
retVal.Data = userDTO;
}
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("GetAllUsers")]
public async Task<ApiResponseDTO<List<UserDTO>>> GetAllUsers()
{
var retVal = new ApiResponseDTO<List<UserDTO>>()
{
IsSuccess = true,
};
var userDTO = await _userService.GetAllUserAsync();
if (userDTO != null)
{
retVal.IsSuccess = true;
retVal.Data = userDTO;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("DeleteUser/{id}")]
public async Task<ApiResponseDTO<bool>> DeleteUser(int id)
{
var retVal = new ApiResponseDTO<bool>()
{
IsSuccess = true,
};
var result = await _userService.DeleteUserAsync(id);
if (result != null)
{
retVal.IsSuccess = true;
retVal.Data = result;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpPost("UpdateUser")]
public async Task<ApiResponseDTO<UserDTO>> UpdateUser([FromBody] UserDTO userDTO)
{
var retVal = new ApiResponseDTO<UserDTO>()
{
IsSuccess = true
};
try
{
var result = await _userService.UpdateUserAsync(userDTO);
retVal.Data = result;
}
catch (Exception ex)
{
retVal.IsSuccess = false;
Log.Error(ex.Message);
}
return retVal;
}
[HttpPost("Authenticate")]
public async Task<ApiResponseDTO<UserDTO>> Authenticate([FromBody] UserSimpleDTO userSimpleDTO)
{
var retVal = new ApiResponseDTO<UserDTO>()
{
IsSuccess = true
};
if (string.IsNullOrEmpty(userSimpleDTO.UserName) || string.IsNullOrEmpty(userSimpleDTO.Password))
{
retVal.IsSuccess = false;
retVal.Errors.Add("Nem megfelelo felhasználói név vagy jelszó");
return retVal;
}
try
{
var userDTO_Response = await _userService.Authenticate(userSimpleDTO.UserName, userSimpleDTO.Password);
if (userDTO_Response != null)
{
if (string.IsNullOrEmpty(userDTO_Response.UserName) == false && userDTO_Response.UserName == userSimpleDTO.UserName)
{
retVal.IsSuccess = true;
retVal.Data = userDTO_Response;
Log.Information($"Sikeres azonosítás! {userSimpleDTO.UserName}");
}
else
{
var error = $"Nem megfelelo felhasználó vagy jelszó! {userSimpleDTO.UserName}";
retVal.IsSuccess = false;
retVal.Errors.Add(error);
Log.Information(error);
}
}
else
{
var error = $"Nem megfelelo felhasználó vagy jelszó! {userSimpleDTO.UserName}";
retVal.IsSuccess = false;
retVal.Errors.Add(error);
Log.Information(error);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
/// <summary>
/// Ez a 2 faktoros első lépése.
/// </summary>
/// <param name="userSimpleDTO"></param>
/// <returns></returns>
[HttpPost("Authenticate2F1")]
public async Task<ApiResponseDTO<string>> Authenticate2F1([FromBody] UserSimpleDTO userSimpleDTO)
{
var retVal = new ApiResponseDTO<string>()
{
IsSuccess = true
};
if (string.IsNullOrEmpty(userSimpleDTO.UserName) || string.IsNullOrEmpty(userSimpleDTO.Password))
{
retVal.IsSuccess = false;
retVal.Errors.Add("Nem megfelelo felhasználói név vagy jelszó");
return retVal;
}
try
{
var response = await _userService.Authenticate2F1(userSimpleDTO.UserName, userSimpleDTO.Password);
if (!string.IsNullOrEmpty(response))
{
retVal.IsSuccess = true;
retVal.Data = response;
Log.Information($"Sikeres azonosítás! {userSimpleDTO.UserName}");
}
else
{
var error = $"Nem megfelelo felhasználó vagy jelszó! {userSimpleDTO.UserName}";
retVal.IsSuccess = false;
retVal.Errors.Add(error);
Log.Information(error);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
[HttpPost("Authenticate2F2")]
public async Task<ApiResponseDTO<UserDTO>> Authenticate2F2([FromBody] User2FADTO user2FADTO)
{
var retVal = new ApiResponseDTO<UserDTO>()
{
IsSuccess = true
};
if (string.IsNullOrEmpty(user2FADTO.UserName) ||
string.IsNullOrEmpty(user2FADTO.Password) ||
string.IsNullOrEmpty(user2FADTO.Code) ||
string.IsNullOrEmpty(user2FADTO.Token2FA))
{
retVal.IsSuccess = false;
retVal.Errors.Add("Nem megfelelo felhasználói név vagy jelszó");
return retVal;
}
try
{
var userDTO_Response = await _userService.Authenticate2F2(user2FADTO.UserName,
user2FADTO.Password,
user2FADTO.Code,
user2FADTO.Token2FA);
if (userDTO_Response != null)
{
if (string.IsNullOrEmpty(userDTO_Response.UserName) == false)
{
retVal.IsSuccess = true;
retVal.Data = userDTO_Response;
Log.Information($"Sikeres azonosítás! {user2FADTO.UserName}");
}
else
{
var error = $"Nem megfelelo felhasználó vagy jelszó! {user2FADTO.UserName}";
retVal.IsSuccess = false;
retVal.Errors.Add(error);
Log.Information(error);
}
}
else
{
var error = $"Nem megfelelo felhasználó vagy jelszó! {user2FADTO.UserName}";
retVal.IsSuccess = false;
retVal.Errors.Add(error);
Log.Information(error);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
[HttpPost("Authenticate2F2ChangePassword")]
public async Task<ApiResponseDTO<UserDTO>> Authenticate2F2ChangePassword([FromBody] UserChangePassword2FADTO userChangePassword2FADTO)
{
var retVal = new ApiResponseDTO<UserDTO>()
{
IsSuccess = true
};
if (string.IsNullOrEmpty(userChangePassword2FADTO.UserName) ||
string.IsNullOrEmpty(userChangePassword2FADTO.OldPassword) ||
string.IsNullOrEmpty(userChangePassword2FADTO.NewPassword1) ||
string.IsNullOrEmpty(userChangePassword2FADTO.NewPassword2) ||
string.IsNullOrEmpty(userChangePassword2FADTO.Code) ||
string.IsNullOrEmpty(userChangePassword2FADTO.Token2FA))
{
retVal.IsSuccess = false;
retVal.Errors.Add("Nem megfelelo felhasználói név vagy jelszó");
return retVal;
}
try
{
var userDTO_Response = await _userService.Authenticate2F2ChangePassword(userChangePassword2FADTO.UserName,
userChangePassword2FADTO.OldPassword,
userChangePassword2FADTO.NewPassword1,
userChangePassword2FADTO.Code,
userChangePassword2FADTO.Token2FA);
if (userDTO_Response != null)
{
if (string.IsNullOrEmpty(userDTO_Response.UserName) == false)
{
retVal.IsSuccess = true;
retVal.Data = userDTO_Response;
Log.Information($"Sikeres azonosítás! {userChangePassword2FADTO.UserName}");
}
else
{
var error = $"Nem megfelelo felhasználó vagy jelszó! {userChangePassword2FADTO.UserName}";
retVal.IsSuccess = false;
retVal.Errors.Add(error);
Log.Information(error);
}
}
else
{
var error = $"Nem megfelelo felhasználó vagy jelszó! {userChangePassword2FADTO.UserName}";
retVal.IsSuccess = false;
retVal.Errors.Add(error);
Log.Information(error);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
[HttpPost("AuthenticateNFC")]
public async Task<ApiResponseDTO<UserDTO>> AuthenticateNFC([FromBody] UserSimpleDTO userSimpleDTO)
{
var retVal = new ApiResponseDTO<UserDTO>()
{
IsSuccess = true
};
if (string.IsNullOrEmpty(userSimpleDTO.UserName) || string.IsNullOrEmpty(userSimpleDTO.Password))
{
retVal.IsSuccess = false;
retVal.Errors.Add("Nem megfelelo felhasználói név vagy jelszó");
return retVal;
}
try
{
var userDTO_Response = await _userService.AuthenticateNFC(userSimpleDTO.UserName);
if (userDTO_Response != null)
{
if (string.IsNullOrEmpty(userDTO_Response.UserName) == false && userDTO_Response.NFCActive)
{
retVal.IsSuccess = true;
retVal.Data = userDTO_Response;
Log.Information($"Sikeres azonosítás! {userSimpleDTO.UserName}");
}
else
{
var error = $"Nem megfelelo felhasználó vagy jelszó! {userSimpleDTO.UserName}";
retVal.IsSuccess = false;
retVal.Errors.Add(error);
Log.Information(error);
}
}
else
{
var error = $"Nem megfelelo felhasználó vagy jelszó! {userSimpleDTO.UserName}";
retVal.IsSuccess = false;
retVal.Errors.Add(error);
Log.Information(error);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
[HttpGet("GetRole/{id}")]
public async Task<ApiResponseDTO<RoleDTO>> GetRole(int id)
{
var retVal = new ApiResponseDTO<RoleDTO>()
{
IsSuccess = true,
};
var RoleDTO = await _userService.GetRoleAsync(id);
if (RoleDTO != null)
{
if (RoleDTO.Id == 0)
{
retVal.IsSuccess = false;
retVal.Errors.Add("No match!");
retVal.Data = RoleDTO;
}
else
{
retVal.IsSuccess = true;
retVal.Data = RoleDTO;
}
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("GetAllRoles")]
public async Task<ApiResponseDTO<List<RoleDTO>>> GetAllRoles()
{
var retVal = new ApiResponseDTO<List<RoleDTO>>()
{
IsSuccess = true,
};
var RoleDTO = await _userService.GetAllRoleAsync();
if (RoleDTO != null)
{
retVal.IsSuccess = true;
retVal.Data = RoleDTO;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("DeleteRole/{id}")]
public async Task<ApiResponseDTO<bool>> DeleteRole(int id)
{
var retVal = new ApiResponseDTO<bool>()
{
IsSuccess = true,
};
var result = await _userService.DeleteRoleAsync(id);
if (result != null)
{
retVal.IsSuccess = true;
retVal.Data = result;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpPost("UpdateRole")]
public async Task<ApiResponseDTO<RoleDTO>> UpdateRole([FromBody] RoleDTO roleDTO)
{
var retVal = new ApiResponseDTO<RoleDTO>()
{
IsSuccess = true
};
try
{
var result = await _userService.UpdateRoleAsync(roleDTO);
retVal.Data = result;
}
catch (Exception ex)
{
retVal.IsSuccess = false;
Log.Error(ex.Message);
}
return retVal;
}
[HttpGet("GetUserRole/{id}")]
public async Task<ApiResponseDTO<UserRoleDTO>> GetUserRole(int id)
{
var retVal = new ApiResponseDTO<UserRoleDTO>()
{
IsSuccess = true,
};
var RoleDTO = await _userService.GetUserRoleAsync(id);
if (RoleDTO != null)
{
if (RoleDTO.Id == 0)
{
retVal.IsSuccess = false;
retVal.Errors.Add("No match!");
retVal.Data = RoleDTO;
}
else
{
retVal.IsSuccess = true;
retVal.Data = RoleDTO;
}
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("GetAllUserRoles")]
public async Task<ApiResponseDTO<List<UserRoleDTO>>> GetAllUserRoles()
{
var retVal = new ApiResponseDTO<List<UserRoleDTO>>()
{
IsSuccess = true,
};
var RoleDTO = await _userService.GetAllUserRoleAsync();
if (RoleDTO != null)
{
retVal.IsSuccess = true;
retVal.Data = RoleDTO;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("DeleteUserRole/{id}")]
public async Task<ApiResponseDTO<bool>> DeleteUserRole(int id)
{
var retVal = new ApiResponseDTO<bool>()
{
IsSuccess = true,
};
var result = await _userService.DeleteUserRoleAsync(id);
if (result != null)
{
retVal.IsSuccess = true;
retVal.Data = result;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpPost("UpdateUserRole")]
public async Task<ApiResponseDTO<UserRoleDTO>> UpdateUserRole([FromBody] UserRoleDTO userRoleDTO)
{
var retVal = new ApiResponseDTO<UserRoleDTO>()
{
IsSuccess = true
};
try
{
var result = await _userService.UpdateUserRoleAsync(userRoleDTO);
retVal.Data = result;
}
catch (Exception ex)
{
retVal.IsSuccess = false;
Log.Error(ex.Message);
}
return retVal;
}
[HttpGet("GetRoleCheckListTemplateHeader/{id}")]
public async Task<ApiResponseDTO<RoleCheckListTemplateHeaderDTO>> GetRoleCheckListTemplateHeader(int id)
{
var retVal = new ApiResponseDTO<RoleCheckListTemplateHeaderDTO>()
{
IsSuccess = true,
};
var roleCheckListTemplateHeaderDTO = await _userService.GetRoleCheckListTemplateHeaderAsync(id);
if (roleCheckListTemplateHeaderDTO != null)
{
if (roleCheckListTemplateHeaderDTO.Id == 0)
{
retVal.IsSuccess = false;
retVal.Errors.Add("No match!");
retVal.Data = roleCheckListTemplateHeaderDTO;
}
else
{
retVal.IsSuccess = true;
retVal.Data = roleCheckListTemplateHeaderDTO;
}
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("GetAllRoleCheckListTemplateHeaders")]
public async Task<ApiResponseDTO<List<RoleCheckListTemplateHeaderDTO>>> GetAllRoleCheckListTemplateHeaders()
{
var retVal = new ApiResponseDTO<List<RoleCheckListTemplateHeaderDTO>>()
{
IsSuccess = true,
};
var results = await _userService.GetAllRoleCheckListTemplateHeadersAsync();
if (results != null)
{
retVal.IsSuccess = true;
retVal.Data = results;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("DeleteRoleCheckListTemplateHeader/{id}")]
public async Task<ApiResponseDTO<bool>> DeleteRoleCheckListTemplateHeader(int id)
{
var retVal = new ApiResponseDTO<bool>()
{
IsSuccess = true,
};
var result = await _userService.DeleteRoleCheckListTemplateHeaderAsync(id);
if (result != null)
{
retVal.IsSuccess = true;
retVal.Data = result;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpPost("UpdateRoleCheckListTemplateHeader")]
public async Task<ApiResponseDTO<RoleCheckListTemplateHeaderDTO>> UpdateRoleCheckListTemplateHeader([FromBody] RoleCheckListTemplateHeaderDTO roleCheckListTemplateHeaderDTO)
{
var retVal = new ApiResponseDTO<RoleCheckListTemplateHeaderDTO>()
{
IsSuccess = true
};
try
{
var result = await _userService.UpdateRoleCheckListTemplateHeaderAsync(roleCheckListTemplateHeaderDTO);
retVal.Data = result;
}
catch (Exception ex)
{
retVal.IsSuccess = false;
Log.Error(ex.Message);
}
return retVal;
}
[HttpGet("GetRoleCheckPoint/{id}")]
public async Task<ApiResponseDTO<RoleCheckPointDTO>> GetRoleCheckPoint(int id)
{
var retVal = new ApiResponseDTO<RoleCheckPointDTO>()
{
IsSuccess = true,
};
var roleCheckPointDTO = await _userService.GetRoleCheckPointAsync(id);
if (roleCheckPointDTO != null)
{
if (roleCheckPointDTO.Id == 0)
{
retVal.IsSuccess = false;
retVal.Errors.Add("No match!");
retVal.Data = roleCheckPointDTO;
}
else
{
retVal.IsSuccess = true;
retVal.Data = roleCheckPointDTO;
}
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("GetAllRoleCheckPoints")]
public async Task<ApiResponseDTO<List<RoleCheckPointDTO>>> GetAllRoleCheckPoints()
{
var retVal = new ApiResponseDTO<List<RoleCheckPointDTO>>()
{
IsSuccess = true,
};
var results = await _userService.GetAllRoleCheckPointsAsync();
if (results != null)
{
retVal.IsSuccess = true;
retVal.Data = results;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpGet("DeleteRoleCheckPoint/{id}")]
public async Task<ApiResponseDTO<bool>> DeleteRoleCheckPoint(int id)
{
var retVal = new ApiResponseDTO<bool>()
{
IsSuccess = true,
};
var result = await _userService.DeleteRoleCheckPointAsync(id);
if (result != null)
{
retVal.IsSuccess = true;
retVal.Data = result;
}
else
{
retVal.IsSuccess = false;
retVal.Errors.Add("No data!");
}
return retVal;
}
[HttpPost("UpdateRoleCheckPoint")]
public async Task<ApiResponseDTO<RoleCheckPointDTO>> UpdateRoleCheckPoint([FromBody] RoleCheckPointDTO roleCheckPointDTO)
{
var retVal = new ApiResponseDTO<RoleCheckPointDTO>()
{
IsSuccess = true
};
try
{
var result = await _userService.UpdateRoleCheckPointAsync(roleCheckPointDTO);
retVal.Data = result;
}
catch (Exception ex)
{
retVal.IsSuccess = false;
Log.Error(ex.Message);
}
return retVal;
}
}
}
@@ -0,0 +1,42 @@
namespace WorkFlowCheck.API.Middleware
{
public class ApiKeyMiddleware
{
private readonly RequestDelegate _next;
private const string ApiKeyHeaderName = "X-Api-Key";
private readonly ILogger<ApiKeyMiddleware> _logger;
public ApiKeyMiddleware(RequestDelegate next, ILogger<ApiKeyMiddleware> logger)
{
_next = next;
_logger = logger;
}
public async Task InvokeAsync(HttpContext context)
{
if (!context.Request.Headers.TryGetValue(ApiKeyHeaderName, out var extractedApiKey))
{
_logger.LogWarning("API Key is missing.");
context.Response.StatusCode = 401; // Unauthorized
context.Response.ContentType = "text/html; charset=utf-8";
await context.Response.WriteAsync("API Key hiányzik.");
return;
}
var appSettings = context.RequestServices.GetRequiredService<IConfiguration>();
var apiKey = appSettings.GetValue<string>("ApiKey");
if (!apiKey.Equals(extractedApiKey))
{
_logger.LogWarning("Invalid API Key.");
context.Response.StatusCode = 403; // Forbidden
context.Response.ContentType = "text/html; charset=utf-8";
await context.Response.WriteAsync("Helytelen API Key.");
return;
}
await _next(context);
}
}
}
@@ -0,0 +1,55 @@
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
namespace WorkFlowCheck.API.Middleware
{
public class JwtMiddleware
{
private readonly RequestDelegate _next;
public readonly IConfiguration _configuration;
public JwtMiddleware(RequestDelegate next, IConfiguration configuration)
{
_next = next;
_configuration = configuration;
}
public async Task Invoke(HttpContext context)
{
var token = context.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last();
if (!string.IsNullOrEmpty(token) && ValidateToken(token, out var claims))
{
context.User = new ClaimsPrincipal(new ClaimsIdentity(claims, "jwt"));
}
await _next(context);
}
private bool ValidateToken(string token, out Claim[] claims)
{
var jwtSettings = _configuration.GetSection("Jwt");
var secretKey = jwtSettings["SecretKey"];
claims = null;
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.UTF8.GetBytes(secretKey);
try
{
var principal = tokenHandler.ValidateToken(token, new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false,
ClockSkew = TimeSpan.Zero
}, out var validatedToken);
claims = principal.Claims.ToArray();
return true;
}
catch
{
return false;
}
}
}
}
Binary file not shown.
+164 -23
View File
@@ -1,36 +1,177 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.OpenApi.Models;
using System.Text.Json;
using System.Text.Json.Serialization;
using WorkFlowCheck.DL;
using Microsoft.AspNetCore.Mvc;
using Serilog;
using WorkFlowCheck.BL.Mappings;
using WorkFlowCheck.BL.Infra;
using WorkFlowCheck.DL.Seed;
using WorkFlowCheck.Common.RequestContext;
using WorkFlowCheck.API.RequestContext;
using WorkFlowCheck.API.Middleware;
using Serilog.Filters;
var builder = WebApplication.CreateSlimBuilder(args);
var builder = WebApplication.CreateBuilder(args);
builder.Services.ConfigureHttpJsonOptions(options =>
//------------------------------------------------------------------------------------------------------------------
string baseLogPath = Path.Combine(Directory.GetCurrentDirectory(), "Logs");
if (!Directory.Exists(baseLogPath))
Directory.CreateDirectory(baseLogPath);
string auditLogPath = Path.Combine(Directory.GetCurrentDirectory(), "Logs", "AuditFlow");
if (!Directory.Exists(auditLogPath))
Directory.CreateDirectory(auditLogPath);
string businessLogPath = Path.Combine(Directory.GetCurrentDirectory(), "Logs", "BusinessFlow");
if (!Directory.Exists(businessLogPath))
Directory.CreateDirectory(businessLogPath);
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(builder.Configuration) // Konfiguráció betöltése
.WriteTo.Console()
.WriteTo.File("logs/log-.log", rollingInterval: RollingInterval.Day)
.WriteTo.Logger(lc => lc
.Filter.ByIncludingOnly(Matching.WithProperty("TAG", "AuditFlow"))
.WriteTo.File("Logs/AuditFlow/au-.log", rollingInterval: RollingInterval.Day)
)
.WriteTo.Logger(lc => lc
.Filter.ByIncludingOnly(Matching.WithProperty("TAG", "BusinessFlow"))
.WriteTo.File("Logs/BusinessFlow/bs-.log", rollingInterval: RollingInterval.Day)
)
.CreateLogger();
//------------------------------------------------------------------------------------------------------------------
Log.ForContext("TAG", "BusinessFlow").Information("API indítása...");
builder.Services.AddAutoMapper(typeof(MapperProfile));
builder.Services.AddMemoryCache();
builder.Services.AddHttpContextAccessor();
builder.Services.AddScoped<IRequestContext, HttpRequestContext>();
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(connectionString, x => x.MigrationsAssembly("WorkFlowCheck.DL")));
//DI
DIConfig.DIInit(builder.Services);
// SWAGGER !!!
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{
options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
c.SwaggerDoc("v1", new OpenApiInfo { Title = "WorkFlowCheck API", Version = "v1" });
// API Key Auth definíció
c.AddSecurityDefinition("ApiKey", new OpenApiSecurityScheme
{
Description = "API Key szükséges. Használat: 'ApiKey: {kulcs}'",
Name = "X-Api-Key", // A fejlécek között keresendõ
In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey,
Scheme = "ApiKey"
});
c.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = "ApiKey"
},
Scheme = "ApiKey",
Name = "ApiKey",
In = ParameterLocation.Header,
},
Array.Empty<string>()
}
});
});
builder.Host.UseSerilog();
builder.Services.AddControllers()
.AddNewtonsoftJson(options =>
{
// Itt konfigurálhatod az egyedi beállításokat
options.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
});
builder.Services.AddCors(options =>
{
options.AddDefaultPolicy(policy =>
{
policy.WithOrigins("*").AllowAnyMethod().AllowAnyHeader();
});
});
builder.WebHost.ConfigureKestrel(options =>
{
var kestrelConfig = builder.Configuration.GetSection("Kestrel");
options.Configure(kestrelConfig);
});
var app = builder.Build();
//----------------- Munkakönyvtárak létrehozása -----------------------------
string imageDirectory = Path.Combine(Directory.GetCurrentDirectory(), "Images");
if (!Directory.Exists(imageDirectory))
{
Directory.CreateDirectory(imageDirectory);
}
string pdfDirectory = Path.Combine(Directory.GetCurrentDirectory(), "Pdf");
// Ensure the Images directory exists
if (!Directory.Exists(pdfDirectory))
{
Directory.CreateDirectory(pdfDirectory);
}
string downloadDirectory = Path.Combine(Directory.GetCurrentDirectory(), "Downloads");
if (!Directory.Exists(downloadDirectory))
{
Directory.CreateDirectory(downloadDirectory);
}
string downloadAPKDirectory = Path.Combine(Directory.GetCurrentDirectory(), "Downloads","APK");
if (!Directory.Exists(downloadAPKDirectory))
{
Directory.CreateDirectory(downloadAPKDirectory);
}
//---------------------------------------------------------------------------
var sampleTodos = new Todo[] {
new(1, "Walk the dog"),
new(2, "Do the dishes", DateOnly.FromDateTime(DateTime.Now)),
new(3, "Do the laundry", DateOnly.FromDateTime(DateTime.Now.AddDays(1))),
new(4, "Clean the bathroom"),
new(5, "Clean the car", DateOnly.FromDateTime(DateTime.Now.AddDays(2)))
};
using (var scope = app.Services.CreateScope())
{
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
DBInitializer.Seed(context);
}
var todosApi = app.MapGroup("/todos");
todosApi.MapGet("/", () => sampleTodos);
todosApi.MapGet("/{id}", (int id) =>
sampleTodos.FirstOrDefault(a => a.Id == id) is { } todo
? Results.Ok(todo)
: Results.NotFound());
// Swagger middleware
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "WorkFlowCheck API v1");
});
}
// Routing és endpointok
//app.UseHttpsRedirection();
app.UseRouting();
app.UseMiddleware<ApiKeyMiddleware>();
app.UseMiddleware<JwtMiddleware>();
app.MapControllers();
app.UseAuthorization();
app.UseCors();
Log.ForContext("TAG", "BusinessFlow").Information("API fut.");
app.Run();
public record Todo(int Id, string? Title, DateOnly? DueBy = null, bool IsComplete = false);
[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{
}
@@ -1,15 +1,31 @@
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "todos",
"applicationUrl": "http://localhost:5069",
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"dotnetRunMessages": true,
"applicationUrl": "https://localhost:5069"
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
},
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:59027/",
"sslPort": 44382
}
}
}
}
@@ -0,0 +1,37 @@
using Microsoft.Extensions.Caching.Memory;
using System.Diagnostics;
using System.Security.Claims;
using WorkFlowCheck.Common.Constants;
using WorkFlowCheck.Common.DTO;
using WorkFlowCheck.Common.RequestContext;
namespace WorkFlowCheck.API.RequestContext
{
public class HttpRequestContext : IRequestContext
{
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly IMemoryCache _memoryCache;
public HttpRequestContext(IHttpContextAccessor httpContextAccessor, IMemoryCache memoryCache)
{
_httpContextAccessor = httpContextAccessor;
_memoryCache = memoryCache;
TraceId = Activity.Current?.Id;
}
public string TraceId { get; }
public int? CurrentUserId => CurrentDbUser?.Id;
public string CurrentUsername => CurrentHttpUser?.Identity.Name;
public string CurrentUserEmail => CurrentHttpUser?.FindFirst(System.Security.Claims.ClaimTypes.Email)?.Value;
public CancellationToken RequestAborted => _httpContextAccessor.HttpContext.RequestAborted;
private UserDTO CurrentDbUser => _memoryCache.Get<UserDTO>(MemoryCacheNames.UsersNamePrefix + CurrentUserEmail);
private ClaimsPrincipal CurrentHttpUser => _httpContextAccessor.HttpContext.User;
}
}
+47 -3
View File
@@ -1,11 +1,55 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<SelfContained>true</SelfContained>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<InvariantGlobalization>true</InvariantGlobalization>
<PublishAot>true</PublishAot>
<InvariantGlobalization>false</InvariantGlobalization>
<PublishAot>false</PublishAot>
<IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\WorkFlowCheck.BL\WorkFlowCheck.BL.csproj" />
<ProjectReference Include="..\WorkFlowCheck.DL\WorkFlowCheck.DL.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="MailKit" Version="4.11.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.11" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.12">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Serilog.AspNetCore" Version="8.0.3" />
<PackageReference Include="Serilog.Expressions" Version="5.0.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="9.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.7" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="7.2.0" />
</ItemGroup>
<ItemGroup>
<None Update="Certs\SwaggerCert.pfx">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Pdf\CheckList_Template_V1.docx">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>
<Content Update="appsettings.Development.json">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<Folder Include="Logs\" />
</ItemGroup>
</Project>
@@ -1,4 +1,7 @@
{
"ConnectionStrings": {
"DefaultConnection": "Data Source=WS2016DC\\SQLEXPRESS;Initial Catalog=WFC;Integrated Security=True;Connect Timeout=30;Encrypt=False;Trust Server Certificate=False;Application Intent=ReadWrite;Multi Subnet Failover=False"
},
"Logging": {
"LogLevel": {
"Default": "Information",
+67 -2
View File
@@ -1,9 +1,74 @@
{
"ConnectionStrings": {
"DefaultConnection": "Data Source=WS2016DC\\SQLEXPRESS;Initial Catalog=WFCUAT;Integrated Security=True;Connect Timeout=30;Encrypt=False;Trust Server Certificate=False;Application Intent=ReadWrite;Multi Subnet Failover=False"
},
"ApiKey": "RUJeLSpSMzVASUdaRCEzUyYxRSE0VyFISFRSJC0zRzhLM1hCSDU=",
"Jwt": {
"SecretKey": "9aLxV2t7RpM8BfKqZwXy3GehYJDUNTCrHkVZ",
"Issuer": "https://wfcapi.nuvolar.hu/",
"Audience": "wfc-application",
"TokenLifetimeMinutes": 1440
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
"Microsoft.AspNetCore": "Information"
}
},
"AllowedHosts": "*"
"Serilog": {
"MinimumLevel": "Information",
"WriteTo": [
{
"Name": "Console"
},
{
"Name": "Logger",
"Args": {
"filter": "Equals(TAG, 'AuditFlow')",
"writeTo": [
{
"Name": "File",
"Args": {
"path": "Logs/AuditFlow/log-.txt",
"rollingInterval": "Day",
"outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}"
}
}
]
}
},
{
"Name": "Logger",
"Args": {
"filter": "Equals(TAG, 'BusinessFlow')",
"writeTo": [
{
"Name": "File",
"Args": {
"path": "Logs/BusinessFlow/log-.txt",
"rollingInterval": "Day",
"outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}"
}
}
]
}
}
],
"Enrich": [ "FromLogContext" ]
},
"AllowedHosts": "*",
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:8660"
}
}
},
"EmailSettings": {
"SmtpServer": "smtp.gmail.com",
"SmtpPort": 587,
"Username": "nuvolarsetup@gmail.com",
"Password": "reiq pgfr nxub pvrb",
"SenderName": "Nuvolar System"
}
}
+2
View File
@@ -0,0 +1,2 @@
dotnet publish -c Release -o e:\wfcapi\
pause
@@ -0,0 +1,222 @@
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System.Diagnostics;
namespace WorkFlowCheck.BL.DocumentGenerator
{
public class DokumentumGenerator
{
public static byte[] DocxToPdfL(byte[] wordBytes, List<string> imagePaths = null)
{
string pdfDirectory = Path.Combine(Directory.GetCurrentDirectory(), "Pdf");
string fileName = Guid.NewGuid().ToString();
string tempWordPath = Path.Combine(pdfDirectory, fileName + ".docx");
string tempPdfPath = Path.Combine(pdfDirectory, fileName + ".pdf");
try
{
// Word fájl mentése ideiglenes fájlba
File.WriteAllBytes(tempWordPath, wordBytes);
if (imagePaths != null && imagePaths.Count > 0)
{
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(tempWordPath, true))
{
MainDocumentPart mainPart = wordDoc.MainDocumentPart;
foreach (string imagePath in imagePaths)
{
if (File.Exists(imagePath))
{
InsertImageAsNewPage(mainPart, imagePath);
}
}
wordDoc.MainDocumentPart.Document.Save();
}
}
// LibreOffice parancssori konverzió
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = "e:\\LibreOffice\\program\\soffice", // LibreOffice parancs
Arguments = $"--headless --convert-to pdf \"{tempWordPath}\" --outdir \"{pdfDirectory}",
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};
using (Process process = Process.Start(startInfo))
{
process.WaitForExit();
}
// Ellenőrzés, hogy létrejött-e a PDF
if (File.Exists(tempPdfPath))
{
byte[] pdfBytes = File.ReadAllBytes(tempPdfPath);
// Ideiglenes fájlok törlése
File.Delete(tempWordPath);
File.Delete(tempPdfPath);
return pdfBytes;
}
else
{
throw new Exception("PDF konverzió sikertelen.");
}
}
catch (Exception ex)
{
Console.WriteLine("Hiba a PDF konverzió során: " + ex.Message);
return null;
}
}
private static void InsertImageAsNewPage(MainDocumentPart mainPart, string imagePath)
{
string fileName = Path.GetFileName(imagePath);
// Kép méretezés max szélesség/magasság A4 hasznos területhez igazítva
using var image = SixLabors.ImageSharp.Image.Load(imagePath);
int pixelWidth = image.Width;
int pixelHeight = image.Height;
long maxWidth = 5760000L; // kb. 16 cm
long maxHeight = 7200000L; // kb. 20 cm
double aspectRatio = (double)pixelHeight / pixelWidth;
long finalWidth = maxWidth;
long finalHeight = (long)(maxWidth * aspectRatio);
if (finalHeight > maxHeight)
{
finalHeight = maxHeight;
finalWidth = (long)(maxHeight / aspectRatio);
}
// Kép hozzáadása Word dokumentumhoz
ImagePart imagePart = mainPart.AddImagePart(ImagePartType.Jpeg);
using (FileStream stream = new FileStream(imagePath, FileMode.Open))
{
imagePart.FeedData(stream);
}
string imagePartId = mainPart.GetIdOfPart(imagePart);
Drawing drawing = CreateImageDrawing(imagePartId, finalWidth, finalHeight);
// Kép beillesztése középre igazítva
Paragraph imageParagraph = new Paragraph(new Run(drawing))
{
ParagraphProperties = new ParagraphProperties(
new Justification() { Val = JustificationValues.Center }
)
};
TableCell imageCell = new TableCell(imageParagraph,
new TableCellProperties(
new TableCellVerticalAlignment { Val = TableVerticalAlignmentValues.Center },
new TableCellWidth() { Type = TableWidthUnitValues.Pct, Width = "10000" }
));
// Képes sor (magas, kitölti az oldalt)
TableRow imageRow = new TableRow(imageCell);
imageRow.AppendChild(new TableRowProperties(
new TableRowHeight() { Val = 9000, HeightType = HeightRuleValues.Exact }
));
// Fájlnév beillesztése középre
Paragraph fileNamePara = new Paragraph(new Run(new Text(fileName)))
{
ParagraphProperties = new ParagraphProperties(
new Justification() { Val = JustificationValues.Center }
)
};
TableCell fileNameCell = new TableCell(fileNamePara,
new TableCellProperties(
new TableCellVerticalAlignment { Val = TableVerticalAlignmentValues.Center },
new TableCellWidth() { Type = TableWidthUnitValues.Pct, Width = "10000" }
));
// Fájlnév sor (normál magasság)
TableRow fileNameRow = new TableRow(fileNameCell);
fileNameRow.AppendChild(new TableRowProperties(
new TableRowHeight() { Val = 400, HeightType = HeightRuleValues.Auto }
));
// Táblázat szegély nélkül, teljes oldalszélességben
Table table = new Table(
new TableProperties(
new TableWidth { Width = "10000", Type = TableWidthUnitValues.Pct },
new TableBorders(
new TopBorder { Val = BorderValues.None },
new BottomBorder { Val = BorderValues.None },
new LeftBorder { Val = BorderValues.None },
new RightBorder { Val = BorderValues.None },
new InsideHorizontalBorder { Val = BorderValues.None },
new InsideVerticalBorder { Val = BorderValues.None }
)
),
imageRow,
fileNameRow
);
// Új oldal és a táblázat beszúrása a dokumentum végére
Body body = mainPart.Document.Body;
body.Append(new Paragraph(new Run(new Break() { Type = BreakValues.Page })));
body.Append(table);
}
private static Drawing CreateImageDrawing(string relationshipId, long width, long height)
{
return new Drawing(
new DocumentFormat.OpenXml.Drawing.Wordprocessing.Inline(
new DocumentFormat.OpenXml.Drawing.Wordprocessing.Extent() { Cx = width, Cy = height },
new DocumentFormat.OpenXml.Drawing.Wordprocessing.EffectExtent()
{
LeftEdge = 0L,
TopEdge = 0L,
RightEdge = 0L,
BottomEdge = 0L
},
new DocumentFormat.OpenXml.Drawing.Wordprocessing.DocProperties()
{
Id = (UInt32Value)1U,
Name = "Inserted Image"
},
new DocumentFormat.OpenXml.Drawing.Graphic(
new DocumentFormat.OpenXml.Drawing.GraphicData(
new DocumentFormat.OpenXml.Drawing.Pictures.Picture(
new DocumentFormat.OpenXml.Drawing.Pictures.NonVisualPictureProperties(
new DocumentFormat.OpenXml.Drawing.Pictures.NonVisualDrawingProperties()
{
Id = (UInt32Value)0U,
Name = "Picture"
},
new DocumentFormat.OpenXml.Drawing.Pictures.NonVisualPictureDrawingProperties()),
new DocumentFormat.OpenXml.Drawing.Pictures.BlipFill(
new DocumentFormat.OpenXml.Drawing.Blip()
{
Embed = relationshipId
},
new DocumentFormat.OpenXml.Drawing.Stretch(
new DocumentFormat.OpenXml.Drawing.FillRectangle())),
new DocumentFormat.OpenXml.Drawing.Pictures.ShapeProperties(
new DocumentFormat.OpenXml.Drawing.Transform2D(
new DocumentFormat.OpenXml.Drawing.Offset() { X = 0L, Y = 0L },
new DocumentFormat.OpenXml.Drawing.Extents() { Cx = width, Cy = height }),
new DocumentFormat.OpenXml.Drawing.PresetGeometry(
new DocumentFormat.OpenXml.Drawing.AdjustValueList())
{ Preset = DocumentFormat.OpenXml.Drawing.ShapeTypeValues.Rectangle }))
)
{ Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture" })
)
{ DistanceFromTop = 0U, DistanceFromBottom = 0U, DistanceFromLeft = 0U, DistanceFromRight = 0U });
}
}
}
@@ -0,0 +1,576 @@
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System.Text.RegularExpressions;
namespace WorkFlowCheck.BL.DocumentGenerator
{
public class SablonGenerator : IDisposable
{
private readonly List<OpenXmlElement> _currentRoot;
private MemoryStream Mem { get; }
private WordprocessingDocument Doc { get; set; }
private List<OpenXmlElement> CurrentRoot => Repeater?.SablonRoot ?? _currentRoot;
private SubSablon Repeater { get; set; }
protected class SubSablon : IDisposable
{
private List<OpenXmlElement> SablonRootBase { get; set; }
protected internal List<OpenXmlElement> SablonRoot { get; private set; }
public BookmarkStart BookmarkStart { get; }
public BookmarkEnd BookmarkEnd { get; }
protected internal SubSablon(WordprocessingDocument doc, string key)
{
var bookmark = doc.MainDocumentPart.RootElement.Descendants<BookmarkStart>()
.FirstOrDefault(x => x.Name == key);
//var parentBookmark = false;
if (bookmark != null)
{
SablonRoot = new List<OpenXmlElement>();
var nextSibling = bookmark.NextSibling();
if (nextSibling == null)
nextSibling = bookmark.Parent;
while (nextSibling != null)
{
var endBookmark = (nextSibling is BookmarkEnd end && end.Id == bookmark.Id.Value) ? end : null;
if (endBookmark == null)
{
endBookmark = nextSibling.Descendants<BookmarkEnd>().FirstOrDefault(x => x.Id == bookmark.Id.Value);
if (endBookmark != null)
SablonRoot.Add(nextSibling);
}
if (endBookmark != null)
{
bookmark.Remove();
endBookmark.Remove();
break;
}
SablonRoot.Add(nextSibling);
var tmpNextSibling = nextSibling.NextSibling();
if (tmpNextSibling == null)
{
tmpNextSibling = nextSibling.Parent;
if (tmpNextSibling != null && !(tmpNextSibling is Body) && !(tmpNextSibling is Document))
SablonRoot.Clear();
else
break;
}
nextSibling = tmpNextSibling;
}
}
if (SablonRoot != null && SablonRoot.Count > 0)
{
SablonRootBase = new List<OpenXmlElement>();
foreach (var item in SablonRoot)
{
SablonRootBase.Add(item.CloneNode(true));
}
BookmarkStart = new BookmarkStart() { Name = "repeater", Id = "1000" };
BookmarkEnd = new BookmarkEnd() { Id = "1000" };
if (SablonRoot.First().Parent != null)
{
SablonRoot.First().InsertBeforeSelf(BookmarkStart);
SablonRoot.First().InsertBeforeSelf(BookmarkEnd);
foreach (var rootItem in SablonRoot)
rootItem.Remove();
}
else
{
foreach (var rootItem in SablonRoot)
foreach (var rootItemChildElement in rootItem.ChildElements)
rootItemChildElement.Remove();
SablonRoot.First().AppendChild(BookmarkStart);
SablonRoot.First().AppendChild(BookmarkEnd);
}
Reset();
}
}
private void Insert()
{
var root = SablonRoot;
if (root.Count == 1 && root.First() is Document)
{
root = root.First().ChildElements.ToList();
}
for (var i = 0; i < root.Count; i++)
{
if (i == 0)
BookmarkStart.InsertBeforeSelf(root[i]);
else
root[i - 1].InsertAfterSelf(root[i]);
}
}
private void Reset()
{
SablonRoot.Clear();
foreach (var item in SablonRootBase)
{
SablonRoot.Add(item.CloneNode(true));
}
}
protected internal void InsertAndReset()
{
Insert();
Reset();
}
public void Dispose()
{
BookmarkStart?.Remove();
BookmarkEnd?.Remove();
SablonRootBase = null;
SablonRoot = null;
}
}
public IDisposable Repeat(string key)
{
Repeater = new SubSablon(Doc, key);
return Repeater;
}
public SablonGenerator(byte[] content)
{
Mem = new MemoryStream();
Mem.Write(content, 0, content.Length);
try
{
Doc = WordprocessingDocument.Open(Mem, true, new OpenSettings()
{
MarkupCompatibilityProcessSettings =
new MarkupCompatibilityProcessSettings(MarkupCompatibilityProcessMode.ProcessAllParts,
FileFormatVersions.Office2010)
});
}
catch (Exception)
{
//if (!string.IsNullOrEmpty(Config.TryGetStringValue("SablonGeneratorErrorPath")))
//{
// File.WriteAllBytes(Path.Combine(Config.GetStringValue("SablonGeneratorErrorPath"), DateTime.Now.ToString("yyyyMMddHHHmmss.content")), content);
//}
throw;
}
_currentRoot = new List<OpenXmlElement>();
CurrentRoot.AddRange(Doc.MainDocumentPart.HeaderParts.Select(x => x.RootElement));
CurrentRoot.Add(Doc.MainDocumentPart.RootElement);
CurrentRoot.AddRange(Doc.MainDocumentPart.FooterParts.Select(x => x.RootElement));
}
public static void CheckOpenXmlDocument(byte[] content)
{
WordprocessingDocument doc = null;
var mem = new MemoryStream();
mem.Write(content, 0, content.Length);
try
{
doc = WordprocessingDocument.Open(mem, true, new OpenSettings()
{
MarkupCompatibilityProcessSettings =
new MarkupCompatibilityProcessSettings(MarkupCompatibilityProcessMode.ProcessAllParts,
FileFormatVersions.Office2010)
});
}
catch (Exception ex)
{
#if DEBUG
//LoggerHelper.DiagnosticAudit.Information(DateTime.Now,
//Common.Enums.Area.BaseSystem,
//0,
//string.Format(ex.ToString()),
//new Guid().ToString());
//LoggerHelper.DiagnosticAudit.Log.Information(ex.ToString());
#else
//LoggerHelper.DiagnosticAudit.Information(DateTime.Now,
//Common.Enums.Area.BaseSystem,
//0,
//string.Format(ex.Message),
//Guid.Empty.ToString());
#endif
//throw new BusinessException("Hibás vagy nem megfelelő OpenXML állomány.");
}
finally
{
mem?.Dispose();
doc?.Dispose();
}
}
public void Generate(Dictionary<string, string> propertyDictionary)
{
ReplaceBookmarks(propertyDictionary);
if (Repeater?.SablonRoot != null) Repeater.InsertAndReset();
}
public void SimpleReplace(string key, string value)
{
value = value == null ? "" : value;
foreach (var headerPart in Doc.MainDocumentPart.HeaderParts)
SimpleReplace2(headerPart.Header, key, value);
SimpleReplace2(Doc.MainDocumentPart.Document.Body, key, value);
foreach (var footerPart in Doc.MainDocumentPart.FooterParts)
SimpleReplace2(footerPart.Footer, key, value);
}
protected void SimpleReplace(OpenXmlCompositeElement target, string key, string value)
{
var keyValue = key.Replace("#", "");
var texts = target.Descendants<Text>();
Text start = null;
Text keyValueText = null;
foreach (var text in texts)
if (text.Text == "#" && start == null)
start = text;
else if (text.Text == "#" && start != null && keyValueText != null)
{
var end = text;
keyValueText.Text = value;
start.Remove();
end.Remove();
start = null;
keyValueText = null;
}
else if (start != null && text.Text.ToUpper().Contains(keyValue.ToUpper()))
keyValueText = text;
else if (text.Text.ToUpper().Contains(key.ToUpper()))
{
start = null;
keyValueText = null;
text.Text = Regex.Replace(text.Text, key, value, RegexOptions.IgnoreCase);
}
else
{
start = null;
keyValueText = null;
}
}
protected void SimpleReplace2(OpenXmlCompositeElement target, string key, string value)
{
var texts = target.Descendants<Text>();
Text start = null;
var tokens = new List<Text>();
string tokenText = "";
foreach (var text in texts)
{
if (text.Text == "#" && start == null)
{
start = text;
tokenText += text.Text;
}
else if (text.Text == "#" && start != null)
{
var end = text;
tokenText += text.Text;
if (tokenText.ToUpper() == key.ToUpper())
{
start.Text = value;
foreach (var token in tokens)
{
token.Remove();
}
tokens.Clear();
end.Remove();
start = null;
tokenText = "";
}
else
{
start = null;
tokens.Clear();
tokenText = "";
end = null;
}
}
else if (text.Text.Contains('#') && text.Text.ToUpper() == key.ToUpper())
{
text.Text = value;
}
else if (text.Text.Contains('#'))
{
}
else if (start != null)
{
tokens.Add(text);
tokenText += text.Text;
}
}
}
public void SimpleReplaceForCV(string key, string value)
{
value = value == null ? "" : value;
SimpleReplaceForCV(Doc.MainDocumentPart.Document.Body, key, value);
}
protected void SimpleReplaceForCV(OpenXmlCompositeElement target, string key, string value)
{
var keyValue = key.Replace("#", "");
var texts = target.Descendants<Text>();
Text start = null;
Text keyValueText = null;
var keyindox = "";
foreach (var text in texts)
{
if (text.Text.Contains(key))
{
text.Text = text.Text.Replace(key, value);
break;
}
if (text.Text.Contains(keyValue + "#") && start != null)
{
start.Text = "";
text.Text = text.Text.Replace(keyValue + "#", value);
break;
}
if ((text.Text == "#" || (text.Text.Contains("#") && text.Text.Count(x => x == '#') == 1)) && start == null)
{
start = text;
keyindox = start.Text;
}
else if (start != null && (text.Text == "#" || text.Text.Contains("#")))
{
for (int i = texts.ToList().IndexOf(start) + 1; i < texts.ToList().IndexOf(text) + 1; i++)
{
if (texts.ToList()[i].Text.Contains(key))
{
texts.ToList()[i].Text = texts.ToList()[i].Text.Replace(key, value);
break;
}
keyindox = keyindox + texts.ToList()[i].Text;
}
keyindox = keyindox.Replace("#", "");
if (keyindox == keyValue || keyindox.Replace(" ", "") == keyValue)
{
for (int i = texts.ToList().IndexOf(start) + 1; i < texts.ToList().IndexOf(text); i++)
{
texts.ToList()[i].Text = "";
}
start.Text = "";
text.Text = value;
}
if (keyindox.Contains(keyValue))
{
for (int i = texts.ToList().IndexOf(start) + 1; i < texts.ToList().IndexOf(text); i++)
{
texts.ToList()[i].Text = "";
}
start.Text = "";
text.Text = keyindox.Replace(keyValue, value);
}
start = null;
keyindox = "";
}
}
}
private void ReplaceBookmarks(Dictionary<string, string> propertyDictionary)
{
var bookmarkEndList = new List<BookmarkEnd>();
foreach (var item in CurrentRoot)
{
var bookmarkEnds = item.Descendants<BookmarkEnd>();
bookmarkEndList.AddRange(bookmarkEnds.ToList());
}
foreach (var docContent in CurrentRoot)
{
var bookmarkStarts = docContent.Descendants<BookmarkStart>();
var bookmarkStartList = bookmarkStarts.ToList();
if (docContent is BookmarkStart)
bookmarkStartList.Add(docContent as BookmarkStart);
for (int k = 0; k < bookmarkStartList.Count; k++)
{
Run bookmarkRun = bookmarkStartList[k].NextSibling<Run>();
if (bookmarkRun != null)
{
var bookmarkText = bookmarkRun.GetFirstChild<Text>().InnerText;
if (propertyDictionary.ContainsKey(bookmarkText))
{
var itemValue = propertyDictionary[bookmarkText];
bookmarkRun.GetFirstChild<Text>().Text = itemValue ?? string.Empty;
var id = bookmarkStartList[k].Id.Value;
bookmarkStartList[k].Remove();
var end = bookmarkEndList.Find(x => x.Id == id);
end.Remove();
}
}
}
}
}
/// <summary>
/// Táblázat generálás (a keyinrow paramétert keresi a táblázat első sorában (nem fejléc), ezt a sort kitörli, és helyére szúrja be az új sorokat
/// amit az első paraméterben kap meg
/// </summary>
/// <param name="rowsAndCells">sorok és benne az egyes cellák tartalma</param>
/// <param name="keyInRow">első (nem fejléc) sorában lévő kulcs, ez alapján azonosítjuk be a táblázatot</param>
/// <param name="deleteEmptyRow">ha igaz, a táblázat összes meglévő sorát törli</param>
public void SetTable_Old(List<List<string>> rowsAndCells, string keyInRow, bool deleteEmptyRow = false)
{
Body bod = Doc.MainDocumentPart.Document.Body;
var table = bod.Descendants<Table>().Where(tbl => tbl.InnerText.Contains(keyInRow)).FirstOrDefault();
if (table != null)
{
if (deleteEmptyRow)
{
var firstRow = table.ChildElements.Where(x => x is TableRow).FirstOrDefault();
var deletedRows = table.ChildElements.Where(x => x is TableRow).ToList();
deletedRows.Remove(firstRow);
foreach (var item in deletedRows)
table.RemoveChild(item);
}
else
{
var deletedRow = table.ChildElements.Where(x => x is TableRow).LastOrDefault();
table.RemoveChild<TableRow>(deletedRow as TableRow);
}
foreach (var row in rowsAndCells)
{
List<OpenXmlElement> cells = new List<OpenXmlElement>();
foreach (var cell in row)
{
var tableCell = new TableCell(new Paragraph(new Run(new Text(cell))));
cells.Add(tableCell);
}
table.Append(new TableRow(cells));
}
}
}
public void SetTable(List<List<string>> rowsAndCells, string keyInRow, bool deleteEmptyRow = false)
{
Body bod = Doc.MainDocumentPart.Document.Body;
var table = bod.Descendants<Table>().Where(tbl => tbl.InnerText.Contains(keyInRow)).FirstOrDefault();
if (table != null)
{
TableRow formatRow = null;
// Megkeressük az első sort és elmentjük a formázást
if (deleteEmptyRow)
{
var firstRow = table.ChildElements.OfType<TableRow>().FirstOrDefault();
if (firstRow != null)
{
formatRow = (TableRow)firstRow.CloneNode(true); // Az első sor másolása formázással
var deletedRows = table.ChildElements.OfType<TableRow>().ToList();
foreach (var item in deletedRows)
table.RemoveChild(item);
}
}
else
{
var deletedRow = table.ChildElements.OfType<TableRow>().LastOrDefault();
if (deletedRow != null)
{
formatRow = (TableRow)deletedRow.CloneNode(true); // Az utolsó sor másolása formázással
table.RemoveChild(deletedRow);
}
}
// Új sorok beszúrása a mentett formázással
foreach (var row in rowsAndCells)
{
List<OpenXmlElement> cells = new List<OpenXmlElement>();
for (int i = 0; i < row.Count; i++)
{
var cellText = row[i].Replace("#", "");
// Ha van formázási minta, alkalmazzuk
TableCell newCell;
if (formatRow != null && i < formatRow.Elements<TableCell>().Count())
{
var formatCell = formatRow.Elements<TableCell>().ElementAt(i);
var clonedCell = (TableCell)formatCell.CloneNode(true);
var para = clonedCell.Descendants<Paragraph>().FirstOrDefault();
// Ha van beágyazott szöveg, frissítjük a tartalmát
if (para != null)
{
var run = para.Descendants<Run>().FirstOrDefault();
if (run != null)
{
run.RemoveAllChildren<Text>();
run.AppendChild(new Text(cellText));
}
}
newCell = clonedCell;
}
else
{
// Alapértelmezett cella, ha nincs formázási minta
newCell = new TableCell(new Paragraph(new Run(new Text(cellText))));
}
cells.Add(newCell);
}
table.Append(new TableRow(cells));
}
}
}
public byte[] CloseAndGetDocument()
{
Doc.Dispose();
Doc = null;
return Mem.ToArray();
}
public void Dispose()
{
Doc?.Dispose();
Mem.Dispose();
}
/// <summary>
/// Hozzáfűzi a már megnyitott fájlhoz a paraméterként kapott dokumentum tartalmát.
/// </summary>
/// <param name="document"></param>
/// <param name="addPageBreak"></param>
public void AppendDocument(byte[] document, bool addPageBreak = true)
{
var mainPart = Doc.MainDocumentPart;
string altChunkId = "AltChunk_" + Guid.NewGuid().ToString().Replace("-", "");
var chunk = mainPart.AddAlternativeFormatImportPart(AlternativeFormatImportPartType.WordprocessingML, altChunkId);
chunk.FeedData(new MemoryStream(document));
// oldaltörés, ha kell
if (addPageBreak)
{
mainPart.Document.Body.AppendChild(new Paragraph(new Run(new Break() { Type = BreakValues.Page })));
}
mainPart.Document.Body.AppendChild(new AltChunk() { Id = altChunkId });
mainPart.Document.Save();
}
}
}
@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html lang="hu">
<head>
<meta charset="UTF-8">
<title>Megerősítő kód</title>
</head>
<body style="font-family: Arial, sans-serif; background-color: #f9f9f9; padding: 20px;">
<p style="font-size: 18px;">
<strong>Workflow Check Application Web</strong> megerősítő kódja:
</p>
<p style="font-size: 28px; font-weight: bold; color: #333; margin-top: 10px;">
#token2F#
</p>
</body>
</html>
+24
View File
@@ -0,0 +1,24 @@
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WorkFlowCheck.BL.Services;
using WorkFlowCheck.BL.Services.Interfaces;
namespace WorkFlowCheck.BL.Infra
{
public static class DIConfig
{
public static void DIInit(IServiceCollection service)
{
service.AddScoped<IUserService, UserService>();
service.AddScoped<ISyncService, SyncService>();
service.AddScoped<ICheckListService, CheckListService>();
service.AddScoped<INumberGeneratorService, NumberGeneratorService>();
service.AddScoped<IMessageService, MessageService>();
service.AddScoped<ISystemService, SystemService>();
}
}
}
@@ -0,0 +1,91 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AutoMapper;
using AutoMapper.Configuration.Conventions;
using WorkFlowCheck.BL.Services.Interfaces;
using WorkFlowCheck.Common.DTO;
using WorkFlowCheck.DL.Entities;
namespace WorkFlowCheck.BL.Mappings
{
public class MapperProfile : Profile
{
public MapperProfile()
{
CreateMap<User, UserDTO>().ForMember(dest => dest.RoleDTO, opt => opt.MapFrom(src => src.UserRoles.Select(ur => ur.Role)));
CreateMap<Role, RoleDTO>()
.ForMember(dest => dest.ParentId, opt => opt.MapFrom(src => src.ParentId))
.ForMember(dest => dest.ParentRoleName, opt => opt.MapFrom(src => src.Parent != null ? src.Parent.RoleName : null));
CreateMap<UserRole, UserRoleDTO>()
.ForMember(dest => dest.RoleDTO, opt => opt.MapFrom(src => src.Role))
.ForMember(dest => dest.UserDTO, opt => opt.MapFrom(src => src.User));
CreateMap<UserDTO, User>()
.ForMember(dest => dest.PasswordHash, opt => opt.MapFrom<PasswordHashResolver>());
CreateMap<CheckListTemplateHeader, CheckListTemplateHeaderDTO>()
.ForMember(dest => dest.CheckListTemplateRowDTO, opt => opt.MapFrom(src => src.CheckListTemplateRows));
CreateMap<CheckListTemplateRow, CheckListTemplateRowDTO>()
.ForMember(dest => dest.EquipmentDTO, opt => opt.MapFrom(src => src.Equipment))
.ForMember(dest => dest.CheckPointDTO, opt => opt.MapFrom(src => src.CheckPoint));
CreateMap<CheckPoint, CheckPointDTO>()
.ForMember(dest => dest.CheckListTemplateRowDTO, opt => opt.MapFrom(src => src.CheckListTemplateRows));
CreateMap<CheckPoint, CheckPointDTO>()
.ForMember(dest => dest.CheckListTemplateRowDTO, opt => opt.MapFrom(src => src.CheckListTemplateRows));
CreateMap<CheckPointDTO, CheckPoint>();
CreateMap<Location, LocationDTO>();
CreateMap<LocationDTO, Location>();
CreateMap<Equipment, EquipmentDTO>();
CreateMap<EquipmentDTO, Equipment>();
CreateMap<DeviceMessage, DeviceMessageDTO>();
CreateMap<DeviceMessageDTO, DeviceMessage>();
CreateMap<CheckListHeader, CheckListHeaderDTO>()
.ForMember(dest => dest.UserDTO, opt => opt.MapFrom(src => src.User))
.ForMember(dest => dest.AcceptUserId, opt => opt.MapFrom(src => src.AcceptUser != null ? src.AcceptUser.Id : (int?)null))
.ForMember(dest => dest.AcceptUserDTO, opt => opt.MapFrom(src => src.AcceptUser))
.ForMember(dest => dest.CheckListRowDTO, opt => opt.MapFrom(src => src.CheckListRows));
CreateMap<CheckListRow, CheckListRowDTO>()
.ForMember(dest => dest.CheckListTemplateRowDTO, opt => opt.MapFrom(src => src.CheckListTemplateRow))
.ForMember(dest => dest.Photo, opt => opt.MapFrom(src => GetImageBytes(src.PhotoFileName)));
CreateMap<RoleCheckListTemplateHeader, RoleCheckListTemplateHeaderDTO>()
.ForMember(dest => dest.RoleDTO, opt => opt.MapFrom(src => src.Role))
.ForMember(dest => dest.CheckListTemplateHeaderDTO, opt => opt.MapFrom(src => src.CheckListTemplateHeader));
}
private byte[] GetImageBytes(string fileName)
{
try
{
var filePath = Path.Combine(Directory.GetCurrentDirectory(), "Images", fileName);
if (File.Exists(filePath))
{
return File.ReadAllBytes(filePath);
}
return Array.Empty<byte>(); // Visszaad egy üres byte[]-ot, ha a fájl nem található
}
catch (Exception)
{
return Array.Empty<byte>(); // Hiba esetén is üres byte[]-ot ad vissza
}
}
}
}
@@ -0,0 +1,20 @@
using AutoMapper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WorkFlowCheck.Common.DTO;
using WorkFlowCheck.Common.Security;
using WorkFlowCheck.DL.Entities;
namespace WorkFlowCheck.BL.Mappings
{
public class PasswordHashResolver : IValueResolver<UserDTO, User, string>
{
public string Resolve(UserDTO source, User destination, string destMember, ResolutionContext context)
{
return PasswordHasher.HashPassword(source.Password);
}
}
}
@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.BL.Models
{
public class EmailSettings
{
public string SmtpServer { get; set; } = string.Empty;
public int SmtpPort { get; set; }
public string Username { get; set; } = string.Empty;
public string Password { get; set; } = string.Empty;
public string SenderName { get; set; } = string.Empty;
}
}
@@ -0,0 +1,149 @@
using AutoMapper;
using Microsoft.EntityFrameworkCore;
using Serilog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using WorkFlowCheck.DL;
namespace WorkFlowCheck.BL.Services
{
public class BaseService
{
public readonly AppDbContext _dbContext;
public readonly IMapper _mapper;
private readonly ILogger _logger;
public BaseService(AppDbContext db_dbContext, IMapper mapper)
{
_dbContext = db_dbContext;
_mapper = mapper;
_logger = Log.ForContext("Tag", "PROGSEC");
}
public async Task<bool> DeleteEntityByIdAsync<T>(int id) where T : class
{
try
{
var entity = await _dbContext.Set<T>().FindAsync(id);
if (entity == null)
return false;
_dbContext.Set<T>().Remove(entity);
await _dbContext.SaveChangesAsync();
return true;
}
catch (Exception ex)
{
Log.Error($"Hiba történt a törlés során: {ex.Message}");
return false;
}
}
public async Task<T?> GetEntityByIdAsync<T>(int id) where T : class
{
try
{
var entity = await _dbContext.Set<T>().FindAsync(id);
return entity;
}
catch (Exception ex)
{
Log.Error($"Hiba történt a lekérdezés során: {ex.Message}");
return null;
}
}
public async Task<List<TEntity>> GetEntityByFilterAsync<TEntity, TFilter>(TFilter filter) where TEntity : class where TFilter : class
{
try
{
IQueryable<TEntity> query = _dbContext.Set<TEntity>();
foreach (var property in typeof(TFilter).GetProperties())
{
var value = property.GetValue(filter);
if (value != null)
{
var parameter = Expression.Parameter(typeof(TEntity), "x");
var member = Expression.Property(parameter, property.Name);
var constant = Expression.Constant(value);
var equal = Expression.Equal(member, constant);
var lambda = Expression.Lambda<Func<TEntity, bool>>(equal, parameter);
query = query.Where(lambda);
}
}
// Adatok lekérdezése
return await query.ToListAsync();
}
catch (Exception ex)
{
Log.Error($"Hiba történt a lekérdezés során: {ex.Message}");
return new List<TEntity>();
}
}
public async Task<PagedResult<TEntity>> GetPagedEntityByFilterAsync<TEntity, TFilter>(TFilter filter, int pageNumber, int pageSize) where TEntity : class where TFilter : class
{
try
{
// Az IQueryable típusú lista létrehozása
IQueryable<TEntity> query = _dbContext.Set<TEntity>();
// Dinamikus szűrés a filter tulajdonságai alapján
foreach (var property in typeof(TFilter).GetProperties())
{
var value = property.GetValue(filter);
if (value != null)
{
var parameter = Expression.Parameter(typeof(TEntity), "x");
var member = Expression.Property(parameter, property.Name);
var constant = Expression.Constant(value);
var equal = Expression.Equal(member, constant);
var lambda = Expression.Lambda<Func<TEntity, bool>>(equal, parameter);
query = query.Where(lambda);
}
}
// Teljes rekordok száma a szűrő után
int totalCount = await query.CountAsync();
// Lapozás alkalmazása
var items = await query
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize)
.ToListAsync();
// Lapozási eredmény összerakása
return new PagedResult<TEntity>
{
Items = items,
TotalCount = totalCount,
PageNumber = pageNumber,
PageSize = pageSize
};
}
catch (Exception ex)
{
Console.WriteLine($"Hiba történt a lekérdezés során: {ex.Message}");
return new PagedResult<TEntity>();
}
}
}
public class PagedResult<TEntity>
{
public List<TEntity> Items { get; set; } = new List<TEntity>();
public int TotalCount { get; set; }
public int PageNumber { get; set; }
public int PageSize { get; set; }
}
}
@@ -0,0 +1,629 @@
using AutoMapper;
using DocumentFormat.OpenXml.Office.CustomUI;
using DocumentFormat.OpenXml.Office2010.Excel;
using DocumentFormat.OpenXml.Spreadsheet;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.EntityFrameworkCore;
using Serilog;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using WorkFlowCheck.BL.DocumentGenerator;
using WorkFlowCheck.BL.Services.Interfaces;
using WorkFlowCheck.Common.DTO;
using WorkFlowCheck.Common.Enums;
using WorkFlowCheck.DL;
using WorkFlowCheck.DL.Entities;
namespace WorkFlowCheck.BL.Services
{
public class CheckListService : BaseService, ICheckListService
{
private readonly INumberGeneratorService _numberGeneratorService;
public CheckListService(AppDbContext dbContext,
IMapper mapper,
INumberGeneratorService numberGeneratorService,
IUserService userService) : base(dbContext, mapper)
{
_numberGeneratorService = numberGeneratorService;
}
public async Task<CheckListHeaderDTO> GetCheckListHeaderAsync(int Id)
{
var retVal = new CheckListHeaderDTO()
{
CheckListRowDTO = new List<CheckListRowDTO>()
};
try
{
var res = await _dbContext.CheckListHeaders
.Where(w => w.Id == Id)
.Include(i => i.User)
.Include(i => i.AcceptUser)
.Include(i => i.CheckListRows)
.ThenInclude(r => r.CheckListTemplateRow)
.ThenInclude(r => r.CheckPoint)
.Include(i => i.CheckListRows)
.ThenInclude(r => r.CheckListTemplateRow)
.ThenInclude(r => r.Equipment)
.AsNoTracking()
.FirstOrDefaultAsync();
if (res != null)
{
res.CheckListRows = res.CheckListRows
.OrderBy(r => r.CheckListTemplateRow.CheckPoint?.ShortName ?? string.Empty)
.ThenBy(r => r.CheckListTemplateRow.RowIndex)
.ToList();
}
if (res != null)
{
retVal = _mapper.Map<CheckListHeaderDTO>(res);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<List<CheckListHeaderDTO>> GetAllCheckListHeaderAsync()
{
var retVal = new List<CheckListHeaderDTO>();
try
{
var checkListHeaders = await _dbContext.CheckListHeaders
.Include(i => i.CheckListRows)
.Include(i => i.User)
.Include(i => i.AcceptUser)
.AsNoTracking()
.ToListAsync();
if (checkListHeaders != null)
{
retVal = _mapper.Map<List<CheckListHeaderDTO>>(checkListHeaders);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<CheckListHeaderDTO> UpdateCheckListHeaderAsync(CheckListHeaderDTO checkListHeaderDTO)
{
var retVal = new CheckListHeaderDTO() { CheckListRowDTO = new List<CheckListRowDTO>() };
try
{
if (checkListHeaderDTO.Id == 0)
{
var checkListHeader = new CheckListHeader()
{
CheckListTemplateHeaderId = checkListHeaderDTO.CheckListTemplateHeaderDTO.Id,
Description = checkListHeaderDTO.Description,
GuidNumber = Guid.NewGuid(),
};
_dbContext.CheckListHeaders.Add(checkListHeader);
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<CheckListHeaderDTO>(checkListHeader);
}
else
{
var checkListHeader = await _dbContext.CheckListHeaders
.Include(i => i.CheckListRows)
.Where(w => w.Id == checkListHeaderDTO.Id)
.FirstOrDefaultAsync();
if (checkListHeader != null)
{
checkListHeader.Description = checkListHeaderDTO.Description;
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<CheckListHeaderDTO>(checkListHeader);
}
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<CheckListHeaderDTO> StartNewCheckListAsync(CheckListHeaderNewDTO checkListHeaderNewDTO)
{
var retVal = new CheckListHeaderDTO()
{
CheckListRowDTO = new List<CheckListRowDTO>()
};
using var transaction = await _dbContext.Database.BeginTransactionAsync();
try
{
var checkListTemplateHeader = await _dbContext.CheckListTemplateHeaders
.Where(w => w.Id == checkListHeaderNewDTO.CheckListTemplateHeaderId)
.FirstOrDefaultAsync();
if (checkListTemplateHeader == null)
{
return retVal;
}
var currentDate = DateTime.UtcNow;
var documentNumber = await _numberGeneratorService.GenerateNextNumberAsync(checkListTemplateHeader.NumberGenerator1Id ?? 1, transaction, currentDate);
CheckListHeader checkListHeader = new CheckListHeader()
{
CheckListTemplateHeaderId = checkListHeaderNewDTO.CheckListTemplateHeaderId,
CheckStatus = CheckStatus.Open,
DateExecution = currentDate,
IsEditable = true,
UserId = checkListHeaderNewDTO.UserId,
ShortName = "",
Description = "",
DocumentNumber = documentNumber,
GuidNumber = Guid.NewGuid(),
IsDeleted = false,
IsStorno = false,
CheckListRows = new List<CheckListRow>()
};
_dbContext.CheckListHeaders.Add(checkListHeader);
await _dbContext.SaveChangesAsync();
var checkListTemplateRows = await _dbContext.CheckListTemplateRows
.Where(w => w.CheckListTemplateHeaderId == checkListHeaderNewDTO.CheckListTemplateHeaderId)
.OrderBy(o => o.RowIndex)
.ToListAsync();
foreach (var item in checkListTemplateRows)
{
CheckListRow checkListRow = new CheckListRow()
{
Answer = "",
CheckListHeaderId = checkListHeader.Id,
CheckListTemplateRowId = item.Id,
GuidNumber = Guid.NewGuid(),
IsDeleted = false,
PhotoFileName = "",
};
_dbContext.CheckListRows.Add(checkListRow);
}
await _dbContext.SaveChangesAsync();
await transaction.CommitAsync();
retVal = _mapper.Map<CheckListHeaderDTO>(checkListHeader);
}
catch (Exception ex)
{
await transaction.RollbackAsync();
Log.Error(ex.Message);
}
return retVal;
}
public async Task<bool> AcceptCheckListHeaderAsync(int id, int userid)
{
var retVal = false;
try
{
var checkListHeader = await _dbContext.CheckListHeaders
.Where(w => w.Id == id && w.CheckStatus == CheckStatus.Sent)
.FirstOrDefaultAsync();
if (checkListHeader != null)
{
checkListHeader.CheckStatus = CheckStatus.Signed;
checkListHeader.IsEditable = false;
checkListHeader.AcceptUserId = userid;
Log.ForContext("TAG", "BusinessFlow").Warning($"Ellenőrzési lap státuszváltozása, jóváhasyás: Ellenőrzés:{id}, Felhasználó:{userid}");
await _dbContext.SaveChangesAsync();
var pdf = await CreateCheckListHeaderPDFAsync(id);
if (pdf != null && pdf.Length > 0)
{
string pdfDirectory = Path.Combine(Directory.GetCurrentDirectory(), "Pdf");
var timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");
var fileName = $"CD_{timestamp}_{checkListHeader.GuidNumber.ToString().ToUpper()}.pdf";
var filePath = Path.Combine(pdfDirectory, fileName);
await File.WriteAllBytesAsync(filePath, pdf);
retVal = true;
}
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<byte[]> CreateCheckListHeaderPDFAsync(int checkListHeaderId)
{
try
{
var checkListHeader = await this.GetCheckListHeaderAsync(checkListHeaderId);
string pdfDirectory = Path.Combine(Directory.GetCurrentDirectory(), "Pdf");
byte[] byteArray = File.ReadAllBytes(Path.Combine(pdfDirectory, "CheckList_Template_V1.docx"));
SablonGenerator gen = new SablonGenerator(byteArray);
gen.SimpleReplace("#DocumentNumber#", checkListHeader.DocumentNumber);
gen.SimpleReplace("#DateExecution#", checkListHeader.DateExecution.ToString("yyyy.MM.dd HH:mm"));
gen.SimpleReplace("#WorkUser#", $"{checkListHeader.UserDTO?.LastName} {checkListHeader.UserDTO?.FirstName}");
gen.SimpleReplace("#AcceptUser#", $"{checkListHeader.AcceptUserDTO?.LastName} {checkListHeader.AcceptUserDTO?.FirstName}");
gen.SimpleReplace("#Guid#", checkListHeader.GuidNumber.ToString());
if (checkListHeader.CheckListRowDTO != null && checkListHeader.CheckListRowDTO.Count > 0)
{
var elements = new List<List<string>>();
foreach (var item in checkListHeader.CheckListRowDTO)
{
if (item.CheckListTemplateRowDTO != null)
{
var cells = new List<string>
{
$"{item.CheckListTemplateRowDTO.RowIndex.ToString()}.",
item.CheckListTemplateRowDTO.OperationDescription,
item.Answer
};
elements.Add(cells);
}
}
gen.SetTable(elements, "#rowindex");
}
byte[] content = gen.CloseAndGetDocument();
string imageDirectory = Path.Combine(Directory.GetCurrentDirectory(), "Images");
var images = checkListHeader.CheckListRowDTO.Where(w => (w.CheckListTemplateRowDTO.AnswerType == "P" || w.CheckListTemplateRowDTO.AnswerType == "PN") &&
string.IsNullOrEmpty(w.Answer) != true)
.Select(s => Path.Combine(imageDirectory, s.Answer))
.ToList();
return DokumentumGenerator.DocxToPdfL(content, images);
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return new byte[0];
}
public async Task<bool> BlockCheckListHeaderAsync(int id, int userid)
{
var retVal = false;
try
{
var checkListHeader = await _dbContext.CheckListHeaders
.Where(w => w.Id == id && w.CheckStatus == CheckStatus.InProgress)
.FirstOrDefaultAsync();
if (checkListHeader != null && checkListHeader.CheckStatus == CheckStatus.InProgress)
{
checkListHeader.CheckStatus = CheckStatus.Blocked;
checkListHeader.IsEditable = false;
Log.ForContext("TAG", "BusinessFlow").Warning($"Ellenőrzési lap blokkolva: Ellenőrzés:{id}, Felhasználó:{userid}");
await _dbContext.SaveChangesAsync();
retVal = true;
}
}
catch (Exception ex)
{
retVal = false;
Log.Error(ex.Message);
}
return retVal;
}
public async Task<bool> UnBlockCheckListHeaderAsync(int id, int userid)
{
var retVal = false;
try
{
var checkListHeader = await _dbContext.CheckListHeaders
.Where(w => w.Id == id && w.CheckStatus == CheckStatus.Blocked)
.FirstOrDefaultAsync();
if (checkListHeader != null && checkListHeader.CheckStatus == CheckStatus.Blocked)
{
checkListHeader.CheckStatus = CheckStatus.InProgress;
checkListHeader.IsEditable = true;
Log.ForContext("TAG", "BusinessFlow").Warning($"Ellenőrzési lap feloldva: Ellenőrzés:{id}, Felhasználó:{userid}");
await _dbContext.SaveChangesAsync();
retVal = true;
}
}
catch (Exception ex)
{
retVal = false;
Log.Error(ex.Message);
}
return retVal;
}
public async Task<bool> CloseCheckListHeader(CheckListHeaderCloseDTO closeCheckListHeaderCloseDTO)
{
var retVal = false;
try
{
var checkListHeader = await _dbContext.CheckListHeaders
.Where(w => w.Id == closeCheckListHeaderCloseDTO.Id &&
(w.CheckStatus == CheckStatus.Blocked ||
w.CheckStatus == CheckStatus.InProgress ||
w.CheckStatus == CheckStatus.Open
))
.FirstOrDefaultAsync();
if (checkListHeader != null)
{
checkListHeader.CheckStatus = CheckStatus.Closed;
checkListHeader.IsEditable = false;
checkListHeader.AcceptUserId = closeCheckListHeaderCloseDTO.UserId;
Log.ForContext("TAG", "BusinessFlow").Warning($"Ellenőrzési lap lezárva: Ellenőrzés:{closeCheckListHeaderCloseDTO.Id}, " +
$"Felhasználó:{closeCheckListHeaderCloseDTO.UserId}, " +
$"Lezárás oka: {closeCheckListHeaderCloseDTO.CloseReason}");
await _dbContext.SaveChangesAsync();
retVal = true;
}
}
catch (Exception ex)
{
retVal = false;
Log.Error(ex.Message);
}
return retVal;
}
public async Task<CheckListTemplateHeaderDTO> GetCheckListTemplateHeaderAsync(int Id)
{
var retVal = new CheckListTemplateHeaderDTO()
{
CheckListTemplateRowDTO = new List<CheckListTemplateRowDTO>()
};
try
{
var res = await _dbContext.CheckListTemplateHeaders
.Where(w => w.Id == Id)
.Include(i => i.CheckListTemplateRows)
.ThenInclude(i => i.CheckPoint)
.Include(i => i.CheckListTemplateRows)
.ThenInclude(i => i.Equipment)
.AsNoTracking()
.FirstOrDefaultAsync();
if (res != null)
{
retVal = _mapper.Map<CheckListTemplateHeaderDTO>(res);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<List<CheckListTemplateHeaderDTO>> GetAllCheckListTemplateHeaderAsync()
{
var retVal = new List<CheckListTemplateHeaderDTO>();
try
{
var roles = await _dbContext.CheckListTemplateHeaders
.Include(i => i.CheckListTemplateRows)
.AsNoTracking()
.ToListAsync();
if (roles != null)
{
retVal = _mapper.Map<List<CheckListTemplateHeaderDTO>>(roles);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<CheckListTemplateHeaderDTO> UpdateCheckListTemplateHeaderAsync(CheckListTemplateHeaderDTO checkListTemplateHeaderDTO)
{
var retVal = new CheckListTemplateHeaderDTO() { CheckListTemplateRowDTO = new List<CheckListTemplateRowDTO>() };
try
{
if (checkListTemplateHeaderDTO.Id == 0)
{
var checkListTemplateHeader = new CheckListTemplateHeader()
{
Description = checkListTemplateHeaderDTO.Description,
ShortName = checkListTemplateHeaderDTO.ShortName,
IsDeleted = false,
NumberGenerator1Id = checkListTemplateHeaderDTO.NumberGenerator1Id,
NumberGenerator2Id = checkListTemplateHeaderDTO.NumberGenerator2Id,
};
_dbContext.CheckListTemplateHeaders.Add(checkListTemplateHeader);
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<CheckListTemplateHeaderDTO>(checkListTemplateHeader);
}
else
{
var checkListTemplateHeader = await _dbContext.CheckListTemplateHeaders
.Include(i => i.CheckListTemplateRows)
.Where(w => w.Id == checkListTemplateHeaderDTO.Id)
.FirstOrDefaultAsync();
if (checkListTemplateHeader != null)
{
checkListTemplateHeader.Description = checkListTemplateHeaderDTO.Description;
checkListTemplateHeader.ShortName = checkListTemplateHeaderDTO.ShortName;
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<CheckListTemplateHeaderDTO>(checkListTemplateHeader);
}
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<bool> DeleteCheckListTemplateHeaderAsync(int id)
{
return await DeleteEntityByIdAsync<CheckListTemplateHeader>(id);
}
public async Task<CheckListTemplateRowDTO> GetCheckListTemplateRowAsync(int id)
{
var retVal = new CheckListTemplateRowDTO();
try
{
var res = await _dbContext.CheckListTemplateRows
.Include(i => i.Equipment)
.Include(i => i.CheckPoint)
.Where(w => w.Id == id)
.AsNoTracking()
.FirstOrDefaultAsync();
if (res != null)
{
retVal = _mapper.Map<CheckListTemplateRowDTO>(res);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<bool> DeleteCheckListTemplateRowAsync(int id)
{
return await DeleteEntityByIdAsync<CheckListTemplateRow>(id);
}
public async Task<CheckListTemplateRowDTO> UpdateCheckListTemplateRowAsync(CheckListTemplateRowDTO checkListTemplateRowDTO)
{
var retVal = new CheckListTemplateRowDTO() { };
try
{
if (checkListTemplateRowDTO.Id == 0)
{
var checkListTemplateRow = new CheckListTemplateRow()
{
CheckListTemplateHeaderId = checkListTemplateRowDTO.CheckListTemplateHeaderId,
CheckPointId = checkListTemplateRowDTO.CheckPointId,
EquipmentId = checkListTemplateRowDTO.EquipmentId,
OperationDescription = checkListTemplateRowDTO.OperationDescription,
AnswerType = checkListTemplateRowDTO.AnswerType,
RowIndex = checkListTemplateRowDTO.RowIndex,
};
_dbContext.CheckListTemplateRows.Add(checkListTemplateRow);
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<CheckListTemplateRowDTO>(checkListTemplateRow);
}
else
{
var checkListTemplateRow = await _dbContext.CheckListTemplateRows
.Where(w => w.Id == checkListTemplateRowDTO.Id)
.FirstOrDefaultAsync();
if (checkListTemplateRow != null)
{
checkListTemplateRow.CheckListTemplateHeaderId = checkListTemplateRowDTO.CheckListTemplateHeaderId;
checkListTemplateRow.CheckPointId = checkListTemplateRowDTO.CheckPointId;
checkListTemplateRow.EquipmentId = checkListTemplateRowDTO.EquipmentId;
checkListTemplateRow.OperationDescription = checkListTemplateRowDTO.OperationDescription;
checkListTemplateRow.AnswerType = checkListTemplateRowDTO.AnswerType;
checkListTemplateRow.RowIndex = checkListTemplateRowDTO.RowIndex;
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<CheckListTemplateRowDTO>(checkListTemplateRow);
}
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<CheckListRowDTO> GetCheckListRowAsync(int id)
{
var retVal = new CheckListRowDTO();
try
{
var res = await _dbContext.CheckListRows
.Include(i => i.CheckListTemplateRow)
.Where(w => w.Id == id)
.AsNoTracking()
.FirstOrDefaultAsync();
if (res != null)
{
retVal = _mapper.Map<CheckListRowDTO>(res);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<CheckListRowDTO> UpdateCheckListRowAsync(CheckListRowDTO checkListRowDTO)
{
var retVal = new CheckListRowDTO() { };
try
{
if (checkListRowDTO.Id == 0)
{
}
else
{
var checkListRow = await _dbContext.CheckListRows
.Where(w => w.Id == checkListRowDTO.Id)
.FirstOrDefaultAsync();
if (checkListRow != null)
{
checkListRow.Answer = checkListRowDTO.Answer;
//checkListRow.Photo = checkListRowDTO.Photo;
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<CheckListRowDTO>(checkListRow);
}
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
}
}
@@ -0,0 +1,34 @@
using Microsoft.AspNetCore.Mvc.Rendering;
using WorkFlowCheck.Common.DTO;
namespace WorkFlowCheck.BL.Services.Interfaces
{
public interface ICheckListService
{
Task<CheckListHeaderDTO> GetCheckListHeaderAsync(int Id);
Task<List<CheckListHeaderDTO>> GetAllCheckListHeaderAsync();
Task<CheckListHeaderDTO> UpdateCheckListHeaderAsync(CheckListHeaderDTO checkListHeaderDTO);
Task<bool> AcceptCheckListHeaderAsync(int id, int userid);
Task<bool> BlockCheckListHeaderAsync(int id, int userid);
Task<bool> UnBlockCheckListHeaderAsync(int id, int userid);
Task<bool> CloseCheckListHeader(CheckListHeaderCloseDTO closeCheckListHeaderCloseDTO);
Task<byte[]> CreateCheckListHeaderPDFAsync(int checkListHeaderId);
Task<CheckListHeaderDTO> StartNewCheckListAsync(CheckListHeaderNewDTO checkListHeaderNewDTO);
Task<CheckListTemplateHeaderDTO> GetCheckListTemplateHeaderAsync(int Id);
Task<List<CheckListTemplateHeaderDTO>> GetAllCheckListTemplateHeaderAsync();
Task<CheckListTemplateHeaderDTO> UpdateCheckListTemplateHeaderAsync(CheckListTemplateHeaderDTO checkListTemplateHeaderDTO);
Task<bool> DeleteCheckListTemplateHeaderAsync(int id);
Task<CheckListTemplateRowDTO> GetCheckListTemplateRowAsync(int id);
Task<bool> DeleteCheckListTemplateRowAsync(int id);
Task<CheckListTemplateRowDTO> UpdateCheckListTemplateRowAsync(CheckListTemplateRowDTO checkListTemplateRowDTO);
Task<CheckListRowDTO> GetCheckListRowAsync(int id);
Task<CheckListRowDTO> UpdateCheckListRowAsync(CheckListRowDTO checkListRowDTO);
}
}
@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.BL.Services.Interfaces
{
public interface IMessageService
{
Task<bool> SendMailAsync(List<string> recipients, string subject, string htmlBody);
}
}
@@ -0,0 +1,17 @@
using Microsoft.EntityFrameworkCore.Storage;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WorkFlowCheck.Common.DTO;
namespace WorkFlowCheck.BL.Services.Interfaces
{
public interface INumberGeneratorService
{
Task<string> GenerateNextNumberAsync(int templateId, IDbContextTransaction transaction, DateTime? baseDate = null);
Task<string> GetSampleAsync(int templateId, DateTime? baseDate = null);
Task<List<NumberGeneratorTemplateDTO>> GetAllNumbergeneratorsAsync();
}
}
@@ -0,0 +1,39 @@
using Microsoft.AspNetCore.Mvc;
using WorkFlowCheck.Common.DTO;
namespace WorkFlowCheck.BL.Services.Interfaces
{
public interface ISyncService
{
Task<List<CheckPointDTO>> GetAllCheckPointAsync();
Task<CheckPointDTO> GetCheckPointAsync(int id);
Task<bool> DeleteCheckPointAsync(int id);
Task<CheckPointDTO> UpdateCheckPointAsync(CheckPointDTO checkPointDTO);
Task<List<CheckPointDTO>> UpdateAllCheckPointAsync(List<CheckPointDTO> checkPointListDTO);
Task<List<LocationDTO>> GetAllLocationAsync();
Task<LocationDTO> GetLocationAsync(int id);
Task<bool> DeleteLocationAsync(int id);
Task<LocationDTO> UpdateLocationAsync(LocationDTO LocationDTO);
Task<List<EquipmentDTO>> GetAllEquipmentAsync();
Task<EquipmentDTO> GetEquipmentAsync(int id);
Task<bool> DeleteEquipmentAsync(int id);
Task<EquipmentDTO> UpdateEquipmentAsync(EquipmentDTO EquipmentDTO);
Task<List<CheckListTemplateHeaderDTO>> GetAllCheckListTemplateAsync(int userId);
Task<List<CheckListHeaderDTO>> GetAllCheckListAsync(int userId);
Task<CheckListHeaderDTO> SendCheckListHeaderAsync(CheckListHeaderDTO checkListHeaderDTO);
Task<bool> DeviceMessageSend(DeviceMessageDTO deviceMessageDTO);
Task<List<DeviceMessageDTO>> DeviceMessageReadUnreaded(string deviceId);
Task<List<DeviceMessageDTO>> DeviceMessageReadUnreadedRole(int roleId);
}
}
@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.BL.Services.Interfaces
{
public interface ISystemService
{
Task<string> GetDatabaseAndVersionInfoAsync();
}
}
@@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WorkFlowCheck.Common.DTO;
namespace WorkFlowCheck.BL.Services.Interfaces
{
public interface IUserService
{
Task<UserDTO> GetUserAsync(int Id);
Task<List<UserDTO>> GetAllUserAsync();
Task<bool> DeleteUserAsync(int Id);
Task<UserDTO> UpdateUserAsync(UserDTO userDTO);
Task<UserDTO> Authenticate(string UserName, string Password);
Task<string> Authenticate2F1(string UserName, string Password);
Task<UserDTO> Authenticate2F2(string UserName, string Password, string Code, string token2FA);
Task<UserDTO> Authenticate2F2ChangePassword(string UserName, string OldPassword, string NewPassword, string Code, string token2FA);
Task<UserDTO> AuthenticateNFC(string NFCCode);
Task<RoleDTO> GetRoleAsync(int Id);
Task<List<RoleDTO>> GetAllRoleAsync();
Task<bool> DeleteRoleAsync(int Id);
Task<RoleDTO> UpdateRoleAsync(RoleDTO roleDTO);
Task<UserRoleDTO> GetUserRoleAsync(int Id);
Task<List<UserRoleDTO>> GetAllUserRoleAsync();
Task<bool> DeleteUserRoleAsync(int Id);
Task<UserRoleDTO> UpdateUserRoleAsync(UserRoleDTO userRoleDTO);
Task<RoleCheckListTemplateHeaderDTO> GetRoleCheckListTemplateHeaderAsync(int Id);
Task<List<RoleCheckListTemplateHeaderDTO>> GetAllRoleCheckListTemplateHeadersAsync();
Task<bool> DeleteRoleCheckListTemplateHeaderAsync(int Id);
Task<RoleCheckListTemplateHeaderDTO> UpdateRoleCheckListTemplateHeaderAsync(RoleCheckListTemplateHeaderDTO roleCheckListTemplateHeaderDTO);
Task<RoleCheckPointDTO> GetRoleCheckPointAsync(int Id);
Task<List<RoleCheckPointDTO>> GetAllRoleCheckPointsAsync();
Task<bool> DeleteRoleCheckPointAsync(int Id);
Task<RoleCheckPointDTO> UpdateRoleCheckPointAsync(RoleCheckPointDTO roleCheckPointDTO);
string GenerateJwtToken(UserDTO userDTO);
}
}
@@ -0,0 +1,46 @@
using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;
using Microsoft.Extensions.Configuration;
using WorkFlowCheck.BL.Models;
using WorkFlowCheck.BL.Services.Interfaces;
namespace WorkFlowCheck.BL.Services
{
public class MessageService : IMessageService
{
private readonly EmailSettings _settings;
public MessageService(IConfiguration configuration)
{
_settings = configuration.GetSection("EmailSettings").Get<EmailSettings>()!;
}
public async Task<bool> SendMailAsync(List<string> recipients, string subject, string htmlBody)
{
var message = new MimeMessage();
message.From.Add(new MailboxAddress(_settings.SenderName, _settings.Username));
foreach (var recipient in recipients)
{
message.To.Add(MailboxAddress.Parse(recipient));
}
message.Subject = subject;
message.Body = new TextPart("html")
{
Text = htmlBody
};
using var smtp = new SmtpClient();
await smtp.ConnectAsync(_settings.SmtpServer, _settings.SmtpPort, SecureSocketOptions.StartTls);
await smtp.AuthenticateAsync(_settings.Username, _settings.Password);
await smtp.SendAsync(message);
await smtp.DisconnectAsync(true);
return true;
}
}
}
@@ -0,0 +1,164 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage;
using Serilog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WorkFlowCheck.BL.Services.Interfaces;
using WorkFlowCheck.Common.DTO;
using WorkFlowCheck.DL;
using WorkFlowCheck.DL.Entities;
namespace WorkFlowCheck.BL.Services
{
public class NumberGeneratorService : INumberGeneratorService
{
private readonly AppDbContext _dbContext;
private static readonly Dictionary<int, SemaphoreSlim> _templateLocks = new();
public NumberGeneratorService(AppDbContext dbContext)
{
_dbContext = dbContext;
}
public async Task<string> GenerateNextNumberAsync(int templateId, IDbContextTransaction transaction, DateTime? baseDate = null)
{
var semaphore = GetOrCreateSemaphore(templateId);
await semaphore.WaitAsync();
try
{
var template = await _dbContext.Set<NumberGeneratorTemplate>()
.FirstOrDefaultAsync(t => t.Id == templateId);
if (template == null)
throw new InvalidOperationException($"Template with ID {templateId} not found.");
var now = baseDate ?? DateTime.Now;
var (year, month) = GetKeyDateParts(template, now);
var templateDate = await _dbContext.Set<NumberGeneratorTemplateDate>()
.FirstOrDefaultAsync(td => td.NumberGeneratorTemplateId == templateId && td.Year == year && td.Month == month);
if (templateDate == null)
{
templateDate = new NumberGeneratorTemplateDate
{
NumberGeneratorTemplateId = template.Id,
Year = year,
Month = month,
CurrentNumber = 0
};
_dbContext.Add(templateDate);
}
templateDate.CurrentNumber++;
var formatted = templateDate.CurrentNumber.ToString(template.DigitFormat);
var dynamicSuffix = BuildDynamicSuffix(template, now);
var result = BuildFormattedNumber(template, formatted, dynamicSuffix);
templateDate.LastGeneratedNumber = result;
await _dbContext.SaveChangesAsync();
return result;
}
catch
{
throw;
}
finally
{
semaphore.Release();
}
}
public async Task<string> GetSampleAsync(int templateId, DateTime? baseDate = null)
{
var template = await _dbContext.Set<NumberGeneratorTemplate>()
.AsNoTracking()
.FirstOrDefaultAsync(t => t.Id == templateId);
if (template == null)
throw new InvalidOperationException($"Template with ID {templateId} not found.");
var now = baseDate ?? DateTime.Now;
var formatted = 1.ToString(template.DigitFormat);
var dynamicSuffix = BuildDynamicSuffix(template, now);
return BuildFormattedNumber(template, formatted, dynamicSuffix);
}
public async Task<List<NumberGeneratorTemplateDTO>> GetAllNumbergeneratorsAsync()
{
var retVal = new List<NumberGeneratorTemplateDTO>();
try
{
var numbergenerators = await _dbContext.NumberGeneratorTemplates.ToListAsync();
foreach (var numbergenerator in numbergenerators)
{
var numbergeneratortemplateDTO = new NumberGeneratorTemplateDTO();
numbergeneratortemplateDTO.Id = numbergenerator.Id;
numbergeneratortemplateDTO.ShortName = numbergenerator.ShortName;
numbergeneratortemplateDTO.Sample = await this.GetSampleAsync(numbergenerator.Id, DateTime.Now);
retVal.Add(numbergeneratortemplateDTO);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
private SemaphoreSlim GetOrCreateSemaphore(int templateId)
{
lock (_templateLocks)
{
if (!_templateLocks.ContainsKey(templateId))
_templateLocks[templateId] = new SemaphoreSlim(1, 1);
return _templateLocks[templateId];
}
}
private static (int year, int? month) GetKeyDateParts(NumberGeneratorTemplate template, DateTime date)
{
int year = date.Year;
int? month = template.GenerateType == GenerateType.YearAndMonth ? date.Month : null;
return (year, month);
}
private static string BuildDynamicSuffix(NumberGeneratorTemplate template, DateTime date)
{
return template.GenerateType switch
{
GenerateType.OnlyYear => date.Year.ToString(),
GenerateType.YearAndMonth => $"{date.Year}/{date.Month:D2}",
_ => template.Suffix
};
}
private static string BuildFormattedNumber(NumberGeneratorTemplate template, string formattedNumber, string dynamicSuffix)
{
var sb = new StringBuilder();
if (!string.IsNullOrEmpty(template.Prefix))
sb.Append(template.Prefix);
if (!string.IsNullOrEmpty(template.PrefixSeparator) && !string.IsNullOrEmpty(template.Prefix))
sb.Append(template.PrefixSeparator);
sb.Append(formattedNumber);
if (!string.IsNullOrEmpty(dynamicSuffix))
{
if (!string.IsNullOrEmpty(template.SuffixSeparator))
sb.Append(template.SuffixSeparator);
sb.Append(dynamicSuffix);
}
return sb.ToString();
}
}
}
@@ -0,0 +1,583 @@
using AutoMapper;
using DocumentFormat.OpenXml.InkML;
using DocumentFormat.OpenXml.Office2010.Excel;
using DocumentFormat.OpenXml.Spreadsheet;
using Microsoft.EntityFrameworkCore;
using Serilog;
using System.Collections.Generic;
using WorkFlowCheck.BL.Services.Interfaces;
using WorkFlowCheck.Common.DTO;
using WorkFlowCheck.Common.Enums;
using WorkFlowCheck.Common.RequestContext;
using WorkFlowCheck.DL;
using WorkFlowCheck.DL.Entities;
namespace WorkFlowCheck.BL.Services
{
public class SyncService : BaseService, ISyncService
{
private readonly IRequestContext _requestContext;
private readonly IUserService _userService;
public SyncService(AppDbContext dbContext,
IMapper mapper,
IRequestContext requestContext,
IUserService userService) : base(dbContext, mapper)
{
_requestContext = requestContext;
_userService = userService;
}
public async Task<List<CheckPointDTO>> GetAllCheckPointAsync()
{
var retVal = new List<CheckPointDTO>();
try
{
var res = await _dbContext.CheckPoints
.Include(i => i.CheckListTemplateRows)
.AsNoTracking()
.ToListAsync();
if (res != null)
{
retVal = _mapper.Map<List<CheckPointDTO>>(res);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<CheckPointDTO> GetCheckPointAsync(int id)
{
var retVal = new CheckPointDTO();
try
{
var checkpoint = await _dbContext.CheckPoints
.Include(i => i.CheckListTemplateRows)
.Where(w => w.Id == id)
.AsNoTracking()
.FirstOrDefaultAsync();
if (checkpoint != null)
{
retVal = _mapper.Map<CheckPointDTO>(checkpoint);
var role = await _dbContext.Roles.Where(w => w.Id == retVal.RoleId).FirstOrDefaultAsync();
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<bool> DeleteCheckPointAsync(int id)
{
return await DeleteEntityByIdAsync<CheckPoint>(id);
}
public async Task<CheckPointDTO> UpdateCheckPointAsync(CheckPointDTO checkPointDTO)
{
var retVal = new CheckPointDTO();
try
{
if (checkPointDTO.Id == 0) //Hozzáadás, ha Id == 0
{
var checkPoint = _mapper.Map<CheckPoint>(checkPointDTO);
_dbContext.CheckPoints.Add(checkPoint);
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<CheckPointDTO>(checkPoint);
}
else
{
var res = await _dbContext.CheckPoints.Where(w => w.Id == checkPointDTO.Id).FirstOrDefaultAsync();
if (res != null)
{
res.ShortName = checkPointDTO.ShortName;
res.Code = checkPointDTO.Code;
res.IsEnabled = checkPointDTO.IsEnabled;
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<CheckPointDTO>(res);
}
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<List<CheckPointDTO>> UpdateAllCheckPointAsync(List<CheckPointDTO> checkPointListDTO)
{
var retVal = new List<CheckPointDTO>();
try
{
var ids = checkPointListDTO.Select(dto => dto.Id).ToList();
var checkPoints = await _dbContext.CheckPoints
.Where(cp => ids.Contains(cp.Id))
.ToListAsync();
foreach (var checkPoint in checkPoints)
{
var dto = checkPointListDTO.FirstOrDefault(d => d.Id == checkPoint.Id);
if (dto != null)
{
checkPoint.Code = dto.Code;
}
}
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<List<CheckPointDTO>>(checkPoints);
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<List<LocationDTO>> GetAllLocationAsync()
{
var retVal = new List<LocationDTO>();
try
{
var res = await _dbContext.Locations.ToListAsync();
if (res != null)
{
retVal = _mapper.Map<List<LocationDTO>>(res);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<LocationDTO> GetLocationAsync(int id)
{
var retVal = new LocationDTO();
try
{
var res = await _dbContext.Locations
.Where(w => w.Id == id)
.AsNoTracking()
.FirstOrDefaultAsync();
if (res != null)
{
retVal = _mapper.Map<LocationDTO>(res);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<bool> DeleteLocationAsync(int id)
{
return await DeleteEntityByIdAsync<DL.Entities.Location>(id);
}
public async Task<LocationDTO> UpdateLocationAsync(LocationDTO LocationDTO)
{
var retVal = new LocationDTO();
try
{
if (LocationDTO.Id == 0) //Hozzáadás, ha Id == 0
{
var Location = _mapper.Map<DL.Entities.Location>(LocationDTO);
_dbContext.Locations.Add(Location);
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<LocationDTO>(Location);
}
else
{
var res = await _dbContext.Locations.Where(w => w.Id == LocationDTO.Id).FirstOrDefaultAsync();
if (res != null)
{
res = _mapper.Map<DL.Entities.Location>(LocationDTO);
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<LocationDTO>(res);
}
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<List<EquipmentDTO>> GetAllEquipmentAsync()
{
var retVal = new List<EquipmentDTO>();
try
{
var res = await _dbContext.Equipments.ToListAsync();
if (res != null)
{
retVal = _mapper.Map<List<EquipmentDTO>>(res);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<EquipmentDTO> GetEquipmentAsync(int id)
{
var retVal = new EquipmentDTO();
try
{
var res = await _dbContext.Equipments
.Where(w => w.Id == id)
.AsNoTracking()
.FirstOrDefaultAsync();
if (res != null)
{
retVal = _mapper.Map<EquipmentDTO>(res);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<bool> DeleteEquipmentAsync(int id)
{
return await DeleteEntityByIdAsync<Equipment>(id);
}
public async Task<EquipmentDTO> UpdateEquipmentAsync(EquipmentDTO EquipmentDTO)
{
var retVal = new EquipmentDTO();
try
{
if (EquipmentDTO.Id == 0) //Hozzáadás, ha Id == 0
{
var Equipment = _mapper.Map<Equipment>(EquipmentDTO);
_dbContext.Equipments.Add(Equipment);
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<EquipmentDTO>(Equipment);
}
else
{
var res = await _dbContext.Equipments.Where(w => w.Id == EquipmentDTO.Id).FirstOrDefaultAsync();
if (res != null)
{
res.ShortName = EquipmentDTO.ShortName;
res.EquipmentNumber = EquipmentDTO.EquipmentNumber;
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<EquipmentDTO>(res);
}
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<List<CheckListTemplateHeaderDTO>> GetAllCheckListTemplateAsync(int userId)
{
var retVal = new List<CheckListTemplateHeaderDTO>();
try
{
var user = _dbContext.Users.Where(w => w.Id == userId).FirstOrDefault();
if (user != null)
{
var res = await (from ur in _dbContext.UserRoles
join rth in _dbContext.RoleCheckListTemplateHeaders on ur.RoleId equals rth.RoleId
join header in _dbContext.CheckListTemplateHeaders on rth.CheckListTemplateHeaderId equals header.Id
where ur.UserId == userId
select header)
.Include(h => h.CheckListTemplateRows)
.Distinct()
.AsNoTracking()
.ToListAsync();
if (res != null)
{
retVal = _mapper.Map<List<CheckListTemplateHeaderDTO>>(res);
}
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<List<CheckListHeaderDTO>> GetAllCheckListAsync(int userId)
{
var retVal = new List<CheckListHeaderDTO>();
try
{
var res = await _dbContext.CheckListHeaders
.Where(w => (w.IsEditable &&
w.IsDeleted != true) || (w.CheckStatus == CheckStatus.Blocked)
)
.Include(i => i.CheckListRows)
//.ThenInclude(i => i.CheckListTemplateRow)
.AsNoTracking()
.ToListAsync();
if (res != null)
{
retVal = _mapper.Map<List<CheckListHeaderDTO>>(res);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<CheckListHeaderDTO> SendCheckListHeaderAsync(CheckListHeaderDTO checkListHeaderDTO)
{
var retVal = new CheckListHeaderDTO();
try
{
if (checkListHeaderDTO.Id > 0)
{
var res = await _dbContext.CheckListHeaders
.Include(i => i.CheckListRows)
.Where(w => w.Id == checkListHeaderDTO.Id)
.FirstOrDefaultAsync();
if (res != null && (res.CheckStatus == CheckStatus.Open ||
res.CheckStatus == CheckStatus.InProgress))
{
if (NeedBlocking(checkListHeaderDTO))
{
/// TODO: blokkolás miatt
res.CheckStatus = CheckStatus.Blocked;
await _dbContext.SaveChangesAsync();
Log.ForContext("TAG", "BusinessFlow").Warning($"Ellenőrzési lap blokkolva: Ellenőrzés:{checkListHeaderDTO.Id}, Felhasználó:{_requestContext.CurrentUsername}");
var user = await _userService.GetUserAsync(_requestContext.CurrentUserId ?? 1);
foreach (var item in user.RoleDTO)
{
var deviceMessageDTO = new DeviceMessageDTO()
{
IsReaded = false,
Message = "Ellenőrző lap blokkolva!",
SendDate = DateTime.UtcNow,
ExtraDataJSON = "",
RoleId = item.ParentId,
DeviceIdFrom = "",
DeviceIdTo = "",
};
await this.DeviceMessageSend(deviceMessageDTO);
}
return retVal;
}
res.CheckStatus = CheckStatus.InProgress;
var ids = checkListHeaderDTO.CheckListRowDTO?.Select(r => r.Id).ToList();
if (ids != null && ids.Count > 0)
{
var rowsToUpdate = await _dbContext.CheckListRows
.Where(r => ids.Contains(r.Id))
.ToListAsync();
foreach (var row in rowsToUpdate)
{
var dtoRow = checkListHeaderDTO.CheckListRowDTO?.FirstOrDefault(r => r.Id == row.Id);
if (dtoRow != null)
{
row.Answer = dtoRow.Answer;
if (dtoRow.Photo != null && dtoRow.Photo.Length > 0)
{
string imageDirectory = Path.Combine(Directory.GetCurrentDirectory(), "Images");
var timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");
var fileName = $"PH_{timestamp}_{row.CheckListHeaderId}_{row.Id}.jpeg";
row.PhotoFileName = fileName;
var filePath = Path.Combine(imageDirectory, fileName);
await File.WriteAllBytesAsync(filePath, dtoRow.Photo);
row.Answer = fileName;
}
}
}
}
if (CheckIfLastReached(checkListHeaderDTO))
{
/// TODO: most kell a CheckStatust állítani és menjen üzenet !
res.CheckStatus = CheckStatus.Sent;
Log.ForContext("TAG", "BusinessFlow").Warning($"Ellenőrzési lap státuszváltozása: Ellenőrzés:{checkListHeaderDTO.Id}, Felhasználó:{_requestContext.CurrentUsername}");
}
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<CheckListHeaderDTO>(res);
}
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
private bool NeedBlocking(CheckListHeaderDTO checkListHeaderDTO)
{
var retVal = false;
if (checkListHeaderDTO.CheckListRowDTO != null && checkListHeaderDTO.CheckListRowDTO.Count > 0)
{
var checkListRows = checkListHeaderDTO.CheckListRowDTO;
foreach (var row in checkListRows)
{
if (!string.IsNullOrEmpty(row.Answer))
{
if (row.CheckListTemplateRowDTO != null)
{
if (row.CheckListTemplateRowDTO.AnswerType == "PI-N" && row.Answer == "Igen")
{
retVal = true;
break;
}
if (row.CheckListTemplateRowDTO.AnswerType == "I-PN" && row.Answer == "Nem")
{
retVal = true;
break;
}
}
}
}
}
return retVal;
}
private bool CheckIfLastReached(CheckListHeaderDTO checkListHeaderDTO)
{
var retVal = false;
if (checkListHeaderDTO != null && checkListHeaderDTO.CheckListRowDTO != null && checkListHeaderDTO.CheckListRowDTO.Count > 0)
{
var totalRowCount = checkListHeaderDTO.CheckListRowDTO.Where(w => w.CheckListTemplateRowDTO.AnswerType != "PN" &&
w.CheckListTemplateRowDTO.CheckPointDTO.IsEnabled == true).Count();
var answeredCount = checkListHeaderDTO.CheckListRowDTO.Where(w => w.CheckListTemplateRowDTO.AnswerType != "PN" &&
w.CheckListTemplateRowDTO.CheckPointDTO.IsEnabled == true &&
string.IsNullOrEmpty(w.Answer) != true).Count();
if (totalRowCount == answeredCount) { retVal = true; }
}
return retVal;
}
public async Task<bool> DeviceMessageSend(DeviceMessageDTO deviceMessageDTO)
{
var retVal = false;
try
{
var deviceMessage = _mapper.Map<DeviceMessage>(deviceMessageDTO);
deviceMessage.SendDate = DateTime.UtcNow;
deviceMessage.IsReaded = false;
_dbContext.DeviceMessages.Add(deviceMessage);
await _dbContext.SaveChangesAsync(true);
retVal = true;
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<List<DeviceMessageDTO>> DeviceMessageReadUnreaded(string deviceId)
{
var retVal = new List<DeviceMessageDTO>();
try
{
var res = await _dbContext.DeviceMessages
.Where(w => w.DeviceIdTo == deviceId && w.IsReaded != true)
.ToListAsync();
if (res != null)
{
retVal = _mapper.Map<List<DeviceMessageDTO>>(res);
foreach (var deviceMessage in res)
{
deviceMessage.IsReaded = true;
deviceMessage.ReceiveDate = DateTime.UtcNow;
}
await _dbContext.SaveChangesAsync();
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<List<DeviceMessageDTO>> DeviceMessageReadUnreadedRole(int roleId)
{
var retVal = new List<DeviceMessageDTO>();
try
{
var res = await _dbContext.DeviceMessages
.Where(w => w.RoleId == roleId && w.IsReaded != true)
.ToListAsync();
if (res != null)
{
retVal = _mapper.Map<List<DeviceMessageDTO>>(res);
foreach (var deviceMessage in res)
{
deviceMessage.IsReaded = true;
deviceMessage.ReceiveDate = DateTime.UtcNow;
}
await _dbContext.SaveChangesAsync();
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
}
}
@@ -0,0 +1,49 @@
using AutoMapper;
using DocumentFormat.OpenXml.InkML;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WorkFlowCheck.BL.Services.Interfaces;
using WorkFlowCheck.DL;
namespace WorkFlowCheck.BL.Services
{
public class SystemService : ISystemService
{
public readonly AppDbContext _dbContext;
public readonly IMapper _mapper;
public readonly IConfiguration _config;
public SystemService(AppDbContext dbContext,
IMapper mapper,
IConfiguration configuration)
{
_config = configuration;
_dbContext = dbContext;
_mapper = mapper;
}
public async Task<string> GetDatabaseAndVersionInfoAsync()
{
var retVal = "";
var connection = _dbContext.Database.GetDbConnection();
var typeName = connection.GetType().Name;
//if (typeName.Contains("Npgsql"))
//{
// var builder = new NpgsqlConnectionStringBuilder(connection.ConnectionString);
// retVal= builder.Database;
//}
if (typeName.Contains("SqlConnection"))
{
var builder = new SqlConnectionStringBuilder(connection.ConnectionString);
retVal= builder.InitialCatalog;
}
return retVal;
}
}
}
@@ -0,0 +1,793 @@
using AutoMapper;
using Microsoft.EntityFrameworkCore;
using Serilog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WorkFlowCheck.Common.DTO;
using WorkFlowCheck.BL.Services.Interfaces;
using WorkFlowCheck.DL;
using WorkFlowCheck.Common.Security;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using WorkFlowCheck.DL.Entities;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNetCore.Identity;
using WorkFlowCheck.BL.Static;
using System.Reflection;
namespace WorkFlowCheck.BL.Services
{
public class UserService : BaseService, IUserService
{
private IConfiguration _configuration;
private IMessageService _messageService;
public UserService(AppDbContext dbContext,
IMapper mapper,
IConfiguration configuration,
IMessageService messageService) : base(dbContext, mapper)
{
_configuration = configuration;
_messageService = messageService;
}
public async Task<UserDTO> GetUserAsync(int Id)
{
var retVal = new UserDTO() { RoleDTO = new List<RoleDTO>() };
try
{
var user = await _dbContext.Users
.Include(i => i.UserRoles)
.ThenInclude(i => i.Role)
.Where(w => w.Id == Id).FirstOrDefaultAsync();
if (user != null)
{
retVal = _mapper.Map<UserDTO>(user);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<List<UserDTO>> GetAllUserAsync()
{
var retVal = new List<UserDTO>
{
new UserDTO
{
RoleDTO = new List<RoleDTO>()
}
};
try
{
var users = await _dbContext.Users
.Include(i => i.UserRoles)
.ThenInclude(i => i.Role)
.ToListAsync();
if (users != null)
{
retVal = _mapper.Map<List<UserDTO>>(users);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<bool> DeleteUserAsync(int id)
{
return await DeleteEntityByIdAsync<User>(id);
}
public async Task<UserDTO> Authenticate(string userName, string password)
{
var retVal = new UserDTO() { RoleDTO = new List<RoleDTO>() };
try
{
Log.ForContext("TAG", "AuditFlow").Information($"Bejelentkezési kísérlet: {userName}");
var user = await _dbContext.Users
.Include(i => i.UserRoles)
.ThenInclude(i => i.Role)
.Where(w => w.UserName == userName && w.Active != false)
.FirstOrDefaultAsync();
if (user != null && PasswordHasher.VerifyPassword(user.PasswordHash, password))
{
var userDTO = new UserDTO()
{
Id = user.Id,
UserName = user.UserName,
RoleDTO = new List<RoleDTO>(),
};
foreach (var item in user.UserRoles)
{
userDTO.RoleDTO.Add(new RoleDTO()
{
Id = item.Role.Id,
RoleName = item.Role.RoleName,
});
}
user.JwtToken = GenerateJwtToken(userDTO);
await _dbContext.SaveChangesAsync();
Log.ForContext("TAG", "AuditFlow").Information($"Sikeres bejelentkezés: {userName}");
retVal = _mapper.Map<UserDTO>(user);
}
else
{
Log.ForContext("TAG", "AuditFlow").Error($"Sikertelen bejelenkezési kísérlet: {userName}");
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<string> Authenticate2F1(string userName, string password)
{
var retVal = "";
try
{
Log.ForContext("TAG", "AuditFlow").Information($"Bejelentkezési kísérlet: {userName}");
var user = await _dbContext.Users
.Include(i => i.UserRoles)
.ThenInclude(i => i.Role)
.Where(w => w.UserName == userName)
.FirstOrDefaultAsync();
if (user != null && PasswordHasher.VerifyPassword(user.PasswordHash, password))
{
var canUseWebAdmin = false;
foreach (var userRole in user.UserRoles)
{
if (userRole.Role.CanUseWebAdmin)
{
canUseWebAdmin = true;
break;
}
}
if (!string.IsNullOrEmpty(user.Email) && canUseWebAdmin)
{
var code = CodeGenerator2F.GenerateSixDigitCode();
await _messageService.SendMailAsync(new List<string>()
{
user.Email,
}, "Bejelentkezés megerősítése",
Get2FConfirmationMessageBody(code));
Log.ForContext("TAG", "AuditFlow").Information($"Bejelentkezési kísérlet, email küldés: {user.Email}");
retVal = CodeGenerator2F.GenerateToken2F(userName, password, code);
return retVal;
}
else
{
Log.ForContext("TAG", "AuditFlow").Information($"A WEB felület NEM használható!: {userName}");
}
}
else
{
Log.ForContext("TAG", "AuditFlow").Error($"Sikertelen bejelentkezési kísérlet: {userName}");
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<UserDTO> Authenticate2F2(string userName, string password, string code, string token2FA)
{
var retVal = new UserDTO() { RoleDTO = new List<RoleDTO>() };
try
{
var user = await _dbContext.Users
.Include(i => i.UserRoles)
.ThenInclude(i => i.Role)
.Where(w => w.UserName == userName && w.Active != false)
.FirstOrDefaultAsync();
if (user != null && PasswordHasher.VerifyPassword(user.PasswordHash, password))
{
if (CodeGenerator2F.ValidateToken2F(token2FA, userName, password, code))
{
var userDTO = new UserDTO()
{
Id = user.Id,
UserName = user.UserName,
RoleDTO = new List<RoleDTO>(),
};
foreach (var item in user.UserRoles)
{
userDTO.RoleDTO.Add(new RoleDTO()
{
Id = item.Role.Id,
RoleName = item.Role.RoleName,
});
}
user.JwtToken = GenerateJwtToken(userDTO);
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<UserDTO>(user);
Log.ForContext("TAG", "AuditFlow").Information($"Sikeres 2FA azonosítás!: {userName}");
return retVal;
}
}
else
{
Log.ForContext("TAG", "AuditFlow").Error($"Sikertelen 2FA bejelentkezési kísérlet: {userName}");
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<UserDTO> Authenticate2F2ChangePassword(string userName, string oldPassword, string newPassword, string code, string token2FA)
{
var retVal = new UserDTO() { RoleDTO = new List<RoleDTO>() };
try
{
var user = await _dbContext.Users
.Include(i => i.UserRoles)
.ThenInclude(i => i.Role)
.Where(w => w.UserName == userName && w.Active != false)
.FirstOrDefaultAsync();
if (user != null && PasswordHasher.VerifyPassword(user.PasswordHash, oldPassword))
{
if (CodeGenerator2F.ValidateToken2F(token2FA, userName, oldPassword, code))
{
user.PasswordHash = PasswordHasher.HashPassword(newPassword);
var userDTO = new UserDTO()
{
Id = user.Id,
UserName = user.UserName,
RoleDTO = new List<RoleDTO>(),
};
foreach (var item in user.UserRoles)
{
userDTO.RoleDTO.Add(new RoleDTO()
{
Id = item.Role.Id,
RoleName = item.Role.RoleName,
});
}
user.PasswordHash = PasswordHasher.HashPassword(newPassword);
user.JwtToken = GenerateJwtToken(userDTO);
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<UserDTO>(user);
Log.ForContext("TAG", "AuditFlow").Information($"Sikeres jelszó módosítás: {userName}");
return retVal;
}
}
else
{
Log.ForContext("TAG", "AuditFlow").Error($"Sikertelen jelszó módosítási kísérlet: {userName}");
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<UserDTO> AuthenticateNFC(string NFCCode)
{
var retVal = new UserDTO() { RoleDTO = new List<RoleDTO>() };
try
{
var user = await _dbContext.Users
.Include(i => i.UserRoles)
.ThenInclude(i => i.Role)
.Where(w => w.NFCCode == NFCCode && w.NFCActive == true)
.FirstOrDefaultAsync();
if (user != null)
{
var userDTO = new UserDTO()
{
Id = user.Id,
UserName = user.UserName,
RoleDTO = new List<RoleDTO>(),
};
foreach (var item in user.UserRoles)
{
userDTO.RoleDTO.Add(new RoleDTO()
{
Id = item.Role.Id,
RoleName = item.Role.RoleName,
});
}
user.JwtToken = GenerateJwtToken(userDTO);
await _dbContext.SaveChangesAsync();
Log.ForContext("TAG", "AuditFlow").Information($"Sikeres NFC kártya azonosítás kísérlet: {user.UserName}");
retVal = _mapper.Map<UserDTO>(user);
}
else
{
Log.ForContext("TAG", "AuditFlow").Error($"Sikertelen NFC kártya azonosítás: {NFCCode}");
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public string GenerateJwtToken(UserDTO userDTO)
{
var jwtSettings = _configuration.GetSection("Jwt");
var secretKey = jwtSettings["SecretKey"];
var issuer = jwtSettings["Issuer"];
var audience = jwtSettings["Audience"];
var tokenLifetime = int.Parse(jwtSettings["TokenLifetimeMinutes"]);
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, userDTO.UserName),
new Claim(ClaimTypes.NameIdentifier, userDTO.Id.ToString())
};
foreach (var role in userDTO.RoleDTO)
{
claims.Add(new Claim(ClaimTypes.Role, role.RoleName));
}
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: issuer,
audience: audience,
claims: claims,
expires: DateTime.UtcNow.AddMinutes(tokenLifetime),
signingCredentials: creds);
return new JwtSecurityTokenHandler().WriteToken(token);
}
public async Task<UserDTO> UpdateUserAsync(UserDTO userDTO)
{
var retVal = new UserDTO() { RoleDTO = new List<RoleDTO>() };
try
{
if (userDTO.Id == 0)
{
var user = new User();
user.UserName = userDTO.UserName;
user.FirstName = userDTO.FirstName;
user.LastName = userDTO.LastName;
user.Email = userDTO.Email;
user.NFCActive = userDTO.NFCActive;
user.NFCCode = userDTO.NFCCode;
user.JwtToken = "";
user.Token2FA = "";
user.IsDeleted = false;
user.Active = userDTO.Active;
user.PasswordHash = PasswordHasher.HashPassword(userDTO.Password);
_dbContext.Users.Add(user);
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<UserDTO>(user);
}
else
{
var user = await _dbContext.Users.Where(w => w.Id == userDTO.Id).FirstOrDefaultAsync();
if (user != null)
{
user.UserName = userDTO.UserName;
user.FirstName = userDTO.FirstName;
user.LastName = userDTO.LastName;
user.Email = userDTO.Email;
user.Active = userDTO.Active;
user.NFCActive = userDTO.NFCActive;
user.NFCCode = userDTO.NFCCode;
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<UserDTO>(user);
}
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
private string Get2FConfirmationMessageBody(string token2F)
{
var assembly = Assembly.GetExecutingAssembly();
var resourceName = "WorkFlowCheck.BL.HtmlTemplates.Token2FBody.html";
using var stream = assembly.GetManifestResourceStream(resourceName);
if (stream == null)
throw new FileNotFoundException($"Nem található a beágyazott erőforrás: {resourceName}");
using var reader = new StreamReader(stream);
var html = reader.ReadToEnd();
return html.Replace("#token2F#", token2F);
}
public async Task<RoleDTO> GetRoleAsync(int Id)
{
var retVal = new RoleDTO();
try
{
var user = await _dbContext.Roles.Where(w => w.Id == Id).FirstOrDefaultAsync();
if (user != null)
{
retVal = _mapper.Map<RoleDTO>(user);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<List<RoleDTO>> GetAllRoleAsync()
{
var retVal = new List<RoleDTO>();
try
{
var roles = await _dbContext.Roles.ToListAsync();
if (roles != null)
{
retVal = _mapper.Map<List<RoleDTO>>(roles);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<bool> DeleteRoleAsync(int id)
{
return await DeleteEntityByIdAsync<Role>(id);
}
public async Task<RoleDTO> UpdateRoleAsync(RoleDTO roleDTO)
{
var retVal = new RoleDTO();
try
{
if (roleDTO.Id == 0)
{
var role = new Role();
role.RoleName = roleDTO.RoleName;
if (roleDTO.ParentId > 0)
{
role.ParentId = roleDTO.ParentId;
}
role.IsAdmin = roleDTO.IsAdmin;
role.CanDownloadAPK = roleDTO.CanDownloadAPK;
role.CanEnableBlocked = roleDTO.CanEnableBlocked;
role.CanUseWebAdmin = roleDTO.CanUseWebAdmin;
role.CanUseMobilApp = roleDTO.CanUseMobilApp;
_dbContext.Roles.Add(role);
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<RoleDTO>(role);
}
else
{
var role = await _dbContext.Roles.Where(w => w.Id == roleDTO.Id).FirstOrDefaultAsync();
if (role != null)
{
role.RoleName = roleDTO.RoleName;
if (roleDTO.ParentId > 0)
{
role.ParentId = roleDTO.ParentId;
}
role.IsAdmin = roleDTO.IsAdmin;
role.CanDownloadAPK = roleDTO.CanDownloadAPK;
role.CanEnableBlocked = roleDTO.CanEnableBlocked;
role.CanUseWebAdmin = roleDTO.CanUseWebAdmin;
role.CanUseMobilApp = roleDTO.CanUseMobilApp;
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<RoleDTO>(role);
}
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<UserRoleDTO> GetUserRoleAsync(int Id)
{
var retVal = new UserRoleDTO();
try
{
var userRole = await _dbContext.UserRoles.Where(w => w.Id == Id).FirstOrDefaultAsync();
if (userRole != null)
{
retVal = _mapper.Map<UserRoleDTO>(userRole);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<List<UserRoleDTO>> GetAllUserRoleAsync()
{
var retVal = new List<UserRoleDTO>();
try
{
var userRoles = await _dbContext.UserRoles
.Include(i => i.User)
.Include(i => i.Role)
.AsNoTracking()
.ToListAsync();
if (userRoles != null)
{
retVal = _mapper.Map<List<UserRoleDTO>>(userRoles);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<bool> DeleteUserRoleAsync(int id)
{
return await DeleteEntityByIdAsync<UserRole>(id);
}
public async Task<UserRoleDTO> UpdateUserRoleAsync(UserRoleDTO userRoleDTO)
{
var retVal = new UserRoleDTO();
try
{
if (userRoleDTO.Id == 0)
{
var userRole = new UserRole();
userRole.UserId = userRoleDTO.UserId;
userRole.RoleId = userRoleDTO.RoleId;
_dbContext.UserRoles.Add(userRole);
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<UserRoleDTO>(userRole);
}
else
{
var userRole = await _dbContext.UserRoles.Where(w => w.Id == userRoleDTO.Id).FirstOrDefaultAsync();
if (userRole != null)
{
userRole.UserId = userRoleDTO.UserId;
userRole.RoleId = userRoleDTO.RoleId;
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<UserRoleDTO>(userRole);
}
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<RoleCheckListTemplateHeaderDTO> GetRoleCheckListTemplateHeaderAsync(int Id)
{
var retVal = new RoleCheckListTemplateHeaderDTO();
try
{
var userRole = await _dbContext.RoleCheckListTemplateHeaders.Where(w => w.Id == Id).FirstOrDefaultAsync();
if (userRole != null)
{
retVal = _mapper.Map<RoleCheckListTemplateHeaderDTO>(userRole);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<List<RoleCheckListTemplateHeaderDTO>> GetAllRoleCheckListTemplateHeadersAsync()
{
var retVal = new List<RoleCheckListTemplateHeaderDTO>();
try
{
var results = await _dbContext.RoleCheckListTemplateHeaders
.Include(i => i.CheckListTemplateHeader)
.Include(i => i.Role)
.AsNoTracking()
.ToListAsync();
if (results != null)
{
retVal = _mapper.Map<List<RoleCheckListTemplateHeaderDTO>>(results);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<bool> DeleteRoleCheckListTemplateHeaderAsync(int id)
{
return await DeleteEntityByIdAsync<RoleCheckListTemplateHeader>(id);
}
public async Task<RoleCheckListTemplateHeaderDTO> UpdateRoleCheckListTemplateHeaderAsync(RoleCheckListTemplateHeaderDTO roleCheckListTemplateHeaderDTO)
{
var retVal = new RoleCheckListTemplateHeaderDTO();
try
{
if (roleCheckListTemplateHeaderDTO.Id == 0)
{
var roleCheckListTemplateHeader_Exists = await _dbContext.RoleCheckListTemplateHeaders
.Where(w => w.RoleId == roleCheckListTemplateHeaderDTO.RoleId &&
w.CheckListTemplateHeaderId == roleCheckListTemplateHeaderDTO.CheckListTemplateHeaderId)
.FirstOrDefaultAsync();
if (roleCheckListTemplateHeader_Exists == null)
{
var roleCheckListTemplateHeader = new RoleCheckListTemplateHeader();
roleCheckListTemplateHeader.CheckListTemplateHeaderId = roleCheckListTemplateHeaderDTO.CheckListTemplateHeaderId;
roleCheckListTemplateHeader.RoleId = roleCheckListTemplateHeaderDTO.RoleId;
roleCheckListTemplateHeader.Enabled = roleCheckListTemplateHeaderDTO.Enabled;
_dbContext.RoleCheckListTemplateHeaders.Add(roleCheckListTemplateHeader);
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<RoleCheckListTemplateHeaderDTO>(roleCheckListTemplateHeader);
}
else
{
retVal = _mapper.Map<RoleCheckListTemplateHeaderDTO>(roleCheckListTemplateHeader_Exists);
}
}
else
{
var roleCheckListTemplateHeader = await _dbContext.RoleCheckListTemplateHeaders.Where(w => w.Id == roleCheckListTemplateHeaderDTO.Id).FirstOrDefaultAsync();
if (roleCheckListTemplateHeader != null)
{
roleCheckListTemplateHeader.CheckListTemplateHeaderId = roleCheckListTemplateHeaderDTO.CheckListTemplateHeaderId;
roleCheckListTemplateHeader.RoleId = roleCheckListTemplateHeaderDTO.RoleId;
roleCheckListTemplateHeader.Enabled = roleCheckListTemplateHeaderDTO.Enabled;
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<RoleCheckListTemplateHeaderDTO>(roleCheckListTemplateHeader);
}
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<RoleCheckPointDTO> GetRoleCheckPointAsync(int Id)
{
var retVal = new RoleCheckPointDTO();
try
{
var userRole = await _dbContext.RoleCheckPoints.Where(w => w.Id == Id).FirstOrDefaultAsync();
if (userRole != null)
{
retVal = _mapper.Map<RoleCheckPointDTO>(userRole);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<List<RoleCheckPointDTO>> GetAllRoleCheckPointsAsync()
{
var retVal = new List<RoleCheckPointDTO>();
try
{
var results = await _dbContext.RoleCheckPoints
.Include(i => i.CheckPoint)
.Include(i => i.Role)
.AsNoTracking()
.ToListAsync();
if (results != null)
{
retVal = _mapper.Map<List<RoleCheckPointDTO>>(results);
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
public async Task<bool> DeleteRoleCheckPointAsync(int id)
{
return await DeleteEntityByIdAsync<RoleCheckPoint>(id);
}
public async Task<RoleCheckPointDTO> UpdateRoleCheckPointAsync(RoleCheckPointDTO roleCheckPointDTO)
{
var retVal = new RoleCheckPointDTO();
try
{
if (roleCheckPointDTO.Id == 0)
{
var roleCheckPoint_Exists = await _dbContext.RoleCheckPoints
.Where(w => w.RoleId == roleCheckPointDTO.RoleId &&
w.CheckPointId == roleCheckPointDTO.CheckPointId)
.FirstOrDefaultAsync();
if (roleCheckPoint_Exists == null)
{
var roleCheckPoint = new RoleCheckPoint();
roleCheckPoint.CheckPointId = roleCheckPointDTO.CheckPointId;
roleCheckPoint.RoleId = roleCheckPointDTO.RoleId;
roleCheckPoint.Enabled = roleCheckPointDTO.Enabled;
_dbContext.RoleCheckPoints.Add(roleCheckPoint);
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<RoleCheckPointDTO>(roleCheckPoint);
}
else
{
retVal = _mapper.Map<RoleCheckPointDTO>(roleCheckPoint_Exists);
}
}
else
{
var roleCheckPoint = await _dbContext.RoleCheckPoints.Where(w => w.Id == roleCheckPointDTO.Id).FirstOrDefaultAsync();
if (roleCheckPoint != null)
{
roleCheckPoint.CheckPointId = roleCheckPointDTO.CheckPointId;
roleCheckPoint.RoleId = roleCheckPointDTO.RoleId;
roleCheckPoint.Enabled = roleCheckPointDTO.Enabled;
await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<RoleCheckPointDTO>(roleCheckPoint);
}
}
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
}
}
@@ -0,0 +1,72 @@
using Microsoft.IdentityModel.Tokens;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.BL.Static
{
public static class CodeGenerator2F
{
private static readonly Random _random = new Random();
private const string SecretKey = "874512WcfApplicationNuvolar.hu!%mBX210jUUKL";
private static readonly byte[] KeyBytes = Encoding.UTF8.GetBytes(SecretKey);
public static string GenerateSixDigitCode()
{
return _random.Next(100000, 1000000).ToString(); // 100000 - 999999
}
public static string GenerateToken2F(string value1, string value2, string value3)
{
var tokenHandler = new JwtSecurityTokenHandler();
var claims = new[]
{
new Claim("val1", value1),
new Claim("val2", value2),
new Claim("val3", value3)
};
var descriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(claims),
Expires = DateTime.UtcNow.AddSeconds(60 * 60 * 2),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(KeyBytes), SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(descriptor);
return tokenHandler.WriteToken(token);
}
public static bool ValidateToken2F(string token, string expected1, string expected2, string expected3)
{
var tokenHandler = new JwtSecurityTokenHandler();
try
{
var parameters = new TokenValidationParameters
{
ValidateIssuer = false,
ValidateAudience = false,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(KeyBytes),
ClockSkew = TimeSpan.Zero // nincs türelmi idő
};
var principal = tokenHandler.ValidateToken(token, parameters, out var validatedToken);
var val1 = principal.FindFirst("val1")?.Value;
var val2 = principal.FindFirst("val2")?.Value;
var val3 = principal.FindFirst("val3")?.Value;
return val1 == expected1 && val2 == expected2 && val3 == expected3;
}
catch
{
return false;
}
}
}
}
@@ -0,0 +1,33 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<None Remove="HtmlTemplates\Token2FBody.html" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="HtmlTemplates\Token2FBody.html" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="AutoMapper" Version="13.0.1" />
<PackageReference Include="DocumentFormat.OpenXml" Version="3.3.0" />
<PackageReference Include="MailKit" Version="4.11.0" />
<PackageReference Include="Serilog.AspNetCore" Version="8.0.3" />
<PackageReference Include="Serilog.Expressions" Version="5.0.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="9.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.7" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\WorkFlowCheck.Common\WorkFlowCheck.Common.csproj" />
<ProjectReference Include="..\WorkFlowCheck.DL\WorkFlowCheck.DL.csproj" />
</ItemGroup>
</Project>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.Common.Constants
{
public static class MemoryCacheNames
{
public const string UsersNamePrefix = "Users_";
public const string TranslationsNamePrefix = "Translations_";
public const string Languages = "Languages";
}
}
@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.Common.DTO
{
public class ApiRequestDTO<T>
{
public UserDTO UserDTO { get; set; }
public T Data { get; set; }
}
}
@@ -0,0 +1,43 @@
using System.Text.Json.Serialization;
namespace WorkFlowCheck.Common.DTO
{
public class ApiResponseBaseDTO
{
public ApiResponseBaseDTO()
{
Errors = new List<string>();
}
public bool IsSuccess { get; set; }
public List<string> Errors { get; set; }
public bool HandleError { get; set; }
public string Error
{
get
{
if (Errors == null || Errors.Count() == 0) return string.Empty;
return string.Join(';', Errors);
}
}
}
public class ApiResponseDTO : ApiResponseBaseDTO
{
public object Data { get; set; }
}
public interface IApiResponseDTO<out T>
{
}
public class ApiResponseDTO<T> : ApiResponseBaseDTO, IApiResponseDTO<T>
{
public T Data { get; set; }
}
public class ApiResponseListDTO<T> : ApiResponseBaseDTO
{
public T[] Data { get; set; }
public int Total { get; set; }
}
}
@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.Common.DTO
{
public class CheckListHeaderCloseDTO
{
public int Id { get; set; }
public string CloseReason { get; set; } = null!;
public int UserId { get; set; }
}
}
@@ -0,0 +1,59 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WorkFlowCheck.Common.Enums;
using WorkFlowCheck.Common.Helper;
namespace WorkFlowCheck.Common.DTO
{
public class CheckListHeaderDTO
{
public int Id { get; set; }
public int CheckListTemplateHeaderId { get; set; }
public CheckListTemplateHeaderDTO? CheckListTemplateHeaderDTO { get; set; }
[DisplayName("Státusz")]
public CheckStatus CheckStatus { get; set; }
public string StatusName => DisplayNameHelper.GetEnumDisplayName(CheckStatus);
[DisplayName("Dátum")]
public DateTime DateExecution { get; set; }
[DisplayName("Ellenőrző")]
public int UserId { get; set; }
public UserDTO? UserDTO { get; set; }
[DisplayName("Jóváhagyó")]
public int? AcceptUserId { get; set; }
public UserDTO? AcceptUserDTO { get; set; }
[DisplayName("Megnevezés")]
public string ShortName { get; set; } = null!;
[DisplayName("Leírás")]
public string Description { get; set; } = null!;
[DisplayName("Sorszám")]
public string DocumentNumber { get; set; } = null!;
[DisplayName("Azonosító")]
public Guid GuidNumber { get; set; }
[DisplayName("Stornózva")]
public bool IsStorno { get; set; }
[DisplayName("Szerkeszthető")]
public bool IsEditable { get; set; }
public ICollection<CheckListRowDTO>? CheckListRowDTO { get; set; } = new List<CheckListRowDTO>();
public CheckListHeaderDTO()
{
CheckListRowDTO = new List<CheckListRowDTO>();
}
}
}
@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.Common.DTO
{
public class CheckListHeaderInfoDTO
{
public int Id { get; set; }
[DisplayName("Összes ellenőrzési szám")]
public int TotalRowCount { get; set; }
[DisplayName("Még ellenőrizendő száma")]
public int EmptyAnswerCount { get; set; }
[DisplayName("Készültség %")]
public string ReadyPercent { get; set; }
[DisplayName("Ellenőrzési pontok száma")]
public int CheckPointCount { get; set; }
}
}
@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.Common.DTO
{
public class CheckListHeaderNewDTO
{
public int CheckListTemplateHeaderId { get; set; }
public int UserId { get; set; }
}
}
@@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.Common.DTO
{
public class CheckListRowDTO
{
public int Id { get; set; }
public int CheckListHeaderId { get; set; }
public int CheckListTemplateRowId { get; set; }
public CheckListTemplateRowDTO? CheckListTemplateRowDTO { get; set; }
public string GroupName => $"AnswerGroup_{CheckListTemplateRowDTO?.RowIndex ?? 0}";
[DisplayName("Eredmény")]
public string Answer { get; set; } = null!;
public bool? AnswerYes { get; set; } = null!;
public bool? AnswerNo { get; set; } = null!;
[DisplayName("Kép")]
public byte[]? Photo { get; set; } = null!;
public Guid GuidNumber { get; set; }
}
}
@@ -0,0 +1,22 @@
using System.ComponentModel;
using System.ComponentModel.DataAnnotations.Schema;
namespace WorkFlowCheck.Common.DTO
{
public class CheckListTemplateHeaderDTO
{
public int Id { get; set; }
[DisplayName("Megnevezés")]
public string ShortName { get; set; } = null!;
[DisplayName("Leírás")]
public string Description { get; set; } = null!;
[DisplayName("Sorszám (munkalap)")]
public int? NumberGenerator1Id { get; set; }
[DisplayName("Sorszám (dokumentum)")]
public int? NumberGenerator2Id { get; set; }
public NumberGeneratorTemplateDTO? NumberGenerator1 { get; set; }
public NumberGeneratorTemplateDTO? NumberGenerator2 { get; set; }
public ICollection<CheckListTemplateRowDTO>? CheckListTemplateRowDTO { get; set; } = new List<CheckListTemplateRowDTO>();
}
}
@@ -0,0 +1,43 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations.Schema;
namespace WorkFlowCheck.Common.DTO
{
public class CheckListTemplateRowDTO
{
public int Id { get; set; }
[Required(ErrorMessage = "A sorrend megadása kötelező.")]
[DisplayName("Sorrend")]
public int RowIndex { get; set; }
public int CheckListTemplateHeaderId { get; set; }
[DisplayName("Berendezés")]
public int EquipmentId { get; set; }
public EquipmentDTO? EquipmentDTO { get; set; } = null!;
public int CheckPointId { get; set; }
public CheckPointDTO? CheckPointDTO { get; set; } = null!;
[DisplayName("Tevékenység leírása")]
public string OperationDescription { get; set; } = null!;
/// <summary>
///
/// I-N (Igen, nem)
/// P (Fénykép készítése)
/// PN (Fénykép nem kötelező készítése)
/// SI-N (Sárga igen,fehér nem)
/// I-SN (Fehér igen, sárga nem)
/// PI-N (Piros igen,fehér nem)
/// I-PN (Fehér igen, piros nem)
/// V (Érték megadása)
///
/// </summary>
[DisplayName("Válasz tipus")]
public string AnswerType { get; set; } = null!;
}
}
@@ -0,0 +1,31 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel;
namespace WorkFlowCheck.Common.DTO
{
public class CheckPointDTO
{
public int Id { get; set; }
[Required(ErrorMessage = "A megnevezés megadása kötelező.")]
[DisplayName("Megnevezés")]
public string ShortName { get; set; }
[Required(ErrorMessage = "A kód megadása kötelező.")]
[DisplayName("Kód")]
public string Code { get; set; }
[DisplayName("Használatban")]
public bool IsEnabled { get; set; }
[DisplayName("Szabály")]
public int? RoleId { get; set; }
[DisplayName("Szabály neve")]
public string? RoleName { get; set; }
public List<CheckListTemplateRowDTO>? CheckListTemplateRowDTO { get; set; } = new List<CheckListTemplateRowDTO>();
}
}
@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.Common.DTO
{
public class DeviceMessageDTO
{
public int Id { get; set; }
public DateTime? SendDate { get; set; }
public DateTime? ReceiveDate { get; set; }
public string DeviceIdFrom { get; set; } = null!;
public string DeviceIdTo { get; set; } = null!;
public string Message { get; set; } = null!;
public string ExtraDataJSON { get; set; } = null!;
public bool IsReaded { get; set; }
public int? RoleId { get; set; }
public RoleDTO? RoleDTO { get; set; }
}
}
@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.Common.DTO
{
public class EquipmentDTO
{
public int Id { get; set; }
public string ShortName { get; set; } = null!;
public string EquipmentNumber { get; set; } = null!;
}
}
@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.Common.DTO
{
public class ImageFileDTO
{
public string Id { get; set; }
public string FileName { get; set; }
public string FileSize { get; set; }
public string CreateDate { get; set; }
}
}
@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.Common.DTO
{
public class LocationDTO
{
public int Id { get; set; }
public string FullName { get; set; } = null!;
}
}
@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.Common.DTO
{
public class LogFileDTO
{
public string Id { get; set; }
public string FileName { get; set; }
public string FileSize { get; set; }
public string CreateDate { get; set; }
}
}
@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.Common.DTO
{
public class MobileUserDTO
{
public int Id { get; set; }
public string? UserName { get; set; }
public string? FirstName { get; set; }
public string? LastName { get; set; }
public string? FullName => $"{LastName} {FirstName}";
public string? Email { get; set; }
public bool NFCActive { get; set; }
public string NFCCode { get; set; } = null!;
}
}
@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.Common.DTO
{
public class NumberGeneratorTemplateDTO
{
public int Id { get; set; }
public string ShortName { get; set; }
public string Sample { get; set; }
}
}
@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.Common.DTO
{
public class PDFFileDTO
{
public string Id { get; set; }
public string FileName { get; set; }
public string FileSize { get; set; }
public string CreateDate { get; set; }
}
}
@@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.Common.DTO
{
public class RoleCheckListTemplateHeaderDTO
{
public int Id { get; set; }
public int RoleId { get; set; }
public RoleDTO? RoleDTO { get; set; } = null!;
public int CheckListTemplateHeaderId { get; set; }
public CheckListTemplateHeaderDTO? CheckListTemplateHeaderDTO { get; set; } = null!;
public bool Enabled { get; set; } = false;
}
}
@@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.Common.DTO
{
public class RoleCheckPointDTO
{
public int Id { get; set; }
public int RoleId { get; set; }
public RoleDTO? RoleDTO { get; set; } = null!;
public int CheckPointId { get; set; }
public CheckPointDTO? CheckPointDTO { get; set; } = null!;
public bool Enabled { get; set; } = false;
}
}
+35
View File
@@ -0,0 +1,35 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel;
namespace WorkFlowCheck.Common.DTO
{
public class RoleDTO
{
public int Id { get; set; }
[Required(ErrorMessage = "A szabály megnevezésének megadása kötelező.")]
[DisplayName("Megnevezés")]
public string RoleName { get; set; } = null!;
public int? ParentId { get; set; }
[DisplayName("Szülő szerepkör neve")]
public string? ParentRoleName { get; set; }
[DisplayName("Adminisztrátor?")]
public bool IsAdmin { get; set; }
[DisplayName("Új program letöltés?")]
public bool CanDownloadAPK { get; set; }
[DisplayName("Folyamat blokk/engedélyez?")]
public bool CanEnableBlocked { get; set; }
[DisplayName("WEB felület?")]
public bool CanUseWebAdmin { get; set; }
[DisplayName("Mobil App?")]
public bool CanUseMobilApp { get; set; }
}
}
@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.Common.DTO
{
public class User2FADTO
{
public string UserName { get; set; } = null!;
public string Password { get; set; } = null!;
public string Code { get; set; } = null!;
public string Token2FA { get; set; } = null!;
}
}
@@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.Common.DTO
{
public class UserChangePassword2FADTO
{
public int UserId { get; set; }
[DisplayName("Felhasználó")]
public string UserName { get; set; } = null!;
[DisplayName("Régi jelszó")]
public string OldPassword { get; set; } = null!;
[DisplayName("Új jelszó")]
public string NewPassword1 { get; set; } = null!;
[DisplayName("Jelszó megerősítése")]
public string NewPassword2 { get; set; } = null!;
[DisplayName("Ellenőrző kód")]
public string Code { get; set; } = null!;
public string Token2FA { get; set; } = null!;
}
}
+44
View File
@@ -0,0 +1,44 @@
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace WorkFlowCheck.Common.DTO
{
public class UserDTO
{
public int Id { get; set; }
[Required(ErrorMessage = "Az utónév kötelező.")]
[EmailAddress(ErrorMessage = "Érvénytelen email cím.")]
[RegularExpression(@"^[^@\s]+@[^@\s]+\.[^@\s]+$", ErrorMessage = "Az email formátum nem megfelelő.")]
[DisplayName("E-mail")]
public string Email { get; set; } = null!;
[Required(ErrorMessage = "Az utónév kötelező.")]
[DisplayName("Utónév")]
public string FirstName { get; set; } = null!;
[Required(ErrorMessage = "Az vezetéknév kötelező.")]
[DisplayName("Vezetéknév")]
public string LastName { get; set; } = null!;
[Required(ErrorMessage = "A felhasználónév kötelező.")]
[DisplayName("Felhasználó neve")]
public string UserName { get;set; } = null!;
[DisplayName("Jelszó")]
public string Password { get; set; }
public string JwtToken { get; set; } = null!;
[DisplayName("Aktív")]
public bool Active { get; set; }
[DisplayName("NFC belépés")]
public bool NFCActive { get; set; }
[DisplayName("NFC kód")]
public string NFCCode { get; set; } = null!;
public ICollection<RoleDTO>? RoleDTO { get; set; } = new List<RoleDTO>();
}
}
@@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.Common.DTO
{
public class UserRoleDTO
{
public int Id { get; set; }
public int? RoleId { get; set; } = 0;
public RoleDTO? RoleDTO { get; set; }
public int UserId { get; set; }
public UserDTO? UserDTO { get; set; }
}
}
@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.Common.DTO
{
public class UserSimpleDTO
{
[Required(ErrorMessage = "A felhasználónév kötelező.")]
public string UserName { get; set; } = null!;
[Required(ErrorMessage = "A jelszó megadása kötelező.")]
public string Password { get; set; }
}
}
@@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace WorkFlowCheck.Common.Enums
{
public enum CheckStatus
{
[Display(Name = "Nyitott")]
Open = 0,
[Display(Name = "Folyamatban")]
InProgress = 1,
[Display(Name = "Blokkolt")]
Blocked = 2,
[Display(Name = "Sztornózva")]
Storno = 3,
[Display(Name = "Beküldött")]
Sent = 4,
[Display(Name = "Jóváhagyva")]
Signed = 5,
[Display(Name = "Lezárva")]
Closed = 6
}
}
@@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.Common.Helper
{
public static class DisplayNameHelper
{
public static string GetDisplayName(string propertyName, Type modelType)
{
var property = modelType.GetProperty(propertyName);
var displayNameAttribute = property?.GetCustomAttributes(typeof(DisplayNameAttribute), false)
.FirstOrDefault() as DisplayNameAttribute;
return displayNameAttribute?.DisplayName ?? propertyName;
}
public static string GetEnumDisplayName(this Enum enumValue)
{
return enumValue
.GetType()
.GetMember(enumValue.ToString())
.First()
.GetCustomAttribute<DisplayAttribute>()?
.Name ?? enumValue.ToString();
}
}
}
@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.Common.RequestContext
{
public interface IRequestContext
{
string TraceId { get; }
string CurrentUsername { get; }
string CurrentUserEmail { get; }
int? CurrentUserId { get; }
CancellationToken RequestAborted { get; }
}
}
@@ -0,0 +1,55 @@
using System;
using System.Collections.Generic;
using System.Data.SqlTypes;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.Common.Security
{
public static class PasswordHasher
{
// Jelszó hashelése
private const string _saltstring = "xc45DDfrt!!ED210:";
public static string HashPassword(string password)
{
// Generate a random salt
byte[] salt = Encoding.UTF8.GetBytes(_saltstring);
// Hash the password with the salt
using (var rfc2898 = new Rfc2898DeriveBytes(password, salt, 10000, HashAlgorithmName.SHA256))
{
byte[] hash = rfc2898.GetBytes(32); // 256-bit hash
byte[] hashBytes = new byte[48]; // Salt (16 bytes) + Hash (32 bytes)
Array.Copy(salt, 0, hashBytes, 0, 16);
Array.Copy(hash, 0, hashBytes, 16, 32);
return Convert.ToBase64String(hashBytes);
}
}
// Jelszó ellenőrzése
public static bool VerifyPassword(string storedPasswordHash, string inputPassword)
{
byte[] hashBytes = Convert.FromBase64String(storedPasswordHash);
// Extract salt (first 16 bytes) and stored hash (next 32 bytes)
byte[] salt = Encoding.UTF8.GetBytes(_saltstring);
byte[] storedHash = new byte[32];
Array.Copy(hashBytes, 0, salt, 0, 16);
Array.Copy(hashBytes, 16, storedHash, 0, 32);
// Hash the input password with the same salt
using (var rfc2898 = new Rfc2898DeriveBytes(inputPassword, salt, 10000, HashAlgorithmName.SHA256))
{
byte[] inputHash = rfc2898.GetBytes(32);
// Compare the stored hash and the calculated hash
return CryptographicOperations.FixedTimeEquals(storedHash, inputHash);
}
}
}
}
@@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
+189
View File
@@ -0,0 +1,189 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using System;
using WorkFlowCheck.Common.RequestContext;
using WorkFlowCheck.Common.Security;
using WorkFlowCheck.DL.Configurations;
using WorkFlowCheck.DL.Entities;
using WorkFlowCheck.DL.Extensions;
using WorkFlowCheck.DL.Interfaces;
namespace WorkFlowCheck.DL
{
public class AppDbContext : DbContext
{
private readonly IRequestContext _requestContext;
public AppDbContext(DbContextOptions<AppDbContext> options, IRequestContext requestContext)
: base(options)
{
_requestContext = requestContext;
}
#region Entities DbSet
public DbSet<Entities.CheckListHeader> CheckListHeaders { get; set; } = null!;
public DbSet<Entities.CheckListRow> CheckListRows { get; set; } = null!;
public DbSet<Entities.CheckListTemplateHeader> CheckListTemplateHeaders { get; set; } = null!;
public DbSet<Entities.CheckListTemplateRow> CheckListTemplateRows { get; set; } = null!;
public DbSet<Entities.CheckPoint> CheckPoints { get; set; } = null!;
public DbSet<DeviceMessage> DeviceMessages { get; set; } = null!;
public DbSet<Entities.Equipment> Equipments { get; set; } = null!;
public DbSet<Entities.Location> Locations { get; set; } = null!;
public DbSet<Entities.NumberGeneratorTemplate> NumberGeneratorTemplates { get; set; } = null!;
public DbSet<Entities.NumberGeneratorTemplateDate> NumberGeneratorTemplateDates { get; set; } = null!;
public DbSet<Entities.Role> Roles { get; set; } = null!;
public DbSet<Entities.User> Users { get; set; } = null!;
public DbSet<Entities.UserRole> UserRoles { get; set; } = null!;
public DbSet<Entities.RoleCheckListTemplateHeader> RoleCheckListTemplateHeaders { get; set; } = null!;
public DbSet<Entities.RoleCheckPoint> RoleCheckPoints { get; set; } = null!;
#endregion
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfiguration(new CheckListHeaderTypeConfiguration());
modelBuilder.ApplyConfiguration(new CheckListRowTypeConfiguration());
modelBuilder.ApplyConfiguration(new CheckListTemplateHeaderTypeConfiguration());
modelBuilder.ApplyConfiguration(new CheckListTemplateRowTypeConfiguration());
modelBuilder.ApplyConfiguration(new CheckPointTypeConfiguration());
modelBuilder.ApplyConfiguration(new DeviceMessageTypeConfiguration());
modelBuilder.ApplyConfiguration(new EquipmentTypeConfiguration());
modelBuilder.ApplyConfiguration(new LocationTypeConfiguration());
modelBuilder.ApplyConfiguration(new NumberGeneratorTypeConfiguration());
modelBuilder.ApplyConfiguration(new NumberGeneratorDateTypeConfiguration());
modelBuilder.ApplyConfiguration(new RoleTypeConfiguration());
modelBuilder.ApplyConfiguration(new RoleCheckListTemplateHeaderTypeConfiguration());
modelBuilder.ApplyConfiguration(new RoleCheckPointTypeConfiguration());
modelBuilder.ApplyConfiguration(new UserTypeConfiguration());
modelBuilder.ApplyConfiguration(new UserRoleTypeConfiguration());
modelBuilder.RegisterSoftDeleteQueryFilters();
SeedInit(modelBuilder);
}
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
{
SaveChangesCore();
return await base.SaveChangesAsync(cancellationToken);
}
protected virtual void SaveChangesCore()
{
var utcNow = DateTime.UtcNow;
var deletedEntries = ChangeTracker
.Entries()
.Where(e => e.Entity is ISoftDeletableEntity && e.State == EntityState.Deleted);
UpdateDeletedEntries(deletedEntries);
var modifiedEntries = ChangeTracker
.Entries()
.Where(e => e.Entity is IAuditableEntity && e.State == EntityState.Modified);
UpdateModifiedEntires(modifiedEntries, utcNow);
var addedEntries = ChangeTracker
.Entries()
.Where(e => e.Entity is IAuditableEntity && e.State == EntityState.Added);
UpdateAddedEntries(addedEntries, utcNow);
}
private void UpdateAddedEntries(IEnumerable<EntityEntry> addedEntries, DateTime utcNow)
{
foreach (var entry in addedEntries)
{
((IAuditableEntity)entry.Entity).CreatedAt = utcNow;
((IAuditableEntity)entry.Entity).LastModAt = utcNow;
((IAuditableEntity)entry.Entity).CreatedBy = _requestContext.CurrentUsername ?? "Admin";
((IAuditableEntity)entry.Entity).LastModBy = _requestContext.CurrentUsername ?? "Admin";
}
}
private void UpdateModifiedEntires(IEnumerable<EntityEntry> modifiedEntries, DateTime utcNow)
{
foreach (var entry in modifiedEntries)
{
((IAuditableEntity)entry.Entity).LastModAt = utcNow;
((IAuditableEntity)entry.Entity).LastModBy = _requestContext.CurrentUsername ?? "Admin";
}
}
private void UpdateDeletedEntries(IEnumerable<EntityEntry> deletedEntries)
{
foreach (var entry in deletedEntries)
{
((ISoftDeletableEntity)entry.Entity).IsDeleted = true;
entry.State = EntityState.Modified;
}
}
private void SeedInit(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().HasData(
new User
{
Id = 1,
Email = "admin@nuvolar.hu",
FirstName = "Administrator",
LastName = "System",
IsDeleted = false,
UserName = "admin",
PasswordHash = PasswordHasher.HashPassword("111111"),
CreatedAt = DateTime.UtcNow,
CreatedBy = "System",
LastModAt = DateTime.UtcNow,
LastModBy = "System",
JwtToken = "",
Active = true,
Token2FA = "",
NFCActive = true,
NFCCode = "00000000"
},
new User
{
Id = 2,
Email = "user@nuvolar.hu",
FirstName = "User",
LastName = "System",
IsDeleted = false,
UserName = "user",
PasswordHash = PasswordHasher.HashPassword("222222"),
CreatedAt = DateTime.UtcNow,
CreatedBy = "System",
LastModAt = DateTime.UtcNow,
LastModBy = "System",
JwtToken = "",
Active = true,
Token2FA = "",
NFCActive = true,
NFCCode = "00000000"
}
);
modelBuilder.Entity<NumberGeneratorTemplate>().HasData(
new NumberGeneratorTemplate
{
Id = 1,
CurrentNumber = 0,
DigitFormat = "D4",
GenerateType = GenerateType.OnlyYear,
LastGeneratedNumber = "",
Prefix = "CHK",
PrefixSeparator = "-",
ShortName = "Ellenőrzési dokumentum sorszámozása",
Suffix = "",
SuffixSeparator = "-",
}
);
modelBuilder.Entity<NumberGeneratorTemplateDate>().HasData(
new NumberGeneratorTemplateDate
{
Id = 1,
CurrentNumber = 0,
LastGeneratedNumber = "",
Month = 0,
Year = 1,
NumberGeneratorTemplateId = 1,
}
);
}
}
}
@@ -0,0 +1,27 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Emit;
using System.Text;
using System.Threading.Tasks;
using WorkFlowCheck.DL.Entities;
namespace WorkFlowCheck.DL.Configurations
{
public class CheckListHeaderTypeConfiguration : IEntityTypeConfiguration<Entities.CheckListHeader>
{
public void Configure(EntityTypeBuilder<Entities.CheckListHeader> builder)
{
builder.ToTable("CheckListHeader");
builder.HasKey(e => e.Id);
builder.Property(e => e.Id).ValueGeneratedOnAdd();
builder
.HasOne(ch => ch.AcceptUser)
.WithMany()
.HasForeignKey(ch => ch.AcceptUserId)
.OnDelete(DeleteBehavior.Restrict); // Elkerüljük a cascade delete-et
}
}
}
@@ -0,0 +1,21 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.DL.Configurations
{
public class CheckListRowTypeConfiguration : IEntityTypeConfiguration<Entities.CheckListRow>
{
public void Configure(EntityTypeBuilder<Entities.CheckListRow> builder)
{
builder.ToTable("CheckListRow");
builder.HasKey(e => e.Id);
builder.Property(e => e.Id).ValueGeneratedOnAdd();
}
}
}
@@ -0,0 +1,21 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.DL.Configurations
{
public class CheckListTemplateHeaderTypeConfiguration : IEntityTypeConfiguration<Entities.CheckListTemplateHeader>
{
public void Configure(EntityTypeBuilder<Entities.CheckListTemplateHeader> builder)
{
builder.ToTable("CheckListTemplateHeader");
builder.HasKey(e => e.Id);
builder.Property(e => e.Id).ValueGeneratedOnAdd();
}
}
}
@@ -0,0 +1,21 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.DL.Configurations
{
public class CheckListTemplateRowTypeConfiguration : IEntityTypeConfiguration<Entities.CheckListTemplateRow>
{
public void Configure(EntityTypeBuilder<Entities.CheckListTemplateRow> builder)
{
builder.ToTable("CheckListTemplateRow");
builder.HasKey(e => e.Id);
builder.Property(e => e.Id).ValueGeneratedOnAdd();
}
}
}
@@ -0,0 +1,21 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.DL.Configurations
{
public class CheckPointTypeConfiguration : IEntityTypeConfiguration<Entities.CheckPoint>
{
public void Configure(EntityTypeBuilder<Entities.CheckPoint> builder)
{
builder.ToTable("CheckPoint");
builder.HasKey(e => e.Id);
builder.Property(e => e.Id).ValueGeneratedOnAdd();
}
}
}
@@ -0,0 +1,24 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.DL.Configurations
{
public class DeviceMessageTypeConfiguration : IEntityTypeConfiguration<Entities.DeviceMessage>
{
public void Configure(EntityTypeBuilder<Entities.DeviceMessage> builder)
{
builder.ToTable("DeviceMessage");
builder.HasKey(e => e.Id);
builder.Property(e => e.Id).ValueGeneratedOnAdd();
builder.HasIndex(e => e.DeviceIdTo)
.HasDatabaseName("IX_DeviceMessage_DeviceIdTo");
}
}
}
@@ -0,0 +1,21 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.DL.Configurations
{
public class EquipmentTypeConfiguration : IEntityTypeConfiguration<Entities.Equipment>
{
public void Configure(EntityTypeBuilder<Entities.Equipment> builder)
{
builder.ToTable("Equipment");
builder.HasKey(e => e.Id);
builder.Property(e => e.Id).ValueGeneratedOnAdd();
}
}
}
@@ -0,0 +1,21 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.DL.Configurations
{
public class LocationTypeConfiguration : IEntityTypeConfiguration<Entities.Location>
{
public void Configure(EntityTypeBuilder<Entities.Location> builder)
{
builder.ToTable("Location");
builder.HasKey(e => e.Id);
builder.Property(e => e.Id).ValueGeneratedOnAdd();
}
}
}
@@ -0,0 +1,29 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.DL.Configurations
{
public class NumberGeneratorTypeConfiguration : IEntityTypeConfiguration<Entities.NumberGeneratorTemplate>
{
public void Configure(EntityTypeBuilder<Entities.NumberGeneratorTemplate> builder)
{
builder.ToTable("NumberGeneratorTemplate");
builder.HasKey(e => e.Id);
builder.Property(e => e.Id).ValueGeneratedOnAdd();
}
}
public class NumberGeneratorDateTypeConfiguration : IEntityTypeConfiguration<Entities.NumberGeneratorTemplateDate>
{
public void Configure(EntityTypeBuilder<Entities.NumberGeneratorTemplateDate> builder)
{
builder.ToTable("NumberGeneratorTemplateDate");
builder.HasKey(e => e.Id);
builder.Property(e => e.Id).ValueGeneratedOnAdd();
}
}
}
@@ -0,0 +1,21 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.DL.Configurations
{
public class RoleCheckListTemplateHeaderTypeConfiguration : IEntityTypeConfiguration<Entities.RoleCheckListTemplateHeader>
{
public void Configure(EntityTypeBuilder<Entities.RoleCheckListTemplateHeader> builder)
{
builder.ToTable("RoleCheckListTemplateHeader");
builder.HasKey(e => e.Id);
builder.Property(e => e.Id).ValueGeneratedOnAdd();
}
}
}
@@ -0,0 +1,20 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.DL.Configurations
{
public class RoleCheckPointTypeConfiguration : IEntityTypeConfiguration<Entities.RoleCheckPoint>
{
public void Configure(EntityTypeBuilder<Entities.RoleCheckPoint> builder)
{
builder.ToTable("RoleCheckPoint");
builder.HasKey(e => e.Id);
builder.Property(e => e.Id).ValueGeneratedOnAdd();
}
}
}
@@ -0,0 +1,25 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.DL.Configurations
{
public class RoleTypeConfiguration : IEntityTypeConfiguration<Entities.Role>
{
public void Configure(EntityTypeBuilder<Entities.Role> builder)
{
builder.ToTable("Roles");
builder.HasKey(e => e.Id);
builder.Property(e => e.Id).ValueGeneratedOnAdd();
builder.HasOne(r => r.Parent)
.WithMany(r => r.Children)
.HasForeignKey(r => r.ParentId)
.OnDelete(DeleteBehavior.Restrict);
}
}
}
@@ -0,0 +1,16 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace WorkFlowCheck.DL.Configurations
{
public class UserRoleTypeConfiguration : IEntityTypeConfiguration<Entities.UserRole>
{
public void Configure(EntityTypeBuilder<Entities.UserRole> builder)
{
builder.ToTable("UserRoles");
builder.HasKey(e => e.Id);
builder.Property(e => e.Id).ValueGeneratedOnAdd();
}
}
}
@@ -0,0 +1,21 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.DL.Configurations
{
public class UserTypeConfiguration : IEntityTypeConfiguration<Entities.User>
{
public void Configure(EntityTypeBuilder<Entities.User> builder)
{
builder.ToTable("Users");
builder.HasKey(e => e.Id);
builder.Property(e => e.Id).ValueGeneratedOnAdd();
}
}
}
@@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WorkFlowCheck.Common.Enums;
using WorkFlowCheck.DL.Interfaces;
namespace WorkFlowCheck.DL.Entities
{
public class CheckListHeader : IAuditableEntity, ISoftDeletableEntity
{
public int Id { get; set; }
public int CheckListTemplateHeaderId { get; set; }
public virtual CheckListTemplateHeader CheckListTemplateHeader { get; set; }
public CheckStatus CheckStatus { get; set; }
public DateTime DateExecution { get; set; }
public int UserId { get; set; }
public virtual User User { get; set; }
public int? AcceptUserId { get; set; }
public virtual User? AcceptUser { get; set; }
public string ShortName { get; set; } = null!;
public string Description { get; set; } = null!;
public string DocumentNumber { get; set; } = null!;
public Guid GuidNumber { get; set; }
public bool IsStorno { get; set; }
public bool IsEditable { get; set; }
public DateTime LastModAt { get; set; }
public string LastModBy { get; set; } = null!;
public DateTime CreatedAt { get; set; }
public string CreatedBy { get; set; } = null!;
public bool IsDeleted { get; set; }
public virtual ICollection<CheckListRow> CheckListRows { get; set; }
}
}
@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WorkFlowCheck.DL.Interfaces;
namespace WorkFlowCheck.DL.Entities
{
public class CheckListRow : ISoftDeletableEntity, IAuditableEntity
{
public int Id { get; set; }
public int CheckListHeaderId { get; set; }
public virtual CheckListHeader CheckListHeader { get; set; } = null!;
public int CheckListTemplateRowId { get; set; }
public virtual CheckListTemplateRow CheckListTemplateRow { get; set; } = null!;
public string Answer { get; set; } = null!;
public string PhotoFileName { get; set; }=null!;
public Guid GuidNumber { get; set; }
public DateTime LastModAt { get; set; }
public string LastModBy { get; set; } = null!;
public DateTime CreatedAt { get; set; }
public string CreatedBy { get; set; } = null!;
public bool IsDeleted { get; set; }
}
}
@@ -0,0 +1,25 @@
using WorkFlowCheck.DL.Interfaces;
namespace WorkFlowCheck.DL.Entities
{
public class CheckListTemplateHeader : ISoftDeletableEntity, IAuditableEntity
{
public int Id { get; set; }
public string ShortName { get; set; } = null!;
public string Description { get; set; } = null!;
public bool IsDeleted { get; set; }
public DateTime LastModAt { get; set; }
public string LastModBy { get; set; } = null!;
public DateTime CreatedAt { get; set; }
public string CreatedBy { get; set; } = null!;
public int? NumberGenerator1Id { get; set; }
public int? NumberGenerator2Id { get; set; }
public NumberGeneratorTemplate NumberGenerator1 { get; set; }
public NumberGeneratorTemplate NumberGenerator2 { get; set; }
public virtual ICollection<CheckListTemplateRow> CheckListTemplateRows { get; set; } = new List<CheckListTemplateRow>();
}
}
@@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WorkFlowCheck.DL.Interfaces;
namespace WorkFlowCheck.DL.Entities
{
public class CheckListTemplateRow : ISoftDeletableEntity, IAuditableEntity
{
public int Id { get; set; }
public int RowIndex { get; set; }
public int CheckListTemplateHeaderId { get; set; }
public virtual CheckListTemplateHeader CheckListTemplateHeader { get; set; }
public int EquipmentId { get; set; }
public virtual Equipment Equipment { get; set; }
public int CheckPointId { get; set; }
public virtual CheckPoint CheckPoint { get; set; }
public string OperationDescription { get; set; } = null!;
/// <summary>
///
/// I-N (Igen, nem)
/// P (Fénykép készítése)
/// SI-N (Sárga igen,fehér nem)
/// I-SN (Fehér igen, sárga nem)
/// PI-N (Piros igen,fehér nem)
/// I-PN (Fehér igen, piros nem)
///
/// </summary>
public string AnswerType { get; set; } = null!;
public bool IsDeleted { get; set; }
public DateTime LastModAt { get; set; }
public string LastModBy { get; set; } = null!;
public DateTime CreatedAt { get; set; }
public string CreatedBy { get; set; } = null!;
}
}
@@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WorkFlowCheck.DL.Interfaces;
namespace WorkFlowCheck.DL.Entities
{
public class CheckPoint : ISoftDeletableEntity, IAuditableEntity
{
public int Id { get; set; }
public string ShortName { get; set; }
public string Code { get; set; }
public bool IsEnabled { get; set; }
public bool IsDeleted { get; set; }
public DateTime LastModAt { get; set; }
public string LastModBy { get; set; } = null!;
public DateTime CreatedAt { get; set; }
public string CreatedBy { get; set; } = null!;
public int RoleId { get; set; }
public virtual ICollection<CheckListTemplateRow> CheckListTemplateRows { get; set; } = new List<CheckListTemplateRow>();
}
}
@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.DL.Entities
{
public class DeviceMessage
{
public int Id { get; set; }
public DateTime SendDate { get; set; }
public DateTime? ReceiveDate { get; set; }
public string DeviceIdFrom { get; set; } = null!;
public string DeviceIdTo { get; set; } = null!;
public string Message { get; set; } = null!;
public string ExtraDataJSON { get; set; } = null!;
public bool IsReaded { get; set; }
public int? RoleId { get; set; }
public virtual Role? Role { get; set; }
}
}
@@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WorkFlowCheck.DL.Interfaces;
namespace WorkFlowCheck.DL.Entities
{
public class Equipment :ISoftDeletableEntity,IAuditableEntity
{
public int Id { get; set; }
public string ShortName { get; set; } = null!;
public string EquipmentNumber { get; set; } = null!;
public bool IsDeleted { get ; set ; }
public DateTime LastModAt { get ; set ; }
public string LastModBy { get ; set ; } = null!;
public DateTime CreatedAt { get ; set ; }
public string CreatedBy { get ; set ; } = null!;
}
}
+20
View File
@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WorkFlowCheck.DL.Interfaces;
namespace WorkFlowCheck.DL.Entities
{
public class Location : ISoftDeletableEntity, IAuditableEntity
{
public int Id { get; set; }
public string FullName { get; set; } = null!;
public bool IsDeleted { get ; set ; }
public DateTime LastModAt { get ; set ; }
public string LastModBy { get ; set ; } = null!;
public DateTime CreatedAt { get ; set ; }
public string CreatedBy { get ; set ; } = null!;
}
}
@@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.DL.Entities
{
public enum GenerateType
{
OnlyYear = 0,
YearAndMonth = 1
}
public class NumberGeneratorTemplate
{
public int Id { get; set; }
public string ShortName { get; set; }
public string Prefix { get; set; }
public string PrefixSeparator { get; set; }
public string DigitFormat { get; set; }
public string SuffixSeparator { get; set; }
public string Suffix { get; set; }
public int CurrentNumber { get; set; }
public string LastGeneratedNumber { get; set; }
public GenerateType GenerateType { get; set; }
public virtual ICollection<NumberGeneratorTemplateDate> NumberGeneratorTemplateDates { get; set; }
}
}
@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.DL.Entities
{
public class NumberGeneratorTemplateDate
{
public int Id { get; set; }
public int NumberGeneratorTemplateId { get; set; }
public virtual NumberGeneratorTemplate NumberGeneratorTemplate { get; set; }
public int Year { get; set; }
public int? Month { get; set; } // csak ha YearAndMonth
public int CurrentNumber { get; set; }
public string LastGeneratedNumber { get; set; }
}
}

Some files were not shown because too many files have changed in this diff Show More