Skip to content

Commit

Permalink
bugfixing
Browse files Browse the repository at this point in the history
  • Loading branch information
PavlosIsaris committed Jan 22, 2025
1 parent 4486dd6 commit 202a319
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 160 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -129,9 +129,12 @@ public function getViewModelForQuestionnairePage(CrowdSourcingProject $project,
return new QuestionnairePage($questionnaire, $userResponse, $project, $languages, false);
}

private function getTranslationForQuestionnaire(Questionnaire $questionnaire, string $getLocale): QuestionnaireFieldsTranslation {
$language = $this->languageManager->getLanguageByCode($getLocale);
$translation = $this->questionnaireTranslationRepository->where(['questionnaire_id' => $questionnaire->id, 'language_id' => $language->id]);
private function getTranslationForQuestionnaire(Questionnaire $questionnaire, string $language_code): QuestionnaireFieldsTranslation {
$language = $this->languageManager->getLanguageByCode($language_code);
$translation = null;
if ($language) {
$translation = $this->questionnaireTranslationRepository->where(['questionnaire_id' => $questionnaire->id, 'language_id' => $language->id]);
}

return $translation ?: $this->questionnaireTranslationRepository->where(['questionnaire_id' => $questionnaire->id, 'language_id' => $questionnaire->default_language_id]);
}
Expand Down
54 changes: 10 additions & 44 deletions app/BusinessLogicLayer/User/UserDashboardManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,52 +21,20 @@
use Illuminate\Support\Collection;

class UserDashboardManager {
protected QuestionnaireRepository $questionnaireRepository;
protected PlatformWideGamificationBadgesProvider $platformWideGamificationBadgesProvider;
protected QuestionnaireGoalManager $crowdSourcingProjectGoalManager;
protected QuestionnaireBadgeProvider $questionnaireBadgeProvider;
protected QuestionnaireResponseRepository $questionnaireResponseRepository;
protected QuestionnaireAccessManager $questionnaireAccessManager;
protected CrowdSourcingProjectManager $crowdSourcingProjectManager;
protected LanguageRepository $languageRepository;
protected CrowdSourcingProjectRepository $crowdSourcingProjectRepository;

public function __construct(QuestionnaireRepository $questionnaireRepository,
PlatformWideGamificationBadgesProvider $platformWideGamificationBadgesProvider,
QuestionnaireGoalManager $crowdSourcingProjectGoalManager,
QuestionnaireBadgeProvider $questionnaireBadgeProvider,
QuestionnaireResponseRepository $questionnaireResponseRepository,
QuestionnaireAccessManager $questionnaireAccessManager,
CrowdSourcingProjectManager $crowdSourcingProjectManager,
LanguageRepository $languageRepository,
CrowdSourcingProjectRepository $crowdSourcingProjectRepository) {
$this->questionnaireRepository = $questionnaireRepository;
$this->platformWideGamificationBadgesProvider = $platformWideGamificationBadgesProvider;
$this->crowdSourcingProjectGoalManager = $crowdSourcingProjectGoalManager;
$this->questionnaireBadgeProvider = $questionnaireBadgeProvider;
$this->questionnaireResponseRepository = $questionnaireResponseRepository;
$this->questionnaireAccessManager = $questionnaireAccessManager;
$this->crowdSourcingProjectManager = $crowdSourcingProjectManager;
$this->languageRepository = $languageRepository;
$this->crowdSourcingProjectRepository = $crowdSourcingProjectRepository;
}
public function __construct(protected QuestionnaireRepository $questionnaireRepository, protected PlatformWideGamificationBadgesProvider $platformWideGamificationBadgesProvider, protected QuestionnaireGoalManager $crowdSourcingProjectGoalManager, protected QuestionnaireBadgeProvider $questionnaireBadgeProvider, protected QuestionnaireResponseRepository $questionnaireResponseRepository, protected QuestionnaireAccessManager $questionnaireAccessManager, protected CrowdSourcingProjectManager $crowdSourcingProjectManager, protected LanguageRepository $languageRepository, protected CrowdSourcingProjectRepository $crowdSourcingProjectRepository) {}

private function questionnaireShouldBeDisplayedInTheDashboard($questionnaire, $userResponses): bool {
private function questionnaireShouldBeDisplayedInTheDashboard($questionnaire, Collection $userResponses): bool {
// If the questionnaire is a feedback questionnaire, then we should check
// if the user has already answered the main project questionnaire, and has not yet answered the feedback questionnaire.
if ($questionnaire->type_id == QuestionnaireTypeLkp::FEEDBACK_QUESTIONNAIRE) {
// These are supposed to be answered IF and only IF the main project questionnaire is answered
// So we only display them the feedback questionnaire to the dashboard
// IF:
//a) they are not answered already
$responseForThisFeedbackQuestionnaireDoesNotExist = $userResponses->first(function ($u) use ($questionnaire) {
return $u->questionnaire_id == $questionnaire->id;
}) == null;
$responseForThisFeedbackQuestionnaireDoesNotExist = $userResponses->first(fn ($u): bool => $u->questionnaire_id == $questionnaire->id) == null;
//b) and user has responded to the main project questionnaire
$responseForMainProjectQuestionnaireExists = $userResponses->first(function ($u) use ($questionnaire) {
return $u->questionnaire->type_id == QuestionnaireTypeLkp::MAIN_QUESTIONNAIRE &&
$questionnaire->projects->firstWhere('id', $u->project_id) != null;
}) != null;
$responseForMainProjectQuestionnaireExists = $userResponses->first(fn ($u): bool => $u->questionnaire->type_id == QuestionnaireTypeLkp::MAIN_QUESTIONNAIRE &&
$questionnaire->projects->firstWhere('id', $u->project_id) != null) != null;

return
$responseForThisFeedbackQuestionnaireDoesNotExist &&
Expand All @@ -79,7 +47,7 @@ private function questionnaireShouldBeDisplayedInTheDashboard($questionnaire, $u
/**
* @return Collection<CrowdSourcingProject>
*/
private function evaluateProjectsThatUserCanContributeTo(Questionnaire $q, $userResponses): Collection {
private function evaluateProjectsThatUserCanContributeTo(Questionnaire $q, Collection $userResponses): Collection {
//If user has already responded to this questionnaire, then any other actions,
// like
// a) responding to the feedback questionnaire or
Expand All @@ -94,15 +62,13 @@ private function evaluateProjectsThatUserCanContributeTo(Questionnaire $q, $user
// b) should provide feedback by navigating to /gr/air-quality-athens.

// So what we need to do, is to find if there is response for a Main project already.
$mainResponse = $userResponses->first(function ($u) use ($q) {
return $u->questionnaire->type_id == 1 &&
$q->projects->firstWhere('id', $u->project_id) != null;
});
$mainResponse = $userResponses->first(fn ($u): bool => $u->questionnaire->type_id == 1 &&
$q->projects->firstWhere('id', $u->project_id) != null);
if ($mainResponse) {
return collect([$q->projects->firstWhere('id', $mainResponse->project_id)]);
} else {
return $q->projects;
}

return $q->projects;
}

public function getUserDashboardViewModel(User $user): UserDashboardViewModel {
Expand Down
120 changes: 52 additions & 68 deletions app/BusinessLogicLayer/User/UserManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,50 +22,35 @@
use Symfony\Component\HttpKernel\Exception\HttpException;

class UserManager {
private UserRepository $userRepository;
private UserRoleRepository $userRoleRepository;
private MailChimpAdaptor $mailChimpManager;
private QuestionnaireResponseRepository $questionnaireResponseRepository;
private QuestionnaireAnswerVoteRepository $questionnaireAnswerVoteRepository;
public static int $USERS_PER_PAGE = 10;
public static string $USER_COOKIE_KEY = 'crowdsourcing_anonymous_user_id';

public function __construct(UserRepository $userRepository,
UserRoleRepository $userRoleRepository,
MailChimpAdaptor $mailChimpManager,
QuestionnaireResponseRepository $questionnaireResponseRepository,
QuestionnaireAnswerVoteRepository $questionnaireAnswerVoteRepository) {
$this->userRepository = $userRepository;
$this->userRoleRepository = $userRoleRepository;
$this->mailChimpManager = $mailChimpManager;
$this->questionnaireResponseRepository = $questionnaireResponseRepository;
$this->questionnaireAnswerVoteRepository = $questionnaireAnswerVoteRepository;
}
public function __construct(private readonly UserRepository $userRepository, private readonly UserRoleRepository $userRoleRepository, private readonly MailChimpAdaptor $mailChimpManager, private readonly QuestionnaireResponseRepository $questionnaireResponseRepository, private readonly QuestionnaireAnswerVoteRepository $questionnaireAnswerVoteRepository) {}

public function getUserProfile($user) {
public function getUserProfile($user): UserProfile {
return new UserProfile($user);
}

public function getUser($userId) {
return $this->userRepository->find($userId);
}

public function getManagePlatformUsersViewModel($paginationNumber, $filters = null) {
$users = $this->userRepository->getPlatformUsers($paginationNumber, $filters, true);
public function getManagePlatformUsersViewModel($paginationNumber, $filters = null): ManageUsers {
$users = $this->userRepository->getPlatformUsers($paginationNumber, $filters);
$allRoles = $this->userRoleRepository->getAllPlatformSpecificRoles();

return new ManageUsers($users, $allRoles);
}

public function getEditUserViewModel($id) {
public function getEditUserViewModel($id): EditUser {
$user = $this->userRepository->getUser($id);
$userRoleIds = $user->roles->pluck('id');
$allRoles = $this->userRoleRepository->getAllPlatformSpecificRoles();

return new EditUser($user, $userRoleIds, $allRoles);
}

public function updateUserRoles($userId, $roleSelect) {
public function updateUserRoles($userId, array $roleSelect): void {
$this->userRepository->updateUserRoles($userId, $roleSelect);
}

Expand All @@ -76,20 +61,20 @@ public function deactivateUser($id): void {
$this->userRepository->softDeleteUser($user);
}

public function anonymizeAndDeleteUser($user): void {
public function anonymizeAndDeleteUser(User $user): void {
$this->questionnaireAnswerVoteRepository->deleteAnswerVotesByUser($user->id);
$this->questionnaireResponseRepository->deleteResponsesByUser($user->id);
$this->userRepository->anonymizeAndDeleteUser($user);
}

public function reactivateUser($id) {
public function reactivateUser($id): void {
$user = $this->userRepository->getUserWithTrashed($id);
$this->questionnaireAnswerVoteRepository->restoreAnswerVotesByUser($user->id);
$this->questionnaireResponseRepository->restoreResponsesByUser($user->id);
$this->userRepository->reActivateUser($user);
}

public function getOrAddUserToPlatform($email, $nickname, $avatar, $password, $roleselect, $gender, $country, $year_of_birth): ActionResponse {
public function getOrAddUserToPlatform($email, $nickname, $avatar, $password, array $roleselect, $gender, $country, $year_of_birth): ActionResponse {
$user = $this->userRepository->getUserByEmail($email);
// Check if email exists in db
if ($user) {
Expand All @@ -98,35 +83,36 @@ public function getOrAddUserToPlatform($email, $nickname, $avatar, $password, $r

$user->nickname = $nickname;
$user->avatar = $avatar;
$user->password != null ? bcrypt($password) : null;
if ($user->password != null) {
bcrypt($password);
}
$user->gender = $gender;
$user->country = $country;
$user->year_of_birth = $year_of_birth;

$user->save();

return new ActionResponse(UserActionResponses::USER_UPDATED, $user);
} else {
// If user email does not exist in db, notify for registration.
$user = User::create([
'nickname' => $nickname,
'email' => $email,
'avatar' => $avatar,
'password' => $password != null ? bcrypt($password) : null,
'gender' => $gender,
'country' => $country,
'year_of_birth' => $year_of_birth,
]);
$user->save();
try {
$user->notify(new UserRegistered);
} catch (\Exception $e) {
Log::error($e);
}
$this->userRepository->updateUserRoles($user->id, $roleselect);

return new ActionResponse(UserActionResponses::USER_CREATED, $user);
}
// If user email does not exist in db, notify for registration.
$user = User::create([
'nickname' => $nickname,
'email' => $email,
'avatar' => $avatar,
'password' => $password != null ? bcrypt($password) : null,
'gender' => $gender,
'country' => $country,
'year_of_birth' => $year_of_birth,
]);
$user->save();
try {
$user->notify(new UserRegistered);
} catch (\Exception $e) {
Log::error($e);
}
$this->userRepository->updateUserRoles($user->id, $roleselect);

return new ActionResponse(UserActionResponses::USER_CREATED, $user);
}

/**
Expand Down Expand Up @@ -205,9 +191,8 @@ public function handleSocialLoginUser($socialUser) {
auth()->login($user);

return $user;
} else {
throw new \Exception($result->status);
}
throw new \Exception($result->status);
}

public function createUser(array $input_data) {
Expand All @@ -220,26 +205,25 @@ public function createUser(array $input_data) {
'year-of-birth' => $input_data['year-of-birth'],
];
$user_id = intval(CookieManager::getCookie(UserManager::$USER_COOKIE_KEY));
if (!$user_id) {
if ($user_id === 0) {
return $this->userRepository->create($user_data);
} else {
try {
$existingUser = $this->userRepository->find($user_id);
$this->userRepository->update([
'email' => $user_data['email'],
'nickname' => $user_data['nickname'],
'password' => Hash::make($input_data['password']),
'gender' => $user_data['gender'],
'country' => $user_data['country'],
'year_of_birth' => $user_data['year-of-birth'],
], $existingUser->id);

return $this->userRepository->find($existingUser->id);
} catch (ModelNotFoundException $e) {
CookieManager::deleteCookie(UserManager::$USER_COOKIE_KEY);

return $this->createUser($user_data);
}
}
try {
$existingUser = $this->userRepository->find($user_id);
$this->userRepository->update([
'email' => $user_data['email'],
'nickname' => $user_data['nickname'],
'password' => Hash::make($input_data['password']),
'gender' => $user_data['gender'],
'country' => $user_data['country'],
'year_of_birth' => $user_data['year-of-birth'],
], $existingUser->id);

return $this->userRepository->find($existingUser->id);
} catch (ModelNotFoundException) {
CookieManager::deleteCookie(UserManager::$USER_COOKIE_KEY);

return $this->createUser($user_data);
}
}

Expand All @@ -248,10 +232,10 @@ public function getLoggedInUserOrCreateAnonymousUser() {
return Auth::user();
}
$user_id = intval(CookieManager::getCookie(UserManager::$USER_COOKIE_KEY));
if ($user_id) {
if ($user_id !== 0) {
try {
return $this->userRepository->find($user_id);
} catch (ModelNotFoundException $e) {
} catch (ModelNotFoundException) {
return $this->createAnonymousUser();
}
}
Expand Down
33 changes: 10 additions & 23 deletions app/BusinessLogicLayer/User/UserQuestionnaireShareManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,32 +11,19 @@
use Illuminate\Support\Facades\Auth;

class UserQuestionnaireShareManager {
protected $questionnaireShareRepository;
protected $questionnaireRepository;
protected $questionnaireActionHandler;
protected $userRepository;
protected $webSessionManager;

public function __construct(UserQuestionnaireShareRepository $questionnaireShareRepository,
QuestionnaireRepository $questionnaireRepository,
QuestionnaireActionHandler $questionnaireActionHandler,
UserRepository $userRepository,
WebSessionManager $webSessionManager,
LanguageManager $languageManager
) {
$this->questionnaireShareRepository = $questionnaireShareRepository;
$this->questionnaireRepository = $questionnaireRepository;
$this->questionnaireActionHandler = $questionnaireActionHandler;
$this->userRepository = $userRepository;
$this->webSessionManager = $webSessionManager;
$this->languageManager = $languageManager;
}
public function __construct(protected UserQuestionnaireShareRepository $questionnaireShareRepository,
protected QuestionnaireRepository $questionnaireRepository,
protected QuestionnaireActionHandler $questionnaireActionHandler,
protected UserRepository $userRepository,
protected WebSessionManager $webSessionManager,
protected LanguageManager $languageManager
) {}

public function createQuestionnaireShare(int $userId, $questionnaireId) {
return $this->questionnaireShareRepository->create(['user_id' => $userId, 'questionnaire_id' => $questionnaireId]);
}

public function handleQuestionnaireShare(array $parameters, int $referrerId) {
public function handleQuestionnaireShare(array $parameters, int $referrerId): void {
$questionnaireId = $parameters['questionnaireId'];
if ($this->shouldCountQuestionnaireShare($questionnaireId, $referrerId)) {
$this->webSessionManager->setReferrerId($referrerId);
Expand All @@ -52,13 +39,13 @@ public function handleQuestionnaireShare(array $parameters, int $referrerId) {
}
}

protected function shouldCountQuestionnaireShare(int $questionnaireId, int $referrerId) {
protected function shouldCountQuestionnaireShare(int $questionnaireId, int $referrerId): bool {
return $this->questionnaireRepository->exists(['id' => $questionnaireId])
&& $this->userRepository->exists(['id' => $referrerId])
&& $this->userNotLoggedInOrDifferentThanReferrer($referrerId);
}

protected function userNotLoggedInOrDifferentThanReferrer(int $referrerId) {
protected function userNotLoggedInOrDifferentThanReferrer(int $referrerId): bool {
if (!Auth::check()) {
return true;
}
Expand Down
Loading

0 comments on commit 202a319

Please sign in to comment.