Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Using Customization handler to insert app-generated ID #1021

Open
apps-caraga opened this issue Mar 9, 2024 · 11 comments
Open

Using Customization handler to insert app-generated ID #1021

apps-caraga opened this issue Mar 9, 2024 · 11 comments
Assignees

Comments

@apps-caraga
Copy link
Contributor

apps-caraga commented Mar 9, 2024

I was just trying to use Universally Unique Lexicographically Sortable Identifier ULID with this library and was able to insert the ULID via the multitenancy middleware as follows:

	'multiTenancy.handler' => function ($operation, $tableName) {
			if($operation =='create' && $tableName=='data'){ 
				return['id'=>Ulid::generate()];
			}
		},

With SQLite, the post request is ok (data is saved and response status is HTTP 200) but returns {} or an empty array. Any idea why?

SQLite table schema:

CREATE TABLE data (
    id        TEXT (26) PRIMARY KEY
                        NOT NULL,
    content      TEXT,
    createdAt DATETIME  NOT NULL
                        DEFAULT (strftime('%Y-%m-%d %H:%M:%fZ') ) 
);

@mevdschee
Copy link
Owner

With SQLite, the post request is ok (data is saved and response status is HTTP 200) but returns {} or an empty array. Any idea why?

I think it is because the code returns the insert(ed) id and not the primary key.

@mevdschee mevdschee self-assigned this Mar 10, 2024
@apps-caraga
Copy link
Contributor Author

apps-caraga commented Mar 10, 2024

So it doesn't matter if the inserted ULID is the primary key. Anyway, is multitenancy the correct way to do this or is there a better way? (aside from client-side ID generation) 😁
I also tried using customization.beforeHandler and it got the same result

@apps-caraga
Copy link
Contributor Author

So i got it to return the new ULID by adding it in the afterHandler.

	'customization.beforeHandler' => function ($operation, $tableName, $request, $environment) {
			if($operation =='create' && $tableName =='data'){
				$body = $request->getParsedBody();
				$body->id = $environment->ulid = Ulid::generate();
				return $request->withParsedBody($body);
			}
		},
		'customization.afterHandler' => function ($operation, $tableName, $response, $environment) {
			if($operation =='create' && $tableName =='data'){
				return ResponseFactory::from(200, 'text/plain',$environment->ulid);
			}
		},	

It's not very good-looking code but it kinda works for my use case. (Although I'm not sure if this is a correct way to use the $environment variable.)😁

@mevdschee
Copy link
Owner

Excellent, that is exactly how that I envisioned that it would be used! Keep it up..

@apps-caraga
Copy link
Contributor Author

Just noting here that the before/afterHandler does not work with user registration even though it's a POST request.

@mevdschee
Copy link
Owner

@apps-caraga I would say that depends on the order of the middlewares.

@apps-caraga
Copy link
Contributor Author

depends on the order of the middlewares.

But it seems that no matter how I order the middlewares, the ULID is not inserted via the customization beforeHandler during dbAuth registration request.

@apps-caraga apps-caraga reopened this Mar 17, 2024
@mevdschee
Copy link
Owner

mevdschee commented Mar 19, 2024

Did you load the Customization handler before DbAuth? You test for 'create' operation, while the DbAuth uses the 'unknown' if I read the code correctly. Did you debug the code? You should be able to do something when calling Customization before DbAuth.

@apps-caraga
Copy link
Contributor Author

apps-caraga commented Mar 19, 2024

You should be able to do something when calling Customization before DbAuth.

I was able to retrieve the path segment thru RequestUtils::getPathSegment($request, 1); parameters so I can check if the current path or operation is 'login','register', or 'logout' operation instead of just checking if the operation is 'unknown'. Then I was able to add the new ID to the $body.

'customization.beforeHandler' => function ($operation, $tableName, $request, $environment) {
			$body = $request->getParsedBody();
			$path = RequestUtils::getPathSegment($request, 1);
			if($path === 'register'  ){
				$body->id = $environment->ulid =   Ulid::generate()->__toString();
				$environment->currPath = $path;
				return $request->withParsedBody($body);
			}
		},

The problem is the dbAuth register processes only the $username and $password so the custom ID added to the body is ignored (line 60-61 of DbAuth middleware ) 😉
image

@apps-caraga apps-caraga changed the title Multitenancy handler and app-generated ID returns an empty array Using Customization handler to insert app-generated ID Mar 19, 2024
@mevdschee
Copy link
Owner

I think it cannot be done without modifying the dbAuth middleware

@apps-caraga
Copy link
Contributor Author

apps-caraga commented Mar 21, 2024

Yup,that's the case.But it may not be a very common use case as of now. For now, I'll just copy some code in the register endpoint and insert it in my beforeHandler as a temp. workaround😁

For future, this feature might good to be implemented in an enhanced dbAuth middleware that can accept extra registration data.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants