I am using azure static webapp for an angular application using the related staticwebapp.database.config.json:
{
"$schema": "https://github.com/Azure/data-api-builder/releases/latest/download/dab.draft.schema.json",
"data-source": {
"database-type": "mssql",
"options": {
"set-session-context": false
},
"connection-string": "@env('DATABASE_CONNECTION_STRING')"
},
"runtime": {
"rest": {
"enabled": true,
"path": "/rest"
},
"graphql": {
"allow-introspection": true,
"enabled": true,
"path": "/graphql"
},
"host": {
"mode": "production",
"authentication": {
"provider": "StaticWebApps"
}
}
},
"entities": {
"setup": {
"source": "dbo.Setup",
"rest": {
"path": "/setup",
"methods": ["get", "post", "put", "delete"],
"enabled": true
},
"permissions": [
{
"actions": ["create", "read", "update", "delete"],
"role": "anonymous"
}
]
},
"organizationDetail": {
"source": {
"object": "dbo.OrganizationDetail",
"type": "view"
},
"rest": {
"path": "/organization-detail",
"methods": ["get"],
"enabled": true
},
"permissions": [
{
"actions": ["read"],
"role": "anonymous"
}
]
}
}
}
I want to try the DataBase connection preview features, I perform the first GET to the following endpoint which target a sql view:
https://[target-static-app]/data-api/rest/organization-detail
...and it works like a charm:
but when I perform a PUT request to the setup endpoint:
url: https://[target-static-app]/data-api/rest/setup/1
payload: {Id: 1, Title: "Test2", PrimaryColor: "#33cc66", SecondaryColor: "#ccff33", OrganizationId: 1}
I can obtain only the following:
"error": {
"code": "BadRequest",
"message": "Invalid request body. Either insufficient or extra fields supplied.",
"status": 400
}
Following the relevant openapi generated:
{
"openapi": "3.0.1",
"info": {
"title": "Data API builder - REST Endpoint",
"version": "PREVIEW"
},
"servers": [
{
"url": "/rest"
}
],
"paths": {
"/setup/Id/{Id}": {
"get": {
"tags": [
"setup"
],
"description": "Returns an entity.",
"responses": {
"400": {
"description": "BadRequest"
},
"401": {
"description": "Unauthorized"
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "NotFound"
},
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"properties": {
"value": {
"type": "array",
"items": {
"$ref": "#/components/schemas/setup"
}
}
}
}
}
}
}
}
},
"put": {
"tags": [
"setup"
],
"description": "Replace or create entity.",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/setup_NoPK"
}
}
},
"required": true
},
"responses": {
"400": {
"description": "BadRequest"
},
"401": {
"description": "Unauthorized"
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "NotFound"
},
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"properties": {
"value": {
"type": "array",
"items": {
"$ref": "#/components/schemas/setup"
}
}
}
}
}
}
},
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"properties": {
"value": {
"type": "array",
"items": {
"$ref": "#/components/schemas/setup"
}
}
}
}
}
}
}
}
},
"patch": {
"tags": [
"setup"
],
"description": "Update or create entity.",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/setup_NoPK"
}
}
},
"required": true
},
"responses": {
"400": {
"description": "BadRequest"
},
"401": {
"description": "Unauthorized"
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "NotFound"
},
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"properties": {
"value": {
"type": "array",
"items": {
"$ref": "#/components/schemas/setup"
}
}
}
}
}
}
},
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"properties": {
"value": {
"type": "array",
"items": {
"$ref": "#/components/schemas/setup"
}
}
}
}
}
}
}
}
},
"delete": {
"tags": [
"setup"
],
"description": "Delete entity.",
"responses": {
"400": {
"description": "BadRequest"
},
"401": {
"description": "Unauthorized"
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "NotFound"
},
"204": {
"description": "NoContent"
}
}
},
"parameters": [
{
"name": "Id",
"in": "path",
"required": true,
"schema": {
"type": "number"
}
}
]
},
"/setup": {
"get": {
"tags": [
"setup"
],
"description": "Returns entities.",
"responses": {
"400": {
"description": "BadRequest"
},
"401": {
"description": "Unauthorized"
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "NotFound"
},
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"properties": {
"value": {
"type": "array",
"items": {
"$ref": "#/components/schemas/setup"
}
},
"nextLink": {
"type": "string"
}
}
}
}
}
}
}
},
"post": {
"tags": [
"setup"
],
"description": "Create entity.",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/setup_NoAutoPK"
}
}
},
"required": true
},
"responses": {
"400": {
"description": "BadRequest"
},
"401": {
"description": "Unauthorized"
},
"403": {
"description": "Forbidden"
},
"404": {
"description": "NotFound"
},
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"properties": {
"value": {
"type": "array",
"items": {
"$ref": "#/components/schemas/setup"
}
}
}
}
}
}
},
"409": {
"description": "Conflict"
}
}
}
},
"components": {
"schemas": {
"setup": {
"type": "object",
"properties": {
"Id": {
"type": "number",
"format": ""
},
"Title": {
"type": "string",
"format": ""
},
"PrimaryColor": {
"type": "string",
"format": ""
},
"SecondaryColor": {
"type": "string",
"format": ""
},
"OrganizationId": {
"type": "number",
"format": ""
}
}
},
"setup_NoAutoPK": {
"type": "object",
"properties": {
"Title": {
"type": "string",
"format": ""
},
"PrimaryColor": {
"type": "string",
"format": ""
},
"SecondaryColor": {
"type": "string",
"format": ""
},
"OrganizationId": {
"type": "number",
"format": ""
}
}
},
"setup_NoPK": {
"type": "object",
"properties": {
"Title": {
"type": "string",
"format": ""
},
"PrimaryColor": {
"type": "string",
"format": ""
},
"SecondaryColor": {
"type": "string",
"format": ""
},
"OrganizationId": {
"type": "number",
"format": ""
}
}
},
"organizationDetail": {
"type": "object",
"properties": {
"Id": {
"type": "number",
"format": ""
},
"Name": {
"type": "string",
"format": ""
},
"Title": {
"type": "string",
"format": ""
},
"PrimaryColor": {
"type": "string",
"format": ""
},
"SecondaryColor": {
"type": "string",
"format": ""
},
"SetupId": {
"type": "number",
"format": ""
},
"OrganizationId": {
"type": "number",
"format": ""
}
}
},
"organizationDetail_NoAutoPK": {
"type": "object",
"properties": {
"Id": {
"type": "number",
"format": ""
},
"Name": {
"type": "string",
"format": ""
},
"Title": {
"type": "string",
"format": ""
},
"PrimaryColor": {
"type": "string",
"format": ""
},
"SecondaryColor": {
"type": "string",
"format": ""
},
"SetupId": {
"type": "number",
"format": ""
},
"OrganizationId": {
"type": "number",
"format": ""
}
}
},
"organizationDetail_NoPK": {
"type": "object",
"properties": {
"Name": {
"type": "string",
"format": ""
},
"Title": {
"type": "string",
"format": ""
},
"PrimaryColor": {
"type": "string",
"format": ""
},
"SecondaryColor": {
"type": "string",
"format": ""
},
"OrganizationId": {
"type": "number",
"format": ""
}
}
}
}
}
}
No way to make it work, what I am missing?
I believe that your issue is that your
PUT
command is expecting thesetup_NoPK
schema, which, according to the definition in your file, doesn't include thePrimaryKey
field, which in your case isId
.Thus, when you send your
PUT
request with theId
field filled out, validation is throwing is back as anoverpost
.If you look at the documentation here you can see that the
Id
value for the entity is passed as a parameter in the URL itself forPUT
andPATCH
calls.This means that in your actual payload, your content should not include the
Id
value, like this: