1 #include <thread>
2 #include <iostream>
3 
4 #include <silicon/api.hh>
5 #include <silicon/middleware_factories.hh>
6 #include <silicon/api_description.hh>
7 #include <silicon/backends/mhd.hh>
8 #include <silicon/middlewares/sqlite_connection.hh>
9 #include <silicon/middlewares/sqlite_orm.hh>
10 #include <silicon/clients/libcurl_client.hh>
11 #include <silicon/sql_rest.hh>
12 
13 #include "symbols.hh"
14 
15 using namespace s;
16 
17 typedef decltype(iod::D(_id(_auto_increment, _primary_key) = int(),
18                         _name = std::string(),
19                         _age = int(),
20                         _address = std::string(),
21                         _city(_read_only) = std::string()
22                    )) User;
23 
24 
main()25 int main()
26 {
27   using namespace sl;
28 
29   auto api = http_api(
30 
31     _user = sql_rest<sqlite_orm<User>>(
32       _before_create = [] (User& u, sqlite_connection& c) { u.city = "Paris"; }
33       ) // Crud for the User object.
34     );
35 
36   auto factories = middleware_factories(
37       sqlite_connection_factory("/tmp/sl_test_crud.sqlite", _synchronous = 1), // sqlite middleware.
38       sqlite_orm_factory<User>("users") // Orm middleware.
39       );
40 
41   std::cout << api_description(api) << std::endl;
42 
43   // Start server.
44   auto server = mhd_json_serve(api, factories, 12345, _non_blocking);
45 
46   // Test.
47   auto c = libcurl_json_client(api, "127.0.0.1", 12345);
48 
49   // // Insert.
50   auto insert_r = c.http_post.user(_name = "matt", _age =  12, _address = "USA");
51   std::cout << json_encode(insert_r) << std::endl;
52   assert(insert_r.status == 200);
53   int id = insert_r.response.id;
54 
55   // Get by id.
56   auto get_r = c.http_get.user(_id = id);
57   std::cout << json_encode(get_r) << std::endl;;
58   assert(get_r.status == 200);
59   assert(get_r.response.name == "matt");
60   assert(get_r.response.age == 12);
61   assert(get_r.response.city == "Paris");
62   assert(get_r.response.address == "USA");
63 
64   auto get_r2 = c.http_get.user(_id = 42);
65   std::cout << json_encode(get_r2) << std::endl;;
66   assert(get_r2.status == 404);
67 
68   // Update
69   auto update_r = c.http_put.user(_id = id, _name = "john", _age = 42, _address = "Canada");
70   std::cout << json_encode(update_r) << std::endl;;
71   auto get_r3 = c.http_get.user(_id = id);
72   std::cout << json_encode(get_r3) << std::endl;;
73   assert(get_r3.status == 200);
74   assert(get_r3.response.id == id);
75   assert(get_r3.response.name == "john");
76   assert(get_r3.response.age == 42);
77   assert(get_r3.response.address == "Canada");
78 
79 
80   // Destroy.
81   auto destroy_r = c.http_delete.user(_id = id);
82   assert(destroy_r.status == 200);
83 
84   auto get_r4 = c.http_get.user(_id = id);
85   assert(get_r4.status == 404);
86 }
87