Skip to content

Commit 30c79f1

Browse files
committed
Merge branch 'releases/v.0.4'
2 parents 2a04b7e + effc8a7 commit 30c79f1

File tree

7 files changed

+177
-63
lines changed

7 files changed

+177
-63
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,5 @@ Homestead.json
1818

1919
# Rocketeer PHP task runner and deployment package. https://github.com/rocketeers/rocketeer
2020
.rocketeer/
21+
22+
\.vscode/

app/Course.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,21 @@
77
class Course extends Model
88
{
99
protected $fillable = [
10-
'name',
10+
'name', 'category', 'public', 'description', 'picture'
1111
];
1212

1313
protected $hidden = [];
1414

1515
// Definimos la relacion NM entre cursos / usuarios.
1616
public function users()
1717
{
18-
return $this->belongsToMany('App\User');
18+
return $this->belongsToMany('App\User')->withPivot(['confirmed', 'member_since']);;
19+
}
20+
21+
22+
23+
public function admins()
24+
{
25+
return $this->hasMany('App\Course', 'admin_id');
1926
}
2027
}

app/Course_User.php

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

app/Http/Controllers/CourseController.php

Lines changed: 152 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -8,72 +8,185 @@
88
use Illuminate\Support\Facades\DB;
99
use Illuminate\Http\Request;
1010
use Illuminate\Support\Facades\Hash;
11+
use Illuminate\Database\Eloquent\ModelNotFoundException;
1112

1213
class CourseController extends Controller{
1314

14-
function index(Request $request){
15+
function index(Request $request, $list = 'all'){
1516
$courses = [];
1617

17-
$user = User::find($request['current_user']);
18+
// Si el parametro opcional es 'all', devuelve los cursos publicos y los del usuario
1819

19-
$courses['user_courses'] = $user->courses;
2020

21-
$publicCourses = Course::where('public', 1)->get();
21+
// Si el parametro opcional es 'user', devuelve solo los cursos del usuario
22+
if( $list == 'user' || $list == 'all' ){
2223

23-
$courses['public_courses'] = $publicCourses;
24+
$user = User::find($request['current_user']);
25+
$courses['user_courses'] = $user->courses;
26+
27+
}
28+
29+
// Si el parametro opcional es 'public', devuelve solo los cursos publicos
30+
if ( $list == 'public' || $list == 'all' ){
31+
32+
$publicCourses = Course::where('public', 1)->get();
33+
$courses['public_courses'] = $publicCourses;
34+
35+
}
2436

2537
return $courses;
2638
}
2739

2840
function addCourse(Request $request){
41+
$this->validate($request, [
42+
'name' => 'required|max:255',
43+
'category' => 'required'
44+
]);
45+
46+
// Sets a default image if no one provided
47+
if( !array_key_exists('picture', $request) ){
48+
$request['picture'] = 'https://placeholdit.co//i/500x200?&bg=ecf0f1&fc=e74c3c&text=Goodle%20Course';
49+
}
50+
51+
// Sets a default description if no one provided
52+
if( !array_key_exists('description', $request ) ){
53+
$request['description'] = 'This course has no description';
54+
}
55+
2956
$course = Course::create([
30-
'name' => $request->json()->get('name')
57+
'name' => $request['name'],
58+
'admin_id' => $request['current_user'],
59+
'category' => $request['category'],
60+
'picture' => $request['picture'],
61+
'description' => $request['description']
3162
]);
3263

33-
return response()->json($course, 201);
64+
return response()->json($course, 201);
3465

3566
}
67+
68+
function updateCourse(Request $request){
69+
$this->validate($request, [
70+
'id' => 'required'
71+
]);
3672

37-
function coursesId(Request $request, $id){
38-
$courses = DB::select("select * from courses where id in (select course_id from users_courses where user_id = ". $id .");");
39-
return response()->json($courses, 200);
40-
}
4173

42-
// function course(Request $request, $id){
43-
// $course = DB::select("select * from goodle.courses where id = ". $id .";");
44-
// return response()->json($course, 200);
45-
// }
46-
47-
function course(Request $request, $id_course){
48-
$id = $request->json()->get('user_id');
49-
$user_courses = DB::select("select id from courses where id in (select course_id from users_courses where user_id = ". $id .");");
50-
$id_course = intval($id_course);
51-
$aray = [];
52-
for ($i=0; $i < count($user_courses); $i++) {
53-
$array[] = $user_courses[$i]->id;
74+
$course = Course::find($request['id']);
75+
76+
// Si el usuario no es el admin del curso le devuelve unauthorized.
77+
if ( $course['admin_id'] != $request['current_user'] ) {
78+
return response()->json(["Message" => 'You need to be the admin of this course to modify it'], 401);
5479
}
55-
if (in_array($id_course, $array)) {
56-
$course = DB::select("select * from courses where id = ". $id_course .";");
57-
return response()->json($course, 200);
58-
}else {
59-
return response()->json(["error" => "This user is not registered in the required course"], 400);
80+
81+
$course['update'] = ["updated_at" => "2011-01-01 01:01:01"];
82+
83+
// Actualiza en el curso todos los campos definidos en el JSON de la request
84+
$course->update($request['update']);
85+
86+
return response()->json(["Message" => 'The course has been modified'], 201);
87+
}
88+
89+
function deleteCourse(Request $request, $id) {
90+
//TODO: Añadir restriccion: solo el admin del curso puede borrarlo.
91+
92+
$param = intval($id);
93+
94+
try {
95+
if( $param == 0 ){
96+
return response()->json(["Message" => 'A valid course_id must be provided'], 401);
97+
}
98+
99+
$course = Course::findOrFail($param);
100+
101+
//Si el usuario no es el admin devuelve unauthorized
102+
if ( $course['admin_id'] != $request['current_user'] ) {
103+
return response()->json(["Message" => 'You need to be the admin of this course to delete it'], 401);
104+
}
105+
106+
$course->delete();
107+
108+
return response()->json(["Message" => 'The course has been deleted'], 200);
109+
110+
} catch (ModelNotFoundException $e) { // Si el curso solicitado no existe devuelve una excepcion
111+
112+
return response()->json(["Message" => 'Course not found or does not exist'], 404);
60113
}
114+
115+
return response()->json(["Message" => 'Unexpected error'], 500);
61116
}
62117

118+
function inviteUsers(Request $request, $username, $courseId){
119+
120+
$courseId = intval($courseId);
121+
122+
try {
123+
if( $courseId == 0 ){
124+
return response()->json(["Message" => 'A valid course_id must be provided'], 401);
125+
}
126+
127+
// Guardamos el curso solicitado en la request
128+
$course = Course::findOrFail($courseId);
129+
130+
//Si el usuario no es el admin devuelve unauthorized
131+
if ( $course['admin_id'] != $request['current_user'] ) {
132+
return response()->json(["Message" => 'You need to be the admin of this course to invite people'], 401);
133+
}
134+
135+
/* INSERT USERS */
136+
137+
try {
138+
139+
// Comprobamos que el usuario no exista ya dentro del curso, bien sea invitado o como miembro.
140+
if ( $course->users->where('username', 'like', $username)->toArray() ){
141+
return response()->json(["Message" => "The user '".$username."' has been already invited."], 406);
142+
}
143+
144+
$request_user = User::where('username', 'like', $username)->firstOrFail();
145+
146+
$course->users()->save($request_user);
147+
148+
return response()->json(["Message" => "User invited successfully"], 200);
149+
150+
} catch (ModelNotFoundException $e) {
151+
return response()->json(["Message" => 'User not found or does not exist'], 404);
152+
}
153+
154+
/* END OF INSERT USERS */
155+
156+
} catch (ModelNotFoundException $e) { // Si el curso solicitado no existe devuelve una excepcion
157+
158+
return response()->json(["Message" => 'Course not found or does not exist'], 404);
159+
}
160+
161+
return response()->json(["Message" => 'Unexpected error'], 500);
63162

64-
function addUserToCourse(Request $request) {
65-
$user_course = UserCourse::create([
66-
'user_id' => $request->json()->get('user_id'),
67-
'course_id' => $request->json()->get('course_id')
68-
]);
69-
return response()->json($user_course, 201);
70163
}
71164

72-
function unsubscribeCourse(Request $request) {
73-
$user_id = $request->json()->get('user_id');
74-
$course_id = $request->json()->get('course_id');
75-
$delete = DB::select('delete from users_courses where user_id = ' . $user_id . ' and course_id = '. $course_id .';');
76-
return response()->json($delete, 200);
165+
function acceptInvite( Request $request, $course_id ){
166+
try {
167+
168+
$course_id = intval($course_id);
169+
$course = Course::findOrFail($course_id);
170+
171+
$user = $course->users->find($request["current_user"]);
172+
173+
// Comprueba que el usuario haya sido invitado al curso
174+
if ( !$user ) {
175+
return response()->json(["Message" => 'Sorry, you have not been invited to this course'], 404);
176+
}
177+
178+
// Actualizamos el atributo confirmed para que el usuario pase a ser miembro del curso
179+
$user->pivot["confirmed"] = 1;
180+
$user->pivot->save();
181+
182+
return response()->json(["Message" => 'Invitation accepted successfully'], 200);
183+
184+
} catch( ModelNotFoundException $e ) {
185+
return response()->json(["Message" => 'Course not found or does not exist'], 404);
186+
}
187+
188+
189+
77190
}
78191

79192
}

app/User.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,6 @@ public function courses()
3535
{
3636
return $this->belongsToMany('App\Course')->withPivot(['confirmed', 'member_since']);
3737
}
38+
39+
3840
}

database/migrations/2018_04_13_202548_create_courses_table.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ public function up()
2222
$table->string('category');
2323
$table->string('picture');
2424
$table->boolean('public')->default(0);
25+
$table->unsignedInteger('admin_id');
26+
$table->foreign('admin_id')->references('id')->on('users')->onDelete('cascade');
2527
});
2628
}
2729

routes/web.php

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
*/
1313

1414
$router->get('/', function () use ($router) {
15-
return str_random(60);
15+
return 'Goodle API v1';
1616
});
1717

1818

@@ -31,15 +31,19 @@
3131

3232
// ## Rutas de cursos ##
3333

34-
$router->get('/courses', 'CourseController@index');
34+
$router->get('/courses[/{list}]', 'CourseController@index'); // Listar todos los cursos
3535

36-
$router->post('/courses', 'CourseController@createCourse');
36+
$router->post('/courses', 'CourseController@addCourse'); // Crear un curso
3737

38-
$router->put('/courses', 'CourseController@updateCourse');
38+
$router->put('/courses', 'CourseController@updateCourse'); // Actualizar/Modificar un curso
3939

40-
$router->delete('/courses', 'CourseController@deleteCourse');
40+
$router->delete('/courses/{id}', 'CourseController@deleteCourse'); // Borrar un curso
4141

42-
$router->get('/courses/{id}/users', 'CourseController@getMembers');
42+
/* $router->get('/courses/{id}/users', 'CourseController@getMembers'); */ // Listar todos los usuarios de un curso
43+
44+
$router->post('/courses/{course_id}/invite/{username}', 'CourseController@inviteUsers'); // Invitar un unico usuario al curso.
45+
46+
$router->post('/courses/{course_id}/accept_invite/', 'CourseController@acceptInvite'); // Invitar un unico usuario al curso.
4347

4448
//Ruta para comprobar el estado de la api y si estas autenticado
4549

0 commit comments

Comments
 (0)