예제 #1
0
        public Task <ResourceWrapper> GetAsync(ResourceKey key, CancellationToken cancellationToken)
        {
            using (var context = new PostgresqlFhirDatastoreContext(_configuration))
            {
                int?requestedVersion = null;
                if (!string.IsNullOrEmpty(key.VersionId))
                {
                    if (!int.TryParse(key.VersionId, out var parsedVersion))
                    {
                        return(null);
                    }

                    requestedVersion = parsedVersion;
                }

                var q = context.Resources
                        .Where(x => x.ResourceType == key.ResourceType)
                        .Where(x => x.ResourceId == key.Id)
                        .AsNoTracking()
                        .AsQueryable();
                if (requestedVersion.HasValue)
                {
                    q = q.Where(x => x.Version == requestedVersion.Value);
                }

                var result = q.FirstOrDefaultAsync(cancellationToken);

                return(Task.FromResult(new ResourceWrapper(
                                           resourceId: key.Id,
                                           versionId: result.Result.Version.ToString(CultureInfo.InvariantCulture),
                                           resourceTypeName: key.ResourceType,
                                           rawResource: new RawResource(result.Result.Resource, FhirResourceFormat.Json),
                                           request: null,
                                           lastModified: result.Result.LastModified,
                                           deleted: result.Result.IsDeleted,
                                           searchIndices: null,
                                           compartmentIndices: null,
                                           lastModifiedClaims: null)));
            }
        }
예제 #2
0
        public Task <UpsertOutcome> UpsertAsync(
            ResourceWrapper resource,
            WeakETag weakETag,
            bool allowCreate,
            bool keepHistory,
            CancellationToken cancellationToken)
        {
            var retryPolicy = Policy
                              .Handle <NpgsqlException>()
                              .WaitAndRetryAsync(1, i => FromSeconds(1));

            return(retryPolicy.ExecuteAsync(async() =>
            {
                using (var context = new PostgresqlFhirDatastoreContext(_configuration))
                {
                    // check if there is an existing resource
                    bool existing = await context.Resources
                                    .AsNoTracking()
                                    .AnyAsync(x => x.ResourceId == resource.ResourceId, cancellationToken: cancellationToken);
                    var version = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;

                    var newEntry = new PgResource
                    {
                        IsDeleted = resource.IsDeleted,
                        Resource = resource.RawResource.Data,
                        ResourceId = resource.ResourceId,
                        ResourceType = resource.ResourceTypeName,
                        LastModified = resource.LastModified.UtcDateTime,
                        LastModifiedClaims = resource.LastModifiedClaims.Select(x => $"{x.Key}:{x.Value}").ToList(),
                        Version = version,
                    };
                    context.Add(newEntry);
                    await context.SaveChangesAsync(cancellationToken);
                    resource.Version = version.ToString(CultureInfo.InvariantCulture);
                    return new UpsertOutcome(
                        wrapper: resource,
                        outcomeType: existing ? SaveOutcomeType.Updated : SaveOutcomeType.Created);
                }
            }));
        }