Skip to content

Commit c97b7f5

Browse files
Finalizing friends feature (#393)
* Removed geonamesadminunits.sql as this is no longer needed. * Finalizing friends feature.
1 parent a5133bd commit c97b7f5

File tree

14 files changed

+200
-145
lines changed

14 files changed

+200
-145
lines changed

config/packages/dev/mailer.yaml

Lines changed: 0 additions & 4 deletions
This file was deleted.

docker/db/geonamesadminunits.sql

Lines changed: 0 additions & 16 deletions
This file was deleted.

src/Command/MigrateDatabaseCommand.php

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ public function __invoke(InputInterface $input, OutputInterface $output): int
194194

195195
$this->progressBar = new ProgressBar($output, $countOfMembers);
196196
$this->progressBar->setFormat(
197-
"<fg=white;bg=green>\n %info:-60s% \n</>\n%current%/%max% [%bar%] %percent:3s%%\n%estimated:-20s% %memory:20s%\nLast error: %error%"
197+
"<fg=white;bg=green>\n %info:-60s% \n</>\n%current%/%max% [%bar%] %percent:3s%%\n%elapsed:-10% %%estimated:-10s% %memory:20s%\nLast error: %error%"
198198
);
199199
$this->progressBar->setMessage("Migrating {$countOfMembers} members to new member table including translations.", 'info');
200200
$this->progressBar->setMessage('none', 'error');
@@ -315,6 +315,11 @@ private function migrateMemberData(array $member): void
315315

316316
private function migrateMemberAddress(mixed $member): void
317317
{
318+
if ('AskToLeave' === $member['Status'] || 'TakenOut' === $member['Status']) {
319+
// Do not add address for members that are not active anymore
320+
return;
321+
}
322+
318323
$addressSQL = 'INSERT INTO address (member_id, active, location, latitude, longitude, wheelChairAccessible) ' .
319324
'VALUES (:member, 1, :city, :latitude, :longitude, :wheelchairAccessible)';
320325

@@ -323,21 +328,18 @@ private function migrateMemberAddress(mixed $member): void
323328
$statement = $this->connection->prepare($addressSQL);
324329
$statement->bindValue('member', $member['id']);
325330
if (null === $city) {
326-
if ('AskToLeave' !== $member['Status'] && 'TakenOut' !== $member['Status']) {
327-
$this->addErrorCity($member);
328-
$this->progressBar->setMessage($member['Username'], 'error');
329-
}
330-
$statement->bindValue('city', null);
331-
$statement->bindValue('latitude', null);
332-
$statement->bindValue('longitude', null);
333-
$statement->bindValue('wheelchairAccessible', null);
334-
} else {
335-
$statement->bindValue('city', $city->getGeonameid());
336-
$statement->bindValue('latitude', $member['Latitude']);
337-
$statement->bindValue('longitude', $member['Longitude']);
338-
$statement->bindValue('wheelchairAccessible', $this->isWheelchairAccessible($member['TypicOffer']) ? 1 : 0);
331+
// If we can't find a city we just do not set an address
332+
return;
339333
}
340334

335+
$statement->bindValue('city', $city->getGeonameid());
336+
$statement->bindValue('latitude', $member['Latitude']);
337+
$statement->bindValue('longitude', $member['Longitude']);
338+
$statement->bindValue(
339+
'wheelchairAccessible',
340+
$this->isWheelchairAccessible($member['TypicOffer']) ? 1 : 0
341+
);
342+
341343
try {
342344
$statement->executeStatement();
343345
} catch (Exception $e) {

src/Controller/FriendshipController.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ public function confirm(
165165
return $this->redirectToRoute('friends', ['username' => $right->getUsername()]);
166166
}
167167

168-
$friendship->setConfirmed(1);
168+
$friendship->setConfirmed(true);
169169
$entityManager->flush();
170170

171171
$this->addTranslatedFlash('notice', 'flash.friendship.confirmed');
@@ -205,10 +205,11 @@ public function friends(Member $member, int $page = 1): Response
205205
{
206206
/** @var Member $loggedInMember */
207207
$loggedInMember = $this->getuser();
208+
$itemsPerPage = $this->getItemsPerPage($loggedInMember);
208209

209210
/** @var FriendRepository $friendRepository */
210211
$friendRepository = $this->entityManager->getRepository(Friend::class);
211-
$friends = $friendRepository->getFriends($member, $page);
212+
$friends = $friendRepository->getFriends($member, $page, $itemsPerPage);
212213

213214
return $this->render('friend/friends.html.twig', [
214215
'member' => $member,

src/Repository/FriendRepository.php

Lines changed: 54 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,35 +6,50 @@
66
use App\Entity\Friend;
77
use App\Entity\Member;
88
use Doctrine\ORM\EntityRepository;
9-
use Pagerfanta\Doctrine\ORM\QueryAdapter;
9+
use Doctrine\ORM\QueryBuilder;
10+
use Pagerfanta\Adapter\ArrayAdapter;
1011
use Pagerfanta\Pagerfanta;
1112

12-
/**
13-
* FamilyAndFriendRepository.
14-
*/
1513
class FriendRepository extends EntityRepository
1614
{
1715
public function getFamilyAndFriendsCount(Member $member): int
1816
{
19-
$qb = $this->createQueryBuilder('r');
17+
$qb = $this->createQueryBuilder('f');
2018

2119
return
2220
(int) $qb
23-
->select('count(r.left)')
24-
->where('r.confirmed = :confirmed')
21+
->select('count(f.left)')
22+
->join('f.left', 'l')
23+
->join('f.right', 'r')
24+
->where('f.confirmed = :confirmed')
2525
->andWhere(
2626
$qb->expr()->orX(
27-
$qb->expr()->eq('r.left', ':member'),
28-
$qb->expr()->eq('r.right', ':member')
27+
$qb->expr()->eq('f.left', ':member'),
28+
$qb->expr()->eq('f.right', ':member')
29+
)
30+
)
31+
->andWhere(
32+
$qb->expr()->orX(
33+
$qb->expr()->in('l.status', ':status'),
34+
$qb->expr()->in('r.status', ':status')
2935
)
3036
)
3137
->setParameter('member', $member)
38+
->setParameter('status', MemberStatusType::ACTIVE_ALL_ARRAY)
3239
->setParameter('confirmed', true)
3340
->getQuery()
3441
->getSingleScalarResult()
3542
;
3643
}
3744

45+
public function getNumberOfFriendsFor(Member $member): int
46+
{
47+
$qb = $this->getFriendsForQueryBuilder($member);
48+
$qb->select('count(f.left)');
49+
50+
return $qb->getQuery()->getSingleScalarResult();
51+
}
52+
3853
public function findFriendsFor(Member $member): mixed
3954
{
4055
$qb = $this->createQueryBuilder('f');
@@ -54,8 +69,8 @@ public function findFriendsFor(Member $member): mixed
5469
->andWhere($qb->expr()->in('r.status', ':status'))
5570
->setParameter('member', $member)
5671
->setParameter('confirmed', 1)
57-
->setParameter('status', MemberStatusType::MEMBER_COMMENTS_ARRAY)
58-
->orderBy('r.updated', 'DESC')
72+
->setParameter('status', MemberStatusType::ACTIVE_ALL_ARRAY)
73+
->orderBy('f.updated', 'DESC')
5974
->getQuery()
6075
->getResult()
6176
;
@@ -97,29 +112,46 @@ public function findUnconfirmedRelationBetween(Member $relation1, Member $relati
97112
;
98113
}
99114

100-
public function getFriends(Member $member, int $page): Pagerfanta
115+
public function getFriends(Member $member, int $page, int $itemsPerPage = 50): Pagerfanta
116+
{
117+
$qb = $this->getFriendsForQueryBuilder($member);
118+
119+
$query = $qb->getQuery();
120+
$results = $query->getResult();
121+
122+
$friends = new Pagerfanta(new ArrayAdapter($results));
123+
124+
// $items per page will be 5, 10, 20, 50, 100 here we want a number dividable by 6
125+
// as for bigger viewports we use 6 friends per row. We use the next larger number
126+
// that is dividable by 6 (6, 12, 24, 54, 102).
127+
$itemsPerPage = ($itemsPerPage / 6 + 1) * 6;
128+
$friends->setMaxPerPage($itemsPerPage);
129+
$friends->setCurrentPage($page);
130+
131+
return $friends;
132+
}
133+
134+
private function getFriendsForQueryBuilder($member): QueryBuilder
101135
{
102136
$qb = $this->createQueryBuilder('f');
103-
$qb
104-
->leftJoin('f.left', 'l')
105-
->leftJoin('f.right', 'r')
137+
138+
return $qb
106139
->where('f.confirmed = :confirmed')
140+
->join('f.left', 'l')
141+
->join('f.right', 'r')
107142
->andWhere(
108143
$qb->expr()
109144
->orX(
110145
$qb->expr()->eq('f.left', ':member'),
111146
$qb->expr()->eq('f.right', ':member'),
112147
)
113148
)
149+
->andWhere($qb->expr()->in('l.status', ':status'))
150+
->andWhere($qb->expr()->in('r.status', ':status'))
114151
->setParameter('member', $member)
115152
->setParameter('confirmed', 1)
116-
->orderBy('l.created', 'ASC')
153+
->setParameter('status', MemberStatusType::ACTIVE_ALL_ARRAY)
154+
->orderBy('r.updated', 'DESC')
117155
;
118-
119-
$notes = new Pagerfanta(new QueryAdapter($qb->getQuery()));
120-
$notes->setMaxPerPage(30);
121-
$notes->setCurrentPage($page);
122-
123-
return $notes;
124156
}
125157
}

src/Repository/GalleryImageRepository.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,10 @@ public function getImagesForMember(Member $member): array
2626
;
2727
}
2828

29-
public function getLatestImagesFor(Member $member, int $count = 10): array
29+
public function getLatestImagesFor(Member $member): array
3030
{
3131
return $this->getImagesByMemberQueryBuilder($member)
3232
->orderBy('i.created', 'DESC')
33-
->setMaxResults($count)
3433
->getQuery()
3534
->getResult()
3635
;

src/Service/Mailer.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,9 @@ public function sendFeedbackEmail($sender, Address $receiver, $parameters): bool
151151
*/
152152
public function sendFriendshipNotification(Friend $friend, Member $requester): bool
153153
{
154-
$sender = $friend->getLeft() === $requester ? $requester : $friend->getRight();
155-
$receiver = $friend->getLeft() === $requester ? $friend->getLeft() : $requester;
154+
$receiver = $friend->getLeft() === $requester ? $friend->getRight() : $friend->getLeft();
156155
$parameters = [];
157-
$parameters['sender'] = $sender;
156+
$parameters['sender'] = $requester;
158157
$parameters['receiver'] = $receiver;
159158
$parameters['subject'] = [
160159
'translationId' => 'email.subject.friendship',
@@ -165,7 +164,7 @@ public function sendFriendshipNotification(Friend $friend, Member $requester): b
165164

166165
return $this->sendTemplateEmail(
167166
$this->getBeWelcomeAddress($requester, self::NO_REPLY_EMAIL_ADDRESS),
168-
$requester,
167+
$receiver,
169168
'friendship.request',
170169
$parameters
171170
);

templates/base.html.twig

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,13 +116,15 @@
116116
{% elseif 'profile_picture' in filter %}
117117
<div class="u:w-full u:relative u:pb-[100%]">
118118
<div class="u:absolute u:left-0 u:top-0 u:w-full u:h-full">
119-
<a href="{{ url('avatar', {username: loggedInMember.username, size:48}) }}" title="{{ 'profile.picture.title'|trans({username: loggedInMember.username}) }}" class="js-profile-picture" data-toggle="lightbox" data-type="image">
119+
<a href="{{ url('avatar', {username: member.username, size:48}) }}" title="{{ 'profile.picture.title'|trans({username: member.username}) }}" class="js-profile-picture" data-toggle="lightbox" data-type="image">
120120
<img class="u:rounded-8 u:w-full u:h-full u:object-cover js-profile-picture"
121-
src="{{ url('avatar', {username: loggedInMember.username, size: 500}) }}" alt="{{ 'profile.picture.title'|trans({username: loggedInMember.username}) }}">
121+
src="{{ url('avatar', {username: member.username, size: 500}) }}" alt="{{ 'profile.picture.title'|trans({username: member.username}) }}">
122122
</a>
123123
</div>
124124
</div>
125-
<div><a href="{{ url('profile_edit_avatar', {username: loggedInMember.username}) }}" class="btn btn-info btn-block">{{ 'profile.change.avatar'|trans }}</a></div>
125+
{% if loggedInMember == member %}
126+
<div><a href="{{ url('profile_edit_avatar', {username: member.username}) }}" class="btn btn-info btn-block">{{ 'profile.change.avatar'|trans }}</a></div>
127+
{% endif %}
126128
{% else %}
127129
<a class="list-group-item nav-link{% if submenu.active == filter %} active{% endif %}"
128130
href="{{ menuItem.url }}">{% if menuItem.icon is defined %}<i

templates/emails/friendship.request.html.twig

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
{% block content %}
44
<p>{{ 'friendship.sender.says.exist'|trans({username:sender.Username}) }}</p>
5+
{{ receiver.username }}
6+
{{ sender.username }}
57
<row>
68
<columns>
79
<center>

templates/friend/friend.html.twig

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1 @@
1-
{% import 'macros.twig' as macros %}
2-
{% set owned_relations = relation.owner == app.user %}
3-
<div class="{% if owned_relations %}relations-card{% else %}relations-card-other{% endif %}">
4-
<div class="relation-avatar"><div class="o-avatar o-avatar--m">{{ macros.roundedavatarstack(relation.receiver.username, 48) }}</div></div>
5-
<div class="relation-relation js-read-more u:break-words">{{ relation.commentText|purify }}</div>
6-
<div class="relation-updated"><span class="u:text-12">{{ relation.updated|format_date('medium') }}</span></div>
7-
8-
{% if owned_relations %}<div class="relation-actions">
9-
<a href="{{ path('edit_relation', {username: relation.receiver.username}) }}" class="o-button"><i class="fa fa-fw fa-edit"></i></a>
10-
<button class="o-button" data-micromodal-trigger="relation-delete-{{ relation.id }}"><i class="fa fa-fw fa-trash-alt"></i></button>
11-
</div>
12-
{% endif %}
13-
</div>
1+
{% import 'macros.twig' as macros %}

0 commit comments

Comments
 (0)