DeleteResourceInTransaction deletes resources in a transaction
(context middleware.Context, resourceSchema *schema.Schema, resourceID string)
| 980 | |
| 981 | //DeleteResourceInTransaction deletes resources in a transaction |
| 982 | func DeleteResourceInTransaction(context middleware.Context, resourceSchema *schema.Schema, resourceID string) error { |
| 983 | defer measureRequestTime(time.Now(), "delete.in_tx", resourceSchema.ID) |
| 984 | mainTransaction := context["transaction"].(transaction.Transaction) |
| 985 | environmentManager := extension.GetManager() |
| 986 | environment, ok := environmentManager.GetEnvironment(resourceSchema.ID) |
| 987 | if !ok { |
| 988 | return fmt.Errorf("No environment for schema") |
| 989 | } |
| 990 | |
| 991 | auth := context["auth"].(schema.Authorization) |
| 992 | policy := context["policy"].(*schema.Policy) |
| 993 | currCond := policy.GetCurrentResourceCondition() |
| 994 | tenantIDs := currCond.GetTenantIDFilter(schema.ActionDelete, auth.TenantID()) |
| 995 | filter := transaction.IDFilter(resourceID) |
| 996 | if tenantIDs != nil { |
| 997 | filter["tenant_id"] = tenantIDs |
| 998 | } |
| 999 | |
| 1000 | var resource *schema.Resource |
| 1001 | var err error |
| 1002 | switch resourceSchema.GetLockingPolicy("delete") { |
| 1003 | case schema.NoLocking: |
| 1004 | resource, err = mainTransaction.Fetch(resourceSchema, filter, nil) |
| 1005 | case schema.LockRelatedResources: |
| 1006 | resource, err = mainTransaction.LockFetch(resourceSchema, filter, schema.LockRelatedResources, nil) |
| 1007 | case schema.SkipRelatedResources: |
| 1008 | resource, err = mainTransaction.LockFetch(resourceSchema, filter, schema.SkipRelatedResources, nil) |
| 1009 | } |
| 1010 | |
| 1011 | if err != nil { |
| 1012 | return err |
| 1013 | } |
| 1014 | if resource != nil { |
| 1015 | context["resource"] = resource.Data() |
| 1016 | } |
| 1017 | // apply property filter |
| 1018 | err = currCond.ApplyPropertyConditionFilter(schema.ActionUpdate, resource.Data(), nil) |
| 1019 | if err != nil { |
| 1020 | return ResourceError{err, "", Unauthorized} |
| 1021 | } |
| 1022 | |
| 1023 | if err := extension.HandleEvent(context, environment, "pre_delete_in_transaction", resourceSchema.ID); err != nil { |
| 1024 | return err |
| 1025 | } |
| 1026 | |
| 1027 | err = mainTransaction.Delete(resourceSchema, resourceID) |
| 1028 | if err != nil { |
| 1029 | return ResourceError{err, "", DeleteFailed} |
| 1030 | } |
| 1031 | |
| 1032 | if err := extension.HandleEvent(context, environment, "post_delete_in_transaction", resourceSchema.ID); err != nil { |
| 1033 | return err |
| 1034 | } |
| 1035 | return nil |
| 1036 | } |
| 1037 | |
| 1038 | // ActionResource runs custom action on resource |
| 1039 | func ActionResource(context middleware.Context, dataStore db.DB, identityService middleware.IdentityService, |
no test coverage detected