diff --git a/addons/supabase/Auth/auth.gd b/addons/supabase/Auth/auth.gd index 4212d76..b456d49 100644 --- a/addons/supabase/Auth/auth.gd +++ b/addons/supabase/Auth/auth.gd @@ -168,7 +168,7 @@ func sign_out() -> AuthTask: var auth_task : AuthTask = AuthTask.new( AuthTask.Task.LOGOUT, _config.supabaseUrl + _logout_endpoint, - _header) + _header + _bearer) _process_task(auth_task) return auth_task @@ -273,45 +273,49 @@ func _process_task(task : AuthTask, _fake : bool = false) -> void: func _on_task_completed(task : AuthTask) -> void: if task._handler!=null: task._handler.queue_free() - if task.user != null: - client = task.user - _auth = client.access_token - _bearer[0] = _bearer[0] % _auth - _expires_in = client.expires_in - match task._code: - AuthTask.Task.SIGNUP: - emit_signal("signed_up", client) - AuthTask.Task.SIGNUPPHONEPASSWORD: - emit_signal("signed_up_phone", client) - AuthTask.Task.SIGNIN: - emit_signal("signed_in", client) - AuthTask.Task.SIGNINOTP: - emit_signal("signed_in_otp", client) - AuthTask.Task.UPDATE: - emit_signal("user_updated", client) - AuthTask.Task.REFRESH: - emit_signal("token_refreshed", client) - AuthTask.Task.VERIFYOTP: - emit_signal("otp_verified") - AuthTask.Task.SIGNINANONYM: - emit_signal("signed_in_anonyous") - refresh_token() - elif task.data == null: - match task._code: - AuthTask.Task.MAGICLINK: - emit_signal("magic_link_sent") - AuthTask.Task.RECOVER: - emit_signal("reset_email_sent") - AuthTask.Task.INVITE: - emit_signal("user_invited") - AuthTask.Task.LOGOUT: - emit_signal("signed_out") - client = null - _auth = "" - _bearer = ["Authorization: Bearer %s"] - _expires_in = 0 - elif task.error != null: + + if task.error != null: emit_signal("error", task.error) + else: + if task.user != null: + client = task.user + _auth = client.access_token + _bearer[0] = _bearer[0] % _auth + _expires_in = client.expires_in + match task._code: + AuthTask.Task.SIGNUP: + emit_signal("signed_up", client) + AuthTask.Task.SIGNUPPHONEPASSWORD: + emit_signal("signed_up_phone", client) + AuthTask.Task.SIGNIN: + emit_signal("signed_in", client) + AuthTask.Task.SIGNINOTP: + emit_signal("signed_in_otp", client) + AuthTask.Task.UPDATE: + emit_signal("user_updated", client) + AuthTask.Task.REFRESH: + emit_signal("token_refreshed", client) + AuthTask.Task.VERIFYOTP: + emit_signal("otp_verified") + AuthTask.Task.SIGNINANONYM: + emit_signal("signed_in_anonyous") + refresh_token() + else: + if task.data.empty() or task.data == null: + match task._code: + AuthTask.Task.MAGICLINK: + emit_signal("magic_link_sent") + AuthTask.Task.RECOVER: + emit_signal("reset_email_sent") + AuthTask.Task.INVITE: + emit_signal("user_invited") + AuthTask.Task.LOGOUT: + emit_signal("signed_out") + client = null + _auth = "" + _bearer = ["Authorization: Bearer %s"] + _expires_in = 0 + # A timer used to listen through TCP on the redirect uri of the request func _tcp_stream_timer() -> void: diff --git a/addons/supabase/Auth/auth_task.gd b/addons/supabase/Auth/auth_task.gd index 8b4fdf2..ca4ad0f 100644 --- a/addons/supabase/Auth/auth_task.gd +++ b/addons/supabase/Auth/auth_task.gd @@ -54,6 +54,8 @@ func push_request(httprequest : HTTPRequest) -> void: _handler = httprequest _handler.connect("request_completed", self, "_on_task_completed") _handler.request(_endpoint, _headers, true, _method, to_json(_payload)) + yield(_handler, "request_completed") + func _on_task_completed(result : int, response_code : int, headers : PoolStringArray, body : PoolByteArray) -> void: var result_body : Dictionary = JSON.parse(body.get_string_from_utf8()).result if body.get_string_from_utf8() else {} diff --git a/addons/supabase/Database/database.gd b/addons/supabase/Database/database.gd index 116e171..d2e65d2 100644 --- a/addons/supabase/Database/database.gd +++ b/addons/supabase/Database/database.gd @@ -24,7 +24,7 @@ func _init(conf : Dictionary, head : PoolStringArray) -> void: # Issue a query on your database func query(supabase_query : SupabaseQuery) -> DatabaseTask: - _bearer = Supabase.auth._bearer + _bearer = get_parent().auth._bearer var endpoint : String = _config.supabaseUrl + _rest_endpoint + supabase_query.build_query() var task : DatabaseTask = DatabaseTask.new() task._setup( @@ -38,7 +38,7 @@ func query(supabase_query : SupabaseQuery) -> DatabaseTask: # Issue an rpc() call to a function func rpc(function_name : String, arguments : Dictionary = {}, supabase_query : SupabaseQuery = null) -> DatabaseTask: - _bearer = Supabase.auth._bearer + _bearer = get_parent().auth._bearer var endpoint : String = _config.supabaseUrl + _rest_endpoint + "rpc/{function}".format({function = function_name}) + (supabase_query.build_query() if supabase_query!=null else "") var task : DatabaseTask = DatabaseTask.new() task._setup( diff --git a/addons/supabase/Storage/storage.gd b/addons/supabase/Storage/storage.gd index b8817bb..fdd0459 100644 --- a/addons/supabase/Storage/storage.gd +++ b/addons/supabase/Storage/storage.gd @@ -23,7 +23,7 @@ func _init(config : Dictionary) -> void: name = "Storage" func list_buckets() -> StorageTask: - _bearer = Supabase.auth._bearer + _bearer = get_parent().auth._bearer var endpoint : String = _config.supabaseUrl + _rest_endpoint + "bucket" var task : StorageTask = StorageTask.new() task._setup( @@ -35,7 +35,7 @@ func list_buckets() -> StorageTask: func get_bucket(id : String) -> StorageTask: - _bearer = Supabase.auth._bearer + _bearer = get_parent().auth._bearer var endpoint : String = _config.supabaseUrl + _rest_endpoint + "bucket/" + id var task : StorageTask = StorageTask.new() task._setup( @@ -47,7 +47,7 @@ func get_bucket(id : String) -> StorageTask: func create_bucket(_name : String, id : String, public : bool = false) -> StorageTask: - _bearer = Supabase.auth._bearer + _bearer = get_parent().auth._bearer var endpoint : String = _config.supabaseUrl + _rest_endpoint + "bucket" var task : StorageTask = StorageTask.new() task._setup( @@ -60,7 +60,7 @@ func create_bucket(_name : String, id : String, public : bool = false) -> Storag func update_bucket(id : String, public : bool) -> StorageTask: - _bearer = Supabase.auth._bearer + _bearer = get_parent().auth._bearer var endpoint : String = _config.supabaseUrl + _rest_endpoint + "bucket/" + id var task : StorageTask = StorageTask.new() task._setup( @@ -73,7 +73,7 @@ func update_bucket(id : String, public : bool) -> StorageTask: func empty_bucket(id : String) -> StorageTask: - _bearer = Supabase.auth._bearer + _bearer = get_parent().auth._bearer var endpoint : String = _config.supabaseUrl + _rest_endpoint + "bucket/" + id + "/empty" var task : StorageTask = StorageTask.new() task._setup( @@ -85,7 +85,7 @@ func empty_bucket(id : String) -> StorageTask: func delete_bucket(id : String) -> StorageTask: - _bearer = Supabase.auth._bearer + _bearer = get_parent().auth._bearer var endpoint : String = _config.supabaseUrl + _rest_endpoint + "bucket/" + id var task : StorageTask = StorageTask.new() task._setup( @@ -100,7 +100,7 @@ func from(id : String) -> StorageBucket: for bucket in get_children(): if bucket.id == id: return bucket - var storage_bucket : StorageBucket = StorageBucket.new(id, _config) + var storage_bucket : StorageBucket = StorageBucket.new(id, _config, get_parent().auth._bearer) add_child(storage_bucket) return storage_bucket diff --git a/addons/supabase/Storage/storage_bucket.gd b/addons/supabase/Storage/storage_bucket.gd index 27f88ca..53c0fe5 100644 --- a/addons/supabase/Storage/storage_bucket.gd +++ b/addons/supabase/Storage/storage_bucket.gd @@ -62,16 +62,15 @@ var _response_code : int var id : String -func _init(id : String , config : Dictionary) -> void: +func _init(id : String , config : Dictionary, bearer : PoolStringArray) -> void: _config = config self.id = id - _http_client + _bearer = bearer name = "Bucket_"+id set_process_internal(false) func list(prefix : String = "", limit : int = 100, offset : int = 0, sort_by : Dictionary = {column = "name", order = "asc"} ) -> StorageTask: - _bearer = Supabase.auth._bearer var endpoint : String = _config.supabaseUrl + _rest_endpoint + "list/" + id var task : StorageTask = StorageTask.new() var header : PoolStringArray = [_header[0] % "application/json"] @@ -86,7 +85,6 @@ func list(prefix : String = "", limit : int = 100, offset : int = 0, sort_by : D func upload(object : String, file_path : String, upsert : bool = false) -> StorageTask: requesting_raw = true - _bearer = Supabase.auth._bearer var task : StorageTask = StorageTask.new() var endpoint : String = _config.supabaseUrl + _rest_endpoint + id + "/" + object var file : File = File.new() @@ -114,7 +112,6 @@ func upload(object : String, file_path : String, upsert : bool = false) -> Stora func update(bucket_path : String, file_path : String) -> StorageTask: requesting_raw = true - _bearer = Supabase.auth._bearer var endpoint : String = _config.supabaseUrl + _rest_endpoint + id + "/" + bucket_path var file : File = File.new() file.open(file_path, File.READ) @@ -136,7 +133,6 @@ func update(bucket_path : String, file_path : String) -> StorageTask: func move(source_path : String, destination_path : String) -> StorageTask: - _bearer = Supabase.auth._bearer var endpoint : String = _config.supabaseUrl + _rest_endpoint + "move" var task : StorageTask = StorageTask.new() var header : PoolStringArray = [_header[0] % "application/json"] @@ -150,7 +146,6 @@ func move(source_path : String, destination_path : String) -> StorageTask: func create_signed_url(object : String, expires_in : int = 60000) -> StorageTask: - _bearer = Supabase.auth._bearer var endpoint : String = _config.supabaseUrl + _rest_endpoint + "sign/" + id + "/" + object var task : StorageTask = StorageTask.new() var header : PoolStringArray = [_header[0] % "application/json"] @@ -166,7 +161,6 @@ func create_signed_url(object : String, expires_in : int = 60000) -> StorageTask func download(object : String, to_path : String = "", private : bool = false) -> StorageTask: if not private: - _bearer = Supabase.auth._bearer var endpoint : String = _config.supabaseUrl + _rest_endpoint + "public/" + id + "/" + object var task : StorageTask = StorageTask.new() var header : PoolStringArray = [_header[0] % "application/json"] @@ -178,7 +172,6 @@ func download(object : String, to_path : String = "", private : bool = false) -> _process_task(task, {download_file = to_path}) return task else: - _bearer = Supabase.auth._bearer var endpoint : String = _config.supabaseUrl + _rest_endpoint + "authenticated/" + id + "/" + object var task : StorageTask = StorageTask.new() var header : PoolStringArray = [_header[0] % "application/json"] @@ -196,7 +189,6 @@ func get_public_url(object : String) -> String: func remove(objects : PoolStringArray) -> StorageTask: - _bearer = Supabase.auth._bearer var endpoint : String = _config.supabaseUrl + _rest_endpoint + id + ("/" + objects[0] if objects.size() == 1 else "") var task : StorageTask = StorageTask.new() var header : PoolStringArray = [_header[0] % "application/json"] diff --git a/addons/supabase/User/user.gd b/addons/supabase/User/user.gd new file mode 100644 index 0000000..2a0e50a --- /dev/null +++ b/addons/supabase/User/user.gd @@ -0,0 +1,42 @@ +extends Reference +class_name SupabaseUser + +var email : String +var id : String +var access_token : String +var token_type : String +var refresh_token : String +var expires_in : float +var created_at : String +var updated_at : String +var last_sign_in_at : String +var user : Dictionary +var user_metadata : Dictionary +var app_metadata : Dictionary +var role : String +var confirmation_sent_at : String + +func _init(user_dictionary : Dictionary) -> void: + if user_dictionary.has("user"): + access_token = user_dictionary.access_token + token_type = user_dictionary.token_type + refresh_token = user_dictionary.refresh_token + expires_in = user_dictionary.expires_in + user = user_dictionary.user + last_sign_in_at = user.last_sign_in_at + else: + user = user_dictionary + confirmation_sent_at = user.confirmation_sent_at + + email = user.email + id = user.id + created_at = user.created_at + updated_at = user.updated_at + user_metadata = user.user_metadata if user.user_metadata != null else {} + role = user.role + +func _to_string(): + var to_string : String = "%-10s %s\n" % ["USER ID:", id] + to_string += "%-10s %s\n" % ["EMAIL:", email] + to_string += "%-10s %s\n" % ["ROLE:", role] + return to_string