fix(provision): reconcile channel pricing and hosted access
This commit is contained in:
@@ -1367,37 +1367,10 @@ func NewActionSet(sqliteDSN string) ActionSet {
|
||||
return AccessPreviewResult{}, fmt.Errorf("provider %q exists in multiple packs; pack_id is required", req.ProviderID)
|
||||
}
|
||||
providerRow := providers[0]
|
||||
if strings.TrimSpace(req.HostID) != "" {
|
||||
hostRow, err := store.Hosts().GetByHostID(ctx, req.HostID)
|
||||
if err != nil {
|
||||
return AccessPreviewResult{}, err
|
||||
}
|
||||
batch, err := store.ImportBatches().GetLatestByProviderIDAndHostID(ctx, providerRow.ID, hostRow.ID)
|
||||
if err != nil {
|
||||
return AccessPreviewResult{}, fmt.Errorf("find batch for provider: %w", err)
|
||||
}
|
||||
latestStatus := batch.AccessStatus
|
||||
closures, err := store.AccessClosures().GetByBatchID(ctx, batch.ID)
|
||||
if err == nil && len(closures) > 0 {
|
||||
latestStatus = closures[len(closures)-1].Status
|
||||
}
|
||||
available := accessStatusSupportsMode(latestStatus, req.Mode)
|
||||
message := fmt.Sprintf("latest access status: %s", latestStatus)
|
||||
if !available {
|
||||
message = fmt.Sprintf("access status %s does not satisfy mode %s", latestStatus, req.Mode)
|
||||
}
|
||||
return AccessPreviewResult{ProviderID: req.ProviderID, Mode: req.Mode, Available: available, Message: message}, nil
|
||||
}
|
||||
batch, err := store.ImportBatches().GetLatestByProviderID(ctx, providerRow.ID)
|
||||
latestStatus, err := resolveLatestAccessStatus(ctx, store, providerRow, req.HostID)
|
||||
if err != nil {
|
||||
return AccessPreviewResult{}, fmt.Errorf("find batch for provider: %w", err)
|
||||
}
|
||||
|
||||
latestStatus := batch.AccessStatus
|
||||
closures, err := store.AccessClosures().GetByBatchID(ctx, batch.ID)
|
||||
if err == nil && len(closures) > 0 {
|
||||
latestStatus = closures[len(closures)-1].Status
|
||||
}
|
||||
available := accessStatusSupportsMode(latestStatus, req.Mode)
|
||||
message := fmt.Sprintf("latest access status: %s", latestStatus)
|
||||
if !available {
|
||||
@@ -1440,6 +1413,45 @@ func resolveProvidersForQuery(ctx context.Context, store *sqlite.DB, req Provide
|
||||
return store.Providers().ListByProviderID(ctx, providerID)
|
||||
}
|
||||
|
||||
func resolveLatestAccessStatus(ctx context.Context, store *sqlite.DB, providerRow sqlite.Provider, hostID string) (string, error) {
|
||||
if store == nil {
|
||||
return "", fmt.Errorf("store is required")
|
||||
}
|
||||
if strings.TrimSpace(hostID) != "" {
|
||||
hostRow, err := store.Hosts().GetByHostID(ctx, hostID)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
batches, err := store.ImportBatches().ListByProviderIDAndHostID(ctx, providerRow.ID, hostRow.ID)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
modeStatuses, err := provision.LatestModeAccessStatuses(ctx, store, batches)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return provision.AggregateAccessStatus(modeStatuses), nil
|
||||
}
|
||||
batches, err := store.ImportBatches().ListByProviderID(ctx, providerRow.ID)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
if len(batches) == 0 {
|
||||
return "", fmt.Errorf("latest import batch not found for provider")
|
||||
}
|
||||
hostIDValue := batches[0].HostID
|
||||
for _, batch := range batches[1:] {
|
||||
if batch.HostID != hostIDValue {
|
||||
return "", fmt.Errorf("provider exists on multiple hosts; host_id is required")
|
||||
}
|
||||
}
|
||||
modeStatuses, err := provision.LatestModeAccessStatuses(ctx, store, batches)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return provision.AggregateAccessStatus(modeStatuses), nil
|
||||
}
|
||||
|
||||
func resolveManagedHost(ctx context.Context, store *sqlite.DB, hostID, baseURL string, auth CreateHostAuth) (sqlite.Host, *sub2api.Client, error) {
|
||||
if store == nil {
|
||||
return sqlite.Host{}, nil, fmt.Errorf("store is required")
|
||||
|
||||
Reference in New Issue
Block a user