Skip to content

Commit 78684bc

Browse files
committed
add storage support
1 parent 4a9a7db commit 78684bc

12 files changed

+562
-9
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ A lightweight addon which integrates Supabase APIs for Godot Engine out of the b
66
- [x] Authentication (/auth)
77
- [x] Database (/database)
88
- [x] Realtime (/realtime)
9-
- [ ] Storage (/storage)
9+
- [x] Storage (/storage)
1010

1111
### examples and demos
1212
A collection of examples and live demos is available at [*fenix-hub/godot-engine.supabase-examples*](https://github.com/fenix-hub/godot-engine.supabase-examples), both with source code and exported binaries.

addons/supabase/Auth/auth.gd

+7
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,13 @@ func sign_in(email : String, password : String = "") -> AuthTask:
7676
_process_task(auth_task)
7777
return auth_task
7878

79+
80+
# Sign in as an anonymous user
81+
func sign_in_anonymous() -> void:
82+
_auth = _config.supabaseKey
83+
_bearer[0] = _bearer[0] % _auth
84+
emit_signal("signed_in", null)
85+
7986
# Sign in with a Provider
8087
# @provider = Providers.PROVIDER
8188
func sign_in_with_provider(provider : String, grab_from_browser : bool = true, port : int = 3000) -> void:

addons/supabase/Database/database.gd

+5-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ func _init(conf : Dictionary, head : PoolStringArray) -> void:
2626
func query(supabase_query : SupabaseQuery) -> DatabaseTask:
2727
_bearer = Supabase.auth._bearer
2828
var endpoint : String = _config.supabaseUrl + _rest_endpoint + supabase_query.build_query()
29-
var task : DatabaseTask = DatabaseTask.new(
29+
var task : DatabaseTask = DatabaseTask.new()
30+
task._setup(
3031
supabase_query,
3132
supabase_query.request,
3233
endpoint,
@@ -39,7 +40,8 @@ func query(supabase_query : SupabaseQuery) -> DatabaseTask:
3940
func rpc(function_name : String, arguments : Dictionary = {}, supabase_query : SupabaseQuery = null) -> DatabaseTask:
4041
_bearer = Supabase.auth._bearer
4142
var endpoint : String = _config.supabaseUrl + _rest_endpoint + "rpc/{function}".format({function = function_name}) + (supabase_query.build_query() if supabase_query!=null else "")
42-
var task : DatabaseTask = DatabaseTask.new(
43+
var task : DatabaseTask = DatabaseTask.new()
44+
task._setup(
4345
supabase_query,
4446
-2,
4547
endpoint,
@@ -57,7 +59,7 @@ func _process_task(task : DatabaseTask) -> void:
5759

5860
# .............. HTTPRequest completed
5961
func _on_task_completed(task : DatabaseTask) -> void:
60-
task._handler.queue_free()
62+
if task._handler != null: task._handler.queue_free()
6163
if task.data!=null and not task.data.empty():
6264
match task._code:
6365
SupabaseQuery.REQUESTS.SELECT: emit_signal("selected", task.data)

addons/supabase/Database/database_error.gd

-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ func _init(dictionary : Dictionary = {}) -> void:
1313
if not _error.empty():
1414
code = _error.code if _error.has("code") else "empty"
1515
message = _error.message
16-
# id = _error.error_id
1716
hint = _error.hint if _error.has("hint") and _error.hint != null else "empty"
1817
details = _error.details if _error.has("details") and _error.details != null else "empty"
1918
### always different behavior ???

addons/supabase/Database/database_task.gd

+7-3
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,18 @@ var error : SupabaseDatabaseError
1717

1818
var _handler : HTTPRequest
1919

20-
func _init(query : SupabaseQuery, code : int, endpoint : String, headers : PoolStringArray, payload : String = ""):
20+
func _init(data = null, error : SupabaseDatabaseError = null) -> void:
21+
self.data = data
22+
self.error = error
23+
24+
func _setup(query : SupabaseQuery, code : int, endpoint : String, headers : PoolStringArray, payload : String = ""):
2125
_query = query
2226
_code = code
2327
_endpoint = endpoint
2428
_headers = headers
2529
_payload = payload
2630
_method = match_code(code)
27-
31+
2832

2933
func match_code(code : int) -> int:
3034
match code:
@@ -51,5 +55,5 @@ func _on_task_completed(result : int, response_code : int, headers : PoolStringA
5155
func complete(_result, _error : SupabaseDatabaseError = null) -> void:
5256
data = _result
5357
error = _error
54-
_handler.queue_free()
58+
if _handler : _handler.queue_free()
5559
emit_signal("completed", self)

addons/supabase/Database/query.gd

+1-1
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ func text_seach(column : String, query : String, type : String = "", config : St
219219
"websearch": filter = Filters.WFTS
220220
_: filter = Filters.FTS
221221
query = query.replacen(" ", "%20")
222-
filter(column, filter, query, {config = config})
222+
filter(column, filter, query, {config = config} if config != "" else {})
223223
return self
224224

225225
func clean() -> void:

addons/supabase/Storage/storage.gd

+130
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
class_name SupabaseStorage
2+
extends Node
3+
4+
signal listed_buckets(buckets)
5+
signal got_bucket(details)
6+
signal created_bucket(details)
7+
signal updated_bucket(details)
8+
signal emptied_bucket(details)
9+
signal deleted_bucket(details)
10+
signal error(error)
11+
12+
const _rest_endpoint : String = "/storage/v1/"
13+
14+
var _config : Dictionary
15+
var _header : PoolStringArray = ["Content-type: application/json"]
16+
var _bearer : PoolStringArray = ["Authorization: Bearer %s"]
17+
18+
var _pooled_tasks : Array = []
19+
20+
21+
func _init(config : Dictionary) -> void:
22+
_config = config
23+
name = "Storage"
24+
25+
func list_buckets() -> StorageTask:
26+
_bearer = Supabase.auth._bearer
27+
var endpoint : String = _config.supabaseUrl + _rest_endpoint + "bucket"
28+
var task : StorageTask = StorageTask.new()
29+
task._setup(
30+
task.METHODS.LIST_BUCKETS,
31+
endpoint,
32+
_header + _bearer)
33+
_process_task(task)
34+
return task
35+
36+
37+
func get_bucket(id : String) -> StorageTask:
38+
_bearer = Supabase.auth._bearer
39+
var endpoint : String = _config.supabaseUrl + _rest_endpoint + "bucket/" + id
40+
var task : StorageTask = StorageTask.new()
41+
task._setup(
42+
task.METHODS.GET_BUCKET,
43+
endpoint,
44+
_header + _bearer)
45+
_process_task(task)
46+
return task
47+
48+
49+
func create_bucket(_name : String, id : String, public : bool = false) -> StorageTask:
50+
_bearer = Supabase.auth._bearer
51+
var endpoint : String = _config.supabaseUrl + _rest_endpoint + "bucket"
52+
var task : StorageTask = StorageTask.new()
53+
task._setup(
54+
task.METHODS.CREATE_BUCKET,
55+
endpoint,
56+
_header + _bearer,
57+
to_json({"name" : _name, id = id, public = public}))
58+
_process_task(task)
59+
return task
60+
61+
62+
func update_bucket(id : String, public : bool) -> StorageTask:
63+
_bearer = Supabase.auth._bearer
64+
var endpoint : String = _config.supabaseUrl + _rest_endpoint + "bucket/" + id
65+
var task : StorageTask = StorageTask.new()
66+
task._setup(
67+
task.METHODS.UPDATE_BUCKET,
68+
endpoint,
69+
_header + _bearer,
70+
to_json({public = public}))
71+
_process_task(task)
72+
return task
73+
74+
75+
func empty_bucket(id : String) -> StorageTask:
76+
_bearer = Supabase.auth._bearer
77+
var endpoint : String = _config.supabaseUrl + _rest_endpoint + "bucket/" + id + "/empty"
78+
var task : StorageTask = StorageTask.new()
79+
task._setup(
80+
task.METHODS.EMPTY_BUCKET,
81+
endpoint,
82+
_bearer)
83+
_process_task(task)
84+
return task
85+
86+
87+
func delete_bucket(id : String) -> StorageTask:
88+
_bearer = Supabase.auth._bearer
89+
var endpoint : String = _config.supabaseUrl + _rest_endpoint + "bucket/" + id
90+
var task : StorageTask = StorageTask.new()
91+
task._setup(
92+
task.METHODS.DELETE_BUCKET,
93+
endpoint,
94+
_bearer)
95+
_process_task(task)
96+
return task
97+
98+
99+
func from(id : String) -> StorageBucket:
100+
for bucket in get_children():
101+
if bucket.id == id:
102+
return bucket
103+
var storage_bucket : StorageBucket = StorageBucket.new(id, _config)
104+
add_child(storage_bucket)
105+
return storage_bucket
106+
107+
# ---
108+
109+
func _process_task(task : StorageTask) -> void:
110+
var httprequest : HTTPRequest = HTTPRequest.new()
111+
add_child(httprequest)
112+
task.connect("completed", self, "_on_task_completed")
113+
task.push_request(httprequest)
114+
_pooled_tasks.append(task)
115+
116+
# .............. HTTPRequest completed
117+
func _on_task_completed(task : StorageTask) -> void:
118+
if task._handler : task._handler.queue_free()
119+
if task.data!=null and not task.data.empty():
120+
match task._code:
121+
task.METHODS.LIST_BUCKETS: emit_signal("listed_buckets", task.data)
122+
task.METHODS.GET_BUCKET: emit_signal("got_bucket", task.data)
123+
task.METHODS.CREATE_BUCKET: emit_signal("created_bucket", task.data)
124+
task.METHODS.UPDATE_BUCKET: emit_signal("updated_bucket", task.data)
125+
task.METHODS.EMPTY_BUCKET: emit_signal("emptied_bucket", task.data)
126+
task.METHODS.DELETE_BUCKET: emit_signal("deleted_bucket", task.data)
127+
_:
128+
emit_signal("rpc_completed", task.data)
129+
elif task.error != null:
130+
emit_signal("error", task.error)

0 commit comments

Comments
 (0)