make sure that the sourcecredential interface is a pointer reciever.

This commit is contained in:
Jason Kulatunga 2023-07-14 19:52:02 -07:00
parent 49cee9ff20
commit 12cfcaee41
No known key found for this signature in database
9 changed files with 66 additions and 52 deletions

View File

@ -252,7 +252,7 @@ func (sr *SqliteRepository) GetSummary(ctx context.Context) (*models.Summary, er
//It will also create associations between fhir resources
func (sr *SqliteRepository) UpsertRawResource(ctx context.Context, sourceCredential sourceModel.SourceCredential, rawResource sourceModel.RawResourceFhir) (bool, error) {
source := sourceCredential.(models.SourceCredential)
source := sourceCredential.(*models.SourceCredential)
//convert from a raw resource (from fasten-sources) to a ResourceFhir (which matches the database models)
wrappedResourceModel := &models.ResourceBase{
@ -289,10 +289,10 @@ func (sr *SqliteRepository) UpsertRawResource(ctx context.Context, sourceCredent
}
err := sr.AddResourceAssociation(
ctx,
&source,
source,
wrappedResourceModel.SourceResourceType,
wrappedResourceModel.SourceResourceID,
&source,
source,
relatedResource.SourceResourceType,
relatedResource.SourceResourceID,
)
@ -328,11 +328,16 @@ func (sr *SqliteRepository) UpsertResource(ctx context.Context, wrappedResourceM
if err != nil {
return false, err
}
wrappedFhirResourceModel.SetOriginBase(wrappedResourceModel.OriginBase)
//wrappedFhirResourceModel.SetResourceRaw(wrappedResourceModel.ResourceRaw)
//TODO: this takes too long, we need to find a way to do this processing faster or in the background async.
err = wrappedFhirResourceModel.PopulateAndExtractSearchParameters(json.RawMessage(wrappedResourceModel.ResourceRaw))
if err != nil {
return false, fmt.Errorf("An error ocurred while extracting SearchParameters using FHIRPath (%s/%s): %v", wrappedResourceModel.SourceResourceType, wrappedResourceModel.SourceResourceID, err)
}
createResult := sr.GormClient.WithContext(ctx).Where(models.OriginBase{
SourceID: wrappedFhirResourceModel.GetSourceID(),
SourceResourceID: wrappedFhirResourceModel.GetSourceResourceID(),

View File

@ -329,7 +329,7 @@ func (suite *RepositoryTestSuite) TestUpsertRawResource() {
authContext := context.WithValue(context.Background(), pkg.ContextKeyTypeAuthUsername, "test_username")
wasCreated, err := dbRepo.UpsertRawResource(
authContext,
testSourceCredential,
&testSourceCredential,
sourceModels.RawResourceFhir{
SourceResourceType: "Patient",
SourceResourceID: "b426b062-8273-4b93-a907-de3176c0567d",
@ -386,7 +386,7 @@ func (suite *RepositoryTestSuite) TestUpsertRawResource_WithRelatedResourceAndDu
//test
wasCreated, err := dbRepo.UpsertRawResource(
context.WithValue(context.Background(), pkg.ContextKeyTypeAuthUsername, "test_username"),
testSourceCredential,
&testSourceCredential,
sourceModels.RawResourceFhir{
SourceResourceType: "Patient",
SourceResourceID: "b426b062-8273-4b93-a907-de3176c0567d",
@ -446,7 +446,7 @@ func (suite *RepositoryTestSuite) TestListResources() {
testResource1Created, err := dbRepo.UpsertRawResource(
context.WithValue(authContext, pkg.ContextKeyTypeAuthUsername, "test_username"),
testSource1Credential,
&testSource1Credential,
sourceModels.RawResourceFhir{
SourceResourceType: "Patient",
SourceResourceID: "b426b062-8273-4b93-a907-de3176c0567d",
@ -461,7 +461,7 @@ func (suite *RepositoryTestSuite) TestListResources() {
require.NoError(suite.T(), err)
testResource2Created, err := dbRepo.UpsertRawResource(
context.WithValue(authContext, pkg.ContextKeyTypeAuthUsername, "test_username"),
testSource2Credential,
&testSource2Credential,
sourceModels.RawResourceFhir{
SourceResourceType: "Patient",
SourceResourceID: "d3fbfb3a-7b8d-45c0-13b4-9666e4d36a3e",
@ -533,7 +533,7 @@ func (suite *RepositoryTestSuite) TestGetResourceByResourceTypeAndId() {
authContext := context.WithValue(context.Background(), pkg.ContextKeyTypeAuthUsername, "test_username")
wasCreated, err := dbRepo.UpsertRawResource(
authContext,
testSourceCredential,
&testSourceCredential,
sourceModels.RawResourceFhir{
SourceResourceType: "Patient",
SourceResourceID: "b426b062-8273-4b93-a907-de3176c0567d",
@ -586,7 +586,7 @@ func (suite *RepositoryTestSuite) TestGetResourceBySourceId() {
authContext := context.WithValue(context.Background(), pkg.ContextKeyTypeAuthUsername, "test_username")
wasCreated, err := dbRepo.UpsertRawResource(
authContext,
testSourceCredential,
&testSourceCredential,
sourceModels.RawResourceFhir{
SourceResourceType: "Patient",
SourceResourceID: "b426b062-8273-4b93-a907-de3176c0567d",
@ -639,7 +639,7 @@ func (suite *RepositoryTestSuite) TestGetPatientForSources() {
authContext := context.WithValue(context.Background(), pkg.ContextKeyTypeAuthUsername, "test_username")
wasCreated, err := dbRepo.UpsertRawResource(
authContext,
testSourceCredential,
&testSourceCredential,
sourceModels.RawResourceFhir{
SourceResourceType: "Patient",
SourceResourceID: "b426b062-8273-4b93-a907-de3176c0567d",
@ -651,7 +651,7 @@ func (suite *RepositoryTestSuite) TestGetPatientForSources() {
was2Created, err := dbRepo.UpsertRawResource(
authContext,
testSourceCredential,
&testSourceCredential,
sourceModels.RawResourceFhir{
SourceResourceType: "Patient",
SourceResourceID: "11111111-8273-4b93-a907-de3176c0567d",
@ -837,7 +837,7 @@ func (suite *RepositoryTestSuite) TestGetSourceSummary() {
}
wasCreated, err := dbRepo.UpsertRawResource(
authContext,
testSourceCredential,
&testSourceCredential,
sourceModels.RawResourceFhir{
SourceResourceType: resourceType,
SourceResourceID: *resourceId,
@ -928,7 +928,7 @@ func (suite *RepositoryTestSuite) TestGetSummary() {
}
wasCreated, err := dbRepo.UpsertRawResource(
authContext,
testSourceCredential1,
&testSourceCredential1,
sourceModels.RawResourceFhir{
SourceResourceType: resourceType,
SourceResourceID: *resourceId,
@ -940,7 +940,7 @@ func (suite *RepositoryTestSuite) TestGetSummary() {
wasCreated2, err2 := dbRepo.UpsertRawResource(
authContext,
testSourceCredential2,
&testSourceCredential2,
sourceModels.RawResourceFhir{
SourceResourceType: resourceType,
SourceResourceID: *resourceId + "2",

View File

@ -3,11 +3,13 @@ package database
import (
"encoding/json"
"github.com/fastenhealth/fastenhealth-onprem/backend/pkg/models"
"gorm.io/datatypes"
)
type IFhirResourceModel interface {
models.OriginBaser
SetOriginBase(originBase models.OriginBase)
SetResourceRaw(resourceRaw datatypes.JSON)
GetSearchParameters() map[string]string
PopulateAndExtractSearchParameters(rawResource json.RawMessage) error
}

View File

@ -21,3 +21,7 @@ type ResourceBase struct {
func (s *ResourceBase) SetOriginBase(originBase OriginBase) {
s.OriginBase = originBase
}
func (s *ResourceBase) SetResourceRaw(resourceRaw datatypes.JSON) {
s.ResourceRaw = resourceRaw
}

View File

@ -46,47 +46,50 @@ type SourceCredential struct {
CodeVerifier string `json:"code_verifier"`
}
func (s SourceCredential) GetSourceType() pkg.SourceType {
func (s *SourceCredential) GetSourceType() pkg.SourceType {
return s.SourceType
}
func (s SourceCredential) GetClientId() string {
func (s *SourceCredential) GetClientId() string {
return s.ClientId
}
func (s SourceCredential) GetPatientId() string {
func (s *SourceCredential) GetPatientId() string {
return s.Patient
}
func (s SourceCredential) GetOauthAuthorizationEndpoint() string {
func (s *SourceCredential) GetOauthAuthorizationEndpoint() string {
return s.AuthorizationEndpoint
}
func (s SourceCredential) GetOauthTokenEndpoint() string {
func (s *SourceCredential) GetOauthTokenEndpoint() string {
return s.TokenEndpoint
}
func (s SourceCredential) GetApiEndpointBaseUrl() string {
func (s *SourceCredential) GetApiEndpointBaseUrl() string {
return s.ApiEndpointBaseUrl
}
func (s SourceCredential) GetRefreshToken() string {
func (s *SourceCredential) GetRefreshToken() string {
return s.RefreshToken
}
func (s SourceCredential) GetAccessToken() string {
func (s *SourceCredential) GetAccessToken() string {
return s.AccessToken
}
func (s SourceCredential) GetExpiresAt() int64 {
func (s *SourceCredential) GetExpiresAt() int64 {
return s.ExpiresAt
}
func (s SourceCredential) RefreshTokens(accessToken string, refreshToken string, expiresAt int64) {
func (s *SourceCredential) RefreshTokens(accessToken string, refreshToken string, expiresAt int64) {
if expiresAt > 0 && expiresAt != s.ExpiresAt {
s.ExpiresAt = expiresAt
}
if accessToken != s.AccessToken {
// update the "source" credential with new data (which will need to be sent
s.AccessToken = accessToken
s.ExpiresAt = expiresAt
// Don't overwrite `RefreshToken` with an empty value
// if this was a token refreshing request.
if refreshToken != "" {

View File

@ -36,7 +36,7 @@ func CreateSource(c *gin.Context) {
}
// after creating the source, we should do a bulk import
summary, err := SyncSourceResources(c, logger, databaseRepo, sourceCred)
summary, err := SyncSourceResources(c, logger, databaseRepo, &sourceCred)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"success": false})
return
@ -59,7 +59,7 @@ func SourceSync(c *gin.Context) {
}
// after creating the source, we should do a bulk import
summary, err := SyncSourceResources(c, logger, databaseRepo, *sourceCred)
summary, err := SyncSourceResources(c, logger, databaseRepo, sourceCred)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"success": false})
return
@ -99,7 +99,7 @@ func CreateManualSource(c *gin.Context) {
manualSourceCredential := models.SourceCredential{
SourceType: sourcePkg.SourceTypeManual,
}
tempSourceClient, _, err := factory.GetSourceClient(sourcePkg.GetFastenLighthouseEnv(), sourcePkg.SourceTypeManual, c, logger, manualSourceCredential)
tempSourceClient, err := factory.GetSourceClient(sourcePkg.GetFastenLighthouseEnv(), sourcePkg.SourceTypeManual, c, logger, &manualSourceCredential)
if err != nil {
logger.Errorln("An error occurred while initializing hub client using manual source without credentials", err)
c.JSON(http.StatusInternalServerError, gin.H{"success": false})
@ -122,7 +122,7 @@ func CreateManualSource(c *gin.Context) {
return
}
manualSourceClient, _, err := factory.GetSourceClient(sourcePkg.GetFastenLighthouseEnv(), sourcePkg.SourceTypeManual, c, logger, manualSourceCredential)
manualSourceClient, err := factory.GetSourceClient(sourcePkg.GetFastenLighthouseEnv(), sourcePkg.SourceTypeManual, c, logger, &manualSourceCredential)
if err != nil {
logger.Errorln("An error occurred while initializing hub client using manual source with credential", err)
c.JSON(http.StatusInternalServerError, gin.H{"success": false})
@ -178,22 +178,22 @@ func ListSource(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"success": true, "data": sourceCreds})
}
func SyncSourceResources(c context.Context, logger *logrus.Entry, databaseRepo database.DatabaseRepository, sourceCred models.SourceCredential) (sourceModels.UpsertSummary, error) {
func SyncSourceResources(c context.Context, logger *logrus.Entry, databaseRepo database.DatabaseRepository, sourceCred *models.SourceCredential) (sourceModels.UpsertSummary, error) {
// after creating the source, we should do a bulk import
sourceClient, updatedSource, err := factory.GetSourceClient(sourcePkg.GetFastenLighthouseEnv(), sourceCred.SourceType, c, logger, sourceCred)
sourceClient, err := factory.GetSourceClient(sourcePkg.GetFastenLighthouseEnv(), sourceCred.SourceType, c, logger, sourceCred)
if err != nil {
logger.Errorln("An error occurred while initializing hub client using source credential", err)
return sourceModels.UpsertSummary{}, err
}
//TODO: update source
if updatedSource != nil {
logger.Warnf("TODO: source credential has been updated, we should store it in the database: %v", updatedSource)
//err := databaseRepo.CreateSource(c, updatedSource)
//if err != nil {
// logger.Errorln("An error occurred while updating source credential", err)
// return err
//}
}
//if updatedSource != nil {
// logger.Warnf("TODO: source credential has been updated, we should store it in the database: %v", updatedSource)
// //err := databaseRepo.CreateSource(c, updatedSource)
// //if err != nil {
// // logger.Errorln("An error occurred while updating source credential", err)
// // return err
// //}
//}
summary, err := sourceClient.SyncAll(databaseRepo)
if err != nil {

View File

@ -45,22 +45,22 @@ func UnsafeRequestSource(c *gin.Context) {
return
}
client, updatedSource, err := factory.GetSourceClient(sourcePkg.GetFastenLighthouseEnv(), foundSource.SourceType, c, logger, foundSource)
client, err := factory.GetSourceClient(sourcePkg.GetFastenLighthouseEnv(), foundSource.SourceType, c, logger, foundSource)
if err != nil {
logger.Errorf("Could not initialize source client %v", err)
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "error": err.Error()})
return
}
//TODO: if source has been updated, we should save the access/refresh token.
if updatedSource != nil {
logger.Warnf("TODO: source credential has been updated, we should store it in the database: %v", updatedSource)
// err := databaseRepo.CreateSource(c, updatedSource)
// if err != nil {
// logger.Errorf("An error occurred while updating source credential %v", err)
// c.JSON(http.StatusInternalServerError, gin.H{"success": false, "error": err.Error()})
// return
// }
}
//if updatedSource != nil {
// logger.Warnf("TODO: source credential has been updated, we should store it in the database: %v", updatedSource)
// // err := databaseRepo.CreateSource(c, updatedSource)
// // if err != nil {
// // logger.Errorf("An error occurred while updating source credential %v", err)
// // c.JSON(http.StatusInternalServerError, gin.H{"success": false, "error": err.Error()})
// // return
// // }
//}
var resp map[string]interface{}

2
go.mod
View File

@ -7,7 +7,7 @@ require (
github.com/dave/jennifer v1.6.1
github.com/dominikbraun/graph v0.15.0
github.com/dop251/goja v0.0.0-20230605162241-28ee0ee714f3
github.com/fastenhealth/fasten-sources v0.1.15
github.com/fastenhealth/fasten-sources v0.2.1
github.com/fastenhealth/gofhir-models v0.0.5
github.com/gin-gonic/gin v1.9.0
github.com/glebarez/sqlite v1.5.0

4
go.sum
View File

@ -188,8 +188,8 @@ github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLi
github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M=
github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww=
github.com/fastenhealth/fasten-sources v0.1.15 h1:p7jFe29VoEdcc35c3otAqb4dRJ+014KJy89f/pYNMIQ=
github.com/fastenhealth/fasten-sources v0.1.15/go.mod h1:B7pVQcwLuL+rgjSHwlu3p0CySyHN262BkfbYMKVKXTk=
github.com/fastenhealth/fasten-sources v0.2.1 h1:ZdQXg3cRelPo/WsguCU+Ic3F/4GfROeCj/LwIm9NpVM=
github.com/fastenhealth/fasten-sources v0.2.1/go.mod h1:B7pVQcwLuL+rgjSHwlu3p0CySyHN262BkfbYMKVKXTk=
github.com/fastenhealth/gofhir-models v0.0.5 h1:wU2Dz+/h9MzZCTRgkQzeq5l0EFuMI6C5xgCbKislFpg=
github.com/fastenhealth/gofhir-models v0.0.5/go.mod h1:xB8ikGxu3bUq2b1JYV+CZpHqBaLXpOizFR0eFBCunis=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=