Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 3454 | Rev 3912 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

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