insert method

Future<APIResponse<String>> insert(
  1. String table,
  2. APIRequest apiRequest, {
  3. Object? id,
})

Implementation

Future<APIResponse<String>> insert(
  String table,
  APIRequest apiRequest, {
  Object? id,
}) async {
  if (onlyOnDevelopment && !development) {
    return APIResponse.error(error: "Unsupported request!");
  }

  var entityRepository = (await entityRepositoryProviders)
      .getEntityRepository(name: table);

  if (entityRepository == null) {
    return APIResponse.error(error: "Can't find table: $table");
  }

  final entityType = entityRepository.type;
  final entityHandler = entityRepository.entityHandler;

  var update = false;
  Object? entity;

  if (id != null) {
    var id2 = entityHandler.resolveID(id);
    entity = await entityRepository.selectByID(id2);
    update = entity != null;
  }

  var htmlDoc = HTMLDocument.darkTheme(
    title: 'DB - ${update ? 'update' : 'insert'} @ $entityType',
    top: _buildTop(
      apiRootName: apiRoot.name,
      apiRootVersion: apiRoot.version,
      table: table,
      entityType: entityType,
    ),
    footer: _buildFooter(),
  );

  var content = [];

  _addScriptFixDateTime(content);

  var parameters = Map<String, dynamic>.from(apiRequest.parameters);
  if (parameters.isNotEmpty) {
    _fixParametersDateTime(parameters);

    var entity2 = await entityHandler.createFromMap(
      parameters,
      entityProvider: entityRepository.provider,
      resolutionRules: EntityResolutionRules(allowEntityFetch: true),
    );

    try {
      if (entity != null) {
        var fields = entityHandler.getFields(entity2);
        entity = await entityHandler.setFieldsFromMap(entity, fields);
      } else {
        entity = entity2;
      }
    } catch (e, s) {
      content.add(
        '<h3 style="text-align: left;">Error instantiating `$entityType`:</h3>\n',
      );
      content.add(
        '<pre>Parameters: ${Json.encode(parameters, pretty: true)}</pre>\n',
      );
      content.add('<pre>ERROR:\n$e\n$s\n</pre>');
      content.add('<hr>\n');
    }

    if (entity != null) {
      try {
        var id = await entityRepository.store(entity);

        content.add(
          '<br><h2 style="text-align: left;">${update ? 'Updated' : 'Inserted'}: #$id</h2>\n',
        );

        _writeEntityJson(entityHandler, entityType, entity, content);

        content.add('<br><hr>');
      } catch (e, s) {
        content.add(
          '<br><h3 style="text-align: left;">Error storing `$entityType`:</h3>\n',
        );
        content.add('<pre>EntityRepository: $entityRepository</pre>\n');
        content.add('<pre>ERROR:\n$e\n$s\n</pre>');
        content.add('<br><hr>\n');
      }
    }
  }

  content.add('<form method="post">');
  content.add(
    '<input id="LOCAL_TIMEZONE" type="hidden" name="__LOCAL_TIMEZONE__">',
  );

  _writeInputTable(entityRepository, content, entity);

  content.add(
    '<br><div style="text-align: center; width: 100%;"><button type="submit">${update ? 'Update' : 'Insert'}</button></div>',
  );

  content.add('</form>');

  content.add(
    "<script type='application/javascript'> setLocalTimeZone() ; fixAllInputsDateTimeToLocal() ;</script>",
  );

  htmlDoc.content = content;

  var html = htmlDoc.build();

  return APIResponse.ok(html, mimeType: 'html');
}