Auth   A
last analyzed

Complexity

Total Complexity 39

Size/Duplication

Total Lines 385
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 39
eloc 181
c 0
b 0
f 0
dl 0
loc 385
rs 9.28

10 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 2 1
A store_edit_course_category() 0 15 2
A updateCourseCategory() 0 23 2
B move_category() 0 43 10
B move_course() 0 61 10
A delete_course_category() 0 24 2
A getCoursesInCategory() 0 32 2
A store_course_category() 0 40 3
A getUserCourseCategory() 0 13 1
B remove_user_from_course() 0 42 6
1
<?php
2
3
/* For licensing terms, see /license.txt */
4
5
/**
6
 * Class Auth
7
 * Auth can be used to instantiate objects or as a library to manage courses
8
 * This file contains a class used like library provides functions for auth tool.
9
 * It's also used like model to courses_controller (MVC pattern).
10
 *
11
 * @author Christian Fasanando <[email protected]>
12
 */
13
class Auth
14
{
15
    /**
16
     * Constructor.
17
     */
18
    public function __construct()
19
    {
20
    }
21
22
    /**
23
     * This function get all the courses in the particular user category.
24
     *
25
     * @param bool $hidePrivate
26
     *
27
     * @return array
28
     */
29
    public function getCoursesInCategory($hidePrivate = true)
30
    {
31
        $user_id = api_get_user_id();
32
33
        $TABLECOURS = Database::get_main_table(TABLE_MAIN_COURSE);
34
        $TABLECOURSUSER = Database::get_main_table(TABLE_MAIN_COURSE_USER);
35
        $avoidCoursesCondition = CoursesAndSessionsCatalog::getAvoidCourseCondition();
36
        $showCoursesCondition = CoursesAndSessionsCatalog::getCoursesToShowInCatalogueCondition();
37
        $visibilityCondition = CourseManager::getCourseVisibilitySQLCondition('course', true, $hidePrivate);
38
39
        $sql = "SELECT
40
                    course.id as real_id,
41
                    course.code, course.visual_code, course.subscribe subscr, course.unsubscribe unsubscr,
42
                    course.title title, course.tutor_name tutor, course.directory, course_rel_user.status status,
43
                    course_rel_user.sort sort, course_rel_user.user_course_cat user_course_cat
44
                FROM $TABLECOURS course,
45
                $TABLECOURSUSER  course_rel_user
46
                WHERE
47
                    course.id = course_rel_user.c_id AND
48
                    course_rel_user.user_id = '".$user_id."' AND
49
                    course_rel_user.relation_type <> ".COURSE_RELATION_TYPE_RRHH."
50
                    $avoidCoursesCondition
51
                    $showCoursesCondition
52
                    $visibilityCondition
53
                ORDER BY course_rel_user.user_course_cat, course_rel_user.sort ASC";
54
        $result = Database::query($sql);
55
        $data = [];
56
        while ($course = Database::fetch_array($result)) {
57
            $data[$course['user_course_cat']][] = $course;
58
        }
59
60
        return $data;
61
    }
62
63
    /**
64
     * stores  the changes in a course category
65
     * (moving a course to a different course category).
66
     *
67
     * @param int $courseId
68
     * @param int       Category id
69
     *
70
     * @return bool True if it success
71
     */
72
    public function updateCourseCategory($courseId, $newcategory)
73
    {
74
        $courseId = (int) $courseId;
75
        $newcategory = (int) $newcategory;
76
        $current_user = api_get_user_id();
77
78
        $table = Database::get_main_table(TABLE_MAIN_COURSE_USER);
79
        $max_sort_value = api_max_sort_value($newcategory, $current_user);
80
        $sql = "UPDATE $table SET
81
                    user_course_cat='".$newcategory."',
82
                    sort='".($max_sort_value + 1)."'
83
                WHERE
84
                    c_id ='".$courseId."' AND
85
                    user_id='".$current_user."' AND
86
                    relation_type<>".COURSE_RELATION_TYPE_RRHH;
87
        $resultQuery = Database::query($sql);
88
89
        $result = false;
90
        if (Database::affected_rows($resultQuery)) {
91
            $result = true;
92
        }
93
94
        return $result;
95
    }
96
97
    /**
98
     * moves the course one place up or down.
99
     *
100
     * @param string    Direction (up/down)
101
     * @param string    Course code
102
     * @param int       Category id
103
     *
104
     * @return bool True if it success
105
     */
106
    public function move_course($direction, $course2move, $category)
107
    {
108
        $table = Database::get_main_table(TABLE_MAIN_COURSE_USER);
109
110
        $current_user_id = api_get_user_id();
111
        $all_user_courses = CourseManager::getCoursesByUserCourseCategory($current_user_id);
112
113
        // we need only the courses of the category we are moving in
114
        $user_courses = [];
115
        foreach ($all_user_courses as $key => $course) {
116
            if ($course['user_course_category'] == $category) {
117
                $user_courses[] = $course;
118
            }
119
        }
120
121
        $target_course = [];
122
        foreach ($user_courses as $count => $course) {
123
            if ($course2move == $course['code']) {
124
                // source_course is the course where we clicked the up or down icon
125
                $source_course = $course;
126
                // target_course is the course before/after the source_course (depending on the up/down icon)
127
                if ('up' == $direction) {
128
                    $target_course = $user_courses[$count - 1];
129
                } else {
130
                    $target_course = $user_courses[$count + 1];
131
                }
132
                break;
133
            }
134
        }
135
136
        $result = false;
137
        if (count($target_course) > 0 && count($source_course) > 0) {
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $source_course does not seem to be defined for all execution paths leading up to this point.
Loading history...
138
            $courseInfo = api_get_course_info($source_course['code']);
139
            $courseId = $courseInfo['real_id'];
140
141
            $targetCourseInfo = api_get_course_info($target_course['code']);
142
            $targetCourseId = $targetCourseInfo['real_id'];
143
144
            $sql = "UPDATE $table
145
                    SET sort='".$target_course['sort']."'
146
                    WHERE
147
                        c_id = '".$courseId."' AND
148
                        user_id = '".$current_user_id."' AND
149
                        relation_type<>".COURSE_RELATION_TYPE_RRHH;
150
151
            $result1 = Database::query($sql);
152
153
            $sql = "UPDATE $table SET sort='".$source_course['sort']."'
154
                    WHERE
155
                        c_id ='".$targetCourseId."' AND
156
                        user_id='".$current_user_id."' AND
157
                        relation_type<>".COURSE_RELATION_TYPE_RRHH;
158
159
            $result2 = Database::query($sql);
160
161
            if (Database::affected_rows($result1) && Database::affected_rows($result2)) {
162
                $result = true;
163
            }
164
        }
165
166
        return $result;
167
    }
168
169
    /**
170
     * Moves the course one place up or down.
171
     *
172
     * @param string $direction     Direction up/down
173
     * @param string $category2move Category id
174
     *
175
     * @return bool True If it success
176
     */
177
    public function move_category($direction, $category2move)
178
    {
179
        $userId = api_get_user_id();
180
        $userCategories = CourseManager::get_user_course_categories($userId);
181
        $categories = array_values($userCategories);
182
183
        $previous = null;
184
        $target_category = [];
185
        foreach ($categories as $key => $category) {
186
            $category_id = $category['id'];
187
            if ($category2move == $category_id) {
188
                // source_course is the course where we clicked the up or down icon
189
                $source_category = $userCategories[$category2move];
190
                // target_course is the course before/after the source_course (depending on the up/down icon)
191
                if ('up' == $direction) {
192
                    if (isset($categories[$key - 1])) {
193
                        $target_category = $userCategories[$categories[$key - 1]['id']];
194
                    }
195
                } else {
196
                    if (isset($categories[$key + 1])) {
197
                        $target_category = $userCategories[$categories[$key + 1]['id']];
198
                    }
199
                }
200
            }
201
        }
202
203
        $result = false;
204
        if (count($target_category) > 0 && count($source_category) > 0) {
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $source_category does not seem to be defined for all execution paths leading up to this point.
Loading history...
205
            $table = Database::get_main_table(TABLE_USER_COURSE_CATEGORY);
206
            $sql = "UPDATE $table SET
207
                    sort = '".Database::escape_string($target_category['sort'])."'
208
                    WHERE id='".intval($source_category['id'])."' AND user_id='".$userId."'";
209
            $resultFirst = Database::query($sql);
210
            $sql = "UPDATE $table SET
211
                    sort = '".Database::escape_string($source_category['sort'])."'
212
                    WHERE id='".intval($target_category['id'])."' AND user_id='".$userId."'";
213
            $resultSecond = Database::query($sql);
214
            if (Database::affected_rows($resultFirst) && Database::affected_rows($resultSecond)) {
215
                $result = true;
216
            }
217
        }
218
219
        return $result;
220
    }
221
222
    /**
223
     * Updates the user course category in the chamilo_user database.
224
     *
225
     * @param string  Category title
226
     * @param int     Category id
227
     *
228
     * @return bool True if it success
229
     */
230
    public function store_edit_course_category($title, $category_id)
231
    {
232
        $title = Database::escape_string($title);
233
        $category_id = (int) $category_id;
234
        $result = false;
235
        $table = Database::get_main_table(TABLE_USER_COURSE_CATEGORY);
236
        $sql = "UPDATE $table
237
                SET title='".api_htmlentities($title, ENT_QUOTES, api_get_system_encoding())."'
238
                WHERE id='".$category_id."'";
239
        $resultQuery = Database::query($sql);
240
        if (Database::affected_rows($resultQuery)) {
241
            $result = true;
242
        }
243
244
        return $result;
245
    }
246
247
    /**
248
     * deletes a course category and moves all the courses that were in this category to main category.
249
     *
250
     * @param int     Category id
251
     *
252
     * @return bool True if it success
253
     */
254
    public function delete_course_category($category_id)
255
    {
256
        $current_user_id = api_get_user_id();
257
        $tucc = Database::get_main_table(TABLE_USER_COURSE_CATEGORY);
258
        $TABLECOURSUSER = Database::get_main_table(TABLE_MAIN_COURSE_USER);
259
        $category_id = (int) $category_id;
260
        $result = false;
261
        $sql = "DELETE FROM $tucc
262
                WHERE
263
                    id='".$category_id."' AND
264
                    user_id='".$current_user_id."'";
265
        $resultQuery = Database::query($sql);
266
        if (Database::affected_rows($resultQuery)) {
267
            $result = true;
268
        }
269
        $sql = "UPDATE $TABLECOURSUSER
270
                SET user_course_cat='0'
271
                WHERE
272
                    user_course_cat='".$category_id."' AND
273
                    user_id='".$current_user_id."' AND
274
                    relation_type<>".COURSE_RELATION_TYPE_RRHH." ";
275
        Database::query($sql);
276
277
        return $result;
278
    }
279
280
    /**
281
     * @param int $categoryId
282
     *
283
     * @return array|mixed
284
     */
285
    public function getUserCourseCategory($categoryId)
286
    {
287
        $userId = api_get_user_id();
288
        $tucc = Database::get_main_table(TABLE_USER_COURSE_CATEGORY);
289
        $categoryId = (int) $categoryId;
290
291
        $sql = "SELECT * FROM $tucc
292
                WHERE
293
                    id= $categoryId AND
294
                    user_id= $userId";
295
        $resultQuery = Database::query($sql);
296
297
        return Database::fetch_array($resultQuery, 'ASSOC');
298
    }
299
300
    /**
301
     * unsubscribe the user from a given course.
302
     *
303
     * @param string $course_code
304
     *
305
     * @return bool True if it success
306
     */
307
    public function remove_user_from_course($course_code, $sessionId = 0)
308
    {
309
        $tbl_course_user = Database::get_main_table(TABLE_MAIN_COURSE_USER);
310
311
        // protect variables
312
        $current_user_id = api_get_user_id();
313
        $course_code = Database::escape_string($course_code);
314
315
        $courseInfo = api_get_course_info($course_code);
316
317
        if (empty($courseInfo) || empty($current_user_id)) {
318
            return false;
319
        }
320
321
        // Check if course can be unsubscribe.
322
        if ('1' !== $courseInfo['unsubscribe']) {
323
            return false;
324
        }
325
326
        $courseId = $courseInfo['real_id'];
327
328
        // we check (once again) if the user is not course administrator
329
        // because the course administrator cannot unsubscribe himself
330
        // (s)he can only delete the course
331
        $sql = "SELECT * FROM $tbl_course_user
332
                WHERE
333
                    user_id='".$current_user_id."' AND
334
                    c_id ='".$courseId."' AND
335
                    status='1' ";
336
        $result_check = Database::query($sql);
337
        $number_of_rows = Database::num_rows($result_check);
338
339
        $result = true;
340
        if ($number_of_rows > 0) {
341
            $result = false;
342
        }
343
344
        if ($result) {
345
            CourseManager::unsubscribe_user($current_user_id, $course_code, $sessionId);
346
        }
347
348
        return $result;
349
    }
350
351
    /**
352
     * stores the user course category in the chamilo_user database.
353
     *
354
     * @param string  Category title
355
     *
356
     * @return bool True if it success
357
     */
358
    public function store_course_category($category_title)
359
    {
360
        $table = Database::get_main_table(TABLE_USER_COURSE_CATEGORY);
361
362
        // protect data
363
        $current_user_id = api_get_user_id();
364
        $category_title = Database::escape_string($category_title);
365
366
        // step 1: we determine the max value of the user defined course categories
367
        $sql = "SELECT sort FROM $table
368
                WHERE user_id='".$current_user_id."'
369
                ORDER BY sort DESC";
370
        $rs_sort = Database::query($sql);
371
        $maxsort = Database::fetch_array($rs_sort);
372
        $nextsort = $maxsort['sort'] + 1;
373
374
        // step 2: we check if there is already a category with this name,
375
        // if not we store it, else we give an error.
376
        $sql = "SELECT * FROM $table
377
                WHERE
378
                    user_id='".$current_user_id."' AND
379
                    title='".$category_title."'
380
                ORDER BY sort DESC";
381
        $rs = Database::query($sql);
382
383
        $result = false;
384
        if (0 == Database::num_rows($rs)) {
385
            $sql = "INSERT INTO $table (user_id, title,sort)
386
                    VALUES ('".$current_user_id."', '".api_htmlentities(
387
                    $category_title,
388
                    ENT_QUOTES,
389
                    api_get_system_encoding()
390
                )."', '".$nextsort."')";
391
            $resultQuery = Database::query($sql);
392
            if (Database::affected_rows($resultQuery)) {
393
                $result = true;
394
            }
395
        }
396
397
        return $result;
398
    }
399
}
400