public function sendNotificationEmail(Group $group, User $user) { if ($user->verified == 1) { // Establish timestamp for notifications from membership data (when was an email sent for the last time?) $membership = \App\Membership::where('user_id', '=', $user->id)->where('group_id', "=", $group->id)->firstOrFail(); $last_notification = $membership->notified_at; // find unread discussions since timestamp $discussions = QueryHelper::getUnreadDiscussionsSince($user->id, $group->id, $membership->notified_at); // find new files since timestamp $files = \App\File::where('updated_at', '>', $membership->notified_at)->where('group_id', "=", $group->id)->get(); // find new members since timestamp $users = QueryHelper::getNewMembersSince($user->id, $group->id, $membership->notified_at); // find future actions until next 2 weeks, this is curently hardcoded... TODO use the mail sending interval to determine stop date $actions = \App\Action::where('start', '>', Carbon::now())->where('stop', '<', Carbon::now()->addWeek()->addWeek())->where('group_id', "=", $group->id)->orderBy('start')->get(); // we only trigger mail sending if a new action has been **created** since last notfication email. // BUT we will send actions for the next two weeks in all cases, IF a mail must be sent $actions_count = \App\Action::where('created_at', '>', $membership->notified_at)->where('group_id', "=", $group->id)->count(); // in all cases update timestamp $membership->notified_at = Carbon::now(); $membership->save(); // if we have anything, build the message and send // removed that : or count($users) > 0 // because we don't want to be notified just because there is a new member if (count($discussions) > 0 or count($files) > 0 or $actions_count > 0) { Mail::send('emails.notification', ['user' => $user, 'group' => $group, 'membership' => $membership, 'discussions' => $discussions, 'files' => $files, 'users' => $users, 'actions' => $actions, 'last_notification' => $last_notification], function ($message) use($user, $group) { $message->from(env('MAIL_NOREPLY', '*****@*****.**'), env('APP_NAME', 'Laravel'))->to($user->email)->subject('[' . env('APP_NAME') . '] ' . trans('messages.news_from_group_email_subject') . ' "' . $group->name . '"'); }); return true; } return false; } }
/** * Returns true if the user is member of $group */ public function isMemberOf(Group $group) { $membership = \App\Membership::where('user_id', '=', $this->id)->where('group_id', '=', $group->id)->first(); if ($membership && $membership->membership == \App\Membership::MEMBER) { return true; } return false; }
/** * Remove the specified user from the group. * * @param int $id * * @return Response */ public function leave(Request $request, Group $group) { // load or create membership for this group and user combination $membership = \App\Membership::where(['user_id' => $request->user()->id, 'group_id' => $group->id])->firstOrFail(); $membership->membership = \App\Membership::UNREGISTERED; $membership->save(); return redirect()->action('DashboardController@index'); }
/** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * * @return mixed */ public function handle($request, Closure $next) { // if current user is not a member of the passed in group // TODO probably could be refactored if ($this->auth->guest()) { return redirect()->back()->with('message', trans('messages.not_logged_in')); } // we expect a url in the form /groups/{group_id} if ($request->segment(1) == 'groups') { $membership = \App\Membership::where('user_id', '=', $request->user()->id)->where('group_id', $request->segment(2))->first(); if ($membership && ($membership->membership = \App\Membership::MEMBER)) { return $next($request); } else { return redirect()->back()->with('message', trans('messages.not_a_member')); } } else { return redirect()->back()->with('message', 'Are you in a group at all !? (url doesnt start with group/something). This is a bug'); } }