Add macros
This commit is contained in:
		
							parent
							
								
									51aa0d3c99
								
							
						
					
					
						commit
						661b5004e8
					
				
					 28 changed files with 1024 additions and 2 deletions
				
			
		
							
								
								
									
										32
									
								
								.sqlx/query-03bfe5bd71d673a621b6ad6af5f71bf18ede519e6b950933f6751ef9cf7521c9.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								.sqlx/query-03bfe5bd71d673a621b6ad6af5f71bf18ede519e6b950933f6751ef9cf7521c9.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,32 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "db_name": "SQLite",
 | 
				
			||||||
 | 
					  "query": "SELECT * FROM macros WHERE id = ?",
 | 
				
			||||||
 | 
					  "describe": {
 | 
				
			||||||
 | 
					    "columns": [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "id",
 | 
				
			||||||
 | 
					        "ordinal": 0,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "uid",
 | 
				
			||||||
 | 
					        "ordinal": 1,
 | 
				
			||||||
 | 
					        "type_info": "Blob"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "name",
 | 
				
			||||||
 | 
					        "ordinal": 2,
 | 
				
			||||||
 | 
					        "type_info": "Text"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "parameters": {
 | 
				
			||||||
 | 
					      "Right": 1
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "nullable": [
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "hash": "03bfe5bd71d673a621b6ad6af5f71bf18ede519e6b950933f6751ef9cf7521c9"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										20
									
								
								.sqlx/query-1348af1c13719ffcd72c2a4c6712b2bab2a9923c715295d8b1d937d33844d1a4.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								.sqlx/query-1348af1c13719ffcd72c2a4c6712b2bab2a9923c715295d8b1d937d33844d1a4.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,20 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "db_name": "SQLite",
 | 
				
			||||||
 | 
					  "query": "SELECT 1 FROM macros WHERE uid = ?",
 | 
				
			||||||
 | 
					  "describe": {
 | 
				
			||||||
 | 
					    "columns": [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "1",
 | 
				
			||||||
 | 
					        "ordinal": 0,
 | 
				
			||||||
 | 
					        "type_info": "Int"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "parameters": {
 | 
				
			||||||
 | 
					      "Right": 1
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "nullable": [
 | 
				
			||||||
 | 
					      false
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "hash": "1348af1c13719ffcd72c2a4c6712b2bab2a9923c715295d8b1d937d33844d1a4"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										38
									
								
								.sqlx/query-2551c285e3e223311cff8e32022d8b11e95d56b2f166326301a0b6722fc1fd44.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								.sqlx/query-2551c285e3e223311cff8e32022d8b11e95d56b2f166326301a0b6722fc1fd44.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,38 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "db_name": "SQLite",
 | 
				
			||||||
 | 
					  "query": "SELECT relays.* FROM relays INNER JOIN junction_relay_schedule\n\t\t\tON junction_relay_schedule.relay_id = relays.id\n\t\t\tWHERE junction_relay_schedule.schedule_id = ?\n\t\t\tORDER BY junction_relay_schedule.weekday",
 | 
				
			||||||
 | 
					  "describe": {
 | 
				
			||||||
 | 
					    "columns": [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "id",
 | 
				
			||||||
 | 
					        "ordinal": 0,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "name",
 | 
				
			||||||
 | 
					        "ordinal": 1,
 | 
				
			||||||
 | 
					        "type_info": "Text"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "number",
 | 
				
			||||||
 | 
					        "ordinal": 2,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "controller_id",
 | 
				
			||||||
 | 
					        "ordinal": 3,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "parameters": {
 | 
				
			||||||
 | 
					      "Right": 1
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "nullable": [
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "hash": "2551c285e3e223311cff8e32022d8b11e95d56b2f166326301a0b6722fc1fd44"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										12
									
								
								.sqlx/query-2e3528a386066c3fc11be1259298f281279353d0b92625c46ef5cd09a672c031.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								.sqlx/query-2e3528a386066c3fc11be1259298f281279353d0b92625c46ef5cd09a672c031.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "db_name": "SQLite",
 | 
				
			||||||
 | 
					  "query": "DELETE FROM macro_actions WHERE id = ?",
 | 
				
			||||||
 | 
					  "describe": {
 | 
				
			||||||
 | 
					    "columns": [],
 | 
				
			||||||
 | 
					    "parameters": {
 | 
				
			||||||
 | 
					      "Right": 1
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "nullable": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "hash": "2e3528a386066c3fc11be1259298f281279353d0b92625c46ef5cd09a672c031"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										12
									
								
								.sqlx/query-3adb7ab9cacd5a84d882e4c9860be83d32bb0380b1fb76f90bf4e200636c7f6a.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								.sqlx/query-3adb7ab9cacd5a84d882e4c9860be83d32bb0380b1fb76f90bf4e200636c7f6a.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "db_name": "SQLite",
 | 
				
			||||||
 | 
					  "query": "DELETE FROM macros WHERE id = ?",
 | 
				
			||||||
 | 
					  "describe": {
 | 
				
			||||||
 | 
					    "columns": [],
 | 
				
			||||||
 | 
					    "parameters": {
 | 
				
			||||||
 | 
					      "Right": 1
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "nullable": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "hash": "3adb7ab9cacd5a84d882e4c9860be83d32bb0380b1fb76f90bf4e200636c7f6a"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										12
									
								
								.sqlx/query-486ed307f718754a3d4ea2c6fe944f9571c88fad3316593edf0c72ddef24c73e.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								.sqlx/query-486ed307f718754a3d4ea2c6fe944f9571c88fad3316593edf0c72ddef24c73e.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "db_name": "SQLite",
 | 
				
			||||||
 | 
					  "query": "DELETE FROM macro_actions WHERE macro_id = ?",
 | 
				
			||||||
 | 
					  "describe": {
 | 
				
			||||||
 | 
					    "columns": [],
 | 
				
			||||||
 | 
					    "parameters": {
 | 
				
			||||||
 | 
					      "Right": 1
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "nullable": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "hash": "486ed307f718754a3d4ea2c6fe944f9571c88fad3316593edf0c72ddef24c73e"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										32
									
								
								.sqlx/query-49afbeaa1d32f8c2e6fea7a2d57a11ec04dd0aab26139c19583af00e5baaba56.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								.sqlx/query-49afbeaa1d32f8c2e6fea7a2d57a11ec04dd0aab26139c19583af00e5baaba56.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,32 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "db_name": "SQLite",
 | 
				
			||||||
 | 
					  "query": "INSERT INTO macros (uid, name) VALUES (?, ?) RETURNING *",
 | 
				
			||||||
 | 
					  "describe": {
 | 
				
			||||||
 | 
					    "columns": [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "id",
 | 
				
			||||||
 | 
					        "ordinal": 0,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "uid",
 | 
				
			||||||
 | 
					        "ordinal": 1,
 | 
				
			||||||
 | 
					        "type_info": "Blob"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "name",
 | 
				
			||||||
 | 
					        "ordinal": 2,
 | 
				
			||||||
 | 
					        "type_info": "Text"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "parameters": {
 | 
				
			||||||
 | 
					      "Right": 2
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "nullable": [
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "hash": "49afbeaa1d32f8c2e6fea7a2d57a11ec04dd0aab26139c19583af00e5baaba56"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										44
									
								
								.sqlx/query-8bdd41a11fd2ca0440b2d6c0dc752a342012048741bdcd1ff9461bc46e1cf701.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								.sqlx/query-8bdd41a11fd2ca0440b2d6c0dc752a342012048741bdcd1ff9461bc46e1cf701.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,44 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "db_name": "SQLite",
 | 
				
			||||||
 | 
					  "query": "SELECT * FROM macro_actions",
 | 
				
			||||||
 | 
					  "describe": {
 | 
				
			||||||
 | 
					    "columns": [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "id",
 | 
				
			||||||
 | 
					        "ordinal": 0,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "macro_id",
 | 
				
			||||||
 | 
					        "ordinal": 1,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "relay_id",
 | 
				
			||||||
 | 
					        "ordinal": 2,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "schedule_id",
 | 
				
			||||||
 | 
					        "ordinal": 3,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "weekday",
 | 
				
			||||||
 | 
					        "ordinal": 4,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "parameters": {
 | 
				
			||||||
 | 
					      "Right": 0
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "nullable": [
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "hash": "8bdd41a11fd2ca0440b2d6c0dc752a342012048741bdcd1ff9461bc46e1cf701"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										20
									
								
								.sqlx/query-96a0b9960daa8a10e04e22cba592870941545b095193612956c29d37a5a1b774.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								.sqlx/query-96a0b9960daa8a10e04e22cba592870941545b095193612956c29d37a5a1b774.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,20 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "db_name": "SQLite",
 | 
				
			||||||
 | 
					  "query": "SELECT 1 FROM tags WHERE tag = ?",
 | 
				
			||||||
 | 
					  "describe": {
 | 
				
			||||||
 | 
					    "columns": [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "1",
 | 
				
			||||||
 | 
					        "ordinal": 0,
 | 
				
			||||||
 | 
					        "type_info": "Int"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "parameters": {
 | 
				
			||||||
 | 
					      "Right": 1
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "nullable": [
 | 
				
			||||||
 | 
					      false
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "hash": "96a0b9960daa8a10e04e22cba592870941545b095193612956c29d37a5a1b774"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										44
									
								
								.sqlx/query-a0c9c1a108c6560b4f073c866415a94af2e823a8d88ab2aa5ace8c2b56023004.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								.sqlx/query-a0c9c1a108c6560b4f073c866415a94af2e823a8d88ab2aa5ace8c2b56023004.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,44 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "db_name": "SQLite",
 | 
				
			||||||
 | 
					  "query": "SELECT * FROM macro_actions WHERE id = ?",
 | 
				
			||||||
 | 
					  "describe": {
 | 
				
			||||||
 | 
					    "columns": [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "id",
 | 
				
			||||||
 | 
					        "ordinal": 0,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "macro_id",
 | 
				
			||||||
 | 
					        "ordinal": 1,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "relay_id",
 | 
				
			||||||
 | 
					        "ordinal": 2,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "schedule_id",
 | 
				
			||||||
 | 
					        "ordinal": 3,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "weekday",
 | 
				
			||||||
 | 
					        "ordinal": 4,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "parameters": {
 | 
				
			||||||
 | 
					      "Right": 1
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "nullable": [
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "hash": "a0c9c1a108c6560b4f073c866415a94af2e823a8d88ab2aa5ace8c2b56023004"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										44
									
								
								.sqlx/query-b6f6fd898dc3f1dbe2c39bf0445bac76c8233c0feee15f4504bf74ea864716ce.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								.sqlx/query-b6f6fd898dc3f1dbe2c39bf0445bac76c8233c0feee15f4504bf74ea864716ce.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,44 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "db_name": "SQLite",
 | 
				
			||||||
 | 
					  "query": "SELECT * FROM macro_actions WHERE macro_id = ?",
 | 
				
			||||||
 | 
					  "describe": {
 | 
				
			||||||
 | 
					    "columns": [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "id",
 | 
				
			||||||
 | 
					        "ordinal": 0,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "macro_id",
 | 
				
			||||||
 | 
					        "ordinal": 1,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "relay_id",
 | 
				
			||||||
 | 
					        "ordinal": 2,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "schedule_id",
 | 
				
			||||||
 | 
					        "ordinal": 3,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "weekday",
 | 
				
			||||||
 | 
					        "ordinal": 4,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "parameters": {
 | 
				
			||||||
 | 
					      "Right": 1
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "nullable": [
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "hash": "b6f6fd898dc3f1dbe2c39bf0445bac76c8233c0feee15f4504bf74ea864716ce"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										44
									
								
								.sqlx/query-bcd9d4dd3641e6c84262ed5f6c5646f825be186da276b113c0150aaad26b057c.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								.sqlx/query-bcd9d4dd3641e6c84262ed5f6c5646f825be186da276b113c0150aaad26b057c.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,44 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "db_name": "SQLite",
 | 
				
			||||||
 | 
					  "query": "INSERT INTO macro_actions (macro_id, relay_id, schedule_id, weekday) VALUES (?, ?, ?, ?) RETURNING *",
 | 
				
			||||||
 | 
					  "describe": {
 | 
				
			||||||
 | 
					    "columns": [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "id",
 | 
				
			||||||
 | 
					        "ordinal": 0,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "macro_id",
 | 
				
			||||||
 | 
					        "ordinal": 1,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "relay_id",
 | 
				
			||||||
 | 
					        "ordinal": 2,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "schedule_id",
 | 
				
			||||||
 | 
					        "ordinal": 3,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "weekday",
 | 
				
			||||||
 | 
					        "ordinal": 4,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "parameters": {
 | 
				
			||||||
 | 
					      "Right": 4
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "nullable": [
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "hash": "bcd9d4dd3641e6c84262ed5f6c5646f825be186da276b113c0150aaad26b057c"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										12
									
								
								.sqlx/query-c138a9c659a7410e9935ad3f6a56c2bc73174fb1921fe1260702f1eab87d979c.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								.sqlx/query-c138a9c659a7410e9935ad3f6a56c2bc73174fb1921fe1260702f1eab87d979c.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "db_name": "SQLite",
 | 
				
			||||||
 | 
					  "query": "DELETE FROM macros WHERE uid = ?",
 | 
				
			||||||
 | 
					  "describe": {
 | 
				
			||||||
 | 
					    "columns": [],
 | 
				
			||||||
 | 
					    "parameters": {
 | 
				
			||||||
 | 
					      "Right": 1
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "nullable": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "hash": "c138a9c659a7410e9935ad3f6a56c2bc73174fb1921fe1260702f1eab87d979c"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										12
									
								
								.sqlx/query-cb0d76a3a1cfa439d48056c865cd5bfbfbc785fa795254120822b843ce63ff07.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								.sqlx/query-cb0d76a3a1cfa439d48056c865cd5bfbfbc785fa795254120822b843ce63ff07.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "db_name": "SQLite",
 | 
				
			||||||
 | 
					  "query": "DELETE FROM tags WHERE tag = ?",
 | 
				
			||||||
 | 
					  "describe": {
 | 
				
			||||||
 | 
					    "columns": [],
 | 
				
			||||||
 | 
					    "parameters": {
 | 
				
			||||||
 | 
					      "Right": 1
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "nullable": []
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "hash": "cb0d76a3a1cfa439d48056c865cd5bfbfbc785fa795254120822b843ce63ff07"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										32
									
								
								.sqlx/query-eee8820f59927c1560a5fd461b9f4a2d40abdf3843d0c815399ea9d267cade5a.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								.sqlx/query-eee8820f59927c1560a5fd461b9f4a2d40abdf3843d0c815399ea9d267cade5a.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,32 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "db_name": "SQLite",
 | 
				
			||||||
 | 
					  "query": "SELECT * FROM macros WHERE uid = ?",
 | 
				
			||||||
 | 
					  "describe": {
 | 
				
			||||||
 | 
					    "columns": [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "id",
 | 
				
			||||||
 | 
					        "ordinal": 0,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "uid",
 | 
				
			||||||
 | 
					        "ordinal": 1,
 | 
				
			||||||
 | 
					        "type_info": "Blob"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "name",
 | 
				
			||||||
 | 
					        "ordinal": 2,
 | 
				
			||||||
 | 
					        "type_info": "Text"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "parameters": {
 | 
				
			||||||
 | 
					      "Right": 1
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "nullable": [
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "hash": "eee8820f59927c1560a5fd461b9f4a2d40abdf3843d0c815399ea9d267cade5a"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										32
									
								
								.sqlx/query-fde0dca1aba5b490a9f5f6006677be750a7bcf5d1185935e8386671c69dc7270.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								.sqlx/query-fde0dca1aba5b490a9f5f6006677be750a7bcf5d1185935e8386671c69dc7270.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,32 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "db_name": "SQLite",
 | 
				
			||||||
 | 
					  "query": "SELECT * FROM macros",
 | 
				
			||||||
 | 
					  "describe": {
 | 
				
			||||||
 | 
					    "columns": [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "id",
 | 
				
			||||||
 | 
					        "ordinal": 0,
 | 
				
			||||||
 | 
					        "type_info": "Int64"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "uid",
 | 
				
			||||||
 | 
					        "ordinal": 1,
 | 
				
			||||||
 | 
					        "type_info": "Blob"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "name": "name",
 | 
				
			||||||
 | 
					        "ordinal": 2,
 | 
				
			||||||
 | 
					        "type_info": "Text"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "parameters": {
 | 
				
			||||||
 | 
					      "Right": 0
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "nullable": [
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false,
 | 
				
			||||||
 | 
					      false
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "hash": "fde0dca1aba5b490a9f5f6006677be750a7bcf5d1185935e8386671c69dc7270"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -554,6 +554,12 @@ paths:
 | 
				
			||||||
      responses:
 | 
					      responses:
 | 
				
			||||||
        '200':
 | 
					        '200':
 | 
				
			||||||
          description: OK
 | 
					          description: OK
 | 
				
			||||||
 | 
					          content:
 | 
				
			||||||
 | 
					            application/json:
 | 
				
			||||||
 | 
					              schema:
 | 
				
			||||||
 | 
					                type: array
 | 
				
			||||||
 | 
					                items:
 | 
				
			||||||
 | 
					                  $ref: '#/components/schemas/macro'
 | 
				
			||||||
      operationId: get-api-v1-macros
 | 
					      operationId: get-api-v1-macros
 | 
				
			||||||
      description: Receive a list with all available macros.
 | 
					      description: Receive a list with all available macros.
 | 
				
			||||||
    post:
 | 
					    post:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										161
									
								
								emgauwa-core/src/handlers/v1/macros.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										161
									
								
								emgauwa-core/src/handlers/v1/macros.rs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,161 @@
 | 
				
			||||||
 | 
					use actix::Addr;
 | 
				
			||||||
 | 
					use actix_web::{delete, get, post, put, web, HttpResponse};
 | 
				
			||||||
 | 
					use emgauwa_lib::db::DbMacro;
 | 
				
			||||||
 | 
					use emgauwa_lib::errors::{DatabaseError, EmgauwaError};
 | 
				
			||||||
 | 
					use emgauwa_lib::models::{convert_db_list, FromDbModel, Macro, MacroAction, Relay};
 | 
				
			||||||
 | 
					use emgauwa_lib::types::{
 | 
				
			||||||
 | 
						ControllerWsAction, EmgauwaUid, RequestMacroCreate, RequestMacroExecute, RequestMacroUpdate,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					use itertools::Itertools;
 | 
				
			||||||
 | 
					use sqlx::{Pool, Sqlite};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use crate::app_state;
 | 
				
			||||||
 | 
					use crate::app_state::AppState;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[get("/macros")]
 | 
				
			||||||
 | 
					pub async fn index(pool: web::Data<Pool<Sqlite>>) -> Result<HttpResponse, EmgauwaError> {
 | 
				
			||||||
 | 
						let mut pool_conn = pool.acquire().await?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						let db_macros = DbMacro::get_all(&mut pool_conn).await?;
 | 
				
			||||||
 | 
						let macros: Vec<Macro> = convert_db_list(&mut pool_conn, db_macros)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Ok(HttpResponse::Ok().json(macros))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[get("/macros/{macro_id}")]
 | 
				
			||||||
 | 
					pub async fn show(
 | 
				
			||||||
 | 
						pool: web::Data<Pool<Sqlite>>,
 | 
				
			||||||
 | 
						path: web::Path<(String,)>,
 | 
				
			||||||
 | 
					) -> Result<HttpResponse, EmgauwaError> {
 | 
				
			||||||
 | 
						let mut pool_conn = pool.acquire().await?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						let (macro_uid,) = path.into_inner();
 | 
				
			||||||
 | 
						let uid = EmgauwaUid::try_from(macro_uid.as_str())?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						let db_macro = DbMacro::get_by_uid(&mut pool_conn, &uid)
 | 
				
			||||||
 | 
							.await?
 | 
				
			||||||
 | 
							.ok_or(DatabaseError::NotFound)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						let return_macro = Macro::from_db_model(&mut pool_conn, db_macro)?;
 | 
				
			||||||
 | 
						Ok(HttpResponse::Ok().json(return_macro))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[post("/macros")]
 | 
				
			||||||
 | 
					pub async fn add(
 | 
				
			||||||
 | 
						pool: web::Data<Pool<Sqlite>>,
 | 
				
			||||||
 | 
						data: web::Json<RequestMacroCreate>,
 | 
				
			||||||
 | 
					) -> Result<HttpResponse, EmgauwaError> {
 | 
				
			||||||
 | 
						let mut pool_conn = pool.acquire().await?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						let new_macro = DbMacro::create(&mut pool_conn, EmgauwaUid::default(), &data.name).await?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						new_macro
 | 
				
			||||||
 | 
							.set_actions(&mut pool_conn, data.actions.as_slice())
 | 
				
			||||||
 | 
							.await?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						let return_macro = Macro::from_db_model(&mut pool_conn, new_macro)?;
 | 
				
			||||||
 | 
						Ok(HttpResponse::Created().json(return_macro))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[put("/macros/{macro_id}")]
 | 
				
			||||||
 | 
					pub async fn update(
 | 
				
			||||||
 | 
						pool: web::Data<Pool<Sqlite>>,
 | 
				
			||||||
 | 
						path: web::Path<(String,)>,
 | 
				
			||||||
 | 
						data: web::Json<RequestMacroUpdate>,
 | 
				
			||||||
 | 
					) -> Result<HttpResponse, EmgauwaError> {
 | 
				
			||||||
 | 
						let mut pool_conn = pool.acquire().await?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						let (macro_uid,) = path.into_inner();
 | 
				
			||||||
 | 
						let uid = EmgauwaUid::try_from(macro_uid.as_str())?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						let db_macro = DbMacro::get_by_uid(&mut pool_conn, &uid)
 | 
				
			||||||
 | 
							.await?
 | 
				
			||||||
 | 
							.ok_or(DatabaseError::NotFound)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if let Some(name) = &data.name {
 | 
				
			||||||
 | 
							db_macro.update(&mut pool_conn, name).await?;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if let Some(actions) = &data.actions {
 | 
				
			||||||
 | 
							db_macro
 | 
				
			||||||
 | 
								.set_actions(&mut pool_conn, actions.as_slice())
 | 
				
			||||||
 | 
								.await?;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						let return_macro = Macro::from_db_model(&mut pool_conn, db_macro)?;
 | 
				
			||||||
 | 
						Ok(HttpResponse::Ok().json(return_macro))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[delete("/macros/{macro_id}")]
 | 
				
			||||||
 | 
					pub async fn delete(
 | 
				
			||||||
 | 
						pool: web::Data<Pool<Sqlite>>,
 | 
				
			||||||
 | 
						path: web::Path<(String,)>,
 | 
				
			||||||
 | 
					) -> Result<HttpResponse, EmgauwaError> {
 | 
				
			||||||
 | 
						let mut pool_conn = pool.acquire().await?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						let (macro_uid,) = path.into_inner();
 | 
				
			||||||
 | 
						let uid = EmgauwaUid::try_from(macro_uid.as_str())?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						DbMacro::delete_by_uid(&mut pool_conn, uid).await?;
 | 
				
			||||||
 | 
						Ok(HttpResponse::Ok().json("macro got deleted"))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[put("/macros/{macro_id}/execute")]
 | 
				
			||||||
 | 
					pub async fn execute(
 | 
				
			||||||
 | 
						pool: web::Data<Pool<Sqlite>>,
 | 
				
			||||||
 | 
						app_state: web::Data<Addr<AppState>>,
 | 
				
			||||||
 | 
						path: web::Path<(String,)>,
 | 
				
			||||||
 | 
						query: web::Query<RequestMacroExecute>,
 | 
				
			||||||
 | 
					) -> Result<HttpResponse, EmgauwaError> {
 | 
				
			||||||
 | 
						let mut pool_conn = pool.acquire().await?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						let (macro_uid,) = path.into_inner();
 | 
				
			||||||
 | 
						let uid = EmgauwaUid::try_from(macro_uid.as_str())?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						let db_macro = DbMacro::get_by_uid(&mut pool_conn, &uid)
 | 
				
			||||||
 | 
							.await?
 | 
				
			||||||
 | 
							.ok_or(DatabaseError::NotFound)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						let actions_db = match query.weekday {
 | 
				
			||||||
 | 
							None => db_macro.get_actions(&mut pool_conn).await?,
 | 
				
			||||||
 | 
							Some(weekday) => {
 | 
				
			||||||
 | 
								db_macro
 | 
				
			||||||
 | 
									.get_actions_weekday(&mut pool_conn, weekday)
 | 
				
			||||||
 | 
									.await?
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						let mut actions: Vec<MacroAction> = convert_db_list(&mut pool_conn, actions_db)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for action in &actions {
 | 
				
			||||||
 | 
							action.execute(&mut pool_conn).await?;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						let affected_controller_uids: Vec<EmgauwaUid> = actions
 | 
				
			||||||
 | 
							.iter()
 | 
				
			||||||
 | 
							.map(|action| action.relay.controller_id.clone())
 | 
				
			||||||
 | 
							.unique()
 | 
				
			||||||
 | 
							.collect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for controller_uid in affected_controller_uids {
 | 
				
			||||||
 | 
							let mut affected_relays: Vec<Relay> = Vec::new();
 | 
				
			||||||
 | 
							let mut affected_relay_ids: Vec<i64> = Vec::new();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for action in actions.iter_mut() {
 | 
				
			||||||
 | 
								if affected_relay_ids.contains(&action.relay.r.id) {
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								action.relay.reload(&mut pool_conn)?;
 | 
				
			||||||
 | 
								affected_relays.push(action.relay.clone());
 | 
				
			||||||
 | 
								affected_relay_ids.push(action.relay.r.id);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							app_state
 | 
				
			||||||
 | 
								.send(app_state::Action {
 | 
				
			||||||
 | 
									controller_uid,
 | 
				
			||||||
 | 
									action: ControllerWsAction::Relays(affected_relays.clone()),
 | 
				
			||||||
 | 
								})
 | 
				
			||||||
 | 
								.await??;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Ok(HttpResponse::Ok().finish()) // TODO add a message?
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,5 @@
 | 
				
			||||||
pub mod controllers;
 | 
					pub mod controllers;
 | 
				
			||||||
 | 
					pub mod macros;
 | 
				
			||||||
pub mod relays;
 | 
					pub mod relays;
 | 
				
			||||||
pub mod schedules;
 | 
					pub mod schedules;
 | 
				
			||||||
pub mod tags;
 | 
					pub mod tags;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -108,6 +108,12 @@ async fn main() -> Result<(), std::io::Error> {
 | 
				
			||||||
					.service(handlers::v1::tags::show)
 | 
										.service(handlers::v1::tags::show)
 | 
				
			||||||
					.service(handlers::v1::tags::delete)
 | 
										.service(handlers::v1::tags::delete)
 | 
				
			||||||
					.service(handlers::v1::tags::add)
 | 
										.service(handlers::v1::tags::add)
 | 
				
			||||||
 | 
										.service(handlers::v1::macros::index)
 | 
				
			||||||
 | 
										.service(handlers::v1::macros::show)
 | 
				
			||||||
 | 
										.service(handlers::v1::macros::add)
 | 
				
			||||||
 | 
										.service(handlers::v1::macros::update)
 | 
				
			||||||
 | 
										.service(handlers::v1::macros::delete)
 | 
				
			||||||
 | 
										.service(handlers::v1::macros::execute)
 | 
				
			||||||
					.service(handlers::v1::ws::ws_controllers)
 | 
										.service(handlers::v1::ws::ws_controllers)
 | 
				
			||||||
					.service(handlers::v1::ws::ws_relays),
 | 
										.service(handlers::v1::ws::ws_relays),
 | 
				
			||||||
			)
 | 
								)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										166
									
								
								emgauwa-lib/src/db/macro.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								emgauwa-lib/src/db/macro.rs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,166 @@
 | 
				
			||||||
 | 
					use std::ops::DerefMut;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use serde_derive::{Deserialize, Serialize};
 | 
				
			||||||
 | 
					use sqlx::pool::PoolConnection;
 | 
				
			||||||
 | 
					use sqlx::Sqlite;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use crate::db::{DbController, DbMacroAction, DbRelay, DbSchedule};
 | 
				
			||||||
 | 
					use crate::errors::DatabaseError;
 | 
				
			||||||
 | 
					use crate::types::{EmgauwaUid, RequestMacroAction};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Debug, Clone, Serialize, Deserialize)]
 | 
				
			||||||
 | 
					pub struct DbMacro {
 | 
				
			||||||
 | 
						#[serde(skip)]
 | 
				
			||||||
 | 
						pub id: i64,
 | 
				
			||||||
 | 
						#[serde(rename = "id")]
 | 
				
			||||||
 | 
						pub uid: EmgauwaUid,
 | 
				
			||||||
 | 
						pub name: String,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl DbMacro {
 | 
				
			||||||
 | 
						pub async fn get_all(conn: &mut PoolConnection<Sqlite>) -> Result<Vec<DbMacro>, DatabaseError> {
 | 
				
			||||||
 | 
							sqlx::query_as!(DbMacro, "SELECT * FROM macros")
 | 
				
			||||||
 | 
								.fetch_all(conn.deref_mut())
 | 
				
			||||||
 | 
								.await
 | 
				
			||||||
 | 
								.map_err(DatabaseError::from)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pub async fn get(
 | 
				
			||||||
 | 
							conn: &mut PoolConnection<Sqlite>,
 | 
				
			||||||
 | 
							id: i64,
 | 
				
			||||||
 | 
						) -> Result<Option<DbMacro>, DatabaseError> {
 | 
				
			||||||
 | 
							sqlx::query_as!(DbMacro, "SELECT * FROM macros WHERE id = ?", id)
 | 
				
			||||||
 | 
								.fetch_optional(conn.deref_mut())
 | 
				
			||||||
 | 
								.await
 | 
				
			||||||
 | 
								.map_err(DatabaseError::from)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pub async fn get_by_uid(
 | 
				
			||||||
 | 
							conn: &mut PoolConnection<Sqlite>,
 | 
				
			||||||
 | 
							filter_uid: &EmgauwaUid,
 | 
				
			||||||
 | 
						) -> Result<Option<DbMacro>, DatabaseError> {
 | 
				
			||||||
 | 
							sqlx::query_as!(DbMacro, "SELECT * FROM macros WHERE uid = ?", filter_uid)
 | 
				
			||||||
 | 
								.fetch_optional(conn.deref_mut())
 | 
				
			||||||
 | 
								.await
 | 
				
			||||||
 | 
								.map_err(DatabaseError::from)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pub async fn create(
 | 
				
			||||||
 | 
							conn: &mut PoolConnection<Sqlite>,
 | 
				
			||||||
 | 
							new_uid: EmgauwaUid,
 | 
				
			||||||
 | 
							new_name: &str,
 | 
				
			||||||
 | 
						) -> Result<DbMacro, DatabaseError> {
 | 
				
			||||||
 | 
							sqlx::query_as!(
 | 
				
			||||||
 | 
								DbMacro,
 | 
				
			||||||
 | 
								"INSERT INTO macros (uid, name) VALUES (?, ?) RETURNING *",
 | 
				
			||||||
 | 
								new_uid,
 | 
				
			||||||
 | 
								new_name
 | 
				
			||||||
 | 
							)
 | 
				
			||||||
 | 
							.fetch_optional(conn.deref_mut())
 | 
				
			||||||
 | 
							.await?
 | 
				
			||||||
 | 
							.ok_or(DatabaseError::InsertGetError)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pub async fn delete(&self, conn: &mut PoolConnection<Sqlite>) -> Result<(), DatabaseError> {
 | 
				
			||||||
 | 
							sqlx::query!("DELETE FROM macros WHERE id = ?", self.id)
 | 
				
			||||||
 | 
								.execute(conn.deref_mut())
 | 
				
			||||||
 | 
								.await
 | 
				
			||||||
 | 
								.map(|res| match res.rows_affected() {
 | 
				
			||||||
 | 
									0 => Err(DatabaseError::DeleteError),
 | 
				
			||||||
 | 
									_ => Ok(()),
 | 
				
			||||||
 | 
								})?
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pub async fn delete_by_uid(
 | 
				
			||||||
 | 
							conn: &mut PoolConnection<Sqlite>,
 | 
				
			||||||
 | 
							filter_uid: EmgauwaUid,
 | 
				
			||||||
 | 
						) -> Result<(), DatabaseError> {
 | 
				
			||||||
 | 
							if sqlx::query_scalar!("SELECT 1 FROM macros WHERE uid = ?", filter_uid)
 | 
				
			||||||
 | 
								.fetch_optional(conn.deref_mut())
 | 
				
			||||||
 | 
								.await?
 | 
				
			||||||
 | 
								.is_none()
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								return Err(DatabaseError::NotFound);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							sqlx::query!("DELETE FROM macros WHERE uid = ?", filter_uid)
 | 
				
			||||||
 | 
								.execute(conn.deref_mut())
 | 
				
			||||||
 | 
								.await
 | 
				
			||||||
 | 
								.map(|res| match res.rows_affected() {
 | 
				
			||||||
 | 
									0 => Err(DatabaseError::DeleteError),
 | 
				
			||||||
 | 
									_ => Ok(()),
 | 
				
			||||||
 | 
								})?
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pub async fn update(
 | 
				
			||||||
 | 
							&self,
 | 
				
			||||||
 | 
							conn: &mut PoolConnection<Sqlite>,
 | 
				
			||||||
 | 
							new_name: &str,
 | 
				
			||||||
 | 
						) -> Result<DbMacro, DatabaseError> {
 | 
				
			||||||
 | 
							sqlx::query!("UPDATE relays SET name = ? WHERE id = ?", new_name, self.id,)
 | 
				
			||||||
 | 
								.execute(conn.deref_mut())
 | 
				
			||||||
 | 
								.await?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							DbMacro::get(conn, self.id)
 | 
				
			||||||
 | 
								.await?
 | 
				
			||||||
 | 
								.ok_or(DatabaseError::UpdateGetError)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pub async fn set_actions(
 | 
				
			||||||
 | 
							&self,
 | 
				
			||||||
 | 
							conn: &mut PoolConnection<Sqlite>,
 | 
				
			||||||
 | 
							new_actions: &[RequestMacroAction],
 | 
				
			||||||
 | 
						) -> Result<(), DatabaseError> {
 | 
				
			||||||
 | 
							sqlx::query!("DELETE FROM macro_actions WHERE macro_id = ?", self.id)
 | 
				
			||||||
 | 
								.execute(conn.deref_mut())
 | 
				
			||||||
 | 
								.await?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for new_action in new_actions {
 | 
				
			||||||
 | 
								let controller = DbController::get_by_uid(conn, &new_action.relay.controller_id)
 | 
				
			||||||
 | 
									.await?
 | 
				
			||||||
 | 
									.ok_or(DatabaseError::NotFound)?;
 | 
				
			||||||
 | 
								let relay =
 | 
				
			||||||
 | 
									DbRelay::get_by_controller_and_num(conn, &controller, new_action.relay.number)
 | 
				
			||||||
 | 
										.await?
 | 
				
			||||||
 | 
										.ok_or(DatabaseError::NotFound)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								let schedule = DbSchedule::get_by_uid(conn, &new_action.schedule.id)
 | 
				
			||||||
 | 
									.await?
 | 
				
			||||||
 | 
									.ok_or(DatabaseError::NotFound)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								DbMacroAction::create(conn, self, &relay, &schedule, new_action.weekday).await?;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							Ok(())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pub async fn get_actions(
 | 
				
			||||||
 | 
							&self,
 | 
				
			||||||
 | 
							conn: &mut PoolConnection<Sqlite>,
 | 
				
			||||||
 | 
						) -> Result<Vec<DbMacroAction>, DatabaseError> {
 | 
				
			||||||
 | 
							sqlx::query_as!(
 | 
				
			||||||
 | 
								DbMacroAction,
 | 
				
			||||||
 | 
								"SELECT * FROM macro_actions WHERE macro_id = ?",
 | 
				
			||||||
 | 
								self.id
 | 
				
			||||||
 | 
							)
 | 
				
			||||||
 | 
							.fetch_all(conn.deref_mut())
 | 
				
			||||||
 | 
							.await
 | 
				
			||||||
 | 
							.map_err(DatabaseError::from)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pub async fn get_actions_weekday(
 | 
				
			||||||
 | 
							&self,
 | 
				
			||||||
 | 
							conn: &mut PoolConnection<Sqlite>,
 | 
				
			||||||
 | 
							weekday: i64,
 | 
				
			||||||
 | 
						) -> Result<Vec<DbMacroAction>, DatabaseError> {
 | 
				
			||||||
 | 
							sqlx::query_as!(
 | 
				
			||||||
 | 
								DbMacroAction,
 | 
				
			||||||
 | 
								"SELECT * FROM macro_actions WHERE macro_id = ? AND weekday = ?",
 | 
				
			||||||
 | 
								self.id,
 | 
				
			||||||
 | 
								weekday
 | 
				
			||||||
 | 
							)
 | 
				
			||||||
 | 
							.fetch_all(conn.deref_mut())
 | 
				
			||||||
 | 
							.await
 | 
				
			||||||
 | 
							.map_err(DatabaseError::from)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										99
									
								
								emgauwa-lib/src/db/macro_action.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								emgauwa-lib/src/db/macro_action.rs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,99 @@
 | 
				
			||||||
 | 
					use std::ops::DerefMut;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use sqlx::pool::PoolConnection;
 | 
				
			||||||
 | 
					use sqlx::Sqlite;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use crate::db::{DbMacro, DbRelay, DbSchedule};
 | 
				
			||||||
 | 
					use crate::errors::DatabaseError;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Debug, Clone)]
 | 
				
			||||||
 | 
					pub struct DbMacroAction {
 | 
				
			||||||
 | 
						pub id: i64,
 | 
				
			||||||
 | 
						pub macro_id: i64,
 | 
				
			||||||
 | 
						pub relay_id: i64,
 | 
				
			||||||
 | 
						pub schedule_id: i64,
 | 
				
			||||||
 | 
						pub weekday: i64, // should be u8, but sqlite will store it as i64
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl DbMacroAction {
 | 
				
			||||||
 | 
						pub async fn get_all(
 | 
				
			||||||
 | 
							conn: &mut PoolConnection<Sqlite>,
 | 
				
			||||||
 | 
						) -> Result<Vec<DbMacroAction>, DatabaseError> {
 | 
				
			||||||
 | 
							sqlx::query_as!(DbMacroAction, "SELECT * FROM macro_actions")
 | 
				
			||||||
 | 
								.fetch_all(conn.deref_mut())
 | 
				
			||||||
 | 
								.await
 | 
				
			||||||
 | 
								.map_err(DatabaseError::from)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pub async fn get(
 | 
				
			||||||
 | 
							conn: &mut PoolConnection<Sqlite>,
 | 
				
			||||||
 | 
							id: i64,
 | 
				
			||||||
 | 
						) -> Result<Option<DbMacroAction>, DatabaseError> {
 | 
				
			||||||
 | 
							sqlx::query_as!(
 | 
				
			||||||
 | 
								DbMacroAction,
 | 
				
			||||||
 | 
								"SELECT * FROM macro_actions WHERE id = ?",
 | 
				
			||||||
 | 
								id
 | 
				
			||||||
 | 
							)
 | 
				
			||||||
 | 
							.fetch_optional(conn.deref_mut())
 | 
				
			||||||
 | 
							.await
 | 
				
			||||||
 | 
							.map_err(DatabaseError::from)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pub async fn create(
 | 
				
			||||||
 | 
							conn: &mut PoolConnection<Sqlite>,
 | 
				
			||||||
 | 
							new_macro: &DbMacro,
 | 
				
			||||||
 | 
							new_relay: &DbRelay,
 | 
				
			||||||
 | 
							new_schedule: &DbSchedule,
 | 
				
			||||||
 | 
							new_weekday: i64,
 | 
				
			||||||
 | 
						) -> Result<DbMacroAction, DatabaseError> {
 | 
				
			||||||
 | 
							sqlx::query_as!(
 | 
				
			||||||
 | 
								DbMacroAction,
 | 
				
			||||||
 | 
								"INSERT INTO macro_actions (macro_id, relay_id, schedule_id, weekday) VALUES (?, ?, ?, ?) RETURNING *",
 | 
				
			||||||
 | 
								new_macro.id,
 | 
				
			||||||
 | 
								new_relay.id,
 | 
				
			||||||
 | 
								new_schedule.id,
 | 
				
			||||||
 | 
								new_weekday
 | 
				
			||||||
 | 
							)
 | 
				
			||||||
 | 
							.fetch_optional(conn.deref_mut())
 | 
				
			||||||
 | 
							.await?
 | 
				
			||||||
 | 
							.ok_or(DatabaseError::InsertGetError)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pub async fn delete(&self, conn: &mut PoolConnection<Sqlite>) -> Result<(), DatabaseError> {
 | 
				
			||||||
 | 
							sqlx::query!("DELETE FROM macro_actions WHERE id = ?", self.id)
 | 
				
			||||||
 | 
								.execute(conn.deref_mut())
 | 
				
			||||||
 | 
								.await
 | 
				
			||||||
 | 
								.map(|res| match res.rows_affected() {
 | 
				
			||||||
 | 
									0 => Err(DatabaseError::DeleteError),
 | 
				
			||||||
 | 
									_ => Ok(()),
 | 
				
			||||||
 | 
								})?
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pub async fn get_relay(
 | 
				
			||||||
 | 
							&self,
 | 
				
			||||||
 | 
							conn: &mut PoolConnection<Sqlite>,
 | 
				
			||||||
 | 
						) -> Result<DbRelay, DatabaseError> {
 | 
				
			||||||
 | 
							DbRelay::get(conn, self.relay_id)
 | 
				
			||||||
 | 
								.await?
 | 
				
			||||||
 | 
								.ok_or(DatabaseError::NotFound)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pub async fn get_schedule(
 | 
				
			||||||
 | 
							&self,
 | 
				
			||||||
 | 
							conn: &mut PoolConnection<Sqlite>,
 | 
				
			||||||
 | 
						) -> Result<DbSchedule, DatabaseError> {
 | 
				
			||||||
 | 
							DbSchedule::get(conn, self.schedule_id)
 | 
				
			||||||
 | 
								.await?
 | 
				
			||||||
 | 
								.ok_or(DatabaseError::NotFound)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pub async fn get_macro(
 | 
				
			||||||
 | 
							&self,
 | 
				
			||||||
 | 
							conn: &mut PoolConnection<Sqlite>,
 | 
				
			||||||
 | 
						) -> Result<DbMacro, DatabaseError> {
 | 
				
			||||||
 | 
							DbMacro::get(conn, self.macro_id)
 | 
				
			||||||
 | 
								.await?
 | 
				
			||||||
 | 
								.ok_or(DatabaseError::NotFound)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -7,6 +7,8 @@ use sqlx::{ConnectOptions, Pool, Sqlite};
 | 
				
			||||||
mod controllers;
 | 
					mod controllers;
 | 
				
			||||||
mod junction_relay_schedule;
 | 
					mod junction_relay_schedule;
 | 
				
			||||||
mod junction_tag;
 | 
					mod junction_tag;
 | 
				
			||||||
 | 
					mod r#macro;
 | 
				
			||||||
 | 
					mod macro_action;
 | 
				
			||||||
mod model_utils;
 | 
					mod model_utils;
 | 
				
			||||||
mod relays;
 | 
					mod relays;
 | 
				
			||||||
mod schedules;
 | 
					mod schedules;
 | 
				
			||||||
| 
						 | 
					@ -15,6 +17,8 @@ mod tag;
 | 
				
			||||||
pub use controllers::DbController;
 | 
					pub use controllers::DbController;
 | 
				
			||||||
pub use junction_relay_schedule::DbJunctionRelaySchedule;
 | 
					pub use junction_relay_schedule::DbJunctionRelaySchedule;
 | 
				
			||||||
pub use junction_tag::DbJunctionTag;
 | 
					pub use junction_tag::DbJunctionTag;
 | 
				
			||||||
 | 
					pub use macro_action::DbMacroAction;
 | 
				
			||||||
 | 
					pub use r#macro::DbMacro;
 | 
				
			||||||
pub use relays::DbRelay;
 | 
					pub use relays::DbRelay;
 | 
				
			||||||
pub use schedules::{DbPeriods, DbSchedule};
 | 
					pub use schedules::{DbPeriods, DbSchedule};
 | 
				
			||||||
pub use tag::DbTag;
 | 
					pub use tag::DbTag;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										42
									
								
								emgauwa-lib/src/models/macro.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								emgauwa-lib/src/models/macro.rs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,42 @@
 | 
				
			||||||
 | 
					use futures::executor::block_on;
 | 
				
			||||||
 | 
					use serde_derive::{Deserialize, Serialize};
 | 
				
			||||||
 | 
					use sqlx::pool::PoolConnection;
 | 
				
			||||||
 | 
					use sqlx::Sqlite;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use crate::db::DbMacro;
 | 
				
			||||||
 | 
					use crate::errors::DatabaseError;
 | 
				
			||||||
 | 
					use crate::models::{convert_db_list, FromDbModel, MacroAction};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Serialize, Deserialize, Debug, Clone)]
 | 
				
			||||||
 | 
					pub struct Macro {
 | 
				
			||||||
 | 
						#[serde(flatten)]
 | 
				
			||||||
 | 
						pub m: DbMacro,
 | 
				
			||||||
 | 
						pub actions: Vec<MacroAction>,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl FromDbModel for Macro {
 | 
				
			||||||
 | 
						type DbModel = DbMacro;
 | 
				
			||||||
 | 
						type DbModelCache = ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fn from_db_model(
 | 
				
			||||||
 | 
							conn: &mut PoolConnection<Sqlite>,
 | 
				
			||||||
 | 
							db_model: Self::DbModel,
 | 
				
			||||||
 | 
						) -> Result<Self, DatabaseError> {
 | 
				
			||||||
 | 
							Self::from_db_model_cache(conn, db_model, ())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fn from_db_model_cache(
 | 
				
			||||||
 | 
							conn: &mut PoolConnection<Sqlite>,
 | 
				
			||||||
 | 
							db_model: Self::DbModel,
 | 
				
			||||||
 | 
							_cache: Self::DbModelCache,
 | 
				
			||||||
 | 
						) -> Result<Self, DatabaseError> {
 | 
				
			||||||
 | 
							let actions_db = block_on(db_model.get_actions(conn))?;
 | 
				
			||||||
 | 
							let actions: Vec<MacroAction> = convert_db_list(conn, actions_db)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Ok(Macro {
 | 
				
			||||||
 | 
								m: db_model,
 | 
				
			||||||
 | 
								actions,
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										56
									
								
								emgauwa-lib/src/models/macro_action.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								emgauwa-lib/src/models/macro_action.rs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,56 @@
 | 
				
			||||||
 | 
					use futures::executor::block_on;
 | 
				
			||||||
 | 
					use serde_derive::{Deserialize, Serialize};
 | 
				
			||||||
 | 
					use sqlx::pool::PoolConnection;
 | 
				
			||||||
 | 
					use sqlx::Sqlite;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use crate::db::{DbJunctionRelaySchedule, DbMacroAction};
 | 
				
			||||||
 | 
					use crate::errors::{DatabaseError, EmgauwaError};
 | 
				
			||||||
 | 
					use crate::models::{FromDbModel, Relay, Schedule};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Serialize, Deserialize, Debug, Clone)]
 | 
				
			||||||
 | 
					pub struct MacroAction {
 | 
				
			||||||
 | 
						pub schedule: Schedule,
 | 
				
			||||||
 | 
						pub relay: Relay,
 | 
				
			||||||
 | 
						pub weekday: i64,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl FromDbModel for MacroAction {
 | 
				
			||||||
 | 
						type DbModel = DbMacroAction;
 | 
				
			||||||
 | 
						type DbModelCache = ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fn from_db_model(
 | 
				
			||||||
 | 
							conn: &mut PoolConnection<Sqlite>,
 | 
				
			||||||
 | 
							db_model: Self::DbModel,
 | 
				
			||||||
 | 
						) -> Result<Self, DatabaseError> {
 | 
				
			||||||
 | 
							Self::from_db_model_cache(conn, db_model, ())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fn from_db_model_cache(
 | 
				
			||||||
 | 
							conn: &mut PoolConnection<Sqlite>,
 | 
				
			||||||
 | 
							db_model: Self::DbModel,
 | 
				
			||||||
 | 
							_cache: Self::DbModelCache,
 | 
				
			||||||
 | 
						) -> Result<Self, DatabaseError> {
 | 
				
			||||||
 | 
							let schedule_db = block_on(db_model.get_schedule(conn))?;
 | 
				
			||||||
 | 
							let schedule = Schedule::from_db_model(conn, schedule_db)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							let relay_db = block_on(db_model.get_relay(conn))?;
 | 
				
			||||||
 | 
							let relay = Relay::from_db_model(conn, relay_db)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							let weekday = db_model.weekday;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Ok(MacroAction {
 | 
				
			||||||
 | 
								schedule,
 | 
				
			||||||
 | 
								relay,
 | 
				
			||||||
 | 
								weekday,
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl MacroAction {
 | 
				
			||||||
 | 
						pub async fn execute(&self, conn: &mut PoolConnection<Sqlite>) -> Result<(), EmgauwaError> {
 | 
				
			||||||
 | 
							DbJunctionRelaySchedule::set_schedule(conn, &self.relay.r, &self.schedule.s, self.weekday)
 | 
				
			||||||
 | 
								.await?;
 | 
				
			||||||
 | 
							Ok(())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,9 +1,13 @@
 | 
				
			||||||
mod controller;
 | 
					mod controller;
 | 
				
			||||||
 | 
					mod r#macro;
 | 
				
			||||||
 | 
					mod macro_action;
 | 
				
			||||||
mod relay;
 | 
					mod relay;
 | 
				
			||||||
mod schedule;
 | 
					mod schedule;
 | 
				
			||||||
mod tag;
 | 
					mod tag;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub use controller::Controller;
 | 
					pub use controller::Controller;
 | 
				
			||||||
 | 
					pub use macro_action::MacroAction;
 | 
				
			||||||
 | 
					pub use r#macro::Macro;
 | 
				
			||||||
pub use relay::Relay;
 | 
					pub use relay::Relay;
 | 
				
			||||||
pub use schedule::Schedule;
 | 
					pub use schedule::Schedule;
 | 
				
			||||||
use sqlx::pool::PoolConnection;
 | 
					use sqlx::pool::PoolConnection;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,7 @@ use sqlx::Sqlite;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use crate::db::{DbPeriods, DbSchedule};
 | 
					use crate::db::{DbPeriods, DbSchedule};
 | 
				
			||||||
use crate::errors::DatabaseError;
 | 
					use crate::errors::DatabaseError;
 | 
				
			||||||
use crate::types::ScheduleUid;
 | 
					use crate::types::{EmgauwaUid, ScheduleUid};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Debug, Serialize, Deserialize)]
 | 
					#[derive(Debug, Serialize, Deserialize)]
 | 
				
			||||||
pub struct RequestScheduleCreate {
 | 
					pub struct RequestScheduleCreate {
 | 
				
			||||||
| 
						 | 
					@ -48,6 +48,41 @@ pub struct RequestTagCreate {
 | 
				
			||||||
	pub tag: String,
 | 
						pub tag: String,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Debug, Serialize, Deserialize)]
 | 
				
			||||||
 | 
					pub struct RequestMacroActionRelay {
 | 
				
			||||||
 | 
						pub number: i64,
 | 
				
			||||||
 | 
						pub controller_id: EmgauwaUid,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Debug, Serialize, Deserialize)]
 | 
				
			||||||
 | 
					pub struct RequestMacroActionSchedule {
 | 
				
			||||||
 | 
						pub id: ScheduleUid,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Debug, Serialize, Deserialize)]
 | 
				
			||||||
 | 
					pub struct RequestMacroAction {
 | 
				
			||||||
 | 
						pub weekday: i64,
 | 
				
			||||||
 | 
						pub relay: RequestMacroActionRelay,
 | 
				
			||||||
 | 
						pub schedule: RequestMacroActionSchedule,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Debug, Serialize, Deserialize)]
 | 
				
			||||||
 | 
					pub struct RequestMacroCreate {
 | 
				
			||||||
 | 
						pub name: String,
 | 
				
			||||||
 | 
						pub actions: Vec<RequestMacroAction>,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Debug, Serialize, Deserialize)]
 | 
				
			||||||
 | 
					pub struct RequestMacroUpdate {
 | 
				
			||||||
 | 
						pub name: Option<String>,
 | 
				
			||||||
 | 
						pub actions: Option<Vec<RequestMacroAction>>,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Debug, Deserialize)]
 | 
				
			||||||
 | 
					pub struct RequestMacroExecute {
 | 
				
			||||||
 | 
						pub weekday: Option<i64>,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl RequestScheduleId {
 | 
					impl RequestScheduleId {
 | 
				
			||||||
	pub async fn get_schedule(
 | 
						pub async fn get_schedule(
 | 
				
			||||||
		&self,
 | 
							&self,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -125,7 +125,7 @@ CREATE TABLE macros
 | 
				
			||||||
        AUTOINCREMENT
 | 
					        AUTOINCREMENT
 | 
				
			||||||
        NOT NULL,
 | 
					        NOT NULL,
 | 
				
			||||||
    uid
 | 
					    uid
 | 
				
			||||||
        VARCHAR(36)
 | 
					        BLOB
 | 
				
			||||||
        NOT NULL
 | 
					        NOT NULL
 | 
				
			||||||
        UNIQUE,
 | 
					        UNIQUE,
 | 
				
			||||||
    name
 | 
					    name
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue