Proyectos de Subversion LeadersLinked - Services

Rev

Rev 60 | Ir a la última revisión | | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
/**
3
 *
4
 * Controlador: Mis Perfiles
5
 *
6
 */
7
declare(strict_types=1);
8
 
9
namespace LeadersLinked\Controller;
10
 
11
use Laminas\Db\Adapter\AdapterInterface;
12
 
13
use Laminas\Mvc\Controller\AbstractActionController;
14
use Laminas\Log\LoggerInterface;
15
use Laminas\View\Model\ViewModel;
16
use Laminas\View\Model\JsonModel;
17
 
18
use LeadersLinked\Mapper\UserProfileMapper;
19
use LeadersLinked\Mapper\CompanyFollowerMapper;
20
use LeadersLinked\Mapper\LocationMapper;
21
use LeadersLinked\Mapper\UserLanguageMapper;
22
use LeadersLinked\Mapper\UserSkillMapper;
23
 
24
use LeadersLinked\Mapper\UserMapper;
25
use LeadersLinked\Mapper\UserEducationMapper;
26
use LeadersLinked\Mapper\DegreeMapper;
27
use LeadersLinked\Mapper\UserExperienceMapper;
28
use LeadersLinked\Mapper\IndustryMapper;
29
use LeadersLinked\Mapper\CompanySizeMapper;
30
use LeadersLinked\Mapper\ConnectionMapper;
31
use LeadersLinked\Mapper\UserBlockedMapper;
32
use LeadersLinked\Model\Connection;
33
use LeadersLinked\Model\Network;
34
use LeadersLinked\Mapper\ProfileVisitMapper;
35
use LeadersLinked\Model\ProfileVisit;
36
use LeadersLinked\Mapper\QueryMapper;
37
use Laminas\Paginator\Adapter\DbSelect;
38
use Laminas\Paginator\Paginator;
39
use LeadersLinked\Model\User;
40
use Laminas\Db\Sql\Expression;
41
use LeadersLinked\Mapper\LanguageMapper;
42
use LeadersLinked\Mapper\SkillMapper;
43
use LeadersLinked\Mapper\AptitudeMapper;
44
use LeadersLinked\Mapper\UserAptitudeMapper;
45
use LeadersLinked\Mapper\HobbyAndInterestMapper;
46
use LeadersLinked\Mapper\UserHobbyAndInterestMapper;
47
use LeadersLinked\Library\Functions;
48
 
49
 
50
class ProfileController extends AbstractActionController
51
{
52
    /**
53
     *
54
     * @var \Laminas\Db\Adapter\AdapterInterface
55
     */
56
    private $adapter;
57
 
58
    /**
59
     *
60
     * @var \LeadersLinked\Cache\CacheInterface
61
     */
62
    private $cache;
63
 
64
 
65
    /**
66
     *
67
     * @var \Laminas\Log\LoggerInterface
68
     */
69
    private $logger;
70
 
71
    /**
72
     *
73
     * @var array
74
     */
75
    private $config;
76
 
77
 
78
    /**
79
     *
80
     * @var \Laminas\Mvc\I18n\Translator
81
     */
82
    private $translator;
83
 
84
 
85
    /**
86
     *
87
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
88
     * @param \LeadersLinked\Cache\CacheInterface $cache
89
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
90
     * @param array $config
91
     * @param \Laminas\Mvc\I18n\Translator $translator
92
     */
93
    public function __construct($adapter, $cache, $logger, $config, $translator)
94
    {
95
        $this->adapter      = $adapter;
96
        $this->cache        = $cache;
97
        $this->logger       = $logger;
98
        $this->config       = $config;
99
        $this->translator   = $translator;
100
    }
101
 
102
    /**
103
     *
104
     * Generación del listado de perfiles
105
     * {@inheritDoc}
106
     * @see \Laminas\Mvc\Controller\AbstractActionController::indexAction()
107
     */
108
    public function indexAction()
109
    {
110
        return new JsonModel([
111
            'success' => false,
112
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
113
        ]);
114
    }
115
 
116
 
117
    /**
118
     * Presenta el perfil con las opciónes de edición de cada sección
119
     * @return \Laminas\Http\Response|\Laminas\View\Model\ViewModel|\Laminas\View\Model\JsonModel
120
     */
121
    public function viewAction()
122
    {
123
 
124
        $currentUserPlugin = $this->plugin('currentUserPlugin');
125
        $currentUser = $currentUserPlugin->getUser();
126
 
127
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
128
        $currentNetwork= $currentNetworkPlugin->getNetwork();
129
 
130
 
131
        $request = $this->getRequest();
132
        if($request->isGet()) {
133
 
134
 
135
            $flashMessenger = $this->plugin('FlashMessenger');
136
 
137
 
138
            $id = $this->params()->fromRoute('id');
139
            if(!$id) {
140
                $flashMessenger->addErrorMessage('ERROR_INVALID_PARAMETER');
141
                return $this->redirect()->toRoute('dashboard');
142
            }
143
 
144
 
145
            $userMapper = UserMapper::getInstance($this->adapter);
146
            $user = $userMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
147
 
148
            $userProfileMapper = UserProfileMapper::getInstance($this->adapter);
149
            if($user) {
150
                $userProfile = $userProfileMapper->fetchOnePublicByUserId($user->id);
151
            } else {
152
                $userProfile = $userProfileMapper->fetchOneByUuid($id);
153
 
154
                if($userProfile) {
155
                    $user = $userMapper->fetchOne($userProfile->user_id);
156
 
157
                    if($user && $currentUser->network_id != $user->network_id) {
158
                        $response = [
159
                            'success' => false,
160
                            'data' => 'ERROR_UNAUTHORIZED'
161
                        ];
162
 
163
                        return new JsonModel($response);
164
                    }
165
                }
166
            }
167
 
168
            if(!$userProfile) {
169
                $flashMessenger->addErrorMessage('ERROR_RECORD_NOT_FOUND');
170
                return $this->redirect()->toRoute('dashboard');
171
            }
172
 
173
 
174
 
175
            $userBlockedMapper = UserBlockedMapper::getInstance($this->adapter);
176
            $userBlocked = $userBlockedMapper->fetchOneByUserIdAndBlockedId($userProfile->user_id, $currentUser->id);
177
 
178
            if($userBlocked) {
179
                $flashMessenger->addErrorMessage('ERROR_UNAUTHORIZED');
180
                return $this->redirect()->toRoute('dashboard');
181
            }
182
 
183
            if($currentUser->id != $userProfile->user_id) {
184
 
185
                $visited_on = date('Y-m-d');;
186
                $profileVisitMapper = ProfileVisitMapper::getInstance($this->adapter);
187
                $profileVisit = $profileVisitMapper->fetchOneByVisitorIdAndVisitedIdAndVisitedOn($currentUser->id, $userProfile->user_id, $visited_on);
188
                if(!$profileVisit) {
189
                    $profileVisit = new ProfileVisit();
190
                    $profileVisit->user_profile_id = $userProfile->id;
191
                    $profileVisit->visited_id = $userProfile->user_id;
192
                    $profileVisit->visitor_id = $currentUser->id;
193
                    $profileVisit->visited_on = date('Y-m-d');
194
                    $profileVisitMapper->insert($profileVisit);
195
                }
196
            }
197
 
198
            if($userProfile->location_id) {
199
                $locationMapper= LocationMapper::getInstance($this->adapter);
200
                $location = $locationMapper->fetchOne($userProfile->location_id);
201
 
202
                $formattedAddress = $location->formatted_address;
203
                $country = $location->country;
204
            } else {
205
                $formattedAddress = '';
206
                $country = '';
207
            }
208
 
209
            $connectionMapper = ConnectionMapper::getInstance($this->adapter);
210
            $connection = $connectionMapper->fetchOneByUserId1AndUserId2($currentUser->id, $userProfile->user_id);
211
 
212
            $userMapper = UserMapper::getInstance($this->adapter);
213
            $user = $userMapper->fetchOne($userProfile->user_id);
214
 
215
            $userLanguages = [];
216
            $languageMapper = LanguageMapper::getInstance($this->adapter);
217
            $userLanguageMapper = UserLanguageMapper::getInstance($this->adapter);
218
            $records = $userLanguageMapper->fetchAllByUserProfileId($userProfile->id);
219
            foreach($records as $record)
220
            {
221
                $language = $languageMapper->fetchOne($record->language_id);
222
                $userLanguages[$language->id] = $language->name;
223
            }
224
 
225
 
226
            $locationMapper = LocationMapper::getInstance($this->adapter);
227
 
228
            $degreeMapper = DegreeMapper::getInstance($this->adapter);
229
            $userEducationMapper = UserEducationMapper::getInstance($this->adapter);
230
            $userEducations = $userEducationMapper->fetchAllByUserProfileId($userProfile->id);
231
 
232
            foreach($userEducations  as &$userEducation)
233
            {
234
                $location = $locationMapper->fetchOne($userEducation->location_id);
235
                $degree = $degreeMapper->fetchOne($userEducation->degree_id)    ;
236
 
237
 
238
                $userEducation = [
239
                    'university' => $userEducation->university,
240
                    'degree' => $degree->name,
241
                    'field_of_study' => $userEducation->field_of_study,
242
                    'grade_or_percentage' => $userEducation->grade_or_percentage,
243
                    'formatted_address' => $location->formatted_address,
244
                    'from_year' => $userEducation->from_year,
245
                    'to_year' => $userEducation->to_year,
246
                    'description' => $userEducation->description,
247
                ];
248
            }
249
 
250
            /*
251
            $industries = [];
252
            $industryMapper = IndustryMapper::getInstance($this->adapter);
253
            $records = $industryMapper->fetchAllActive();
254
            foreach($records as $record)
255
            {
256
                $industries[$record->uuid] = $record->name;
257
            }
258
 
259
            $companySizes = [];
260
            $companySizeMapper = CompanySizeMapper::getInstance($this->adapter);
261
            $records = $companySizeMapper->fetchAllActive();
262
            foreach($records as $record)
263
            {
264
                $companySizes[$record->uuid] = $record->name . ' ('.$record->minimum_no_of_employee . '-' . $record->maximum_no_of_employee .')';
265
            }
266
            */
267
 
268
            $industryMapper = IndustryMapper::getInstance($this->adapter);
269
            $companySizeMapper = CompanySizeMapper::getInstance($this->adapter);
270
 
271
 
272
            $userExperienceMapper = UserExperienceMapper::getInstance($this->adapter);
273
            $userExperiences = $userExperienceMapper->fetchAllByUserProfileId($userProfile->id);
274
 
275
            foreach($userExperiences  as &$userExperience)
276
            {
277
                $industry = $industryMapper->fetchOne($userExperience->industry_id);
278
                $companySize = $companySizeMapper->fetchOne($userExperience->company_size_id);
279
 
280
 
281
                $location = $locationMapper->fetchOne($userExperience->location_id);
282
 
283
                $userExperience = [
284
                    'company' => $userExperience->company,
285
                    'industry' => $industry->name,
286
                    'size' => $companySize->name . ' (' . $companySize->minimum_no_of_employee . ' - ' . $companySize->maximum_no_of_employee . ' ) ',
287
                    'title' => $userExperience->title,
288
                    'formatted_address' => $location->formatted_address,
289
                    'from_year' => $userExperience->from_year,
290
                    'from_month' => $userExperience->from_month,
291
                    'to_year' => $userExperience->to_year,
292
                    'to_month' => $userExperience->to_month,
293
                    'description' => $userExperience->description,
294
                    'is_current' => $userExperience->is_current,
295
                ];
296
            }
297
 
298
            $userAptitudes = [];
299
            $aptitudeMapper = AptitudeMapper::getInstance($this->adapter);
300
            $userAptitudeMapper = UserAptitudeMapper::getInstance($this->adapter);
301
            $records  = $userAptitudeMapper->fetchAllByUserProfileId($userProfile->id);
302
            foreach($records as $record)
303
            {
304
                $aptitude = $aptitudeMapper->fetchOne($record->aptitude_id);
305
                if($aptitude) {
306
                    $userAptitudes[$aptitude->uuid] = $aptitude->name;
307
                }
308
            }
309
 
310
            $userHobbiesAndInterests = [];
311
            $hobbyAndInterestMapper = HobbyAndInterestMapper::getInstance($this->adapter);
312
            $userHobbyAndInterestMapper = UserHobbyAndInterestMapper::getInstance($this->adapter);
313
            $records  = $userHobbyAndInterestMapper->fetchAllByUserProfileId($userProfile->id);
314
            foreach($records as $record)
315
            {
316
                $hobbyAndInterest = $hobbyAndInterestMapper->fetchOne($record->hobby_and_interest_id);
317
                if($hobbyAndInterest) {
318
                    $userHobbiesAndInterests[$hobbyAndInterest->uuid] = $hobbyAndInterest->name;
319
                }
320
            }
321
 
322
 
323
            $userSkills = [];
324
            $skillMapper = SkillMapper::getInstance($this->adapter);
325
            $userSkillMapper = UserSkillMapper::getInstance($this->adapter);
326
            $records  = $userSkillMapper->fetchAllByUserProfileId($userProfile->id);
327
            foreach($records as $record)
328
            {
329
                $skill = $skillMapper->fetchOne($record->skill_id);
330
                if($skill) {
331
                    $userSkills[$skill->uuid] = $skill->name;
332
                }
333
            }
334
 
335
 
336
 
337
 
338
 
339
            if($currentNetwork->relationship_user_mode == Network::RELATIONSHIP_USER_MODE_USER_2_USER)  {
340
 
341
                $connectionMapper = ConnectionMapper::getInstance($this->adapter);
342
                $total_connections = $connectionMapper->fetchTotalConnectionByUser($user->id);
343
 
344
                $request_connection = 0;
345
                if($connection) {
346
                    if($connection->status == Connection::STATUS_REJECTED || $connection->status == Connection::STATUS_CANCELLED) {
347
                        $request_connection = 1;
348
                    }
349
                } else {
350
                    $request_connection = 1;
351
                }
352
 
353
 
354
 
355
                $common_connection = count($connectionMapper->fetchAllCommonConnectionsUserIdByUser1ReturnIds($currentUser->id, $userProfile->user_id));
356
            }
357
 
358
 
359
            $profileVisitMapper = ProfileVisitMapper::getInstance($this->adapter);
360
            $views          = $profileVisitMapper->getTotalByVisitedId( $userProfile->user_id );
361
 
362
 
363
                $data = [
364
                    'user_id'                       => $user->uuid,
365
                    'user_uuid'                     => ($user->uuid),
366
                    'full_name'                     => trim($user->first_name . ' ' . $user->last_name),
367
                    'user_profile_id'               => $userProfile->id,
368
                    'user_profile_uuid'             => $userProfile->uuid,
369
                    'image'                         => $this->url()->fromRoute('storage',['code' => $user->uuid, 'type' => 'user-profile', 'filename' => $user->image]),
370
                    'cover'                         => $this->url()->fromRoute('storage',['code' => $user->uuid, 'type' => 'user-cover', 'filename' => $userProfile->cover]),
371
                    'overview'                      => $userProfile->description,
372
                    'facebook'                      => $userProfile->facebook,
373
                    'instagram'                     => $userProfile->instagram,
374
                    'twitter'                       => $userProfile->twitter,
375
                    'formatted_address'             => $formattedAddress,
376
                    'country'                       => $country,
377
                    'user_skills'                   => $userSkills,
378
                    'user_languages'                => $userLanguages,
379
                    'user_educations'               => $userEducations,
380
                    'user_experiences'              => $userExperiences,
381
                    'user_aptitudes'                => $userAptitudes,
382
                    'user_hobbies_and_interests'    => $userHobbiesAndInterests,
383
                    'views'                         => $views,
384
                    'show_contact'                  => $user->id != $currentUser->id,
385
                    'link_inmail'                   => $this->url()->fromRoute('inmail',['id' => $user->uuid ]),
386
                ];
387
 
388
 
389
                if($currentNetwork->default == Network::DEFAULT_YES) {
390
 
391
                    $companyFollowerMapper = CompanyFollowerMapper::getInstance($this->adapter);
392
                    $data['following'] = $companyFollowerMapper->getCountFollowing($user->id);
393
                    $data['view_following'] = 1;
394
                } else {
395
                    $data['following'] = 0;
396
                    $data['view_following'] = 0;
397
                }
398
 
399
 
400
                if($currentNetwork->relationship_user_mode == Network::RELATIONSHIP_USER_MODE_USER_2_USER)  {
401
                    $data['total_connections']  = $total_connections;
402
                    $data['view_total_connections']  = 1;
403
                    $data['request_connection'] = $request_connection;
404
                    $data['common_connection']  = $common_connection;
405
                    $data['link_cancel']        = $connection && $connection->status == Connection::STATUS_SENT ? $this->url()->fromRoute('connection/delete',['id' => $user->uuid ]) :  $this->url()->fromRoute('connection/cancel',['id' => $user->uuid]);
406
                    $data['link_request']       = $request_connection ? $this->url()->fromRoute('connection/request',['id' => $user->uuid ]) : '';
407
                } else {
408
                    $data['total_connections']  = 0;
409
                    $data['view_total_connections']  = 0;
410
                    $data['request_connection'] = 0;
411
                    $data['common_connection']  = 0;
412
                    $data['link_cancel']        = '';
413
                    $data['link_request']       = '';
414
                }
415
 
416
                return new JsonModel($data);
417
 
418
        }
419
 
420
        return new JsonModel([
421
            'success' => false,
422
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
423
        ]);
424
 
425
 
426
 
427
    }
428
 
429
    public function peopleViewedProfileAction()
430
    {
431
        $currentUserPlugin = $this->plugin('currentUserPlugin');
432
        $currentUser = $currentUserPlugin->getUser();
433
 
434
        $request = $this->getRequest();
435
        if($request->isGet()) {
436
 
437
                $page = (int) $this->params()->fromQuery('page');
438
                $search = Functions::sanitizeFilterString($this->params()->fromQuery('search', ''));
439
 
440
                $mapper = QueryMapper::getInstance($this->adapter);
441
                $select = $mapper->getSql()->select();
442
                $select->columns(['visitor_id' => new Expression('DISTINCT(visitor_id)')]);
443
                $select->from(['p' => ProfileVisitMapper::_TABLE]);
444
                $select->join(['u' => UserMapper::_TABLE], 'p.visitor_id = u.id ', ['uuid', 'first_name', 'last_name', 'image']);
445
                $select->where->equalTo('p.visited_id', $currentUser->id)->and->equalTo('u.status', User::STATUS_ACTIVE);
446
 
447
                if($search) {
448
                    $select->where->NEST->like('first_name', '%' . $search . '%')->or->like('last_name', '%' . $search . '%')->UNNEST;
449
                }
450
                $select->order('first_name','last_name');
451
 
452
                //echo $select->getSqlString($this->adapter->platform); exit;
453
 
454
                $dbSelect = new DbSelect($select, $this->adapter);
455
                $paginator = new Paginator($dbSelect);
456
                $paginator->setCurrentPageNumber($page ? $page : 1);
457
                $paginator->setItemCountPerPage(10);
458
 
459
                $items = [];
460
                $records = $paginator->getCurrentItems();
461
 
462
                foreach($records as $record)
463
                {
464
 
465
                    $item = [
466
                        'name' => trim($record['first_name'] . ' ' . $record['last_name']),
467
                        'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $record['uuid'], 'filename' => $record['image'] ]),
468
                        'link_view' => $this->url()->fromRoute('profile/view', ['id' => $record['uuid']  ]),
469
                        'link_inmail'   => $this->url()->fromRoute('inmail', ['id' => $record['uuid']  ]),
470
                    ];
471
 
472
                    array_push($items, $item);
473
                }
474
 
475
                $response = [
476
                    'success' => true,
477
                    'data' => [
478
                        'total' => [
479
                            'count' => $paginator->getTotalItemCount(),
480
                            'pages' => $paginator->getPages()->pageCount,
481
                        ],
482
                        'current' => [
483
                            'items'    => $items,
484
                            'page'     => $paginator->getCurrentPageNumber(),
485
                            'count'    => $paginator->getCurrentItemCount(),
486
                        ]
487
                    ]
488
                ];
489
 
490
 
491
 
492
                return new JsonModel($response);
493
 
494
 
495
        } else {
496
            return new JsonModel([
497
                'success' => false,
498
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
499
            ]);
500
        }
501
    }
502
 
503
 
504
}