Proyectos de Subversion LeadersLinked - Services

Rev

Rev 666 | Rev 673 | Ir a la última revisión | Mostrar el archivo completo | | | Autoría | Ultima modificación | Ver Log |

Rev 666 Rev 667
Línea 84... Línea 84...
84
        $this->config       = $config;
84
        $this->config       = $config;
85
        $this->translator   = $translator;
85
        $this->translator   = $translator;
86
    }
86
    }
Línea 87... Línea 87...
87
 
87
 
-
 
88
    /**
88
    /**
89
     * Genera el listado de conversaciones del usuario actual
89
     * 
90
     * 
90
     * Generación del listado de conversationes
91
     * Endpoint: GET /inmail
-
 
92
     * 
-
 
93
     * Parámetros de ruta:
-
 
94
     * - id: UUID del usuario o empresa para seleccionar automáticamente (opcional)
-
 
95
     * 
91
     * 
96
     * Respuesta exitosa:
92
     * [
97
     * [
93
     *  success: true,
98
     *   success: true,
94
     *  data:[
99
     *   data: [
95
     *    [
100
     *     [
96
     *       uuid: uuid con quien se tiene la conversación,
101
     *       uuid: UUID del usuario/empresa con quien se tiene la conversación,
97
     *       name: nombre de con quien se tiene la conversacion,
102
     *       name: nombre del usuario/empresa,
98
     *       image: imagen de con quien se tiene la conversación,
103
     *       image: URL de la imagen del usuario/empresa,
99
     *       profile: url del profile con quien se tiene la conversación,
104
     *       profile: URL del perfil del usuario/empresa,
100
     *       last_message: fecha del ultimo mensaje,
105
     *       last_message: tiempo transcurrido del último mensaje,
101
     *       count_unread: cantidad de mensajes sin leer,
106
     *       count_unread: cantidad de mensajes sin leer,
102
     *       messages_link: url para recuperar los mensajes,
107
     *       messages_link: URL para recuperar los mensajes,
103
     *       send_link: url para enviar el mensaje,
108
     *       send_link: URL para enviar mensaje,
-
 
109
     *       selected: 0 = no seleccionado, 1 = seleccionado,
104
     *       selected: 0 = no seleccionado, 1 = seleccionado
110
     *       delete_link: URL para eliminar la conversación
105
     *     ]
111
     *     ]
-
 
112
     *   ]
106
     *  ]
113
     * ]
-
 
114
     * 
-
 
115
     * Respuesta de error:
-
 
116
     * [
-
 
117
     *   success: false,
-
 
118
     *   data: mensaje de error
107
     * 
119
     * ]
108
     * 
120
     * 
109
     * @return \Laminas\View\Model\JsonModel
121
     * @return \Laminas\View\Model\JsonModel
110
     */
122
     */
111
    public function indexAction()
123
    public function indexAction()
112
    {
124
    {
113
        $request = $this->getRequest();
-
 
114
        if ($request->isGet()) {
-
 
115
            $currentUserPlugin = $this->plugin('currentUserPlugin');
-
 
116
            $currentUser = $currentUserPlugin->getUser();
125
        $request = $this->getRequest();
117
 
-
 
118
            $id = $this->params()->fromRoute('id');
-
 
119
 
-
 
120
            $currentUserPlugin = $this->plugin('currentUserPlugin');
126
        
121
            $currentUser = $currentUserPlugin->getUser();
-
 
122
 
-
 
123
            $userBlockedMapper = UserBlockedMapper::getInstance($this->adapter);
-
 
124
            $user_blocked_ids = $userBlockedMapper->fetchAllBlockedReturnIds($currentUser->id);
-
 
125
 
-
 
126
            $user_blocked_me_ids = $userBlockedMapper->fetchAllUserBlockMeReturnIds($currentUser->id);
-
 
127
 
-
 
128
 
-
 
129
            $userMapper = UserMapper::getInstance($this->adapter);
127
        // Verificar que la petición sea GET
130
            $now = $userMapper->getDatebaseNow();
-
 
131
 
-
 
132
            $conversationMapper = ConversationMapper::getInstance($this->adapter);
-
 
133
            $messageMapper = MessageMapper::getInstance($this->adapter);
128
        if (!$request->isGet()) {
134
            $conversations = [];
-
 
135
 
129
            return new JsonModel([
136
            $selected_user_id = 0;
-
 
137
 
130
                'success' => false,
138
            $id = $this->params()->fromRoute('id');
131
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
139
            if ($id) {
-
 
140
 
-
 
141
                $companyMapper = CompanyMapper::getInstance($this->adapter);
-
 
142
                $company = $companyMapper->fetchOneByUuid($id);
132
            ]);
Línea -... Línea 133...
-
 
133
        }
-
 
134
 
-
 
135
        // ========================================
-
 
136
        // INICIALIZACIÓN Y OBTENCIÓN DE DATOS BÁSICOS
-
 
137
        // ========================================
-
 
138
        
-
 
139
        // Obtener el usuario actual autenticado
-
 
140
        $currentUserPlugin = $this->plugin('currentUserPlugin');
-
 
141
        $currentUser = $currentUserPlugin->getUser();
-
 
142
 
-
 
143
        // Obtener la fecha actual de la base de datos para cálculos de tiempo
-
 
144
        $userMapper = UserMapper::getInstance($this->adapter);
-
 
145
        $now = $userMapper->getDatebaseNow();
-
 
146
 
-
 
147
        // ========================================
-
 
148
        // OBTENCIÓN DE USUARIOS BLOQUEADOS
-
 
149
        // ========================================
-
 
150
        
-
 
151
        // Obtener IDs de usuarios que el usuario actual ha bloqueado
-
 
152
        $userBlockedMapper = UserBlockedMapper::getInstance($this->adapter);
-
 
153
        $user_blocked_ids = $userBlockedMapper->fetchAllBlockedReturnIds($currentUser->id);
-
 
154
 
-
 
155
        // Obtener IDs de usuarios que han bloqueado al usuario actual
-
 
156
        $user_blocked_me_ids = $userBlockedMapper->fetchAllUserBlockMeReturnIds($currentUser->id);
-
 
157
 
-
 
158
        // ========================================
-
 
159
        // INICIALIZACIÓN DE MAPPER Y VARIABLES
-
 
160
        // ========================================
-
 
161
        
-
 
162
        $conversationMapper = ConversationMapper::getInstance($this->adapter);
-
 
163
        $messageMapper = MessageMapper::getInstance($this->adapter);
-
 
164
        $conversations = [];
-
 
165
        $selected_user_id = 0;
-
 
166
 
-
 
167
        // ========================================
-
 
168
        // PROCESAMIENTO DE USUARIO/EMPRESA SELECCIONADO
-
 
169
        // ========================================
-
 
170
        
-
 
171
        $id = $this->params()->fromRoute('id');
-
 
172
        if ($id) {
-
 
173
            // ========================================
-
 
174
            // BÚSQUEDA COMO EMPRESA PRIMERO
-
 
175
            // ========================================
-
 
176
            
-
 
177
            $companyMapper = CompanyMapper::getInstance($this->adapter);
-
 
178
            $company = $companyMapper->fetchOneByUuid($id);
-
 
179
            
143
                if ($company) {
180
            if ($company) {
144
 
181
                // Buscar el propietario de la empresa
-
 
182
                $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
-
 
183
                $companyUser = $companyUserMapper->fetchOwnerByCompanyId($company->id);
-
 
184
 
-
 
185
                // Verificar que no haya bloqueos entre usuarios
-
 
186
                if (!in_array($companyUser->user_id, $user_blocked_ids) && 
-
 
187
                    !in_array($companyUser->id, $user_blocked_me_ids)) {
-
 
188
                    
-
 
189
                    $user = $userMapper->fetchOne($companyUser->user_id);
-
 
190
                    $selected_user_id = $user->id;
-
 
191
                    
-
 
192
                    // Buscar conversación existente
-
 
193
                    $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
-
 
194
 
-
 
195
                    // Calcular tiempo del último mensaje y mensajes no leídos
-
 
196
                    $timeElapsedString = '';
-
 
197
                    if ($conversation) {
-
 
198
                        $unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId(
-
 
199
                            $conversation->id, 
-
 
200
                            $currentUser->id
-
 
201
                        );
-
 
202
                        $lastMessage = $messageMapper->fetchLastUnreadMessagesByConversationIdAndReceiverId(
-
 
203
                            $conversation->id, 
Línea -... Línea 204...
-
 
204
                            $currentUser->id
145
                    $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
205
                        );
-
 
206
 
-
 
207
                        if ($lastMessage) {
146
                    $companyUser = $companyUserMapper->fetchOwnerByCompanyId($company->id);
208
                            $timeElapsedString = $this->timeAgo($lastMessage, $now);
-
 
209
                        }
Línea -... Línea 210...
-
 
210
                    } else {
-
 
211
                        $unread = 0;
-
 
212
                    }
-
 
213
 
-
 
214
                    // Agregar conversación de empresa a la lista
-
 
215
                    array_push($conversations, [
-
 
216
                        'uuid' => $company->uuid,
-
 
217
                        'name' => $company->name,
-
 
218
                        'image' => $this->url()->fromRoute('storage', [
-
 
219
                            'type' => 'company', 
-
 
220
                            'code' => $company->uuid, 
-
 
221
                            'filename' => $company->image
-
 
222
                        ], ['force_canonical' => true]),
-
 
223
                        'profile' => $this->url()->fromRoute('company/view', ['id' => $company->uuid]),
-
 
224
                        'last_message' => $timeElapsedString,
-
 
225
                        'count_unread' => $unread,
-
 
226
                        'messages_link' => $this->url()->fromRoute('inmail/message/list', ['id' => $user->uuid]),
-
 
227
                        'send_link' => $this->url()->fromRoute('inmail/message/send', ['id' => $user->uuid]),
-
 
228
                        'selected' => 1, // Marcar como seleccionado
-
 
229
                        'delete_link' => $this->url()->fromRoute('inmail/message/delete', ['id' => $user->uuid]),
-
 
230
                    ]);
-
 
231
                }
-
 
232
            } 
-
 
233
            // ========================================
-
 
234
            // BÚSQUEDA COMO USUARIO INDIVIDUAL
-
 
235
            // ========================================
-
 
236
            else {
-
 
237
                $user = $userMapper->fetchOneByUuid($id);
Línea -... Línea 238...
-
 
238
                if ($user) {
147
 
239
                    // Verificar que no haya bloqueos entre usuarios
-
 
240
                    if (!in_array($user->id, $user_blocked_ids) && 
-
 
241
                        !in_array($user->id, $user_blocked_me_ids)) {
148
                    if (!in_array($companyUser->user_id, $user_blocked_ids) && !in_array($companyUser->id, $user_blocked_me_ids)) {
242
 
149
                        $user  = $userMapper->fetchOne($companyUser->user_id);
-
 
150
 
243
                        $timeElapsedString = '';
151
 
-
 
152
                        $selected_user_id = $user->id;
244
                        $selected_user_id = $user->id;
153
                        $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
245
                        
-
 
246
                        // Buscar conversación existente
-
 
247
                        $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
-
 
248
                        
154
 
249
                        if ($conversation) {
-
 
250
                            $unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId(
-
 
251
                                $conversation->id, 
-
 
252
                                $currentUser->id
155
 
253
                            );
156
                        $timeElapsedString = '';
254
                            $lastMessage = $messageMapper->fetchLastUnreadMessagesByConversationIdAndReceiverId(
157
                        if ($conversation) {
255
                                $conversation->id, 
158
                            $unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId($conversation->id, $currentUser->id);
256
                                $currentUser->id
159
                            $lastMessage = $messageMapper->fetchLastUnreadMessagesByConversationIdAndReceiverId($conversation->id, $currentUser->id);
257
                            );
160
 
258
                            
161
                            if ($lastMessage) {
259
                            if ($lastMessage) {
Línea 162... Línea -...
162
                                $timeElapsedString =  $this->timeAgo($lastMessage, $now);
-
 
-
 
260
                                $timeElapsedString = $this->timeAgo($lastMessage, $now);
163
                            }
261
                            }
164
                        } else {
262
                        } else {
-
 
263
                            $unread = 0;
-
 
264
                        }
-
 
265
 
165
                            $unread = 0;
266
                        // Agregar conversación de usuario a la lista
-
 
267
                        array_push($conversations, [
166
                        }
268
                            'uuid' => $user->uuid,
167
 
269
                            'name' => trim($user->first_name . ' ' . $user->last_name),
168
 
270
                            'image' => $this->url()->fromRoute('storage', [
169
                        array_push($conversations, [
271
                                'type' => 'user', 
170
                            'uuid' => $company->uuid,
272
                                'code' => $user->uuid, 
171
                            'name' => $company->name,
273
                                'filename' => $user->image
172
                            'image' => $this->url()->fromRoute('storage', ['type' => 'company', 'code' => $company->uuid, 'filename' => $company->image], ['force_canonical' => true]),
274
                            ], ['force_canonical' => true]),
173
                            'profile' => $this->url()->fromRoute('company/view', ['id' => $company->uuid]),
275
                            'profile' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
174
                            'last_message' => $timeElapsedString,
276
                            'last_message' => $timeElapsedString,
175
                            'count_unread' => $unread,
277
                            'count_unread' => $unread,
176
                            'messages_link' => $this->url()->fromRoute('inmail/message', ['id' => $user->uuid]),
-
 
177
                            'send_link' => $this->url()->fromRoute('inmail/message/send', ['id' => $user->uuid]),
-
 
178
                            'selected' => 1,
-
 
179
                            'delete_link' => $this->url()->fromRoute('inmail/message/delete',  ['id' => $user->uuid]),
-
 
180
                        ]);
-
 
181
                    }
-
 
182
                } else {
-
 
183
                    $user = $userMapper->fetchOneByUuid($id);
-
 
184
                    if ($user) {
-
 
185
 
-
 
186
                        if (!in_array($user->id, $user_blocked_ids) && !in_array($user->id, $user_blocked_me_ids)) {
-
 
187
 
-
 
188
                            $timeElapsedString = '';
-
 
189
 
-
 
190
                            $selected_user_id = $user->id;
-
 
191
                            $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
-
 
192
                            if ($conversation) {
-
 
193
                                $unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId($conversation->id, $currentUser->id);
-
 
194
                                $lastMessage = $messageMapper->fetchLastUnreadMessagesByConversationIdAndReceiverId($conversation->id, $currentUser->id);
-
 
195
                                if ($lastMessage) {
-
 
196
                                    $timeElapsedString =  $this->timeAgo($lastMessage, $now);
-
 
197
                                }
-
 
198
                            } else {
-
 
199
                                $unread = 0;
-
 
200
                            }
-
 
201
 
-
 
202
 
-
 
203
                            array_push($conversations, [
-
 
204
                                'uuid' => $user->uuid,
-
 
205
                                'name' => trim($user->first_name . ' ' . $user->last_name),
-
 
206
                                'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image], ['force_canonical' => true]),
-
 
207
                                'profile' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
-
 
208
                                'last_message' => $timeElapsedString,
-
 
209
                                'count_unread' => $unread,
-
 
210
                                'messages_link' => $this->url()->fromRoute('inmail/message', ['id' => $user->uuid]),
-
 
211
                                'send_link' => $this->url()->fromRoute('inmail/message/send', ['id' => $user->uuid]),
278
                            'messages_link' => $this->url()->fromRoute('inmail/message/list', ['id' => $user->uuid]),
212
                                'selected' => 1,
279
                            'send_link' => $this->url()->fromRoute('inmail/message/send', ['id' => $user->uuid]),
-
 
280
                            'selected' => 1, // Marcar como seleccionado
Línea -... Línea 281...
-
 
281
                            'delete_link' => $this->url()->fromRoute('inmail/message/delete', ['id' => $user->uuid]),
-
 
282
                        ]);
-
 
283
                    }
213
                                'delete_link' => $this->url()->fromRoute('inmail/message/delete',  ['id' => $user->uuid]),
284
                }
214
                            ]);
285
            }
-
 
286
        }
215
                        }
287
 
216
                    }
288
        // ========================================
217
                }
289
        // OBTENCIÓN DE TODAS LAS CONVERSACIONES EXISTENTES
218
            }
290
        // ========================================
-
 
291
        
-
 
292
        $records = $conversationMapper->fetchAllByUserId($currentUser->id);
219
 
293
        
220
 
294
        foreach ($records as $record) {
221
            $records = $conversationMapper->fetchAllByUserId($currentUser->id);
295
            // ========================================
222
            foreach ($records as $record) {
-
 
223
                if ($selected_user_id) {
296
            // FILTRADO DE CONVERSACIONES YA PROCESADAS
224
                    if ($record->sender_id == $currentUser->id && $record->receiver_id == $selected_user_id) {
-
 
225
                        continue;
297
            // ========================================
226
                    }
298
            
227
                    if ($record->receiver_id == $currentUser->id && $record->sender_id == $selected_user_id) {
299
            // Omitir conversaciones que ya fueron procesadas como seleccionadas
228
                        continue;
300
            if ($selected_user_id) {
229
                    }
-
 
Línea -... Línea 301...
-
 
301
                if ($record->sender_id == $currentUser->id && $record->receiver_id == $selected_user_id) {
-
 
302
                    continue;
-
 
303
                }
-
 
304
                if ($record->receiver_id == $currentUser->id && $record->sender_id == $selected_user_id) {
-
 
305
                    continue;
230
                }
306
                }
-
 
307
            }
-
 
308
 
-
 
309
            // ========================================
-
 
310
            // DETERMINACIÓN DEL OTRO USUARIO EN LA CONVERSACIÓN
231
 
311
            // ========================================
-
 
312
            
232
                if ($record->sender_id == $currentUser->id) {
313
            if ($record->sender_id == $currentUser->id) {
233
                    $user = $userMapper->fetchOne($record->receiver_id);
314
                $user = $userMapper->fetchOne($record->receiver_id);
-
 
315
            }
-
 
316
            if ($record->receiver_id == $currentUser->id) {
-
 
317
                $user = $userMapper->fetchOne($record->sender_id);
-
 
318
 
-
 
319
                // Omitir usuarios bloqueados
-
 
320
                if (in_array($user->id, $user_blocked_ids) || in_array($user->id, $user_blocked_me_ids)) {
-
 
321
                    continue;
-
 
322
                }
-
 
323
            }
-
 
324
 
-
 
325
            // ========================================
-
 
326
            // CÁLCULO DE TIEMPO Y MENSAJES NO LEÍDOS
-
 
327
            // ========================================
-
 
328
            
-
 
329
            $timeElapsedString = '';
Línea 234... Línea -...
234
                }
-
 
235
                if ($record->receiver_id == $currentUser->id) {
-
 
236
                    $user = $userMapper->fetchOne($record->sender_id);
-
 
237
 
-
 
238
                    if (in_array($user->id, $user_blocked_ids) || in_array($user->id, $user_blocked_me_ids)) {
-
 
239
                        continue;
330
            $unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId(
240
                    }
331
                $record->id, 
241
                }
-
 
242
 
-
 
243
                $timeElapsedString = '';
-
 
244
                $unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId($record->id, $currentUser->id);
-
 
245
                $lastMessage = $messageMapper->fetchLastMessagesByConversationIdAndReceiverId($record->id, $currentUser->id);
-
 
246
 
-
 
247
 
-
 
248
                if ($lastMessage) {
-
 
249
                    $timeElapsedString =  $this->timeAgo($lastMessage, $now);
-
 
250
                }
-
 
251
 
-
 
252
                array_push($conversations, [
-
 
253
                    'uuid' => $user->uuid,
-
 
254
                    'name' => trim($user->first_name . ' ' . $user->last_name),
-
 
255
                    'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image], ['force_canonical' => true]),
332
                $currentUser->id
Línea -... Línea 333...
-
 
333
            );
-
 
334
            $lastMessage = $messageMapper->fetchLastMessagesByConversationIdAndReceiverId(
-
 
335
                $record->id, 
-
 
336
                $currentUser->id
-
 
337
            );
-
 
338
 
-
 
339
            if ($lastMessage) {
-
 
340
                $timeElapsedString = $this->timeAgo($lastMessage, $now);
-
 
341
            }
-
 
342
 
-
 
343
            // ========================================
-
 
344
            // AGREGAR CONVERSACIÓN A LA LISTA
-
 
345
            // ========================================
-
 
346
            
-
 
347
            array_push($conversations, [
-
 
348
                'uuid' => $user->uuid,
-
 
349
                'name' => trim($user->first_name . ' ' . $user->last_name),
-
 
350
                'image' => $this->url()->fromRoute('storage', [
-
 
351
                    'type' => 'user', 
-
 
352
                    'code' => $user->uuid, 
-
 
353
                    'filename' => $user->image
Línea 256... Línea 354...
256
                    'profile' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
354
                ], ['force_canonical' => true]),
-
 
355
                'profile' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
257
                    'last_message' => $timeElapsedString,
356
                'last_message' => $timeElapsedString,
-
 
357
                'count_unread' => $unread,
258
                    'count_unread' => $unread,
358
                'messages_link' => $this->url()->fromRoute('inmail/message/list', ['id' => $user->uuid]),
259
                    'messages_link' => $this->url()->fromRoute('inmail/message', ['id' => $user->uuid]),
359
                'send_link' => $this->url()->fromRoute('inmail/message/send', ['id' => $user->uuid]),
260
                    'send_link' => $this->url()->fromRoute('inmail/message/send', ['id' => $user->uuid]),
360
                'selected' => 0, // No seleccionado
261
                    'selected' => 0,
361
                'delete_link' => $this->url()->fromRoute('inmail/message/delete', ['id' => $user->uuid]),
262
                    'delete_link' => $this->url()->fromRoute('inmail/message/delete',  ['id' => $user->uuid]),
362
            ]);
263
                ]);
363
        }
264
            }
364
 
265
 
365
        // ========================================
-
 
366
        // ORDENAMIENTO DE CONVERSACIONES
-
 
367
        // ========================================
266
 
368
        
267
            usort($conversations, function ($a, $b) {
369
        // Ordenar por: seleccionados primero, luego por fecha del último mensaje
Línea 268... Línea 370...
268
                if ($a['selected'] == $b['selected']) {
370
        usort($conversations, function ($a, $b) {
269
                    if ($a['last_message'] == $b['last_message']) {
371
            if ($a['selected'] == $b['selected']) {
270
                        return 0;
372
                if ($a['last_message'] == $b['last_message']) {
271
                    } else {
373
                    return 0;
272
                        return $a['last_message'] < $b['last_message'] ? -1 : 1;
-
 
273
                    }
374
                } else {
274
                } else {
375
                    return $a['last_message'] < $b['last_message'] ? -1 : 1;
275
                    return $a['selected'] < $b['selected'] ? -1 : 1;
376
                }
276
                }
-
 
277
            });
377
            } else {
278
 
378
                return $a['selected'] < $b['selected'] ? -1 : 1;
Línea 279... Línea 379...
279
 
379
            }
280
            return new JsonModel([
380
        });
281
                'success' => true,
381