diff --git a/endpoints/api_v1_schedules_STR.c b/endpoints/api_v1_schedules_STR.c index ce065a0..36d3074 100644 --- a/endpoints/api_v1_schedules_STR.c +++ b/endpoints/api_v1_schedules_STR.c @@ -156,14 +156,10 @@ api_v1_schedules_STR_PUT(struct mg_connection *c, endpoint_args_t *args, struct return; } - int *relays = junction_relay_schedule_get_relays_ids(schedule->id); - for(int i = 0; relays[i] != 0; ++i) + relay_t **relays = relay_get_with_schedule(schedule->id); + for(int i = 0; relays[i] != NULL; ++i) { - relay_t *relay = relay_get_by_id(relays[i]); - if(relay) - { - command_set_relay_schedule(relay); - } + command_set_relay_schedule(relays[i]); } cJSON *json_tag; diff --git a/handlers/connection.c b/handlers/connection.c index 58fa9c3..b6650ce 100644 --- a/handlers/connection.c +++ b/handlers/connection.c @@ -10,7 +10,7 @@ handler_connection(struct mg_connection *c, int ev, void *p) if (ev == MG_EV_HTTP_REQUEST) { struct http_message *hm = (struct http_message *) p; - LOG_DEBUG("new http request for %.*s\n", hm->uri.len, hm->uri.p); + LOG_DEBUG("new http %.*s request for %.*s\n", hm->method.len, hm->method.p, hm->uri.len, hm->uri.p); endpoint_t *endpoint = router_find_endpoint(hm->uri.p, hm->uri.len, &hm->method); @@ -33,7 +33,11 @@ handler_connection(struct mg_connection *c, int ev, void *p) if(endpoint->method == HTTP_METHOD_OPTIONS) { char options_header[256]; // TODO make more generic - sprintf(options_header, "Allow: OPTIONS%s%s%s%s\r\n" STANDARD_HEADERS, + sprintf(options_header, "Allow: OPTIONS%s%s%s%s\r\nAccess-Control-Allow-Methods: OPTIONS%s%s%s%s\r\n" STANDARD_HEADERS, + endpoint->options & HTTP_METHOD_GET ? ", GET" : "", + endpoint->options & HTTP_METHOD_POST ? ", POST" : "", + endpoint->options & HTTP_METHOD_PUT ? ", PUT" : "", + endpoint->options & HTTP_METHOD_DELETE ? ", DELETE" : "", endpoint->options & HTTP_METHOD_GET ? ", GET" : "", endpoint->options & HTTP_METHOD_POST ? ", POST" : "", endpoint->options & HTTP_METHOD_PUT ? ", PUT" : "", diff --git a/include/constants.h b/include/constants.h index ceb06db..4f5c117 100644 --- a/include/constants.h +++ b/include/constants.h @@ -28,6 +28,6 @@ #define PIFACE_GPIO_BASE 200 -#define STANDARD_HEADERS "Access-Control-Allow-Origin: *" +#define STANDARD_HEADERS "Access-Control-Allow-Origin: *\r\nAccess-Control-Allow-Headers: *" #endif /* CORE_CONTANTS_H */ diff --git a/include/models/relay.h b/include/models/relay.h index c220845..ee8b9a4 100644 --- a/include/models/relay.h +++ b/include/models/relay.h @@ -48,6 +48,9 @@ relay_get_by_id(int id); relay_t* relay_get_for_controller(int controller_id, int relay_num); +relay_t** +relay_get_with_schedule(int schedule_id); + relay_t** relay_get_all(); diff --git a/include/models/schedule.h b/include/models/schedule.h index 5b2210a..1950c58 100644 --- a/include/models/schedule.h +++ b/include/models/schedule.h @@ -52,6 +52,9 @@ schedule_get_by_uid_or_off(uuid_t uid); schedule_t* schedule_get_by_uid(uuid_t uid); +schedule_t** +schedule_get_relay_weekdays(int relay_id); + schedule_t** schedule_get_all(); diff --git a/models/relay.c b/models/relay.c index 816d332..3e364dd 100644 --- a/models/relay.c +++ b/models/relay.c @@ -60,11 +60,21 @@ relay_db_select_mapper(sqlite3_stmt *stmt) break; } } + + schedule_t **schedules = schedule_get_relay_weekdays(new_relay->id); for(int i = 0; i < 7; ++i) { - int schedule_id = junction_relay_schedule_get_schedule_id(i, new_relay->id); - new_relay->schedules[i] = schedule_get_by_id_or_off(schedule_id); + if(schedules[i] == NULL) + { + LOG_ERROR("got only %d/7 schedules for relay_id %d\n", i, new_relay->id); + relay_free(new_relay); + free(schedules); + return NULL; + } + new_relay->schedules[i] = schedules[i]; } + free(schedules); // don't free list, because contents are kept in relay->schedules + relay_reload_active_schedule(new_relay); return new_relay; @@ -324,6 +334,17 @@ relay_get_all() return relay_db_select(stmt); } +relay_t** +relay_get_with_schedule(int schedule_id) +{ + sqlite3_stmt *stmt; + + sqlite3_prepare_v2(global_database, "SELECT DISTINCT relays.* FROM relays INNER JOIN junction_relay_schedule ON relays.id == junction_relay_schedule.relay_id WHERE junction_relay_schedule.schedule_id = ?1;", -1, &stmt, NULL); + sqlite3_bind_int(stmt, 1, schedule_id); + + return relay_db_select(stmt); +} + relay_t* relay_get_for_controller(int controller_id, int relay_num) { diff --git a/models/schedule.c b/models/schedule.c index deccb3b..bd27200 100644 --- a/models/schedule.c +++ b/models/schedule.c @@ -391,6 +391,17 @@ schedule_get_by_uid(uuid_t uid) return result; } +schedule_t** +schedule_get_relay_weekdays(int relay_id) +{ + sqlite3_stmt *stmt; + + sqlite3_prepare_v2(global_database, "SELECT schedules.* FROM schedules INNER JOIN junction_relay_schedule ON schedules.id == junction_relay_schedule.schedule_id WHERE junction_relay_schedule.relay_id = ?1 ORDER BY junction_relay_schedule.weekday ASC", -1, &stmt, NULL); + sqlite3_bind_int(stmt, 1, relay_id); + + return schedule_db_select(stmt); +} + schedule_t** schedule_get_all() {