Invision Community 4: SEO, prepare for v5 and dormant account notifications By Matt Monday at 02:04 PM
Clover13 Posted March 20 Posted March 20 Was working on something new and started issuing POSTs to a Pages DB but it's erroring with a 500. System log entry below. Being this is a create of a record via a POST, I'm not sure why it is triggering an edit (requiring a record_id) which is also via a POST.
Jim M Posted March 20 Posted March 20 Are you getting this with any post made to this endpoint or specifically with a certain request?
Clover13 Posted March 20 Author Posted March 20 (edited) 48 minutes ago, Jim M said: Are you getting this with any post made to this endpoint or specifically with a certain request? I tried another Pages DB and POST call that worked before the update and it too is getting the same error. Edited March 20 by Clover13
Clover13 Posted March 20 Author Posted March 20 (edited) It's just a python script, I put this together to post to the default Articles Pages DB and get a 500 as well. def test_api_cms_post(self): post_cms_record_url = f"{self.API_URL}{self.CMS_RECORDS_ENDPOINT}1" logging.info(f"post_cms_record_url: {post_cms_record_url}") # Request parameters with API key included in the URL request_params = { 'key': self.API_KEY } post_data = {'category': 1, 'author': 1, 'fields[1]': 'Title 123', 'fields[2]': 'Content ABC'} logging.info(f"post_data: {post_data}") # Make a POST request to the API endpoint response = requests.post(post_cms_record_url, data=post_data, params=request_params) # Check if the request was successful (status code 200) if response.status_code == 200: # Parse the JSON response data = response.json() # Process the data as needed print("Response:", data) else: # Print an error message if the request was not successful print(f"Error: {response.status_code}") Output: 2024-03-20 16:13:43 - INFO - post_cms_record_url: http://localhost/api/index.php?/cms/records/1 2024-03-20 16:13:43 - INFO - post_data: {'category': 1, 'author': 1, 'fields[1]': 'Title 123', 'fields[2]': 'Content ABC'} 2024-03-20 16:13:43 - DEBUG - Starting new HTTP connection (1): localhost:80 Error: 500 2024-03-20 16:13:43 - DEBUG - http://localhost:80 "POST /api/index.php?/cms/records/1&key=ef2f4f1687b901d3c962f074dcd4528e HTTP/1.1" 500 72 Ran 1 test in 0.140s OK Edited March 20 by Clover13
teraßyte Posted March 20 Posted March 20 500 error code aside, the API should also return a separate code/message about the issue. Have you tried checking that? 2T306/4 INVALID_DATABASE 1T306/5 NO_CATEGORY 1T306/6 NO_AUTHOR 2T306/G NO_PERMISSION 1T306/D TITLE_CONTENT_REQUIRED 1S306/E UPLOAD_FIELD_NOT_OBJECT 1T306/F UPLOAD_FIELD_NO_FILES 1T306/G UPLOAD_FIELD_MULTIPLE_NOT_ALLOWED 1T306/H UPLOAD_FIELD_IMAGE_NOT_SUPPORTED 1T306/I UPLOAD_FIELD_IMAGES_ONLY 1T306/J UPLOAD_FIELD_EXTENSION_NOT_ALLOWED
Clover13 Posted March 20 Author Posted March 20 8 minutes ago, teraßyte said: 500 error code aside, the API should also return a separate code/message about the issue. Have you tried checking that? 2T306/4 INVALID_DATABASE 1T306/5 NO_CATEGORY 1T306/6 NO_AUTHOR 2T306/G NO_PERMISSION 1T306/D TITLE_CONTENT_REQUIRED 1S306/E UPLOAD_FIELD_NOT_OBJECT 1T306/F UPLOAD_FIELD_NO_FILES 1T306/G UPLOAD_FIELD_MULTIPLE_NOT_ALLOWED 1T306/H UPLOAD_FIELD_IMAGE_NOT_SUPPORTED 1T306/I UPLOAD_FIELD_IMAGES_ONLY 1T306/J UPLOAD_FIELD_EXTENSION_NOT_ALLOWED I dropped the data parsing for the non-200 case, here is that output: 2024-03-20 16:38:05 - INFO - post_cms_record_url: http://localhost/api/index.php?/cms/records/1 2024-03-20 16:38:05 - INFO - post_data: {'category': 1, 'author': 1, 'fields[1]': 'Title 123', 'fields[2]': 'Content ABC'} 2024-03-20 16:38:05 - DEBUG - Starting new HTTP connection (1): localhost:80 2024-03-20 16:38:05 - DEBUG - http://localhost:80 "POST /api/index.php?/cms/records/1&key=ef2f4f1687b901d3c962f074dcd4528e HTTP/1.1" 500 72 Ran 1 test in 0.179s OK Error: 500 Response: {'errorCode': 'EX1048', 'errorMessage': 'UNKNOWN_ERROR'}
Clover13 Posted March 20 Author Posted March 20 (edited) 24 minutes ago, Adriano Faria said: EX1048 means that a column cannot be NULL. Right and I believe that's due to the first screenshot I posted where it's expecting a record_id when one doesn't exist yet since this is creating a record, not editing one. Unless that DB update is made after the record is created (but not committed yet), I don't know the sequencing or transactionalization of their DB commands for the API. Maybe it's due to the api key being a request param instead of a header, but the header approach wouldn't work for me before this current version of the software. Edited March 20 by Clover13
Clover13 Posted March 20 Author Posted March 20 FWIW... # With API Key in request params returns 500 and EX1048 response = requests.post(post_cms_record_url, data=post_data, params=request_params) # With API Key base64 encoded in headers # Error: 401 # Response: {'errorCode': '3S290/7', 'errorMessage': 'INVALID_API_KEY'} response = requests.post(post_cms_record_url, data=post_data, headers=headers) # With API Key in auth returns 500 and EX1048 response = requests.post(post_cms_record_url, data=post_data, auth=auth)
Marc Posted March 21 Posted March 21 In the first instance, try removing the 2 hooks you have in play there, and see if that resolves the problem. Im not able to replicate it on this end, and since you have this on local, its not too easy to debug
Clover13 Posted March 21 Author Posted March 21 4 hours ago, Marc Stridgen said: In the first instance, try removing the 2 hooks you have in play there, and see if that resolves the problem. Im not able to replicate it on this end, and since you have this on local, its not too easy to debug I'll do some more testing today. FWIW, the GET to the hello endpoint works fine. I'll also get appropriate errors when the POST executes and determines something like an invalid category or author. 2024-03-21 10:21:24 - INFO - post_cms_record_url: http://localhost/api/index.php?/cms/records/1 2024-03-21 10:21:24 - INFO - post_data: {'category': 99, 'author': 1, 'fields[1]': 'Title 123', 'fields[2]': 'Content ABC'} 2024-03-21 10:21:24 - DEBUG - Starting new HTTP connection (1): localhost:80 2024-03-21 10:21:24 - DEBUG - http://localhost:80 "POST /api/index.php?/cms/records/1&key=ef2f4f1687b901d3c962f074dcd4528e HTTP/1.1" 400 72 Ran 1 test in 0.094s OK Error: 400 Response: {'errorCode': '1T306/5', 'errorMessage': 'NO_CATEGORY'} Regarding the hooks being disabled, that did not resolve the issue. 2024-03-21 10:25:57 - INFO - post_cms_record_url: http://localhost/api/index.php?/cms/records/1 2024-03-21 10:25:57 - INFO - post_data: {'category': 1, 'author': 1, 'fields[1]': 'Title 123', 'fields[2]': 'Content ABC'} 2024-03-21 10:25:57 - DEBUG - Starting new HTTP connection (1): localhost:80 Error: 500 Response: {'errorCode': 'EX1048', 'errorMessage': 'UNKNOWN_ERROR'} 2024-03-21 10:25:58 - DEBUG - http://localhost:80 "POST /api/index.php?/cms/records/1&key=ef2f4f1687b901d3c962f074dcd4528e HTTP/1.1" 500 72
teraßyte Posted March 21 Posted March 21 (edited) Looking again at the screenshot, the error is being thrown when a revision for the record is added to the database, not when the record itself is added. If you're adding a new record, it shouldn't store a revision. A revision should be saved only when you edit a record. The problem is in /applications/cms/api/records.php in the _createOrUpdate() function (lines 424-443): /* Store a revision before we change any values */ if ( $item::database()->revisions ) { $revision = new \IPS\cms\Records\Revisions; $revision->database_id = $item::$customDatabaseId; $revision->record_id = $item->_id; $revision->data = $item->fieldValues( TRUE ); if ( $this->member ) { $memberId = $this->member->member_id; } else { $memberId = $item->author()->member_id; } $revision->member_id = $memberId; $revision->save(); } The IF check should also check if you're editing a record because when adding a new one there is no record ID available yet (thus the column NULL error): if ( $type == 'edit' AND $item::database()->revisions ) Edited March 21 by teraßyte Afrodude, SeNioR- and Clover13 2 1
Clover13 Posted March 21 Author Posted March 21 4 minutes ago, teraßyte said: Looking again at the screenshot, the error is being thrown when a revision for the record is added to the database, not when the record itself is added. If you're adding a new record, it shouldn't store a revision. A revision should be saved only when you edit a record. The problem is in /applications/cms/api/records.php in the _createOrUpdate() function (lines 424-443): /* Store a revision before we change any values */ if ( $item::database()->revisions ) { $revision = new \IPS\cms\Records\Revisions; $revision->database_id = $item::$customDatabaseId; $revision->record_id = $item->_id; $revision->data = $item->fieldValues( TRUE ); if ( $this->member ) { $memberId = $this->member->member_id; } else { $memberId = $item->author()->member_id; } $revision->member_id = $memberId; $revision->save(); } The IF check should also check if you're editing a record because when adding a new one there is no record ID available yet (thus the column NULL error): if ( $type == 'edit' AND $item::database()->revisions ) Thanks @teraßyte. I noticed the edit aspect and had mentioned that earlier. I would think any POST to create a new record would fail in this case (which is what I'm experiencing across 3 different Pages DBs), but @Marc Stridgen wasn't able to reproduce it. @Marc Stridgen can you confirm you tested on 4.7.16?
Marc Posted March 21 Posted March 21 Thank you for bringing this issue to our attention! I can confirm this should be further reviewed and I have logged an internal bug report for our development team to investigate and address as necessary, in a future maintenance release. Clover13 1
teraßyte Posted March 21 Posted March 21 @Clover13 To reproduce the bug, the database must have the Store revisions option enabled. Most likely the test was made on a database with it disabled. I initially thought too the error was coming from saving the record to the database, only after re-checking your last screenshot I noticed it was a revision instead. 😅 Marc and Clover13 1 1
Clover13 Posted March 21 Author Posted March 21 6 minutes ago, teraßyte said: @Clover13 To reproduce the bug, the database must have the Store revisions option enabled. Most likely the test was made on a database with it disabled. I initially thought too the error was coming from saving the record to the database, only after re-checking your last screenshot I noticed it was a revision instead. 😅 I see how you tracked it down in the PHP code, I'll try to do that next time as well. I'm not too PHP savvy, but I see the stacktrace there and how you tracked it down, thank you for doing that! 👍 Also confirming with revisions OFF for the Pages DB, it does work and returns a 201 (CREATED) 2024-03-21 11:12:21 - INFO - post_cms_record_url: http://localhost/api/index.php?/cms/records/1 2024-03-21 11:12:21 - INFO - post_data: {'category': 1, 'author': 1, 'fields[1]': 'Title 123', 'fields[2]': 'Content ABC'} 2024-03-21 11:12:21 - DEBUG - Starting new HTTP connection (1): localhost:80 2024-03-21 11:12:21 - DEBUG - http://localhost:80 "POST /api/index.php?/cms/records/1&key=ef2f4f1687b901d3c962f074dcd4528e HTTP/1.1" 201 1109
Stuart Silvester Posted May 1 Posted May 1 We have released a patch to address this issue. Please go to AdminCP > System > Support and apply the patch from the first/top left box. If you do not see an option to install the patch, you already have the latest release. Sonya*, Clover13 and SeNioR- 3
Recommended Posts