feat: translation flows, revision conflicts, delete scopes, article moves and a target site for new articles

This commit is contained in:
Florian Sylvain committed 2026-11-03 00:12:29 +01:00
1 parent 339e646eb8
commit 45fbbc33b1
93 files changed
+7630 -294

No files matched your search

+15 -1
View File
@@ -42,6 +42,7 @@ type PostArticle struct {
StoryID *uint32 `json:"story_id" validate:"omitempty,gte=1"`
SourceArticleID *uint32 `json:"source_article_id" validate:"omitempty,gte=1"`
Copy *bool `json:"copy"`
Site *string `json:"site" validate:"omitempty,sitekey"`
}
type PostTranslation struct {
@@ -237,11 +238,15 @@ func (h *Handler) PostArticle(w http.ResponseWriter, r *http.Request) {
}
if err := validator.Validate.Struct(localArticle); err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
writeValidationError(w, err)
return
}
if localArticle.StoryID != nil {
if localArticle.Site != nil {
http.Error(w, apperr.BodyErrorMessage, http.StatusBadRequest)
return
}
h.postTranslation(w, r, format, localArticle)
return
}
@@ -259,6 +264,7 @@ func (h *Handler) PostArticle(w http.ResponseWriter, r *http.Request) {
Body: localArticle.Body,
Format: format,
Lang: lang,
Site: localArticle.Site,
Caller: access.CallerOf(r),
})
if err != nil {
@@ -336,6 +342,8 @@ func writeKnownArticleError(w http.ResponseWriter, err error) bool {
return access.WriteIfMissingPermission(w, err) || articleerr.Write(w, err)
}
const siteField = "Site"
var bodyMismatchFailures = map[string]string{
"Copy": "required",
"IfRevision": "min",
@@ -351,6 +359,12 @@ func writeValidationError(w http.ResponseWriter, err error) {
return
}
}
for _, failure := range failures {
if failure.Field() == siteField {
http.Error(w, apperr.InvalidSiteKeyErrorMessage, http.StatusBadRequest)
return
}
}
if len(failures) > 0 && bodyMismatchFailures[failures[0].Field()] == failures[0].Tag() {
http.Error(w, apperr.BodyErrorMessage, http.StatusBadRequest)
return
+1
View File
@@ -63,6 +63,7 @@ const CachePurgeTargetErrorMessage = "A variant name or an image id is required
const VariantUnknownMessage = "Unknown variant"
const VariantUnsupportedParameterMessage = "Unsupported parameter"
const SiteNotFoundErrorMessage = "site_not_found"
const InvalidSiteKeyErrorMessage = "invalid_site_key"
const SiteKeyTakenErrorMessage = "site_key_taken"
const SiteHasArticlesErrorMessage = "site_has_articles"
const DefaultSiteErrorMessage = "default_site"