avisos.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. <?
  2. require_once "{$_SERVER['DOCUMENT_ROOT']}/class/c_login.php";
  3. header('Content-Type: application/json');
  4. if (!Login::is_logged()) {
  5. header('HTTP/1.1 401 Unauthorized');
  6. echo json_encode(array('error' => 'No se ha iniciado sesión'));
  7. exit();
  8. }
  9. $user = Login::get_user();
  10. try {
  11. switch ($_SERVER['REQUEST_METHOD']) {
  12. case 'GET':
  13. $facultad_id = $user->facultad['facultad_id'];
  14. $avisos = $db->query(
  15. "SELECT * FROM aviso
  16. WHERE
  17. (CURRENT_DATE BETWEEN aviso_fecha_inicial AND aviso_fecha_final) AND
  18. (facultad_id = :facultad_id OR :facultad_id IS NULL) AND
  19. aviso_estado
  20. ORDER BY aviso_id DESC",
  21. array('facultad_id' => $facultad_id)
  22. );
  23. /*
  24. if (empty($avisos)) {
  25. header('HTTP/1.1 404 Not Found');
  26. echo json_encode(array('error' => 'No hay avisos disponibles'));
  27. exit();
  28. }
  29. */
  30. $avisos = array_map(fn($aviso) => array(
  31. ...$aviso,
  32. 'carreras' => $db->query(
  33. "SELECT carrera_id, carrera_nombre FROM aviso_carrera
  34. JOIN carrera USING (carrera_id)
  35. WHERE aviso_id = :aviso_id",
  36. array('aviso_id' => $aviso['aviso_id'])
  37. ),
  38. 'profesores' => $db->query(
  39. "SELECT profesor_id, profesor_clave, profesor_nombre FROM aviso_profesor
  40. JOIN profesor USING (profesor_id)
  41. WHERE aviso_id = :aviso_id",
  42. array('aviso_id' => $aviso['aviso_id'])
  43. ),
  44. ), $avisos);
  45. echo json_encode($avisos);
  46. break;
  47. case 'POST':
  48. $raw_input = file_get_contents('php://input');
  49. if (empty($raw_input)) {
  50. header('HTTP/1.1 400 Bad Request');
  51. echo json_encode(array('error' => 'No se recibieron parámetros'));
  52. exit();
  53. }
  54. $input_data = json_decode($raw_input);
  55. if (json_last_error() !== JSON_ERROR_NONE) {
  56. header('HTTP/1.1 400 Bad Request');
  57. echo json_encode(array('error' => 'Invalid JSON format'));
  58. exit();
  59. }
  60. $schema = <<<JSON
  61. {
  62. "\$schema": "http://json-schema.org/draft-07/schema#",
  63. "type": "object",
  64. "required": ["aviso_fecha_inicial", "aviso_fecha_final", "aviso_titulo", "aviso_texto"],
  65. "properties": {
  66. "aviso_fecha_inicial": {
  67. "type": "string",
  68. "format": "date"
  69. },
  70. "aviso_fecha_final": {
  71. "type": "string",
  72. "format": "date"
  73. },
  74. "aviso_texto": {
  75. "type": "string"
  76. },
  77. "aviso_titulo": {
  78. "type": "string"
  79. },
  80. "carreras": {
  81. "type": "array",
  82. "items": {
  83. "type": "integer",
  84. "minimum": 1
  85. },
  86. "minItems": 0,
  87. "uniqueItems": true
  88. },
  89. "profesores": {
  90. "type": "array",
  91. "items": {
  92. "type": "integer",
  93. "minimum": 1
  94. },
  95. "minItems": 0,
  96. "uniqueItems": true
  97. }
  98. },
  99. "anyOf": [
  100. {"required": ["carreras"]},
  101. {"required": ["profesores"]}
  102. ]
  103. }
  104. JSON;
  105. // VALIDATE JSON SCHEMA
  106. $validate = new JsonSchema\Validator();
  107. $validate->validate($input_data, json_decode($schema));
  108. if (!$validate->isValid()) {
  109. header('HTTP/1.1 400 Bad Request');
  110. echo json_encode(
  111. array(
  112. 'error' => 'El formato de la solicitud es incorrecto',
  113. 'success' => false,
  114. 'errors' => $validate->getErrors()
  115. )
  116. );
  117. exit();
  118. }
  119. $aviso_id = $db->insert(
  120. 'aviso',
  121. array(
  122. 'aviso_fecha_inicial' => $input_data->aviso_fecha_inicial,
  123. 'aviso_fecha_final' => $input_data->aviso_fecha_final,
  124. 'aviso_texto' => $input_data->aviso_texto,
  125. 'facultad_id' => $user->facultad['facultad_id'],
  126. ),
  127. 'aviso_id'
  128. );
  129. if (isset($input_data->carreras)) {
  130. array_walk($input_data->carreras, fn($carrera_id) => $db->insert('aviso_carrera', array('aviso_id' => $aviso_id, 'carrera_id' => $carrera_id)));
  131. }
  132. if (isset($input_data->profesores)) {
  133. array_walk($input_data->profesores, fn($profesor_id) => $db->insert('aviso_profesor', array('aviso_id' => $aviso_id, 'profesor_id' => $profesor_id)));
  134. }
  135. echo json_encode(
  136. array(
  137. 'aviso_id' => $aviso_id,
  138. 'msg' => 'Aviso creado exitosamente',
  139. 'success' => true
  140. )
  141. );
  142. break;
  143. case 'PUT':
  144. $raw_input = file_get_contents('php://input');
  145. if (empty($raw_input)) {
  146. header('HTTP/1.1 400 Bad Request');
  147. echo json_encode(array('error' => 'No se recibieron parámetros'));
  148. exit();
  149. }
  150. $input_data = json_decode($raw_input);
  151. if (json_last_error() !== JSON_ERROR_NONE) {
  152. header('HTTP/1.1 400 Bad Request');
  153. echo json_encode(array('error' => 'Invalid JSON format'));
  154. exit();
  155. }
  156. $schema = <<<JSON
  157. {
  158. "\$schema": "http://json-schema.org/draft-07/schema#",
  159. "type": "object",
  160. "required": ["aviso_id", "aviso_fecha_final"],
  161. "properties": {
  162. "aviso_id": {
  163. "type": "integer",
  164. "minimum": 1
  165. },
  166. "aviso_fecha_final": {
  167. "type": "string",
  168. "format": "date"
  169. }
  170. }
  171. }
  172. JSON;
  173. // VALIDATE JSON SCHEMA
  174. $validate = new JsonSchema\Validator();
  175. $validate->validate($input_data, json_decode($schema));
  176. if (!$validate->isValid()) {
  177. header('HTTP/1.1 400 Bad Request');
  178. echo json_encode(
  179. array(
  180. 'error' => 'El formato de la solicitud es incorrecto',
  181. 'errors' => $validate->getErrors(),
  182. 'success' => false,
  183. )
  184. );
  185. exit();
  186. }
  187. $db->where('aviso_id', $input_data->aviso_id)
  188. ->update(
  189. 'aviso',
  190. array(
  191. 'aviso_fecha_final' => $input_data->aviso_fecha_final,
  192. ),
  193. );
  194. if (isset($input_data->carreras)) {
  195. $db->where('aviso_id', $input_data->aviso_id)->delete('aviso_carrera');
  196. array_walk($input_data->carreras, fn($carrera_id) => $db->insert('aviso_carrera', array('aviso_id' => $input_data->aviso_id, 'carrera_id' => $carrera_id)));
  197. }
  198. if (isset($input_data->profesores)) {
  199. $db->where('aviso_id', $input_data->aviso_id)->delete('aviso_profesor');
  200. array_walk($input_data->profesores, fn($profesor_id) => $db->insert('aviso_profesor', array('aviso_id' => $input_data->aviso_id, 'profesor_id' => $profesor_id)));
  201. }
  202. echo json_encode(
  203. array(
  204. 'msg' => 'Aviso actualizado exitosamente',
  205. 'success' => true
  206. )
  207. );
  208. break;
  209. case 'DELETE':
  210. $raw_input = file_get_contents('php://input');
  211. if (empty($raw_input)) {
  212. header('HTTP/1.1 400 Bad Request');
  213. echo json_encode(array('error' => 'No se recibieron parámetros'));
  214. exit();
  215. }
  216. $input_data = json_decode($raw_input);
  217. if (json_last_error() !== JSON_ERROR_NONE) {
  218. header('HTTP/1.1 400 Bad Request');
  219. echo json_encode(array('error' => 'Invalid JSON format'));
  220. exit();
  221. }
  222. $schema = <<<JSON
  223. {
  224. "\$schema": "http://json-schema.org/draft-07/schema#",
  225. "type": "object",
  226. "required": ["aviso_id"],
  227. "properties": {
  228. "aviso_id": {
  229. "type": "integer",
  230. "minimum": 1
  231. }
  232. }
  233. }
  234. JSON;
  235. // VALIDATE JSON SCHEMA
  236. $validate = new JsonSchema\Validator();
  237. $validate->validate($input_data, json_decode($schema));
  238. if (!$validate->isValid()) {
  239. header('HTTP/1.1 400 Bad Request');
  240. echo json_encode(
  241. array(
  242. 'error' => 'El formato de la solicitud es incorrecto',
  243. 'errors' => $validate->getErrors(),
  244. 'success' => false,
  245. )
  246. );
  247. exit();
  248. }
  249. $result = $db->where('aviso_id', $input_data->aviso_id)->update('aviso', array('aviso_estado' => false));
  250. echo json_encode(
  251. array(
  252. 'msg' => 'Aviso eliminado exitosamente',
  253. 'success' => true,
  254. 'result' => $result
  255. )
  256. );
  257. break;
  258. }
  259. } catch (PDOException $e) {
  260. echo json_encode(
  261. array(
  262. 'error' => $e->getMessage(),
  263. 'query' => $db->getLastQuery(),
  264. 'exception' => $e->getTraceAsString()
  265. )
  266. );
  267. }