@@ -22,7 +22,7 @@ class GroupMemberController extends Controller
2222 * @var array
2323 */
2424 public $ doNotSanitize = [
25- //
25+ //
2626 ];
2727
2828 /**
@@ -196,4 +196,173 @@ public function destroy(GroupMember $group_member)
196196 $ group_member ->delete ();
197197 return response ([], 204 );
198198 }
199+
200+ /**
201+ * Display a listing of groups available
202+ *
203+ * @param \Illuminate\Http\Request $request
204+ * @return ApiCollection
205+ *
206+ * @OA\Get(
207+ * path="/group_members_available",
208+ * summary="Returns all groups available for a given member",
209+ * operationId="getGroupMembersAvailable",
210+ * tags={"Group Members"},
211+ * @OA\Parameter(
212+ * description="ID of group_members to return",
213+ * in="path",
214+ * name="member_id",
215+ * required=true,
216+ * @OA\Schema(
217+ * type="string",
218+ * )
219+ * ),
220+ * @OA\Parameter(
221+ * description="type of group_members to return",
222+ * in="path",
223+ * name="member_type",
224+ * required=true,
225+ * @OA\Schema(
226+ * type="string",
227+ * )
228+ * ),
229+ * @OA\Parameter(ref="#/components/parameters/filter"),
230+ * @OA\Parameter(ref="#/components/parameters/order_by"),
231+ * @OA\Parameter(ref="#/components/parameters/order_direction"),
232+ * @OA\Parameter(ref="#/components/parameters/per_page"),
233+ *
234+ * @OA\Response(
235+ * response=200,
236+ * description="list of groups available to be assigned as member",
237+ * @OA\JsonContent(
238+ * type="object",
239+ * @OA\Property(
240+ * property="data",
241+ * type="array",
242+ * @OA\Items(ref="#/components/schemas/group_members"),
243+ * ),
244+ * @OA\Property(
245+ * property="meta",
246+ * type="object",
247+ * allOf={@OA\Schema(ref="#/components/schemas/metadata")},
248+ * ),
249+ * ),
250+ * ),
251+ * )
252+ */
253+ public function groupsAvailable (Request $ request )
254+ {
255+ $ member_id = $ request ->input ('member_id ' , null );
256+ $ member_type = $ request ->input ('member_type ' , null );
257+
258+ $ members = [];
259+ if ($ member_id && $ member_type ) {
260+ //Load groups already assigned.
261+ $ data = GroupMember::where ('member_type ' , $ member_type )
262+ ->where ('member_id ' , $ member_id )
263+ ->get ();
264+ foreach ($ data as $ item ) {
265+ array_push ($ members , $ item ->group_id );
266+ }
267+ }
268+
269+ $ query = Group::where ('status ' , 'ACTIVE ' )
270+ ->whereNotIn ('id ' , $ members );
271+
272+ $ filter = $ request ->input ('filter ' , '' );
273+ if (!empty ($ filter )) {
274+ //filter by name group
275+ $ filter = '% ' . $ filter . '% ' ;
276+ $ query ->where (function ($ query ) use ($ filter ) {
277+ $ query ->Where ('name ' , 'like ' , $ filter );
278+ });
279+ }
280+ $ response =
281+ $ query ->orderBy (
282+ $ request ->input ('order_by ' , 'name ' ),
283+ $ request ->input ('order_direction ' , 'ASC ' )
284+ )->paginate ($ request ->input ('per_page ' , 10 ));
285+
286+ return new ApiCollection ($ response );
287+ }
288+
289+ /**
290+ * Display a listing of users available
291+ *
292+ * @param \Illuminate\Http\Request $request
293+ * @return ApiCollection
294+ *
295+ * @OA\Get(
296+ * path="/user_members_available",
297+ * summary="Returns all users available for a given member",
298+ * operationId="getUserMembersAvailable",
299+ * tags={"Group Members"},
300+ * @OA\Parameter(
301+ * description="ID of group to return",
302+ * in="path",
303+ * name="group_id",
304+ * required=true,
305+ * @OA\Schema(
306+ * type="string",
307+ * )
308+ * ),
309+ * @OA\Parameter(ref="#/components/parameters/filter"),
310+ * @OA\Parameter(ref="#/components/parameters/order_by"),
311+ * @OA\Parameter(ref="#/components/parameters/order_direction"),
312+ * @OA\Parameter(ref="#/components/parameters/per_page"),
313+ *
314+ * @OA\Response(
315+ * response=200,
316+ * description="list of users available to be assigned as member",
317+ * @OA\JsonContent(
318+ * type="object",
319+ * @OA\Property(
320+ * property="data",
321+ * type="array",
322+ * @OA\Items(ref="#/components/schemas/group_members"),
323+ * ),
324+ * @OA\Property(
325+ * property="meta",
326+ * type="object",
327+ * allOf={@OA\Schema(ref="#/components/schemas/metadata")},
328+ * ),
329+ * ),
330+ * ),
331+ * )
332+ */
333+ public function usersAvailable (Request $ request )
334+ {
335+ $ groupId = $ request ->input ('group_id ' , null );
336+
337+ $ members = [];
338+ if ($ groupId ) {
339+ //Load user members already assigned.
340+ $ data = GroupMember::where ('member_type ' , User::class)
341+ ->where ('group_id ' , $ groupId )
342+ ->get ();
343+ foreach ($ data as $ item ) {
344+ array_push ($ members , $ item ->member_id );
345+ }
346+ }
347+
348+ $ query = User::where ('status ' , 'ACTIVE ' )
349+ ->whereNotIn ('id ' , $ members );
350+
351+ $ filter = $ request ->input ('filter ' , '' );
352+ if (!empty ($ filter )) {
353+ //filter by name group
354+ $ filter = '% ' . $ filter . '% ' ;
355+ $ query ->where (function ($ query ) use ($ filter ) {
356+ $ query ->Where ('firstname ' , 'like ' , $ filter )
357+ ->orWhere ('lastname ' , 'like ' , $ filter );
358+ });
359+ }
360+ $ response =
361+ $ query ->orderBy (
362+ $ request ->input ('order_by ' , 'firstname ' ),
363+ $ request ->input ('order_direction ' , 'ASC ' )
364+ )->paginate ($ request ->input ('per_page ' , 10 ));
365+
366+ return new ApiCollection ($ response );
367+ }
199368}
0 commit comments