Unfortunately, PowerApps connects to SharePoint using the context of the end user. You have to give them contribute rights to the list, at a minimum. You can create a custom permission that gives users the ability to create but not edit (I haven't done this and don't know exactly what would happen).
Here's an option you can use to get around your issue. Again, you'll need to give your users edit/contribute rights to the SharePoint list.
You can then change permissions on the list item via Power Automate.
Create a Power Automate that responds when an item is created
You'll need to get some user and group references
- Add action "Send an HTTP request to SharePoint"
- Connect to your site
- Set the method to GET
- Set the URI to
_api/web/sitegroups/getbyname('Your Site Owner Group')
Record the ID in a compose action - body('Send_an_HTTP_request_to_SharePoint')['d']['Id']
Send another HTTP request to your SharePoint site to get the user's ID. Set the URI to _api/web/siteusers('triggerBody()?['Author']?['Claims']')

Record the User ID into a compose: body('Send_an_HTTP_request_to_SharePoint_2')['d']['Id']
And you'll need to get a list of your role definitions. So send an HTTP request to your SharePoint site to _api/Web/RoleDefinitions
- Filter the results looking for Edit
- Add a Filter Array action
- Set From to
@body('Send_an_HTTP_request_to_SharePoint_3')['d']['results']
- Set the filter to
@item()['Name']
is equal to
Read
(screenshot show Edit, which you'll need as well)
- Record the ID of your Role in a compose:
first(body('Filter_array'))['Id']

- Now you are ready to set permissions
- Break role inheritance on the list item
- Send an HTTP request to SharePoint. Set Method to POST and Uri to
_api/web/lists/getByTitle('Your List Name')/items(@{triggerBody()?['ID']})/breakroleinheritance(copyRoleAssignments=false, clearSubscopes=true)
- Add headers - key: accept and value: application/json;odata=verbose
- Then send an HTTP request to your site to give your user Read rights
- Set Method to POST
- Set Uri to
_api/web/lists/getByTitle('Your List name')/items(@{triggerBody()?['ID']})/roleassignments/addroleassignment(principalid=@{outputs('User_ID')},roledefid=@{outputs('Read_Id')})
- Finally, send a similiar HTTP request to your site, but this time sending your owners role to give them edit rights.
This is kinda high level and the screenshots won't match your exact case, but should point you in the right direction.
As for your question regarding attachments, you're right. You can't patch attachments. You'll have to create a Form that connects to SharePoint and then figure out how to attach that attachment to your list item before the unique permissions are set. I've done this in the past, by creating a list that's specifically set up for storing attachments and then using a common string or number between the two lists to link them up. You can also try to get the ID of your new list item when the patch is complete and then set the Item of the Form to the list item.