Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
3c2034e
feat: add related content at edition level
SarahJohnsonONS Jul 13, 2026
bcc4259
Merge branch 'develop' into feat/4885/add-related-content-at-edition-…
SarahJohnsonONS Jul 13, 2026
6c3e409
Store previous series IDs for datasets
hbrace Jul 14, 2026
c8f47df
Redact previous series ID for web mode when EnableURLRewriting is true
hbrace Jul 15, 2026
3b4e4d4
Merge pull request #745 from ONSdigital/feat/4885/add-related-content…
SarahJohnsonONS Jul 16, 2026
fbbdbac
Merge branch 'develop' into feature/store-previous-series-ids-for-dat…
hbrace Jul 16, 2026
ea2fd62
Redact previous series IDs when GET /datasets
hbrace Jul 17, 2026
30b88c0
Fix linting issue
hbrace Jul 17, 2026
c79498a
avoid data race on config in parallel tests
aryan-p03 Jul 20, 2026
d9ed7be
Fix audit falure for CVE-2026-56852
hbrace Jul 22, 2026
c7a4ebf
feat: add related content for versions
SarahJohnsonONS Jul 24, 2026
a31aa85
ensure static editions are always first sorted by oldest version rele…
aryan-p03 Jul 27, 2026
6caf80c
fix audit issues with go.opentelemetry.io/otel
aryan-p03 Jul 27, 2026
8b97893
add is_migration series level
andre-urbani Jul 28, 2026
250ea52
adjust swagger alignment
andre-urbani Jul 28, 2026
4e2291c
upgrade dependencies
andre-urbani Jul 28, 2026
26e79d0
upgrade google.golang.org/grpc to v1.82.1
aryan-p03 Jul 28, 2026
a87dc8f
refactor DELETE /datasets/{id} so all associated versions all deleted
aryan-p03 Jul 28, 2026
af13a37
update DeleteDataset unit tests and mock call assersions
aryan-p03 Jul 28, 2026
f32cc8d
remove defaultLimit from DatasetAPI struct as it is no longer used
aryan-p03 Jul 28, 2026
f9ef9bc
Merge branch 'develop' into feature/add-is-migration-series
andre-urbani Jul 29, 2026
66c35c6
Merge branch 'develop' into fix/delete-dataset-deletes-all-associated…
aryan-p03 Jul 29, 2026
23f7b54
add 409 errors for id changes on migrated datasets
aryan-p03 Jul 29, 2026
c9864a5
prevent id being changed on migrated datasets
aryan-p03 Jul 29, 2026
46a2a27
prevent id being changed on migrated edition
aryan-p03 Jul 29, 2026
a3c6c81
add component tests for id changes on migrated datasets
aryan-p03 Jul 29, 2026
f3931a8
wait for async Kafka message and Cloudflare purge in unit tests
aryan-p03 Jul 30, 2026
5785265
fix: related content now deleted from database
SarahJohnsonONS Jul 30, 2026
19b0d1d
resolve merge conflicts
aryan-p03 Aug 3, 2026
f9a15ee
Merge branch 'master' into develop
aryan-p03 Aug 3, 2026
5a96a9f
remove duplicate assersion
aryan-p03 Aug 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,6 @@ type DatasetAPI struct {
instancePublishedChecker *instance.PublishCheck
versionPublishedChecker *PublishCheck
MaxRequestOptions int
defaultLimit int
smDatasetAPI *application.StateMachineDatasetAPI
auditService application.AuditService
staticDatasetService application.StaticDatasetService
Expand Down Expand Up @@ -108,7 +107,6 @@ func Setup(ctx context.Context, cfg *config.Configuration, router *mux.Router, d
versionPublishedChecker: nil,
instancePublishedChecker: nil,
MaxRequestOptions: cfg.MaxRequestOptions,
defaultLimit: cfg.DefaultLimit,
smDatasetAPI: smDatasetAPI,
permissionsChecker: permissionsChecker,
auditService: auditService,
Expand Down
35 changes: 23 additions & 12 deletions api/dataset.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,11 @@ var (

// errors that should return a 409 status
datasetsConflict = map[error]bool{
errs.ErrCannotChangeIDForPublishedDataset: true,
errs.ErrAddDatasetAlreadyExists: true,
errs.ErrAddDatasetTitleAlreadyExists: true,
errs.ErrPublishedDatasetTopicChange: true,
errs.ErrCannotChangeIDForPublishedDataset: true,
errs.ErrCannotChangeDatasetIDForMigratedDataset: true,
errs.ErrAddDatasetAlreadyExists: true,
errs.ErrAddDatasetTitleAlreadyExists: true,
errs.ErrPublishedDatasetTopicChange: true,
}
)

Expand Down Expand Up @@ -225,6 +226,7 @@ func (api *DatasetAPI) getDataset(w http.ResponseWriter, r *http.Request) {
log.Info(ctx, "getDataset endpoint: get dataset with auth", logData)
} else {
dataset.Current.PreviousSeriesId = nil
dataset.Current.IsMigration = nil
datasetResponse, err = utils.RewriteDatasetWithoutAuth(ctx, dataset, datasetLinksBuilder)
if err != nil {
log.Error(ctx, "getDataset endpoint: failed to rewrite dataset without authorisation", err, logData)
Expand All @@ -248,6 +250,7 @@ func (api *DatasetAPI) getDataset(w http.ResponseWriter, r *http.Request) {
}

dataset.Current.PreviousSeriesId = nil
dataset.Current.IsMigration = nil

datasetResponse = dataset.Current
} else {
Expand Down Expand Up @@ -612,6 +615,11 @@ func (api *DatasetAPI) putDataset(w http.ResponseWriter, r *http.Request) {
return nil, errs.ErrCannotChangeIDForPublishedDataset
}

if isIDChanged && currentDataset.Next.IsMigration != nil && *currentDataset.Next.IsMigration {
log.Error(ctx, "putDataset endpoint: cannot change dataset ID for migrated dataset", errs.ErrCannotChangeDatasetIDForMigratedDataset, data)
return nil, errs.ErrCannotChangeDatasetIDForMigratedDataset
}

if !isPublished && isIDChanged {
err := api.dataStore.Backend.CheckDatasetExists(ctx, dataset.ID, "")
if err == nil {
Expand Down Expand Up @@ -690,6 +698,11 @@ func (api *DatasetAPI) putDataset(w http.ResponseWriter, r *http.Request) {
} else if dataset.Type == models.Static.String() && dataset.ID != currentDataset.ID {
dataset.PreviousSeriesId = append([]string{}, currentDataset.Next.PreviousSeriesId...)
dataset.PreviousSeriesId = append(dataset.PreviousSeriesId, currentDataset.ID)

if dataset.IsMigration == nil {
dataset.IsMigration = currentDataset.Next.IsMigration
}

renamedDatasetUpdate := &models.DatasetUpdate{
ID: dataset.ID,
Next: dataset,
Expand Down Expand Up @@ -820,10 +833,7 @@ func (api *DatasetAPI) deleteDataset(w http.ResponseWriter, r *http.Request) {

// Find any editions/versions associated with the dataset based on the type
if currentDataset.Next.Type == models.Static.String() {
// Limit is set to DEFAULT_LIMIT (20) to prevent unbounded queries.
// If a dataset has more than DEFAULT_LIMIT unpublished editions/versions, only the first DEFAULT_LIMIT will be deleted.
// Refactoring is required if more than DEFAULT_LIMIT editions/versions per dataset is a possibility.
versionDocs, _, err := api.dataStore.Backend.GetAllStaticVersions(ctx, currentDataset.ID, "", 0, api.defaultLimit)
versions, _, err := api.dataStore.Backend.GetVersionsStaticNoLimit(ctx, currentDataset.ID, "")
if err != nil {
if err == errs.ErrVersionsNotFound {
log.Info(ctx, "deleteDataset endpoint: dataset didn't contain any versions, continuing to delete dataset", logData)
Expand All @@ -833,9 +843,9 @@ func (api *DatasetAPI) deleteDataset(w http.ResponseWriter, r *http.Request) {
}
}

for i := range versionDocs {
if versionDocs[i].Distributions != nil {
for _, distribution := range *versionDocs[i].Distributions {
for i := range versions {
if versions[i].Distributions != nil {
for _, distribution := range *versions[i].Distributions {
logData["distribution_title"] = distribution.Title
logData["distribution_download_url"] = distribution.DownloadURL

Expand All @@ -848,7 +858,7 @@ func (api *DatasetAPI) deleteDataset(w http.ResponseWriter, r *http.Request) {
}
}

err := api.dataStore.Backend.DeleteStaticDatasetVersion(ctx, currentDataset.ID, versionDocs[i].Edition, versionDocs[i].Version)
err := api.dataStore.Backend.DeleteStaticDatasetVersion(ctx, currentDataset.ID, versions[i].Edition, versions[i].Version)
if err != nil {
log.Error(ctx, "deleteDataset endpoint: failed to delete version", err, logData)
return err
Expand Down Expand Up @@ -915,6 +925,7 @@ func mapResults(results []*models.DatasetUpdate) []*models.Dataset {
}
item.Current.ID = item.ID
item.Current.PreviousSeriesId = nil
item.Current.IsMigration = nil
items = append(items, item.Current)
}
return items
Expand Down
Loading