Browse Source

update response user from keycloak

pearlgw 1 month ago
parent
commit
9aff337bf6

+ 2 - 0
entrypoint.sh

@@ -14,3 +14,5 @@ npx prisma migrate dev --name init
14 14
 
15 15
 echo "🚀 Menjalankan aplikasi..."
16 16
 exec node index.js
17
+
18
+# cara jalaninnya, kan databaseseeder dulu, setelah itu node prisma/seeders/UserAreaSeeder, HospitalSeeder, VendorSeeder

+ 2 - 0
prisma/migrations/20250722014110_add_relation_user/migration.sql

@@ -0,0 +1,2 @@
1
+-- AddForeignKey
2
+ALTER TABLE "hospitals" ADD CONSTRAINT "hospitals_created_by_fkey" FOREIGN KEY ("created_by") REFERENCES "keycloak_users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

+ 8 - 0
prisma/migrations/20250722023051_add_relation/migration.sql

@@ -0,0 +1,8 @@
1
+-- AddForeignKey
2
+ALTER TABLE "vendors" ADD CONSTRAINT "vendors_created_by_fkey" FOREIGN KEY ("created_by") REFERENCES "keycloak_users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
3
+
4
+-- AddForeignKey
5
+ALTER TABLE "user_areas" ADD CONSTRAINT "user_areas_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "keycloak_users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
6
+
7
+-- AddForeignKey
8
+ALTER TABLE "status_histories" ADD CONSTRAINT "status_histories_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "keycloak_users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

+ 14 - 6
prisma/schema.prisma

@@ -59,8 +59,12 @@ model User {
59 59
 }
60 60
 
61 61
 model UserKeycloak {
62
-  id       String @id @default(uuid())
63
-  fullname String
62
+  id            String          @id @default(uuid())
63
+  fullname      String
64
+  Hospital      Hospital[]
65
+  UserArea      UserArea[]
66
+  Vendor        Vendor[]
67
+  StatusHistory StatusHistory[]
64 68
 
65 69
   @@map("keycloak_users")
66 70
 }
@@ -115,6 +119,7 @@ model Hospital {
115 119
   deletedAt            DateTime?
116 120
   province             Province            @relation(fields: [province_id], references: [id])
117 121
   city                 City                @relation(fields: [city_id], references: [id])
122
+  user                 UserKeycloak        @relation(fields: [created_by], references: [id])
118 123
   vendor_experiences   VendorExperience[]
119 124
   executives_histories ExecutivesHistory[]
120 125
   status_histories     StatusHistory[]
@@ -133,18 +138,20 @@ model Vendor {
133 138
   createdAt          DateTime           @default(now())
134 139
   updatedAt          DateTime           @updatedAt
135 140
   deletedAt          DateTime?
141
+  user               UserKeycloak       @relation(fields: [created_by], references: [id])
136 142
   vendor_experiences VendorExperience[]
137 143
 
138 144
   @@map("vendors")
139 145
 }
140 146
 
141 147
 model UserArea {
142
-  id          String    @id @default(uuid())
148
+  id          String       @id @default(uuid())
143 149
   user_id     String
144 150
   province_id String
145
-  province    Province  @relation(fields: [province_id], references: [id])
146
-  createdAt   DateTime  @default(now())
147
-  updatedAt   DateTime  @updatedAt
151
+  province    Province     @relation(fields: [province_id], references: [id])
152
+  user        UserKeycloak @relation(fields: [user_id], references: [id])
153
+  createdAt   DateTime     @default(now())
154
+  updatedAt   DateTime     @updatedAt
148 155
   deletedAt   DateTime?
149 156
 
150 157
   @@map("user_areas")
@@ -212,6 +219,7 @@ model StatusHistory {
212 219
   new_status  ProgressStatus
213 220
   note        String?        @db.Text
214 221
   hospital    Hospital       @relation(fields: [hospital_id], references: [id])
222
+  user        UserKeycloak   @relation(fields: [user_id], references: [id])
215 223
   createdAt   DateTime       @default(now())
216 224
   updatedAt   DateTime       @updatedAt
217 225
   deletedAt   DateTime?

+ 6 - 7
prisma/seeders/DatabaseSeeder.js

@@ -39,9 +39,9 @@ const { seedSumateraBaratCities } = require('./city/SumateraBaratCitySeeder');
39 39
 const { seedSumateraSelatanCities } = require('./city/SumateraSelatanCitySeeder');
40 40
 const { seedSumateraUtaraCities } = require('./city/SumateraUtaraCitySeeder');
41 41
 const { seedUsers } = require('./UserSeeder.js');
42
-const { seedVendors } = require('./VendorSeeder.js');
43
-const seedUserAreas = require('./UserAreaSeeder.js');
44
-const { seedHospitals } = require('./HospitalSeeder.js');
42
+// const { seedVendors } = require('./VendorSeeder.js');
43
+// const seedUserAreas = require('./UserAreaSeeder.js');
44
+// const { seedHospitals } = require('./HospitalSeeder.js');
45 45
 
46 46
 async function main() {
47 47
     await seedProvinces();
@@ -83,10 +83,9 @@ async function main() {
83 83
     await seedSumateraSelatanCities();
84 84
     await seedSumateraUtaraCities();
85 85
     await seedUsers();
86
-    await seedVendors();
87
-    await seedUserAreas();
88
-    await seedHospitals();
89
-    await seedVendors();
86
+    // await seedUserAreas();
87
+    // await seedHospitals();
88
+    // await seedVendors();
90 89
 }
91 90
 
92 91
 main().then(() => {

+ 15 - 3
prisma/seeders/HospitalSeeder.js

@@ -3,8 +3,8 @@ const prisma = new PrismaClient();
3 3
 
4 4
 async function seedHospitals() {
5 5
     try {
6
-        const sales1 = await prisma.user.findFirst({ where: { username: 'sales1' } });
7
-        const sales2 = await prisma.user.findFirst({ where: { username: 'sales2' } });
6
+        const sales1 = await prisma.userKeycloak.findFirst({ where: { id: '26042443-e53a-44b1-ab52-12985e8bdad1' } });
7
+        const sales2 = await prisma.userKeycloak.findFirst({ where: { id: '49349b07-a46c-4686-a964-8bbcedbf63f2' } });
8 8
 
9 9
         if (!sales1 || !sales2) {
10 10
             throw new Error('User sales1 or sales2 not found');
@@ -131,4 +131,16 @@ async function seedHospitals() {
131 131
     }
132 132
 }
133 133
 
134
-module.exports = { seedHospitals };
134
+module.exports = { seedHospitals };
135
+
136
+if (require.main === module) {
137
+    seedHospitals()
138
+        .then(() => {
139
+            console.log('🌱 Seeder selesai!');
140
+            process.exit(0);
141
+        })
142
+        .catch((err) => {
143
+            console.error('❌ Error saat seeding:', err);
144
+            process.exit(1);
145
+        });
146
+}

+ 15 - 3
prisma/seeders/UserAreaSeeder.js

@@ -3,8 +3,8 @@ const prisma = require('../../src/prisma/PrismaClient.js');
3 3
 async function seedUserAreas() {
4 4
     try {
5 5
         // Ambil user dengan role 'sales1' dan 'sales2'
6
-        const sales1 = await prisma.user.findFirst({ where: { username: 'sales1' } });
7
-        const sales2 = await prisma.user.findFirst({ where: { username: 'sales2' } });
6
+        const sales1 = await prisma.userKeycloak.findFirst({ where: { id: '26042443-e53a-44b1-ab52-12985e8bdad1' } });
7
+        const sales2 = await prisma.userKeycloak.findFirst({ where: { id: '49349b07-a46c-4686-a964-8bbcedbf63f2' } });
8 8
 
9 9
         if (!sales1 || !sales2) {
10 10
             throw new Error('User sales1 or sales2 not found');
@@ -38,4 +38,16 @@ async function seedUserAreas() {
38 38
     }
39 39
 }
40 40
 
41
-module.exports = seedUserAreas;
41
+module.exports = seedUserAreas;
42
+
43
+if (require.main === module) {
44
+    seedUserAreas()
45
+        .then(() => {
46
+            console.log('🌱 Seeder selesai!');
47
+            process.exit(0);
48
+        })
49
+        .catch((err) => {
50
+            console.error('❌ Error saat seeding:', err);
51
+            process.exit(1);
52
+        });
53
+}

+ 15 - 3
prisma/seeders/VendorSeeder.js

@@ -3,9 +3,9 @@ const prisma = require('../../src/prisma/PrismaClient.js');
3 3
 async function seedVendors() {
4 4
     try {
5 5
         // cari user role admin
6
-        const adminUser = await prisma.user.findFirst({
6
+        const adminUser = await prisma.userKeycloak.findFirst({
7 7
             where: {
8
-                username: 'admin1',
8
+                id: 'ffc58d77-b098-4cc2-ad99-6eeeac8d87ab',
9 9
             },
10 10
         });
11 11
 
@@ -54,4 +54,16 @@ async function seedVendors() {
54 54
     }
55 55
 }
56 56
 
57
-module.exports = { seedVendors };
57
+module.exports = { seedVendors };
58
+
59
+if (require.main === module) {
60
+    seedVendors()
61
+        .then(() => {
62
+            console.log('🌱 Seeder selesai!');
63
+            process.exit(0);
64
+        })
65
+        .catch((err) => {
66
+            console.error('❌ Error saat seeding:', err);
67
+            process.exit(1);
68
+        });
69
+}

+ 2 - 2
src/controllers/admin/VendorController.js

@@ -22,8 +22,8 @@ exports.getAllVendor = async (req, res) => {
22 22
 exports.showVendor = async (req, res) => {
23 23
     try {
24 24
         const id = req.params.id;
25
-        const { vendor, userName } = await vendorService.showVendorService(id);
26
-        return VendorResource(res, vendor, userName, 'Success show vendor');
25
+        const { vendor } = await vendorService.showVendorService(id);
26
+        return VendorResource(res, vendor, 'Success show vendor');
27 27
     } catch (err) {
28 28
         return errorResponse(res, err);
29 29
     }

+ 2 - 2
src/controllers/sales/HospitalController.js

@@ -41,8 +41,8 @@ exports.updateHospital = async (req, res) => {
41 41
 exports.showHospital = async (req, res) => {
42 42
     try {
43 43
         const id = req.params.id;
44
-        const { hospital, userName } = await showHospitalService(id);
45
-        return HospitalResource(res, hospital, userName, 'Success show hospital');
44
+        const { hospital } = await showHospitalService(id);
45
+        return HospitalResource(res, hospital, 'Success show hospital');
46 46
     } catch (err) {
47 47
         return errorResponse(res, err);
48 48
     }

+ 6 - 4
src/repository/admin/HospitalRepository.js

@@ -27,6 +27,7 @@ const HospitalRepository = {
27 27
                 created_by: true,
28 28
                 createdAt: true,
29 29
                 updatedAt: true,
30
+                user: { select: { id: true, fullname: true } },
30 31
                 vendor_experiences: {
31 32
                     where: {
32 33
                         status: "active",
@@ -49,10 +50,10 @@ const HospitalRepository = {
49 50
         });
50 51
 
51 52
         return hospitalsRaw.map(hospital => {
52
-            const { vendor_histories, ...rest } = hospital;
53
+            const { vendor_experiences, ...rest } = hospital;
53 54
             return {
54 55
                 ...rest,
55
-                vendor: vendor_histories?.[0]?.vendor || null
56
+                vendor: vendor_experiences?.[0]?.vendor || null
56 57
             };
57 58
         });
58 59
     },
@@ -87,6 +88,7 @@ const HospitalRepository = {
87 88
                 created_by: true,
88 89
                 createdAt: true,
89 90
                 updatedAt: true,
91
+                user: { select: { id: true, fullname: true } },
90 92
                 vendor_experiences: {
91 93
                     where: {
92 94
                         status: "active",
@@ -111,10 +113,10 @@ const HospitalRepository = {
111 113
 
112 114
         if (!hospitalRaw) return null;
113 115
 
114
-        const { vendor_histories, ...rest } = hospitalRaw;
116
+        const { vendor_experiences, ...rest } = hospitalRaw;
115 117
         return {
116 118
             ...rest,
117
-            vendor: vendor_histories?.[0]?.vendor || null
119
+            vendor: vendor_experiences?.[0]?.vendor || null
118 120
         };
119 121
     },
120 122
 

+ 7 - 7
src/repository/admin/StatusHistoryRepository.js

@@ -34,15 +34,15 @@ const StatusHistoryRepository = {
34 34
                         // image: true,
35 35
                         progress_status: true,
36 36
                         // note: true,
37
-                        // user: {
38
-                        //     select: {
39
-                        //         id: true,
40
-                        //         username: true
41
-                        //     }
42
-                        // }
43 37
                     }
44 38
                 },
45
-                user_id: true,
39
+                user: {
40
+                    select: {
41
+                        id: true,
42
+                        fullname: true
43
+                    }
44
+                },
45
+                // user_id: true,
46 46
                 old_status: true,
47 47
                 new_status: true,
48 48
                 note: true,

+ 2 - 2
src/repository/admin/VendorRepository.js

@@ -15,7 +15,7 @@ const VendorRepository = {
15 15
                 strengths: true,
16 16
                 weaknesses: true,
17 17
                 website: true,
18
-                created_by: true,
18
+                user: { select: { id: true, fullname: true } },
19 19
                 _count: {
20 20
                     select: {
21 21
                         vendor_experiences: {
@@ -58,7 +58,7 @@ const VendorRepository = {
58 58
                 strengths: true,
59 59
                 weaknesses: true,
60 60
                 website: true,
61
-                created_by: true,
61
+                user: { select: { id: true, fullname: true } },
62 62
                 _count: {
63 63
                     select: {
64 64
                         vendor_experiences: {

+ 0 - 1
src/repository/sales/AreaRepository.js

@@ -9,7 +9,6 @@ const AreaRepository = {
9 9
             orderBy,
10 10
             select: {
11 11
                 id: true,
12
-                user_id: true,
13 12
                 province: {
14 13
                     select: {
15 14
                         id: true,

+ 7 - 4
src/repository/sales/HospitalRepository.js

@@ -26,6 +26,7 @@ const HospitalRepository = {
26 26
                 created_by: true,
27 27
                 createdAt: true,
28 28
                 updatedAt: true,
29
+                user: { select: { id: true, fullname: true } },
29 30
                 vendor_experiences: {
30 31
                     where: {
31 32
                         status: "active",
@@ -48,10 +49,10 @@ const HospitalRepository = {
48 49
         });
49 50
 
50 51
         return hospitalsRaw.map(hospital => {
51
-            const { vendor_histories, ...rest } = hospital;
52
+            const { vendor_experiences, ...rest } = hospital;
52 53
             return {
53 54
                 ...rest,
54
-                vendor: vendor_histories?.[0]?.vendor || null
55
+                vendor: vendor_experiences?.[0]?.vendor || null
55 56
             };
56 57
         });
57 58
     },
@@ -89,6 +90,7 @@ const HospitalRepository = {
89 90
                 created_by: true,
90 91
                 createdAt: true,
91 92
                 updatedAt: true,
93
+                user: { select: { id: true, fullname: true } },
92 94
                 vendor_experiences: {
93 95
                     where: {
94 96
                         status: "active",
@@ -113,10 +115,10 @@ const HospitalRepository = {
113 115
 
114 116
         if (!hospitalRaw) return null;
115 117
 
116
-        const { vendor_histories, ...rest } = hospitalRaw;
118
+        const { vendor_experiences, ...rest } = hospitalRaw;
117 119
         return {
118 120
             ...rest,
119
-            vendor: vendor_histories?.[0]?.vendor || null
121
+            vendor: vendor_experiences?.[0]?.vendor || null
120 122
         };
121 123
     },
122 124
 
@@ -139,6 +141,7 @@ const HospitalRepository = {
139 141
     //         }
140 142
     //     });
141 143
     // },
144
+
142 145
     update: async (id, data) => {
143 146
         return prisma.hospital.update({
144 147
             where: { id },

+ 7 - 7
src/repository/sales/StatusHistoryRepository.js

@@ -42,13 +42,13 @@ const StatusHistoryRepository = {
42 42
                         // }
43 43
                     }
44 44
                 },
45
-                // user: {
46
-                //     select: {
47
-                //         id: true,
48
-                //         username: true,
49
-                //     }
50
-                // },
51
-                user_id: true,
45
+                user: {
46
+                    select: {
47
+                        id: true,
48
+                        fullname: true,
49
+                    }
50
+                },
51
+                // user_id: true,
52 52
                 old_status: true,
53 53
                 new_status: true,
54 54
                 note: true,

+ 5 - 5
src/resources/admin/hospital/HospitalCollection.js

@@ -5,14 +5,14 @@ const { getUserNameById } = require("../../../utils/CheckUserKeycloak.js");
5 5
 // Fungsi transform per item
6 6
 const transformHospitalList = async (data = []) => {
7 7
     return Promise.all(data.map(async ({ created_by, ...rest }) => {
8
-        const name = await getUserNameById(created_by);
8
+        // const name = await getUserNameById(created_by);
9 9
 
10 10
         return {
11 11
             ...rest,
12
-            user: {
13
-                id: created_by,
14
-                name: name
15
-            },
12
+            // user: {
13
+            //     id: created_by,
14
+            //     name: name
15
+            // },
16 16
             createdAt: formatISOWithoutTimezone(rest.createdAt),
17 17
             updatedAt: formatISOWithoutTimezone(rest.updatedAt)
18 18
         };

+ 6 - 6
src/resources/admin/status_history/StatusHistoryCollection.js

@@ -3,15 +3,15 @@ const { formatISOWithoutTimezone } = require("../../../utils/FormatDate.js");
3 3
 const { getUserNameById } = require("../../../utils/CheckUserKeycloak.js");
4 4
 
5 5
 const transformStatusHistoryList = async (data = []) => {
6
-    return Promise.all(data.map(async ({ user_id, ...rest }) => {
7
-        const name = await getUserNameById(user_id);
6
+    return Promise.all(data.map(async ({ ...rest }) => {
7
+        // const name = await getUserNameById(user_id);
8 8
 
9 9
         return {
10 10
             ...rest,
11
-            user: {
12
-                id: user_id,
13
-                name: name
14
-            },
11
+            // user: {
12
+            //     id: user_id,
13
+            //     name: name
14
+            // },
15 15
             note: rest.note?.trim() === '' ? null : rest.note,
16 16
             createdAt: formatISOWithoutTimezone(rest.createdAt),
17 17
             updatedAt: formatISOWithoutTimezone(rest.updatedAt)

+ 6 - 6
src/resources/admin/vendor/VendorCollection.js

@@ -3,15 +3,15 @@ const { formatISOWithoutTimezone } = require("../../../utils/FormatDate.js");
3 3
 const { getUserNameById } = require("../../../utils/CheckUserKeycloak");
4 4
 
5 5
 const transformVendorList = async (data = []) => {
6
-    return Promise.all(data.map(async ({ created_by, ...rest }) => {
7
-        const name = await getUserNameById(created_by);
6
+    return Promise.all(data.map(async ({ ...rest }) => {
7
+        // const name = await getUserNameById(created_by);
8 8
 
9 9
         return {
10 10
             ...rest,
11
-            user: {
12
-                id: created_by,
13
-                name: name
14
-            },
11
+            // user: {
12
+            //     id: created_by,
13
+            //     name: name
14
+            // },
15 15
             createdAt: formatISOWithoutTimezone(rest.createdAt),
16 16
             updatedAt: formatISOWithoutTimezone(rest.updatedAt)
17 17
         };

+ 8 - 8
src/resources/admin/vendor/VendorResource.js

@@ -1,21 +1,21 @@
1 1
 const { formatISOWithoutTimezone } = require("../../../utils/FormatDate");
2 2
 
3
-const formatItem = ({ item, userName }) => {
4
-    const { created_by, ...rest } = item;
3
+const formatItem = ({ item }) => {
4
+    const { ...rest } = item;
5 5
 
6 6
     return {
7 7
         ...rest,
8
-        user: {
9
-            id: created_by,
10
-            name: userName
11
-        },
8
+        // user: {
9
+        //     id: created_by,
10
+        //     name: userName
11
+        // },
12 12
         createdAt: formatISOWithoutTimezone(item.createdAt),
13 13
         updatedAt: formatISOWithoutTimezone(item.updatedAt)
14 14
     };
15 15
 };
16 16
 
17
-exports.VendorResource = (res, item, userName, message = 'Success') => {
18
-    const formattedData = formatItem({ item, userName });
17
+exports.VendorResource = (res, item, message = 'Success') => {
18
+    const formattedData = formatItem({ item });
19 19
 
20 20
     return res.status(200).json({
21 21
         success: true,

+ 6 - 6
src/resources/sales/area/UserAreaCollection.js

@@ -2,15 +2,15 @@ const { getUserNameById } = require("../../../utils/CheckUserKeycloak");
2 2
 const { ListResponse } = require("../../../utils/ListResponse");
3 3
 
4 4
 const transformArea = async (data = []) => {
5
-    return Promise.all(data.map(async ({ user_id, ...rest }) => {
6
-        const name = await getUserNameById(user_id);
5
+    return Promise.all(data.map(async ({ ...rest }) => {
6
+        // const name = await getUserNameById(user_id);
7 7
 
8 8
         return {
9 9
             ...rest,
10
-            user: {
11
-                id: user_id,
12
-                name: name
13
-            },
10
+            // user: {
11
+            //     id: user_id,
12
+            //     name: name
13
+            // },
14 14
         };
15 15
     }));
16 16
 };

+ 5 - 5
src/resources/sales/hospital/HospitalCollection.js

@@ -5,14 +5,14 @@ const { getUserNameById } = require("../../../utils/CheckUserKeycloak.js");
5 5
 // Fungsi transform per item
6 6
 const transformHospitalList = async (data = []) => {
7 7
     return Promise.all(data.map(async ({ created_by, ...rest }) => {
8
-        const name = await getUserNameById(created_by);
8
+        // const name = await getUserNameById(created_by);
9 9
 
10 10
         return {
11 11
             ...rest,
12
-            user: {
13
-                id: created_by,
14
-                name: name
15
-            },
12
+            // user: {
13
+            //     id: created_by,
14
+            //     name: name
15
+            // },
16 16
             createdAt: formatISOWithoutTimezone(rest.createdAt),
17 17
             updatedAt: formatISOWithoutTimezone(rest.updatedAt)
18 18
         };

+ 7 - 7
src/resources/sales/hospital/HospitalResource.js

@@ -1,21 +1,21 @@
1 1
 const { formatISOWithoutTimezone } = require("../../../utils/FormatDate");
2 2
 
3
-const formatItem = ({ item, userName }) => {
3
+const formatItem = ({ item }) => {
4 4
     const { created_by, ...rest } = item;
5 5
 
6 6
     return {
7 7
         ...rest,
8
-        user: {
9
-            id: created_by,
10
-            name: userName
11
-        },
8
+        // user: {
9
+        //     id: created_by,
10
+        //     name: userName
11
+        // },
12 12
         createdAt: formatISOWithoutTimezone(item.createdAt),
13 13
         updatedAt: formatISOWithoutTimezone(item.updatedAt)
14 14
     };
15 15
 };
16 16
 
17
-exports.HospitalResource = (res, item, userName, message = 'Success') => {
18
-    const formattedData = formatItem({ item, userName });
17
+exports.HospitalResource = (res, item, message = 'Success') => {
18
+    const formattedData = formatItem({ item });
19 19
 
20 20
     return res.status(200).json({
21 21
         success: true,

+ 6 - 6
src/resources/sales/status_history/StatusHistoryCollection.js

@@ -3,15 +3,15 @@ const { formatISOWithoutTimezone } = require("../../../utils/FormatDate.js");
3 3
 const { getUserNameById } = require("../../../utils/CheckUserKeycloak.js");
4 4
 
5 5
 const transformStatusHistoryList = async (data = []) => {
6
-    return Promise.all(data.map(async ({ user_id, ...rest }) => {
7
-        const name = await getUserNameById(user_id);
6
+    return Promise.all(data.map(async ({ ...rest }) => {
7
+        // const name = await getUserNameById(user_id);
8 8
 
9 9
         return {
10 10
             ...rest,
11
-            user: {
12
-                id: user_id,
13
-                name: name
14
-            },
11
+            // user: {
12
+            //     id: user_id,
13
+            //     name: name
14
+            // },
15 15
             note: rest.note?.trim() === '' ? null : rest.note,
16 16
             createdAt: formatISOWithoutTimezone(rest.createdAt),
17 17
             updatedAt: formatISOWithoutTimezone(rest.updatedAt)

+ 2 - 2
src/routes/admin/HospitalRoute.js

@@ -33,9 +33,9 @@ const checkRoles = require('../../middleware/CheckRoles.js');
33 33
 // router.delete('/:id/executives-history/:id_executives_history', verifyJWT, checkRole(['admin']), executivesHistoryController.deleteExecutivesHistory);
34 34
 
35 35
 router.get('/', [keycloak.protect(), extractToken, checkRoles(["admin"])], hospitalController.getAllHospital);
36
-router.post('/', [keycloak.protect(), extractToken, checkRoles(["admin", "admin"])], upload.single('image'), hospitalController.storeHospital);
36
+router.post('/', [keycloak.protect(), extractToken, checkRoles(["admin"])], upload.single('image'), hospitalController.storeHospital);
37 37
 router.get('/:id', [keycloak.protect(), extractToken, checkRoles(["admin"])], hospitalController.showHospital);
38
-router.patch('/:id', [keycloak.protect(), extractToken, checkRoles(["admin", "admin"])], upload.single('image'), hospitalController.updateHospital);
38
+router.patch('/:id', [keycloak.protect(), extractToken, checkRoles(["admin"])], upload.single('image'), hospitalController.updateHospital);
39 39
 router.delete('/:id', [keycloak.protect(), extractToken, checkRoles(["admin"])], hospitalController.deleteHospital);
40 40
 
41 41
 // Vendor History

+ 2 - 2
src/services/admin/VendorService.js

@@ -29,9 +29,9 @@ exports.showVendorService = async (id) => {
29 29
         throw new HttpException("Data vendor not found", 404);
30 30
     }
31 31
 
32
-    const userName = await getUserNameById(vendor.created_by);
32
+    // const userName = await getUserNameById(vendor.created_by);
33 33
 
34
-    return { vendor, userName };
34
+    return { vendor };
35 35
 };
36 36
 
37 37
 exports.storeVendorService = async (validateData, req) => {

+ 2 - 2
src/services/sales/HospitalService.js

@@ -300,7 +300,7 @@ exports.showHospitalService = async (id) => {
300 300
         throw new HttpException("Data hospital not found", 404);
301 301
     }
302 302
 
303
-    const userName = await getUserNameById(hospital.created_by);
303
+    // const userName = await getUserNameById(hospital.created_by);
304 304
 
305
-    return { hospital, userName };
305
+    return { hospital };
306 306
 };

+ 45 - 4
src/utils/LogActivity.js

@@ -64,22 +64,63 @@ const { getUserNameById } = require('./CheckUserKeycloak.js');
64 64
 
65 65
 // };
66 66
 // 3
67
+// const baseLog = async ({ req, action, data }) => {
68
+//     try {
69
+//         let userId, username;
70
+
71
+//         // Ambil userId dari token Keycloak
72
+//         if (req?.tokenData?.sub) {
73
+//             userId = req.tokenData.sub;
74
+//             username = await getUserNameById(userId);
75
+//         }
76
+
77
+//         // Fallback kalau tokenData tidak ada
78
+//         if (!userId || !username) {
79
+//             userId = data?.id;
80
+//             username = data?.username;
81
+//         }
82
+
83
+//         if (!userId || !username) return;
84
+
85
+//         await prisma.activityLog.create({
86
+//             data: {
87
+//                 user_id: userId,
88
+//                 username,
89
+//                 action: JSON.stringify({ [action]: data }),
90
+//                 createdAt: timeLocal.now().toDate(),
91
+//                 updatedAt: timeLocal.now().toDate(),
92
+//                 deletedAt: null,
93
+//             }
94
+//         });
95
+//     } catch (err) {
96
+//         console.error('Failed to log activity:', err.message);
97
+//     }
98
+// };
99
+
67 100
 const baseLog = async ({ req, action, data }) => {
68 101
     try {
69 102
         let userId, username;
70 103
 
71
-        // Ambil userId dari token Keycloak
104
+        // Ambil user dari tabel userKeycloak berdasarkan token.sub
72 105
         if (req?.tokenData?.sub) {
73
-            userId = req.tokenData.sub;
74
-            username = await getUserNameById(userId);
106
+            const user = await prisma.userKeycloak.findUnique({
107
+                where: { id: req.tokenData.sub },
108
+                select: { id: true, fullname: true }
109
+            });
110
+
111
+            if (user) {
112
+                userId = user.id;
113
+                username = user.fullname;
114
+            }
75 115
         }
76 116
 
77
-        // Fallback kalau tokenData tidak ada
117
+        // Fallback (misalnya digunakan di luar request auth)
78 118
         if (!userId || !username) {
79 119
             userId = data?.id;
80 120
             username = data?.username;
81 121
         }
82 122
 
123
+        // Skip jika tetap tidak ada userId atau username
83 124
         if (!userId || !username) return;
84 125
 
85 126
         await prisma.activityLog.create({