From 65961b3e591ac9f8d4088d7cea26ebdc7fc6a314 Mon Sep 17 00:00:00 2001
From: Farhan <mfarhan0304@gmail.com>
Date: Thu, 21 Feb 2019 18:37:13 +0700
Subject: [PATCH] finish groups API

---
 app/Group.php                                 |  14 ++-
 app/{GroupDetails.php => GroupMember.php}     |  23 +++-
 app/Http/Controllers/GroupController.php      | 110 ++++++++++++++++
 .../Controllers/GroupMemberController.php     | 117 ++++++++++++++++++
 .../2019_02_19_140044_create_groups_table.php |   2 +-
 ...2_19_140125_create_groups_member_table.php |   4 +-
 routes/api.php                                |   2 -
 7 files changed, 262 insertions(+), 10 deletions(-)
 rename app/{GroupDetails.php => GroupMember.php} (71%)
 create mode 100644 app/Http/Controllers/GroupController.php
 create mode 100644 app/Http/Controllers/GroupMemberController.php

diff --git a/app/Group.php b/app/Group.php
index 6a61248..90a9807 100644
--- a/app/Group.php
+++ b/app/Group.php
@@ -4,7 +4,17 @@ namespace App;
 
 use Illuminate\Database\Eloquent\Model;
 
+/**
+ * @property int $id
+ * @property string $group_name
+ * @property string $description
+ * @property string $created_at
+ * @property string $updated_at
+ */
 class Group extends Model
 {
-    //
-}
+    protected $table = 'groups';
+    protected $primaryKey = 'id';
+    protected $fillable = ['group_name', 'description', 'created_at', 'updated_at'];
+    public $timestamps = true;
+}
\ No newline at end of file
diff --git a/app/GroupDetails.php b/app/GroupMember.php
similarity index 71%
rename from app/GroupDetails.php
rename to app/GroupMember.php
index 828d8e5..c1b27c6 100644
--- a/app/GroupDetails.php
+++ b/app/GroupMember.php
@@ -4,13 +4,22 @@ namespace App;
 
 use Illuminate\Database\Eloquent\Model;
 
-class GroupGameScore extends Model
+/**
+ * @property int $group_id
+ * @property int $user_id
+ * @property string $role
+ * @property int $score
+ * @property string $created_at
+ * @property string $updated_at
+ * @property Group $group
+ * @property User $user
+ */
+class GroupMember extends Model
 {
-    //
     protected $table = 'group_details';
     public $incrementing = false;
     protected $primaryKey = ['group_id', 'user_id'];
-        /**
+    /**
      * Set the keys for a save update query.
      *
      * @param  \Illuminate\Database\Eloquent\Builder  $query
@@ -48,4 +57,12 @@ class GroupGameScore extends Model
 
         return $this->getAttribute($keyName);
     }
+
+    public function group() {
+        return $this->belongsTo('App\Group', 'group_id', 'group_id');
+    }
+
+    public function user() {
+        return $this->belongsTo('App\User', 'user_id', 'id');
+    }
 }
diff --git a/app/Http/Controllers/GroupController.php b/app/Http/Controllers/GroupController.php
new file mode 100644
index 0000000..e032b47
--- /dev/null
+++ b/app/Http/Controllers/GroupController.php
@@ -0,0 +1,110 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+use App\Group;
+
+class GroupController extends Controller
+{
+    public function store(Request $request) {
+        $validator = $this->validate($request);
+
+        if ($validator->fails()) {
+            return response(json_encode([
+                'statusMessage' => 'Bad Request'
+            ]), 400);
+        } else {
+            $input = $request->all();
+            $isGroupExist = Group::find($input['group_id']);
+
+            if (is_null($isGroupExist)) {
+                $group = Group::create([
+                    'group_id' => $input['group_id'],
+                    'group_name' => $input['group_name'],
+                    'description' => $input['description']
+                ]);
+                $group->save();
+                
+                return response(json_encode([
+                    'statusMessage' => 'Success',
+                    'data' => $group->toArray()
+                ]), 200);
+            } else {
+                return response(json_encode([
+                    'statusMessage' => 'Bad Request'
+                ]), 400);
+            }
+        }
+    }
+
+    public function show(Request $request, $groupId) {
+        $isGroupExist = Group::find($groupId);
+
+        if (is_null($isGroupExist)) {
+            return response(json_encode([
+                'statusMessage' => 'Not Found'
+            ]), 404);
+        } else {
+            $group = $isGroupExist->toArray();
+
+            return response(json_encode([
+                'statusMessage' => 'Success',
+                'data' => $group
+            ]), 200);
+        }
+    }
+
+    public function update(Request $request) {
+        $validator = $this->validate($request);
+
+        if ($validator->fails()) {
+            return response(json_encode([
+                'statusMessage' => 'Bad Request'
+            ]), 400);
+        } else {
+            $input = $request->all();
+            $isGroupExist = Group::find($input['group_id']);
+
+            if (is_null($isGroupExist)) {
+                return response(json_encode([
+                    'statusMessage' => 'Bad Request'
+                ]), 400);
+            } else {
+                $group = Group::create([
+                    'group_name' => $input['group_name'],
+                    'description' => $input['description']
+                ]);
+                $group->save();
+    
+                return response(json_encode([
+                    'statusMessage' => 'Success',
+                    'data' => $group->toArray()
+                ]), 200);
+            }
+        }
+    }
+
+    public function destroy($groupId) {
+        $group = Group::find($groupId);
+
+        if (is_null($group)) {
+            return response(json_encode([
+                'statusMessage' => 'Bad Request'
+            ]), 400);
+        } else {
+            $group->delete;
+
+            return response(json_encode([
+                'statusMessage' => 'Success'
+            ]), 200);
+        }
+    }
+
+    private function validate(Request $request) {
+        $input = $request->all();
+        return Validator::make($input, [
+            'group_name' => 'required'
+        ]);
+    }
+}
\ No newline at end of file
diff --git a/app/Http/Controllers/GroupMemberController.php b/app/Http/Controllers/GroupMemberController.php
new file mode 100644
index 0000000..88e5ae7
--- /dev/null
+++ b/app/Http/Controllers/GroupMemberController.php
@@ -0,0 +1,117 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+use App\Group;
+use App\GroupMember;
+use Validator;
+
+class GroupMemberController extends Controller
+{
+    public function store(Request $request) {
+        $validator = $this->validate($request);
+
+        if ($validator->fails()) {
+            return response(json_encode([
+                'statusMessage' => 'Bad Request'
+            ]), 400);
+        } else {
+            $input = $request->all();
+            $isGroupMemberExist = GroupMember::find($input['group_id'])::find($input['user_id']);
+            $groupMember = GroupMember::create([
+                'group_id' => $input['group_id'],
+                'user_id' => $input['user_id'],
+                'role' => $input['role'],
+                'high_score' => $input['high_score']
+            ]);
+
+            $group = Group::find($groupId);
+
+            if (is_null($group)) {
+                return response(json_encode([
+                    'statusMessage' => 'Bad Request'
+                ]), 400);
+            } else {
+                $groupMember->save();
+
+                return response(json_encode([
+                    'statusMessage' => ['Success'],
+                    'data' => $groupMember->toArray()
+                ]), 200);
+            }
+        }
+    }
+
+    public function show(Request $request, $groupId) {
+        $isGroupMemberExist = GroupMember::find($groupId);
+
+        if (is_null($groupMember)) {
+            return response(json_decode([
+                'statusMessage' => 'Not Found'
+            ]), 404);
+        } else {
+            $member = $group->toArray();
+
+            return response(json_encode([
+                'statusMessage' => 'Success',
+                'data' => $member
+            ]), 200);
+        }
+    }
+
+    public function update(Request $request, $groupId, $userId) {
+        $validator = $this->validate($request);
+
+        if ($validator->fails()) {
+            return response(json_encode([
+                'statusMessage' => 'Bad Request'
+            ]), 400);
+        } else {
+            $input = $request->all();
+            $groupMember = GroupMember::create([
+                'role' => $input['role'],
+                'high_score' => $input['high_score']
+            ]);
+
+            $member = GroupMember::find($groupId)->find($userId);
+            if ($member) {
+                $member->fill($groupMember);
+                $member->save();
+
+                return response(json_encode([
+                    'statusMessage' => 'Success',
+                    'data' => $member->toArray()
+                ]), 200);
+            } else {
+                return response(json_encode([
+                    'statusMessage' => 'Not Found'
+                ]), 404);
+            }
+        }
+    }
+
+    public function destroy($groupId, $userId) {        
+        $groupMember = GroupMember::find($groupId);
+
+        if (is_null($groupDetails)) {
+            return response(json_encode([
+                'statusMessage' => 'Bad Request'
+            ]), 400);
+        } else {
+            $groupMember->delete();
+
+            return response(json_encode([
+                'statusMessage' => 'Success'
+            ]), 200);
+        }
+    }
+
+    private function validate(Request $request) {
+        $input = $request->all();
+        return Validator::make($input, [
+            'role' => 'required',
+            'high_score' => 'required'
+        ]);
+    }
+}
\ No newline at end of file
diff --git a/database/migrations/2019_02_19_140044_create_groups_table.php b/database/migrations/2019_02_19_140044_create_groups_table.php
index 1e158d6..461058b 100644
--- a/database/migrations/2019_02_19_140044_create_groups_table.php
+++ b/database/migrations/2019_02_19_140044_create_groups_table.php
@@ -16,7 +16,7 @@ class CreateGroupsTable extends Migration
         Schema::create('groups', function (Blueprint $table) {
             $table->increments('id');
             $table->string('group_name');
-            $table->string('description');            
+            $table->string('description')->default("");            
             $table->timestamps();
         });
     }
diff --git a/database/migrations/2019_02_19_140125_create_groups_member_table.php b/database/migrations/2019_02_19_140125_create_groups_member_table.php
index e722f1e..5b017f8 100644
--- a/database/migrations/2019_02_19_140125_create_groups_member_table.php
+++ b/database/migrations/2019_02_19_140125_create_groups_member_table.php
@@ -13,7 +13,7 @@ class CreateGroupsDetailsTable extends Migration
      */
     public function up()
     {
-        Schema::create('group_details', function (Blueprint $table) {
+        Schema::create('group_member', function (Blueprint $table) {
             $table->unsignedInteger('group_id');
             $table->foreign('group_id')->references('id')->on('groups');
             $table->unsignedInteger('user_id');
@@ -32,6 +32,6 @@ class CreateGroupsDetailsTable extends Migration
      */
     public function down()
     {
-        Schema::dropIfExists('group_details');
+        Schema::dropIfExists('group_member');
     }
 }
diff --git a/routes/api.php b/routes/api.php
index 5cc149c..aecf8de 100644
--- a/routes/api.php
+++ b/routes/api.php
@@ -22,8 +22,6 @@ Route::post('/login', 'UserController@generateToken');
 Route::post('/logout', 'UserController@logOut')->middleware('auth:api');
 
 
-
-
 //Task
 Route::post('/tasks', 'TaskController@store')->middleware('auth:api');
 Route::get('/tasks/{taskId}', 'TaskController@show')->middleware('auth:api');
-- 
GitLab