private Dictionary BuildAndExecuteInsertDbQueries()

in src/Core/Resolvers/SqlMutationEngine.cs [1386:1459]


        private Dictionary<string, object?> BuildAndExecuteInsertDbQueries(ISqlMetadataProvider sqlMetadataProvider,
                                                                           string entityName,
                                                                           string parentEntityName,
                                                                           IDictionary<string, object?> parameters,
                                                                           SourceDefinition sourceDefinition,
                                                                           bool isLinkingEntity,
                                                                           int nestingLevel)
        {
            SqlInsertStructure sqlInsertStructure = new(
                                                     entityName: entityName,
                                                     sqlMetadataProvider: sqlMetadataProvider,
                                                     authorizationResolver: _authorizationResolver,
                                                     gQLFilterParser: _gQLFilterParser,
                                                     mutationParams: parameters,
                                                     httpContext: GetHttpContext(),
                                                     isLinkingEntity: isLinkingEntity);

            IQueryBuilder queryBuilder = _queryManagerFactory.GetQueryBuilder(sqlMetadataProvider.GetDatabaseType());
            IQueryExecutor queryExecutor = _queryManagerFactory.GetQueryExecutor(sqlMetadataProvider.GetDatabaseType());

            // When the entity is a linking entity, the parent entity's name is used to get the
            // datasource name. Otherwise, the entity's name is used.
            string dataSourceName = isLinkingEntity ? _runtimeConfigProvider.GetConfig().GetDataSourceNameFromEntityName(parentEntityName)
                                                    : _runtimeConfigProvider.GetConfig().GetDataSourceNameFromEntityName(entityName);
            string queryString = queryBuilder.Build(sqlInsertStructure);
            Dictionary<string, DbConnectionParam> queryParameters = sqlInsertStructure.Parameters;

            List<string> exposedColumnNames = new();
            if (sqlMetadataProvider.TryGetExposedFieldToBackingFieldMap(entityName, out IReadOnlyDictionary<string, string>? exposedFieldToBackingFieldMap))
            {
                exposedColumnNames = exposedFieldToBackingFieldMap.Keys.ToList();
            }

            DbResultSet? dbResultSet;
            DbResultSetRow? dbResultSetRow;
            dbResultSet = queryExecutor.ExecuteQuery(
                queryString,
                queryParameters,
                queryExecutor.ExtractResultSetFromDbDataReader,
                GetHttpContext(),
                EnumerableUtilities.IsNullOrEmpty(exposedColumnNames) ? sourceDefinition.Columns.Keys.ToList() : exposedColumnNames,
                dataSourceName);

            dbResultSetRow = dbResultSet is not null ? (dbResultSet.Rows.FirstOrDefault() ?? new DbResultSetRow()) : null;
            if (dbResultSetRow is null || dbResultSetRow.Columns.Count == 0)
            {
                if (isLinkingEntity)
                {
                    throw new DataApiBuilderException(
                        message: $"Could not insert row with given values in the linking table joining entities: {entityName} and {parentEntityName} at nesting level : {nestingLevel}",
                        statusCode: HttpStatusCode.InternalServerError,
                        subStatusCode: DataApiBuilderException.SubStatusCodes.DatabaseOperationFailed);
                }
                else
                {
                    if (dbResultSetRow is null)
                    {
                        throw new DataApiBuilderException(
                            message: "No data returned back from database.",
                            statusCode: HttpStatusCode.InternalServerError,
                            subStatusCode: DataApiBuilderException.SubStatusCodes.DatabaseOperationFailed);
                    }
                    else
                    {
                        throw new DataApiBuilderException(
                            message: $"Could not insert row with given values for entity: {entityName} at nesting level : {nestingLevel}",
                            statusCode: HttpStatusCode.Forbidden,
                            subStatusCode: DataApiBuilderException.SubStatusCodes.DatabasePolicyFailure);
                    }
                }
            }

            return dbResultSetRow.Columns;
        }