From 6e9e4ec07aab6a9b39a3553c587ca36c7b815c62 Mon Sep 17 00:00:00 2001 From: Petru Braha Date: Sun, 3 May 2026 20:35:04 +0300 Subject: [PATCH 01/23] brand slug, store is a subresource of brand --- model/brand/brand-apis.smithy | 1 + model/brand/brand-io.smithy | 6 +++--- model/brand/brand-types.smithy | 2 +- model/store/store-apis.smithy | 7 ++++--- model/store/store-io.smithy | 7 +++---- model/store/store-types.smithy | 4 +--- model/util/util-basic.smithy | 16 +++------------- 7 files changed, 16 insertions(+), 27 deletions(-) diff --git a/model/brand/brand-apis.smithy b/model/brand/brand-apis.smithy index 79c43ba..bd36a22 100644 --- a/model/brand/brand-apis.smithy +++ b/model/brand/brand-apis.smithy @@ -10,6 +10,7 @@ use com.shopping.inandout.store#Store use com.shopping.inandout.util#Currency use com.shopping.inandout.util#ImageUrl use com.shopping.inandout.util#ResourceName +use com.shopping.inandout.util#UUID use com.shopping.inandout.util#Slug resource Brand { diff --git a/model/brand/brand-io.smithy b/model/brand/brand-io.smithy index 8ca2918..44c7515 100644 --- a/model/brand/brand-io.smithy +++ b/model/brand/brand-io.smithy @@ -19,13 +19,13 @@ structure CreateBrandInput { structure GetBrandInput { @required @httpLabel - brandSlug: Slug + brandSlug: UUID } structure UpdateBrandInput { @required @httpLabel - brandSlug: Slug + brandSlug: UUID name: ResourceName @@ -37,5 +37,5 @@ structure UpdateBrandInput { structure DeleteBrandInput { @required @httpLabel - brandSlug: Slug + brandSlug: UUID } diff --git a/model/brand/brand-types.smithy b/model/brand/brand-types.smithy index 4e768d8..e0e7c92 100644 --- a/model/brand/brand-types.smithy +++ b/model/brand/brand-types.smithy @@ -9,7 +9,7 @@ use com.shopping.inandout.util#Slug structure BrandSummary { @required - brandSlug: Slug + brandSlug: UUID @required name: ResourceName diff --git a/model/store/store-apis.smithy b/model/store/store-apis.smithy index fd2701c..9e2fab9 100644 --- a/model/store/store-apis.smithy +++ b/model/store/store-apis.smithy @@ -22,6 +22,7 @@ resource Store { } properties: { name: ResourceName + brandSlug: UUID description: Description imageUrl: ImageUrl currency: Currency @@ -53,7 +54,7 @@ operation CreateStore { } @readonly -@http(method: "GET", uri: "/api/brands/{brandSlug}/stores/{storeUid}") +@http(method: "GET", uri: "/api/brands/{brandSlug}/stores/{storeId}") operation GetStore { input: GetStoreInput output: StoreSummary @@ -73,7 +74,7 @@ operation ListStores { ] } -@http(method: "PATCH", uri: "/api/brands/{brandSlug}/stores/{storeUid}") +@http(method: "PATCH", uri: "/api/brands/{brandSlug}/stores/{storeId}") operation UpdateStore { input: UpdateStoreInput output: StoreSummary @@ -83,7 +84,7 @@ operation UpdateStore { } @idempotent -@http(method: "DELETE", uri: "/api/brands/{brandSlug}/stores/{storeUid}") +@http(method: "DELETE", uri: "/api/brands/{brandSlug}/stores/{storeId}") @documentation("Not restricted cascading operation, deletes floors, stands, etc.") operation DeleteStore { input: DeleteStoreInput diff --git a/model/store/store-io.smithy b/model/store/store-io.smithy index 68870cd..75de773 100644 --- a/model/store/store-io.smithy +++ b/model/store/store-io.smithy @@ -17,10 +17,7 @@ use com.shopping.inandout.util#UID structure CreateStoreInput { @required - @httpLabel - brandSlug: Slug - - name: ResourceName + brandSlug: UUID description: Description @@ -79,6 +76,8 @@ structure UpdateStoreInput { name: ResourceName + brandSlug: UUID + description: Description imageUrl: ImageUrl diff --git a/model/store/store-types.smithy b/model/store/store-types.smithy index a4e711c..3ad9def 100644 --- a/model/store/store-types.smithy +++ b/model/store/store-types.smithy @@ -24,9 +24,7 @@ structure StoreSummary { brandSlug: Slug @required - storeUid: UID - - name: ResourceName + brandSlug: UUID description: Description diff --git a/model/util/util-basic.smithy b/model/util/util-basic.smithy index f1f46e9..29979ee 100644 --- a/model/util/util-basic.smithy +++ b/model/util/util-basic.smithy @@ -2,19 +2,9 @@ $version: "2" namespace com.shopping.inandout.util -@pattern("^[0-9]+$") -@length(min: 1) -@documentation("Simple identifier of a resource") -string ID - -list IDList { - member: ID -} - -@pattern("^[0-9a-fA-F]{8}$") -@length(min: 8, max: 8) -@documentation("Unique identifier of a resource, scoped to a specific domain") -string UID +@pattern("^[a-z0-9]+(?:-[a-z0-9]+)*$") +@length(min: 3, max: 63) +string Slug @pattern("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$") @length(min: 36, max: 36) From 88cd86ea086be831d92468c0cf55f120ee24bcb4 Mon Sep 17 00:00:00 2001 From: Petru Braha Date: Sun, 3 May 2026 20:41:26 +0300 Subject: [PATCH 02/23] brand slug, store is a subresource of brand --- model/brand/brand-apis.smithy | 4 ---- model/store/store-apis.smithy | 4 ++-- model/store/store-io.smithy | 11 +++++++---- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/model/brand/brand-apis.smithy b/model/brand/brand-apis.smithy index bd36a22..9dfbaaa 100644 --- a/model/brand/brand-apis.smithy +++ b/model/brand/brand-apis.smithy @@ -5,12 +5,9 @@ namespace com.shopping.inandout.brand use com.shopping.inandout#DeleteRestrictedError use com.shopping.inandout#ResourceAlreadyExistsError use com.shopping.inandout#ResourceNotFoundError -use com.shopping.inandout.article#Article use com.shopping.inandout.store#Store -use com.shopping.inandout.util#Currency use com.shopping.inandout.util#ImageUrl use com.shopping.inandout.util#ResourceName -use com.shopping.inandout.util#UUID use com.shopping.inandout.util#Slug resource Brand { @@ -26,7 +23,6 @@ resource Brand { } resources: [ Store - Article ] create: CreateBrand read: GetBrand diff --git a/model/store/store-apis.smithy b/model/store/store-apis.smithy index 9e2fab9..b06450e 100644 --- a/model/store/store-apis.smithy +++ b/model/store/store-apis.smithy @@ -18,11 +18,10 @@ use com.shopping.inandout.util#UID resource Store { identifiers: { brandSlug: Slug - storeUid: UID + storeId: UUID } properties: { name: ResourceName - brandSlug: UUID description: Description imageUrl: ImageUrl currency: Currency @@ -35,6 +34,7 @@ resource Store { resources: [ Route Stand + Offer ] create: CreateStore read: GetStore diff --git a/model/store/store-io.smithy b/model/store/store-io.smithy index 75de773..0c9bef0 100644 --- a/model/store/store-io.smithy +++ b/model/store/store-io.smithy @@ -17,7 +17,10 @@ use com.shopping.inandout.util#UID structure CreateStoreInput { @required - brandSlug: UUID + @httpLabel + brandSlug: Slug + + name: ResourceName description: Description @@ -39,7 +42,7 @@ structure GetStoreInput { @required @httpLabel - storeUid: UID + storeId: UUID } structure ListStoresInput with [InputPagination] { @@ -72,7 +75,7 @@ structure UpdateStoreInput { @required @httpLabel - storeUid: UID + storeId: UUID name: ResourceName @@ -98,5 +101,5 @@ structure DeleteStoreInput { @required @httpLabel - storeUid: UID + storeId: UUID } From 735de7656737838f7d6514d3b7709afef55fc180 Mon Sep 17 00:00:00 2001 From: Petru Braha Date: Sun, 3 May 2026 21:43:23 +0300 Subject: [PATCH 03/23] feat: resource declaration --- model/main.smithy | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/model/main.smithy b/model/main.smithy index 339110e..b5fc389 100644 --- a/model/main.smithy +++ b/model/main.smithy @@ -11,7 +11,9 @@ metadata suppressions = [ namespace com.shopping.inandout use aws.protocols#restJson1 +use com.shopping.inandout.article#Article use com.shopping.inandout.brand#Brand +use com.shopping.inandout.offer#Offer use com.shopping.inandout.route#Route use com.shopping.inandout.stand#Stand @@ -43,5 +45,8 @@ service MappingService with [InAndOut] { service BusinessService with [InAndOut] { resources: [ Brand + Store + Article + Offer ] } From 4c3e03a3ec7249809431ceb754990769f2c31885 Mon Sep 17 00:00:00 2001 From: Petru Braha Date: Sun, 3 May 2026 21:44:54 +0300 Subject: [PATCH 04/23] feat: new way of referencing a resource - slugs --- model/util/util-basic.smithy | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/model/util/util-basic.smithy b/model/util/util-basic.smithy index 29979ee..96108e9 100644 --- a/model/util/util-basic.smithy +++ b/model/util/util-basic.smithy @@ -6,19 +6,24 @@ namespace com.shopping.inandout.util @length(min: 3, max: 63) string Slug -@pattern("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$") -@length(min: 36, max: 36) -@documentation("Universally unique identifier for all scopes") -string UUID - -@pattern("^[a-z0-9]+(?:-[a-z0-9]+)*$") -@length(min: 3, max: 63) -string Slug - list SlugList { member: Slug } +@pattern("^[0-9a-fA-F]{8}$") +@length(min: 8, max: 8) +@documentation("Identifier of a resource, scoped to a specific domain.") +string UID + +list UIDList { + member: UID +} + +@pattern("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$") +@length(min: 36, max: 36) +@documentation("Universally unique identifier for all scopes.") +string UUID + @pattern("^[a-zA-Z0-9\\- ]+$") @length(min: 3, max: 63) string ResourceName From a0581a57ffe3dfcdb54139d889a62e1ae893282a Mon Sep 17 00:00:00 2001 From: Petru Braha Date: Sun, 3 May 2026 21:49:42 +0300 Subject: [PATCH 05/23] feat: new way of referencing a resource - simple ids --- model/util/util-basic.smithy | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/model/util/util-basic.smithy b/model/util/util-basic.smithy index 96108e9..b38317d 100644 --- a/model/util/util-basic.smithy +++ b/model/util/util-basic.smithy @@ -2,17 +2,13 @@ $version: "2" namespace com.shopping.inandout.util -@pattern("^[a-z0-9]+(?:-[a-z0-9]+)*$") -@length(min: 3, max: 63) -string Slug - -list SlugList { - member: Slug -} +@range(min: 0, max: 9999999999999) +@documentation("Simple identifier of a resource.") +integer ID @pattern("^[0-9a-fA-F]{8}$") @length(min: 8, max: 8) -@documentation("Identifier of a resource, scoped to a specific domain.") +@documentation("Unique identifier of a resource, scoped to a specific domain.") string UID list UIDList { @@ -24,6 +20,14 @@ list UIDList { @documentation("Universally unique identifier for all scopes.") string UUID +@pattern("^[a-z0-9]+(?:-[a-z0-9]+)*$") +@length(min: 3, max: 63) +string Slug + +list SlugList { + member: Slug +} + @pattern("^[a-zA-Z0-9\\- ]+$") @length(min: 3, max: 63) string ResourceName From 93be756b41effe123385450a6cec745459e0c876 Mon Sep 17 00:00:00 2001 From: Petru Braha Date: Sun, 3 May 2026 21:51:51 +0300 Subject: [PATCH 06/23] feat: changed store id type --- model/store/store-apis.smithy | 2 +- model/store/store-io.smithy | 8 +++----- model/store/store-types.smithy | 4 +++- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/model/store/store-apis.smithy b/model/store/store-apis.smithy index b06450e..074a937 100644 --- a/model/store/store-apis.smithy +++ b/model/store/store-apis.smithy @@ -18,7 +18,7 @@ use com.shopping.inandout.util#UID resource Store { identifiers: { brandSlug: Slug - storeId: UUID + storeId: UID } properties: { name: ResourceName diff --git a/model/store/store-io.smithy b/model/store/store-io.smithy index 0c9bef0..c4c223e 100644 --- a/model/store/store-io.smithy +++ b/model/store/store-io.smithy @@ -42,7 +42,7 @@ structure GetStoreInput { @required @httpLabel - storeId: UUID + storeId: UID } structure ListStoresInput with [InputPagination] { @@ -75,12 +75,10 @@ structure UpdateStoreInput { @required @httpLabel - storeId: UUID + storeId: UID name: ResourceName - brandSlug: UUID - description: Description imageUrl: ImageUrl @@ -101,5 +99,5 @@ structure DeleteStoreInput { @required @httpLabel - storeId: UUID + storeId: UID } diff --git a/model/store/store-types.smithy b/model/store/store-types.smithy index 3ad9def..4403354 100644 --- a/model/store/store-types.smithy +++ b/model/store/store-types.smithy @@ -24,7 +24,9 @@ structure StoreSummary { brandSlug: Slug @required - brandSlug: UUID + storeId: UID + + name: ResourceName description: Description From 82dc61d830c9af8495c46e1340095cdd755fa05d Mon Sep 17 00:00:00 2001 From: Petru Braha Date: Sun, 3 May 2026 22:04:07 +0300 Subject: [PATCH 07/23] feat: article apis --- model/article/article-apis.smithy | 23 ++++++++++++----------- model/article/article-io.smithy | 20 ++++++++++---------- model/article/article-types.smithy | 20 ++++++++++---------- 3 files changed, 32 insertions(+), 31 deletions(-) diff --git a/model/article/article-apis.smithy b/model/article/article-apis.smithy index b5998cc..cc65c84 100644 --- a/model/article/article-apis.smithy +++ b/model/article/article-apis.smithy @@ -1,12 +1,17 @@ $version: "2" -namespace com.shopping.inandout.article +namespace shopping.inandout.article -use com.shopping.inandout#DeleteRestrictedError -use com.shopping.inandout#ResourceAlreadyExistsError -use com.shopping.inandout#ResourceNotFoundError -use com.shopping.inandout.util#PositiveDouble -use com.shopping.inandout.util#Slug +use shopping.inandout#DeleteRestrictedError +use shopping.inandout#InternalServerError +use shopping.inandout#InvalidInputError +use shopping.inandout#PositiveDouble +use shopping.inandout#ResourceAlreadyExistsError +use shopping.inandout#ResourceNotFoundError +use shopping.inandout#UUID +use shopping.inandout.product#ProductSummary +use shopping.inandout.util#Price +use shopping.inandout.util#Slug resource Article { identifiers: { @@ -16,7 +21,7 @@ resource Article { } properties: { productSummary: ProductSummary - defaultAmount: PositiveDouble + price: Price createdAt: Timestamp updatedAt: Timestamp } @@ -33,7 +38,6 @@ operation CreateArticle { output: ArticleSummary errors: [ ResourceAlreadyExistsError - ResourceNotFoundError ] } @@ -53,9 +57,6 @@ operation GetArticle { operation ListArticles { input: ListArticlesInput output: ArticleSummaries - errors: [ - ResourceNotFoundError - ] } @http(method: "PATCH", uri: "/api/brands/{brandSlug}/articles/{articleSlug}") diff --git a/model/article/article-io.smithy b/model/article/article-io.smithy index ddfcbcf..1bf900d 100644 --- a/model/article/article-io.smithy +++ b/model/article/article-io.smithy @@ -2,10 +2,10 @@ $version: "2" namespace com.shopping.inandout.article +use com.shopping.inandout.util#Currency use com.shopping.inandout.util#InputPagination use com.shopping.inandout.util#PositiveDouble -use com.shopping.inandout.util#ResourceName -use com.shopping.inandout.util#Slug +use com.shopping.inandout.util#Price use com.shopping.inandout.util#UUID structure CreateArticleInput { @@ -14,11 +14,10 @@ structure CreateArticleInput { brandSlug: Slug @required - @notProperty - productUuid: UUID + productSlug: String @required - defaultAmount: PositiveDouble + price: Price } structure GetArticleInput { @@ -37,22 +36,23 @@ structure ListArticlesInput with [InputPagination] { brandSlug: Slug @httpQuery("amount") + @documentation("Price amount in the currency of the article.") amount: PositiveDouble @httpQuery("name") - @documentation("Product name") + @documentation("Literal product name.") name: ResourceName @httpQuery("subcategory") - @documentation("Product subcategory") + @documentation("Literal product subcategory.") subcategory: ResourceName @httpQuery("category") - @documentation("Product category") + @documentation("Literal product category.") category: ResourceName @httpQuery("vendor") - @documentation("Product vendor") + @documentation("Literal product vendor.") vendor: ResourceName } @@ -65,7 +65,7 @@ structure UpdateArticleInput { @httpLabel articleSlug: Slug - defaultAmount: PositiveDouble + price: Price } structure DeleteArticleInput { diff --git a/model/article/article-types.smithy b/model/article/article-types.smithy index 383b2f5..ed091c2 100644 --- a/model/article/article-types.smithy +++ b/model/article/article-types.smithy @@ -1,18 +1,18 @@ $version: "2" -namespace com.shopping.inandout.article +namespace shopping.inandout.article -use com.shopping.inandout.util#Description -use com.shopping.inandout.util#ImageUrl -use com.shopping.inandout.util#OutputPagination -use com.shopping.inandout.util#PositiveDouble -use com.shopping.inandout.util#ResourceName -use com.shopping.inandout.util#Slug -use com.shopping.inandout.util#UUID +use shopping.inandout#AuditMetadata +use shopping.inandout#PositiveDouble +use shopping.inandout#ResourceName +use shopping.inandout#Timestamp +use shopping.inandout#UUID +use shopping.inandout.util#Price +use shopping.inandout.util#Slug structure ProductSummary { @required - productUuid: UUID + productSlug: Slug @required name: ResourceName @@ -48,7 +48,7 @@ structure ArticleSummary { productSummary: ProductSummary @required - defaultAmount: PositiveDouble + price: Price @required createdAt: Timestamp From 92c573ba6ec779dd3a39013d6aaebe8c5f8f4a3e Mon Sep 17 00:00:00 2001 From: Petru Braha Date: Sun, 3 May 2026 22:05:01 +0300 Subject: [PATCH 08/23] feat: brand slug --- model/brand/brand-apis.smithy | 1 + model/brand/brand-io.smithy | 6 +++--- model/brand/brand-types.smithy | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/model/brand/brand-apis.smithy b/model/brand/brand-apis.smithy index 9dfbaaa..0f0d512 100644 --- a/model/brand/brand-apis.smithy +++ b/model/brand/brand-apis.smithy @@ -23,6 +23,7 @@ resource Brand { } resources: [ Store + Article ] create: CreateBrand read: GetBrand diff --git a/model/brand/brand-io.smithy b/model/brand/brand-io.smithy index 44c7515..8ca2918 100644 --- a/model/brand/brand-io.smithy +++ b/model/brand/brand-io.smithy @@ -19,13 +19,13 @@ structure CreateBrandInput { structure GetBrandInput { @required @httpLabel - brandSlug: UUID + brandSlug: Slug } structure UpdateBrandInput { @required @httpLabel - brandSlug: UUID + brandSlug: Slug name: ResourceName @@ -37,5 +37,5 @@ structure UpdateBrandInput { structure DeleteBrandInput { @required @httpLabel - brandSlug: UUID + brandSlug: Slug } diff --git a/model/brand/brand-types.smithy b/model/brand/brand-types.smithy index e0e7c92..23475b5 100644 --- a/model/brand/brand-types.smithy +++ b/model/brand/brand-types.smithy @@ -6,10 +6,11 @@ use com.shopping.inandout.util#Currency use com.shopping.inandout.util#ImageUrl use com.shopping.inandout.util#ResourceName use com.shopping.inandout.util#Slug +use com.shopping.inandout.util#Timestamp structure BrandSummary { @required - brandSlug: UUID + brandSlug: Slug @required name: ResourceName From 5dc53fcf8c41ebe976563f1eda62fb41738f97dc Mon Sep 17 00:00:00 2001 From: Petru Braha Date: Sun, 3 May 2026 22:07:54 +0300 Subject: [PATCH 09/23] feat: offer apis --- model/offer/offer-apis.smithy | 78 ++++++++++++++++++++++++++++++++ model/offer/offer-io.smithy | 82 ++++++++++++++++++++++++++++++++++ model/offer/offer-types.smithy | 59 ++++++++++++++++++++++++ 3 files changed, 219 insertions(+) create mode 100644 model/offer/offer-apis.smithy create mode 100644 model/offer/offer-io.smithy create mode 100644 model/offer/offer-types.smithy diff --git a/model/offer/offer-apis.smithy b/model/offer/offer-apis.smithy new file mode 100644 index 0000000..014b957 --- /dev/null +++ b/model/offer/offer-apis.smithy @@ -0,0 +1,78 @@ +$version: "2" + +namespace shopping.inandout.offer + +use shopping.inandout#NaturalNumber +use shopping.inandout#Percentage +use shopping.inandout#ResourceAlreadyExistsError +use shopping.inandout#ResourceNotFoundError +use shopping.inandout#TimeRange +use shopping.inandout.util#UIDList +use shopping.inandout.util#Slug + +resource Offer { + identifiers: { + brandSlug: Slug + offerId: ID + } + properties: { + percentage: Percentage + storeIdList: UIDList + articleSlugList: SlugList + dependencyList: DependencyList + timeRange: TimeRange + lifetime: NaturalNumber + createdAt: Timestamp + updatedAt: Timestamp + } + create: CreateOffer + read: GetOffer + list: ListOffers + update: UpdateOffer + delete: DeleteOffer +} + +@http(method: "POST", uri: "/api/brands/{brandSlug}/offers") +operation CreateOffer { + input: CreateOfferInput + output: OfferSummary + errors: [ + ResourceAlreadyExistsError + ] +} + +@readonly +@http(method: "GET", uri: "/api/brands/{brandSlug}/offers/{offerId}") +operation GetOffer { + input: GetOfferInput + output: OfferSummary + errors: [ + ResourceNotFoundError + ] +} + +@readonly +@paginated +@http(method: "GET", uri: "/api/brands/{brandSlug}/offers") +operation ListOffers { + input: ListOffersInput + output: OfferSummaries +} + +@http(method: "PATCH", uri: "/api/brands/{brandSlug}/offers/{offerId}") +@documentation("Non-idempotent cascading operation, creates/deletes internal resources as needed") +operation UpdateOffer { + input: UpdateOfferInput + output: OfferSummary + errors: [ + ResourceNotFoundError + ] +} + +@idempotent +@http(method: "DELETE", uri: "/api/brands/{brandSlug}/offers/{offerId}") +@documentation("Not restricted cascading operation, deletes discounts, dependencies, etc.") +operation DeleteOffer { + input: DeleteOfferInput + output: OfferSummary +} diff --git a/model/offer/offer-io.smithy b/model/offer/offer-io.smithy new file mode 100644 index 0000000..f875561 --- /dev/null +++ b/model/offer/offer-io.smithy @@ -0,0 +1,82 @@ +$version: "2" + +namespace shopping.inandout.offer + +use shopping.inandout#InputPagination +use shopping.inandout#OutputPagination +use shopping.inandout#Percentage +use shopping.inandout#StoreIdMixin +use shopping.inandout#UUID + +structure CreateOfferInput { + @required + @httpLabel + brandSlug: Slug + + @required + percentage: Percentage + + storeIdList: UUIDList + + @required + articleSlugList: SlugList + + dependencyList: DependencyList + + timeRange: TimeRange + + @required + lifetime: NaturalNumber +} + +structure GetOfferInput { + @required + @httpLabel + brandSlug: Slug + + @required + @httpLabel + offerId: UID +} + +structure ListOffersInput with [InputPagination] { + @required + @httpLabel + brandSlug: Slug + + @required + @httpLabel + offerId: UID +} + +structure UpdateOfferInput { + @required + @httpLabel + brandSlug: Slug + + @required + @httpLabel + offerId: UID + + percentage: Percentage + + storeIdList: UUIDList + + articleSlugList: SlugList + + dependencyList: DependencyList + + timeRange: TimeRange + + lifetime: NaturalNumber +} + +structure DeleteOfferInput { + @required + @httpLabel + brandSlug: Slug + + @required + @httpLabel + offerId: UID +} diff --git a/model/offer/offer-types.smithy b/model/offer/offer-types.smithy new file mode 100644 index 0000000..69e016a --- /dev/null +++ b/model/offer/offer-types.smithy @@ -0,0 +1,59 @@ +$version: "2" + +namespace shopping.inandout.offer + +use shopping.inandout#AuditMetadata +use shopping.inandout#NaturalNumber +use shopping.inandout#Percentage +use shopping.inandout#TimeRange +use shopping.inandout#UUID +use shopping.inandout#UUIDList +use shopping.inandout.article#Article +use shopping.inandout.store#Store + +@documentation("Product dependency; it must be bought in order for the offer to activate.") +structure Dependency { + @required + articleSlug: Slug + + quantity: NaturalNumber +} + +list DependencyList { + member: Dependency +} + +structure OfferSummary { + @required + brandSlug: UUID + + @required + offerId: UID + + @required + percentage: Percentage + + storeIdList: UIDList + + articleSlugList: SlugList + + dependencyList: DependencyList + + timeRange: TimeRange + + lifetime: NaturalNumber + + @required + createdAt: Timestamp + + @required + updatedAt: Timestamp +} + +list OfferSummaryList { + members: OfferSummary +} + +structure OfferSummaries with [OutputPagination] { + tokens: OfferSummaryList +} From fde053fcd40f9297217e61908d6b925651712d0c Mon Sep 17 00:00:00 2001 From: Petru Braha Date: Sun, 3 May 2026 22:14:31 +0300 Subject: [PATCH 10/23] fix: stand subresource of a store --- model/route/route-apis.smithy | 1 + model/route/route-io.smithy | 11 +++-------- model/route/route-types.smithy | 5 +---- model/stand/stand-apis.smithy | 14 ++++++++------ model/stand/stand-io.smithy | 19 +++++++++++++++++-- model/stand/stand-types.smithy | 10 +++++++--- model/util/util-basic.smithy | 4 ++++ 7 files changed, 41 insertions(+), 23 deletions(-) diff --git a/model/route/route-apis.smithy b/model/route/route-apis.smithy index 8423cc3..cfe3fed 100644 --- a/model/route/route-apis.smithy +++ b/model/route/route-apis.smithy @@ -16,6 +16,7 @@ resource Route { routeUid: UID } properties: { + storeId: UID standIdList: IDList solutionList: SolutionList } diff --git a/model/route/route-io.smithy b/model/route/route-io.smithy index 6d5764c..e9b606d 100644 --- a/model/route/route-io.smithy +++ b/model/route/route-io.smithy @@ -2,18 +2,13 @@ $version: "2" namespace com.shopping.inandout.route +use com.shopping.inandout.util#ID use com.shopping.inandout.util#IDList -use com.shopping.inandout.util#Slug -use com.shopping.inandout.util#UID +use com.shopping.inandout.util#UUID structure CreateRouteInput { @required - @httpLabel - brandSlug: Slug - - @required - @httpLabel - storeUid: UID + storeId: UID @required standIdList: IDList diff --git a/model/route/route-types.smithy b/model/route/route-types.smithy index 0cbe733..de3df0c 100644 --- a/model/route/route-types.smithy +++ b/model/route/route-types.smithy @@ -50,10 +50,7 @@ structure RouteSummary { brandSlug: Slug @required - storeUid: UID - - @required - routeUid: UID + storeId: UID @required @documentation("The initial input") diff --git a/model/stand/stand-apis.smithy b/model/stand/stand-apis.smithy index ca9b8a8..c94d566 100644 --- a/model/stand/stand-apis.smithy +++ b/model/stand/stand-apis.smithy @@ -6,19 +6,21 @@ use com.shopping.inandout#ResourceAlreadyExistsError use com.shopping.inandout#ResourceNotFoundError use com.shopping.inandout.util#ID use com.shopping.inandout.util#PositiveDouble +use com.shopping.inandout.util#Price use com.shopping.inandout.util#Slug -use com.shopping.inandout.util#UID +use com.shopping.inandout.util#Timestamp +use com.shopping.inandout.util#UUID resource Stand { identifiers: { brandSlug: Slug - storeUid: UID + storeId: UID standId: ID } properties: { articleSlug: Slug edgeId: ID - amount: PositiveDouble + price: Price sourceNodeDistance: PositiveDouble createdAt: Timestamp updatedAt: Timestamp @@ -30,7 +32,7 @@ resource Stand { delete: DeleteStand } -@http(method: "POST", uri: "/api/brands/{brandSlug}/stores/{storeUid}/stands") +@http(method: "POST", uri: "/api/brands/{brandSlug}/stores/{storeId}/stands") operation CreateStand { input: CreateStandInput output: StandSummary @@ -41,7 +43,7 @@ operation CreateStand { } @readonly -@http(method: "GET", uri: "/api/brands/{brandSlug}/stores/{storeUid}/stands/{standId}") +@http(method: "GET", uri: "/api/brands/{brandSlug}/stores/{storeId}/stands/{standId}") operation GetStand { input: GetStandInput output: StandSummary @@ -52,7 +54,7 @@ operation GetStand { @readonly @paginated -@http(method: "GET", uri: "/api/brands/{brandSlug}/stores/{storeUid}/stands") +@http(method: "GET", uri: "/api/brands/{brandSlug}/stores/{storeId}/stands") operation ListStands { input: ListStandsInput output: StandSummaries diff --git a/model/stand/stand-io.smithy b/model/stand/stand-io.smithy index fb3e557..448d947 100644 --- a/model/stand/stand-io.smithy +++ b/model/stand/stand-io.smithy @@ -16,7 +16,10 @@ structure CreateStandInput { @required @httpLabel - storeUid: UID + storeId: UID + + @required + articleSlug: Slug @required articleSlug: Slug @@ -34,6 +37,10 @@ structure GetStandInput { @httpLabel brandSlug: Slug + @required + @httpLabel + storeId: UID + @required @httpLabel storeUid: UID @@ -50,7 +57,7 @@ structure ListStandsInput with [InputPagination] { @required @httpLabel - storeUid: UID + storeId: UID @httpQuery("edgeId") edgeId: ID @@ -67,6 +74,10 @@ structure UpdateStandInput { @httpLabel brandSlug: Slug + @required + @httpLabel + storeId: UID + @required @httpLabel storeUid: UID @@ -87,6 +98,10 @@ structure DeleteStandInput { @httpLabel brandSlug: Slug + @required + @httpLabel + storeId: UID + @required @httpLabel storeUid: UID diff --git a/model/stand/stand-types.smithy b/model/stand/stand-types.smithy index cf147dc..dcca80b 100644 --- a/model/stand/stand-types.smithy +++ b/model/stand/stand-types.smithy @@ -5,15 +5,16 @@ namespace com.shopping.inandout.stand use com.shopping.inandout.util#ID use com.shopping.inandout.util#OutputPagination use com.shopping.inandout.util#PositiveDouble -use com.shopping.inandout.util#Slug -use com.shopping.inandout.util#UID +use com.shopping.inandout.util#Price +use com.shopping.inandout.util#Timestamp +use com.shopping.inandout.util#UUID structure StandSummary { @required brandSlug: Slug @required - storeUid: UID + storeId: UID @required standId: ID @@ -24,6 +25,9 @@ structure StandSummary { @required edgeId: ID + @required + edgeId: ID + amount: PositiveDouble sourceNodeDistance: PositiveDouble diff --git a/model/util/util-basic.smithy b/model/util/util-basic.smithy index b38317d..0020706 100644 --- a/model/util/util-basic.smithy +++ b/model/util/util-basic.smithy @@ -6,6 +6,10 @@ namespace com.shopping.inandout.util @documentation("Simple identifier of a resource.") integer ID +list IDList { + member: ID +} + @pattern("^[0-9a-fA-F]{8}$") @length(min: 8, max: 8) @documentation("Unique identifier of a resource, scoped to a specific domain.") From ea3814e6dbe76b95b6571c5e2abda057822063d2 Mon Sep 17 00:00:00 2001 From: Petru Braha Date: Sun, 3 May 2026 22:16:04 +0300 Subject: [PATCH 11/23] fix: com. prefix of imports --- model/article/article-apis.smithy | 20 ++++++++++---------- model/article/article-types.smithy | 14 +++++++------- model/offer/offer-apis.smithy | 14 +++++++------- model/offer/offer-io.smithy | 10 +++++----- model/offer/offer-types.smithy | 16 ++++++++-------- 5 files changed, 37 insertions(+), 37 deletions(-) diff --git a/model/article/article-apis.smithy b/model/article/article-apis.smithy index cc65c84..c786899 100644 --- a/model/article/article-apis.smithy +++ b/model/article/article-apis.smithy @@ -2,16 +2,16 @@ $version: "2" namespace shopping.inandout.article -use shopping.inandout#DeleteRestrictedError -use shopping.inandout#InternalServerError -use shopping.inandout#InvalidInputError -use shopping.inandout#PositiveDouble -use shopping.inandout#ResourceAlreadyExistsError -use shopping.inandout#ResourceNotFoundError -use shopping.inandout#UUID -use shopping.inandout.product#ProductSummary -use shopping.inandout.util#Price -use shopping.inandout.util#Slug +use com.shopping.inandout#DeleteRestrictedError +use com.shopping.inandout#InternalServerError +use com.shopping.inandout#InvalidInputError +use com.shopping.inandout#PositiveDouble +use com.shopping.inandout#ResourceAlreadyExistsError +use com.shopping.inandout#ResourceNotFoundError +use com.shopping.inandout#UUID +use com.shopping.inandout.product#ProductSummary +use com.shopping.inandout.util#Price +use com.shopping.inandout.util#Slug resource Article { identifiers: { diff --git a/model/article/article-types.smithy b/model/article/article-types.smithy index ed091c2..424ab06 100644 --- a/model/article/article-types.smithy +++ b/model/article/article-types.smithy @@ -2,13 +2,13 @@ $version: "2" namespace shopping.inandout.article -use shopping.inandout#AuditMetadata -use shopping.inandout#PositiveDouble -use shopping.inandout#ResourceName -use shopping.inandout#Timestamp -use shopping.inandout#UUID -use shopping.inandout.util#Price -use shopping.inandout.util#Slug +use com.shopping.inandout#AuditMetadata +use com.shopping.inandout#PositiveDouble +use com.shopping.inandout#ResourceName +use com.shopping.inandout#Timestamp +use com.shopping.inandout#UUID +use com.shopping.inandout.util#Price +use com.shopping.inandout.util#Slug structure ProductSummary { @required diff --git a/model/offer/offer-apis.smithy b/model/offer/offer-apis.smithy index 014b957..03248e9 100644 --- a/model/offer/offer-apis.smithy +++ b/model/offer/offer-apis.smithy @@ -2,13 +2,13 @@ $version: "2" namespace shopping.inandout.offer -use shopping.inandout#NaturalNumber -use shopping.inandout#Percentage -use shopping.inandout#ResourceAlreadyExistsError -use shopping.inandout#ResourceNotFoundError -use shopping.inandout#TimeRange -use shopping.inandout.util#UIDList -use shopping.inandout.util#Slug +use com.shopping.inandout#NaturalNumber +use com.shopping.inandout#Percentage +use com.shopping.inandout#ResourceAlreadyExistsError +use com.shopping.inandout#ResourceNotFoundError +use com.shopping.inandout#TimeRange +use com.shopping.inandout.util#UIDList +use com.shopping.inandout.util#Slug resource Offer { identifiers: { diff --git a/model/offer/offer-io.smithy b/model/offer/offer-io.smithy index f875561..35615fa 100644 --- a/model/offer/offer-io.smithy +++ b/model/offer/offer-io.smithy @@ -2,11 +2,11 @@ $version: "2" namespace shopping.inandout.offer -use shopping.inandout#InputPagination -use shopping.inandout#OutputPagination -use shopping.inandout#Percentage -use shopping.inandout#StoreIdMixin -use shopping.inandout#UUID +use com.shopping.inandout#InputPagination +use com.shopping.inandout#OutputPagination +use com.shopping.inandout#Percentage +use com.shopping.inandout#StoreIdMixin +use com.shopping.inandout#UUID structure CreateOfferInput { @required diff --git a/model/offer/offer-types.smithy b/model/offer/offer-types.smithy index 69e016a..81cf9bd 100644 --- a/model/offer/offer-types.smithy +++ b/model/offer/offer-types.smithy @@ -2,14 +2,14 @@ $version: "2" namespace shopping.inandout.offer -use shopping.inandout#AuditMetadata -use shopping.inandout#NaturalNumber -use shopping.inandout#Percentage -use shopping.inandout#TimeRange -use shopping.inandout#UUID -use shopping.inandout#UUIDList -use shopping.inandout.article#Article -use shopping.inandout.store#Store +use com.shopping.inandout#AuditMetadata +use com.shopping.inandout#NaturalNumber +use com.shopping.inandout#Percentage +use com.shopping.inandout#TimeRange +use com.shopping.inandout#UUID +use com.shopping.inandout#UUIDList +use com.shopping.inandout.article#Article +use com.shopping.inandout.store#Store @documentation("Product dependency; it must be bought in order for the offer to activate.") structure Dependency { From f90130cfdc90b6d06e8738ba4ea4493954bcd6ae Mon Sep 17 00:00:00 2001 From: Petru Braha Date: Sun, 3 May 2026 22:16:28 +0300 Subject: [PATCH 12/23] fix: com. prefix of imports --- model/article/article-apis.smithy | 2 +- model/article/article-types.smithy | 2 +- model/offer/offer-apis.smithy | 2 +- model/offer/offer-io.smithy | 2 +- model/offer/offer-types.smithy | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/model/article/article-apis.smithy b/model/article/article-apis.smithy index c786899..6952c3a 100644 --- a/model/article/article-apis.smithy +++ b/model/article/article-apis.smithy @@ -1,6 +1,6 @@ $version: "2" -namespace shopping.inandout.article +namespace com.shopping.inandout.article use com.shopping.inandout#DeleteRestrictedError use com.shopping.inandout#InternalServerError diff --git a/model/article/article-types.smithy b/model/article/article-types.smithy index 424ab06..3db4b8a 100644 --- a/model/article/article-types.smithy +++ b/model/article/article-types.smithy @@ -1,6 +1,6 @@ $version: "2" -namespace shopping.inandout.article +namespace com.shopping.inandout.article use com.shopping.inandout#AuditMetadata use com.shopping.inandout#PositiveDouble diff --git a/model/offer/offer-apis.smithy b/model/offer/offer-apis.smithy index 03248e9..ef0a1e9 100644 --- a/model/offer/offer-apis.smithy +++ b/model/offer/offer-apis.smithy @@ -1,6 +1,6 @@ $version: "2" -namespace shopping.inandout.offer +namespace com.shopping.inandout.offer use com.shopping.inandout#NaturalNumber use com.shopping.inandout#Percentage diff --git a/model/offer/offer-io.smithy b/model/offer/offer-io.smithy index 35615fa..abc4701 100644 --- a/model/offer/offer-io.smithy +++ b/model/offer/offer-io.smithy @@ -1,6 +1,6 @@ $version: "2" -namespace shopping.inandout.offer +namespace com.shopping.inandout.offer use com.shopping.inandout#InputPagination use com.shopping.inandout#OutputPagination diff --git a/model/offer/offer-types.smithy b/model/offer/offer-types.smithy index 81cf9bd..86fe98a 100644 --- a/model/offer/offer-types.smithy +++ b/model/offer/offer-types.smithy @@ -1,6 +1,6 @@ $version: "2" -namespace shopping.inandout.offer +namespace com.shopping.inandout.offer use com.shopping.inandout#AuditMetadata use com.shopping.inandout#NaturalNumber From 3a2cb7446efe810f28291440d4796275f70c2be9 Mon Sep 17 00:00:00 2001 From: Petru Braha Date: Sun, 3 May 2026 22:30:16 +0300 Subject: [PATCH 13/23] fix: imports --- model/article/article-apis.smithy | 8 -------- model/article/article-io.smithy | 6 +++--- model/article/article-types.smithy | 9 ++++----- model/brand/brand-apis.smithy | 1 + model/brand/brand-types.smithy | 1 - model/offer/offer-apis.smithy | 10 ++++++---- model/offer/offer-io.smithy | 25 ++++++++++++++----------- model/offer/offer-types.smithy | 24 ++++++++++++------------ model/route/route-apis.smithy | 2 +- model/route/route-io.smithy | 2 +- model/route/route-types.smithy | 3 +-- model/stand/stand-apis.smithy | 3 +-- model/stand/stand-io.smithy | 2 ++ model/stand/stand-types.smithy | 4 ++-- model/store/store-apis.smithy | 2 +- model/store/store-io.smithy | 1 - model/store/store-types.smithy | 1 - 17 files changed, 49 insertions(+), 55 deletions(-) diff --git a/model/article/article-apis.smithy b/model/article/article-apis.smithy index 6952c3a..15376d8 100644 --- a/model/article/article-apis.smithy +++ b/model/article/article-apis.smithy @@ -2,14 +2,6 @@ $version: "2" namespace com.shopping.inandout.article -use com.shopping.inandout#DeleteRestrictedError -use com.shopping.inandout#InternalServerError -use com.shopping.inandout#InvalidInputError -use com.shopping.inandout#PositiveDouble -use com.shopping.inandout#ResourceAlreadyExistsError -use com.shopping.inandout#ResourceNotFoundError -use com.shopping.inandout#UUID -use com.shopping.inandout.product#ProductSummary use com.shopping.inandout.util#Price use com.shopping.inandout.util#Slug diff --git a/model/article/article-io.smithy b/model/article/article-io.smithy index 1bf900d..2a4b0b9 100644 --- a/model/article/article-io.smithy +++ b/model/article/article-io.smithy @@ -2,11 +2,11 @@ $version: "2" namespace com.shopping.inandout.article -use com.shopping.inandout.util#Currency use com.shopping.inandout.util#InputPagination use com.shopping.inandout.util#PositiveDouble use com.shopping.inandout.util#Price -use com.shopping.inandout.util#UUID +use com.shopping.inandout.util#ResourceName +use com.shopping.inandout.util#Slug structure CreateArticleInput { @required @@ -14,7 +14,7 @@ structure CreateArticleInput { brandSlug: Slug @required - productSlug: String + productSlug: Slug @required price: Price diff --git a/model/article/article-types.smithy b/model/article/article-types.smithy index 3db4b8a..302ad4a 100644 --- a/model/article/article-types.smithy +++ b/model/article/article-types.smithy @@ -2,12 +2,11 @@ $version: "2" namespace com.shopping.inandout.article -use com.shopping.inandout#AuditMetadata -use com.shopping.inandout#PositiveDouble -use com.shopping.inandout#ResourceName -use com.shopping.inandout#Timestamp -use com.shopping.inandout#UUID +use com.shopping.inandout.util#Description +use com.shopping.inandout.util#ImageUrl +use com.shopping.inandout.util#OutputPagination use com.shopping.inandout.util#Price +use com.shopping.inandout.util#ResourceName use com.shopping.inandout.util#Slug structure ProductSummary { diff --git a/model/brand/brand-apis.smithy b/model/brand/brand-apis.smithy index 0f0d512..e68483a 100644 --- a/model/brand/brand-apis.smithy +++ b/model/brand/brand-apis.smithy @@ -5,6 +5,7 @@ namespace com.shopping.inandout.brand use com.shopping.inandout#DeleteRestrictedError use com.shopping.inandout#ResourceAlreadyExistsError use com.shopping.inandout#ResourceNotFoundError +use com.shopping.inandout.article#Article use com.shopping.inandout.store#Store use com.shopping.inandout.util#ImageUrl use com.shopping.inandout.util#ResourceName diff --git a/model/brand/brand-types.smithy b/model/brand/brand-types.smithy index 23475b5..4e768d8 100644 --- a/model/brand/brand-types.smithy +++ b/model/brand/brand-types.smithy @@ -6,7 +6,6 @@ use com.shopping.inandout.util#Currency use com.shopping.inandout.util#ImageUrl use com.shopping.inandout.util#ResourceName use com.shopping.inandout.util#Slug -use com.shopping.inandout.util#Timestamp structure BrandSummary { @required diff --git a/model/offer/offer-apis.smithy b/model/offer/offer-apis.smithy index ef0a1e9..2645640 100644 --- a/model/offer/offer-apis.smithy +++ b/model/offer/offer-apis.smithy @@ -2,13 +2,15 @@ $version: "2" namespace com.shopping.inandout.offer -use com.shopping.inandout#NaturalNumber -use com.shopping.inandout#Percentage use com.shopping.inandout#ResourceAlreadyExistsError use com.shopping.inandout#ResourceNotFoundError -use com.shopping.inandout#TimeRange -use com.shopping.inandout.util#UIDList +use com.shopping.inandout.util#ID +use com.shopping.inandout.util#NaturalNumber +use com.shopping.inandout.util#Percentage use com.shopping.inandout.util#Slug +use com.shopping.inandout.util#SlugList +use com.shopping.inandout.util#TimeRange +use com.shopping.inandout.util#UIDList resource Offer { identifiers: { diff --git a/model/offer/offer-io.smithy b/model/offer/offer-io.smithy index abc4701..bb394b9 100644 --- a/model/offer/offer-io.smithy +++ b/model/offer/offer-io.smithy @@ -2,13 +2,16 @@ $version: "2" namespace com.shopping.inandout.offer -use com.shopping.inandout#InputPagination -use com.shopping.inandout#OutputPagination -use com.shopping.inandout#Percentage -use com.shopping.inandout#StoreIdMixin -use com.shopping.inandout#UUID - -structure CreateOfferInput { +use com.shopping.inandout.util#InputPagination +use com.shopping.inandout.util#NaturalNumber +use com.shopping.inandout.util#Percentage +use com.shopping.inandout.util#Slug +use com.shopping.inandout.util#SlugList +use com.shopping.inandout.util#TimeRange +use com.shopping.inandout.util#UID +use com.shopping.inandout.util#UIDList + +structure CreateOfferInput { @required @httpLabel brandSlug: Slug @@ -16,13 +19,13 @@ structure CreateOfferInput { @required percentage: Percentage - storeIdList: UUIDList + storeIdList: UIDList @required articleSlugList: SlugList dependencyList: DependencyList - + timeRange: TimeRange @required @@ -60,12 +63,12 @@ structure UpdateOfferInput { percentage: Percentage - storeIdList: UUIDList + storeIdList: UIDList articleSlugList: SlugList dependencyList: DependencyList - + timeRange: TimeRange lifetime: NaturalNumber diff --git a/model/offer/offer-types.smithy b/model/offer/offer-types.smithy index 86fe98a..550663b 100644 --- a/model/offer/offer-types.smithy +++ b/model/offer/offer-types.smithy @@ -2,20 +2,20 @@ $version: "2" namespace com.shopping.inandout.offer -use com.shopping.inandout#AuditMetadata -use com.shopping.inandout#NaturalNumber -use com.shopping.inandout#Percentage -use com.shopping.inandout#TimeRange -use com.shopping.inandout#UUID -use com.shopping.inandout#UUIDList -use com.shopping.inandout.article#Article -use com.shopping.inandout.store#Store +use com.shopping.inandout.util#ID +use com.shopping.inandout.util#NaturalNumber +use com.shopping.inandout.util#OutputPagination +use com.shopping.inandout.util#Percentage +use com.shopping.inandout.util#Slug +use com.shopping.inandout.util#SlugList +use com.shopping.inandout.util#TimeRange +use com.shopping.inandout.util#UIDList @documentation("Product dependency; it must be bought in order for the offer to activate.") structure Dependency { @required articleSlug: Slug - + quantity: NaturalNumber } @@ -25,10 +25,10 @@ list DependencyList { structure OfferSummary { @required - brandSlug: UUID + brandSlug: Slug @required - offerId: UID + offerId: ID @required percentage: Percentage @@ -51,7 +51,7 @@ structure OfferSummary { } list OfferSummaryList { - members: OfferSummary + member: OfferSummary } structure OfferSummaries with [OutputPagination] { diff --git a/model/route/route-apis.smithy b/model/route/route-apis.smithy index cfe3fed..d7c4846 100644 --- a/model/route/route-apis.smithy +++ b/model/route/route-apis.smithy @@ -5,8 +5,8 @@ namespace com.shopping.inandout.route use com.shopping.inandout#ResourceAlreadyExistsError use com.shopping.inandout#ResourceNotFoundError use com.shopping.inandout.util#IDList -use com.shopping.inandout.util#Slug use com.shopping.inandout.util#UID +use com.shopping.inandout.util#UUID @documentation("Travelling salesman problem and solution creation/retrieval") resource Route { diff --git a/model/route/route-io.smithy b/model/route/route-io.smithy index e9b606d..471b822 100644 --- a/model/route/route-io.smithy +++ b/model/route/route-io.smithy @@ -2,8 +2,8 @@ $version: "2" namespace com.shopping.inandout.route -use com.shopping.inandout.util#ID use com.shopping.inandout.util#IDList +use com.shopping.inandout.util#UID use com.shopping.inandout.util#UUID structure CreateRouteInput { diff --git a/model/route/route-types.smithy b/model/route/route-types.smithy index de3df0c..ef9f726 100644 --- a/model/route/route-types.smithy +++ b/model/route/route-types.smithy @@ -2,10 +2,9 @@ $version: "2" namespace com.shopping.inandout.route -use com.shopping.inandout.util#ID use com.shopping.inandout.util#IDList -use com.shopping.inandout.util#Slug use com.shopping.inandout.util#UID +use com.shopping.inandout.util#UUID @documentation("In between nodes navigable stand points") structure StandNode { diff --git a/model/stand/stand-apis.smithy b/model/stand/stand-apis.smithy index c94d566..bd99008 100644 --- a/model/stand/stand-apis.smithy +++ b/model/stand/stand-apis.smithy @@ -8,8 +8,7 @@ use com.shopping.inandout.util#ID use com.shopping.inandout.util#PositiveDouble use com.shopping.inandout.util#Price use com.shopping.inandout.util#Slug -use com.shopping.inandout.util#Timestamp -use com.shopping.inandout.util#UUID +use com.shopping.inandout.util#UID resource Stand { identifiers: { diff --git a/model/stand/stand-io.smithy b/model/stand/stand-io.smithy index 448d947..2c60105 100644 --- a/model/stand/stand-io.smithy +++ b/model/stand/stand-io.smithy @@ -5,9 +5,11 @@ namespace com.shopping.inandout.stand use com.shopping.inandout.util#ID use com.shopping.inandout.util#InputPagination use com.shopping.inandout.util#PositiveDouble +use com.shopping.inandout.util#Price use com.shopping.inandout.util#ResourceName use com.shopping.inandout.util#Slug use com.shopping.inandout.util#UID +use com.shopping.inandout.util#UUID structure CreateStandInput { @required diff --git a/model/stand/stand-types.smithy b/model/stand/stand-types.smithy index dcca80b..19295aa 100644 --- a/model/stand/stand-types.smithy +++ b/model/stand/stand-types.smithy @@ -6,8 +6,8 @@ use com.shopping.inandout.util#ID use com.shopping.inandout.util#OutputPagination use com.shopping.inandout.util#PositiveDouble use com.shopping.inandout.util#Price -use com.shopping.inandout.util#Timestamp -use com.shopping.inandout.util#UUID +use com.shopping.inandout.util#Slug +use com.shopping.inandout.util#UID structure StandSummary { @required diff --git a/model/store/store-apis.smithy b/model/store/store-apis.smithy index 074a937..90fc03a 100644 --- a/model/store/store-apis.smithy +++ b/model/store/store-apis.smithy @@ -4,7 +4,7 @@ namespace com.shopping.inandout.store use com.shopping.inandout#ResourceAlreadyExistsError use com.shopping.inandout#ResourceNotFoundError -use com.shopping.inandout.route#Route +use com.shopping.inandout.offer#Offer use com.shopping.inandout.stand#Stand use com.shopping.inandout.util#Currency use com.shopping.inandout.util#Description diff --git a/model/store/store-io.smithy b/model/store/store-io.smithy index c4c223e..aefb14c 100644 --- a/model/store/store-io.smithy +++ b/model/store/store-io.smithy @@ -2,7 +2,6 @@ $version: "2" namespace com.shopping.inandout.store -use com.shopping.inandout.util#Currency use com.shopping.inandout.util#Description use com.shopping.inandout.util#GeoCoordinates use com.shopping.inandout.util#ImageUrl diff --git a/model/store/store-types.smithy b/model/store/store-types.smithy index 4403354..78df190 100644 --- a/model/store/store-types.smithy +++ b/model/store/store-types.smithy @@ -2,7 +2,6 @@ $version: "2" namespace com.shopping.inandout.store -use com.shopping.inandout.util#Currency use com.shopping.inandout.util#DayType use com.shopping.inandout.util#Description use com.shopping.inandout.util#GeoCoordinates From a3dd6fc9c4702b7a968abb4987d2a9aa24c4a1ae Mon Sep 17 00:00:00 2001 From: Petru Braha Date: Sun, 3 May 2026 22:34:37 +0300 Subject: [PATCH 14/23] fix: imports --- model/article/article-apis.smithy | 3 +++ model/brand/brand-apis.smithy | 2 ++ model/main.smithy | 6 ------ model/store/store-apis.smithy | 2 -- model/util/util-basic.smithy | 4 ++-- 5 files changed, 7 insertions(+), 10 deletions(-) diff --git a/model/article/article-apis.smithy b/model/article/article-apis.smithy index 15376d8..d16714f 100644 --- a/model/article/article-apis.smithy +++ b/model/article/article-apis.smithy @@ -2,6 +2,9 @@ $version: "2" namespace com.shopping.inandout.article +use com.shopping.inandout#DeleteRestrictedError +use com.shopping.inandout#ResourceAlreadyExistsError +use com.shopping.inandout#ResourceNotFoundError use com.shopping.inandout.util#Price use com.shopping.inandout.util#Slug diff --git a/model/brand/brand-apis.smithy b/model/brand/brand-apis.smithy index e68483a..8585cbf 100644 --- a/model/brand/brand-apis.smithy +++ b/model/brand/brand-apis.smithy @@ -6,6 +6,7 @@ use com.shopping.inandout#DeleteRestrictedError use com.shopping.inandout#ResourceAlreadyExistsError use com.shopping.inandout#ResourceNotFoundError use com.shopping.inandout.article#Article +use com.shopping.inandout.offer#Offer use com.shopping.inandout.store#Store use com.shopping.inandout.util#ImageUrl use com.shopping.inandout.util#ResourceName @@ -25,6 +26,7 @@ resource Brand { resources: [ Store Article + Offer ] create: CreateBrand read: GetBrand diff --git a/model/main.smithy b/model/main.smithy index b5fc389..fe96739 100644 --- a/model/main.smithy +++ b/model/main.smithy @@ -10,10 +10,7 @@ metadata suppressions = [ namespace com.shopping.inandout -use aws.protocols#restJson1 -use com.shopping.inandout.article#Article use com.shopping.inandout.brand#Brand -use com.shopping.inandout.offer#Offer use com.shopping.inandout.route#Route use com.shopping.inandout.stand#Stand @@ -45,8 +42,5 @@ service MappingService with [InAndOut] { service BusinessService with [InAndOut] { resources: [ Brand - Store - Article - Offer ] } diff --git a/model/store/store-apis.smithy b/model/store/store-apis.smithy index 90fc03a..d00fe4e 100644 --- a/model/store/store-apis.smithy +++ b/model/store/store-apis.smithy @@ -4,7 +4,6 @@ namespace com.shopping.inandout.store use com.shopping.inandout#ResourceAlreadyExistsError use com.shopping.inandout#ResourceNotFoundError -use com.shopping.inandout.offer#Offer use com.shopping.inandout.stand#Stand use com.shopping.inandout.util#Currency use com.shopping.inandout.util#Description @@ -34,7 +33,6 @@ resource Store { resources: [ Route Stand - Offer ] create: CreateStore read: GetStore diff --git a/model/util/util-basic.smithy b/model/util/util-basic.smithy index 0020706..e367397 100644 --- a/model/util/util-basic.smithy +++ b/model/util/util-basic.smithy @@ -2,9 +2,9 @@ $version: "2" namespace com.shopping.inandout.util -@range(min: 0, max: 9999999999999) +@pattern("^[a-fA-F]+$") @documentation("Simple identifier of a resource.") -integer ID +string ID list IDList { member: ID From 3ac0fe05aaf30f26131462839c969be67c75c6cc Mon Sep 17 00:00:00 2001 From: Petru Braha Date: Mon, 4 May 2026 08:07:07 +0300 Subject: [PATCH 15/23] fix: imports --- model/article/article-io.smithy | 1 + model/main.smithy | 3 ++- model/offer/offer-io.smithy | 12 ++++-------- model/stand/stand-apis.smithy | 4 ++-- model/stand/stand-io.smithy | 17 +++-------------- smithy-build.json | 5 ++++- 6 files changed, 16 insertions(+), 26 deletions(-) diff --git a/model/article/article-io.smithy b/model/article/article-io.smithy index 2a4b0b9..eae06ab 100644 --- a/model/article/article-io.smithy +++ b/model/article/article-io.smithy @@ -14,6 +14,7 @@ structure CreateArticleInput { brandSlug: Slug @required + @notProperty productSlug: Slug @required diff --git a/model/main.smithy b/model/main.smithy index fe96739..c5a967b 100644 --- a/model/main.smithy +++ b/model/main.smithy @@ -10,6 +10,7 @@ metadata suppressions = [ namespace com.shopping.inandout +use aws.protocols#restJson1 use com.shopping.inandout.brand#Brand use com.shopping.inandout.route#Route use com.shopping.inandout.stand#Stand @@ -38,7 +39,7 @@ service MappingService with [InAndOut] { } @paginated(inputToken: "nextToken", outputToken: "nextToken", pageSize: "pageSize", items: "tokens") -@documentation("Manages business resources like Brands, Stores, Articles and Offers") +@documentation("Brands, Stores, Articles, Offers.") service BusinessService with [InAndOut] { resources: [ Brand diff --git a/model/offer/offer-io.smithy b/model/offer/offer-io.smithy index bb394b9..fb497b5 100644 --- a/model/offer/offer-io.smithy +++ b/model/offer/offer-io.smithy @@ -2,13 +2,13 @@ $version: "2" namespace com.shopping.inandout.offer +use com.shopping.inandout.util#ID use com.shopping.inandout.util#InputPagination use com.shopping.inandout.util#NaturalNumber use com.shopping.inandout.util#Percentage use com.shopping.inandout.util#Slug use com.shopping.inandout.util#SlugList use com.shopping.inandout.util#TimeRange -use com.shopping.inandout.util#UID use com.shopping.inandout.util#UIDList structure CreateOfferInput { @@ -39,17 +39,13 @@ structure GetOfferInput { @required @httpLabel - offerId: UID + offerId: ID } structure ListOffersInput with [InputPagination] { @required @httpLabel brandSlug: Slug - - @required - @httpLabel - offerId: UID } structure UpdateOfferInput { @@ -59,7 +55,7 @@ structure UpdateOfferInput { @required @httpLabel - offerId: UID + offerId: ID percentage: Percentage @@ -81,5 +77,5 @@ structure DeleteOfferInput { @required @httpLabel - offerId: UID + offerId: ID } diff --git a/model/stand/stand-apis.smithy b/model/stand/stand-apis.smithy index bd99008..a89b1ff 100644 --- a/model/stand/stand-apis.smithy +++ b/model/stand/stand-apis.smithy @@ -62,7 +62,7 @@ operation ListStands { ] } -@http(method: "PATCH", uri: "/api/brands/{brandSlug}/stores/{storeUid}/stands/{standId}") +@http(method: "PATCH", uri: "/api/brands/{brandSlug}/stores/{storeId}/stands/{standId}") operation UpdateStand { input: UpdateStandInput output: StandSummary @@ -72,7 +72,7 @@ operation UpdateStand { } @idempotent -@http(method: "DELETE", uri: "/api/brands/{brandSlug}/stores/{storeUid}/stands/{standId}") +@http(method: "DELETE", uri: "/api/brands/{brandSlug}/stores/{storeId}/stands/{standId}") operation DeleteStand { input: DeleteStandInput output: StandSummary diff --git a/model/stand/stand-io.smithy b/model/stand/stand-io.smithy index 2c60105..5e98fac 100644 --- a/model/stand/stand-io.smithy +++ b/model/stand/stand-io.smithy @@ -9,7 +9,6 @@ use com.shopping.inandout.util#Price use com.shopping.inandout.util#ResourceName use com.shopping.inandout.util#Slug use com.shopping.inandout.util#UID -use com.shopping.inandout.util#UUID structure CreateStandInput { @required @@ -24,7 +23,7 @@ structure CreateStandInput { articleSlug: Slug @required - articleSlug: Slug + edgeId: ID @required edgeId: ID @@ -43,10 +42,6 @@ structure GetStandInput { @httpLabel storeId: UID - @required - @httpLabel - storeUid: UID - @required @httpLabel standId: ID @@ -80,16 +75,14 @@ structure UpdateStandInput { @httpLabel storeId: UID - @required - @httpLabel - storeUid: UID - @required @httpLabel standId: ID edgeId: ID + edgeId: ID + amount: PositiveDouble sourceNodeDistance: PositiveDouble @@ -104,10 +97,6 @@ structure DeleteStandInput { @httpLabel storeId: UID - @required - @httpLabel - storeUid: UID - @required @httpLabel standId: ID diff --git a/smithy-build.json b/smithy-build.json index 4a94d51..2523752 100644 --- a/smithy-build.json +++ b/smithy-build.json @@ -1,4 +1,7 @@ { "version": "1.0", - "sources": ["model/"] + "sources": ["model/"], + "maven": { + "dependencies": ["software.amazon.smithy:smithy-aws-traits:1.67.0"] + } } From f283ff73de34de4d32eff5a3e3b2da2f8751da65 Mon Sep 17 00:00:00 2001 From: Petru Braha Date: Mon, 4 May 2026 09:34:18 +0300 Subject: [PATCH 16/23] fix: productId --- model/article/article-types.smithy | 3 ++- model/main.smithy | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/model/article/article-types.smithy b/model/article/article-types.smithy index 302ad4a..f5c0a3f 100644 --- a/model/article/article-types.smithy +++ b/model/article/article-types.smithy @@ -8,10 +8,11 @@ use com.shopping.inandout.util#OutputPagination use com.shopping.inandout.util#Price use com.shopping.inandout.util#ResourceName use com.shopping.inandout.util#Slug +use com.shopping.inandout.util#UUID structure ProductSummary { @required - productSlug: Slug + productId: UUID @required name: ResourceName diff --git a/model/main.smithy b/model/main.smithy index c5a967b..3e01198 100644 --- a/model/main.smithy +++ b/model/main.smithy @@ -8,6 +8,14 @@ metadata suppressions = [ } ] +metadata severityOverrides = [ + { + namespace: "*" + id: "Model.UnresolvedTrait" + severity: "WARNING" + } +] + namespace com.shopping.inandout use aws.protocols#restJson1 From 5488339981512ae3720e53b781e62f3ad06a8a9f Mon Sep 17 00:00:00 2001 From: Petru Braha Date: Mon, 4 May 2026 09:34:35 +0300 Subject: [PATCH 17/23] fix: build json --- smithy-build.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/smithy-build.json b/smithy-build.json index 2523752..4a94d51 100644 --- a/smithy-build.json +++ b/smithy-build.json @@ -1,7 +1,4 @@ { "version": "1.0", - "sources": ["model/"], - "maven": { - "dependencies": ["software.amazon.smithy:smithy-aws-traits:1.67.0"] - } + "sources": ["model/"] } From 0c5a24ddae838208cb8613d79042ee391c2bf3a3 Mon Sep 17 00:00:00 2001 From: Petru Braha Date: Mon, 4 May 2026 09:36:59 +0300 Subject: [PATCH 18/23] fix: documentation traits --- model/article/article-io.smithy | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/model/article/article-io.smithy b/model/article/article-io.smithy index eae06ab..608f1c0 100644 --- a/model/article/article-io.smithy +++ b/model/article/article-io.smithy @@ -41,19 +41,19 @@ structure ListArticlesInput with [InputPagination] { amount: PositiveDouble @httpQuery("name") - @documentation("Literal product name.") + @documentation("Product name.") name: ResourceName @httpQuery("subcategory") - @documentation("Literal product subcategory.") + @documentation("Product subcategory.") subcategory: ResourceName @httpQuery("category") - @documentation("Literal product category.") + @documentation("Product category.") category: ResourceName @httpQuery("vendor") - @documentation("Literal product vendor.") + @documentation("Product vendor.") vendor: ResourceName } From d88df38e2c4830a55399c1883b57614dc560b402 Mon Sep 17 00:00:00 2001 From: Petru Braha Date: Mon, 4 May 2026 09:43:55 +0300 Subject: [PATCH 19/23] fix: default amount in articles member --- model/article/article-apis.smithy | 4 ++-- model/article/article-io.smithy | 6 ++---- model/article/article-types.smithy | 4 ++-- model/brand/brand-apis.smithy | 1 + model/main.smithy | 8 -------- 5 files changed, 7 insertions(+), 16 deletions(-) diff --git a/model/article/article-apis.smithy b/model/article/article-apis.smithy index d16714f..b0f52ae 100644 --- a/model/article/article-apis.smithy +++ b/model/article/article-apis.smithy @@ -5,7 +5,7 @@ namespace com.shopping.inandout.article use com.shopping.inandout#DeleteRestrictedError use com.shopping.inandout#ResourceAlreadyExistsError use com.shopping.inandout#ResourceNotFoundError -use com.shopping.inandout.util#Price +use com.shopping.inandout.util#PositiveDouble use com.shopping.inandout.util#Slug resource Article { @@ -16,7 +16,7 @@ resource Article { } properties: { productSummary: ProductSummary - price: Price + defaultAmount: PositiveDouble createdAt: Timestamp updatedAt: Timestamp } diff --git a/model/article/article-io.smithy b/model/article/article-io.smithy index 608f1c0..429c9f4 100644 --- a/model/article/article-io.smithy +++ b/model/article/article-io.smithy @@ -4,7 +4,6 @@ namespace com.shopping.inandout.article use com.shopping.inandout.util#InputPagination use com.shopping.inandout.util#PositiveDouble -use com.shopping.inandout.util#Price use com.shopping.inandout.util#ResourceName use com.shopping.inandout.util#Slug @@ -18,7 +17,7 @@ structure CreateArticleInput { productSlug: Slug @required - price: Price + defaultAmount: PositiveDouble } structure GetArticleInput { @@ -37,7 +36,6 @@ structure ListArticlesInput with [InputPagination] { brandSlug: Slug @httpQuery("amount") - @documentation("Price amount in the currency of the article.") amount: PositiveDouble @httpQuery("name") @@ -66,7 +64,7 @@ structure UpdateArticleInput { @httpLabel articleSlug: Slug - price: Price + defaultAmount: PositiveDouble } structure DeleteArticleInput { diff --git a/model/article/article-types.smithy b/model/article/article-types.smithy index f5c0a3f..66be7bd 100644 --- a/model/article/article-types.smithy +++ b/model/article/article-types.smithy @@ -5,7 +5,7 @@ namespace com.shopping.inandout.article use com.shopping.inandout.util#Description use com.shopping.inandout.util#ImageUrl use com.shopping.inandout.util#OutputPagination -use com.shopping.inandout.util#Price +use com.shopping.inandout.util#PositiveDouble use com.shopping.inandout.util#ResourceName use com.shopping.inandout.util#Slug use com.shopping.inandout.util#UUID @@ -48,7 +48,7 @@ structure ArticleSummary { productSummary: ProductSummary @required - price: Price + defaultAmount: PositiveDouble @required createdAt: Timestamp diff --git a/model/brand/brand-apis.smithy b/model/brand/brand-apis.smithy index 8585cbf..1d3428d 100644 --- a/model/brand/brand-apis.smithy +++ b/model/brand/brand-apis.smithy @@ -8,6 +8,7 @@ use com.shopping.inandout#ResourceNotFoundError use com.shopping.inandout.article#Article use com.shopping.inandout.offer#Offer use com.shopping.inandout.store#Store +use com.shopping.inandout.util#Currency use com.shopping.inandout.util#ImageUrl use com.shopping.inandout.util#ResourceName use com.shopping.inandout.util#Slug diff --git a/model/main.smithy b/model/main.smithy index 3e01198..c5a967b 100644 --- a/model/main.smithy +++ b/model/main.smithy @@ -8,14 +8,6 @@ metadata suppressions = [ } ] -metadata severityOverrides = [ - { - namespace: "*" - id: "Model.UnresolvedTrait" - severity: "WARNING" - } -] - namespace com.shopping.inandout use aws.protocols#restJson1 From 4e78162c289b13c863487d397805c49097113257 Mon Sep 17 00:00:00 2001 From: Petru Braha Date: Mon, 4 May 2026 09:49:48 +0300 Subject: [PATCH 20/23] fix: offer required traits --- model/offer/offer-types.smithy | 2 ++ 1 file changed, 2 insertions(+) diff --git a/model/offer/offer-types.smithy b/model/offer/offer-types.smithy index 550663b..4bd90b6 100644 --- a/model/offer/offer-types.smithy +++ b/model/offer/offer-types.smithy @@ -35,12 +35,14 @@ structure OfferSummary { storeIdList: UIDList + @required articleSlugList: SlugList dependencyList: DependencyList timeRange: TimeRange + @required lifetime: NaturalNumber @required From c5de32b27224a3e59a01aa90ae1a863610a7f9a3 Mon Sep 17 00:00:00 2001 From: Petru Braha Date: Mon, 4 May 2026 09:56:45 +0300 Subject: [PATCH 21/23] feat: route subresource of store --- model/main.smithy | 1 - model/route/route-apis.smithy | 12 +++++------- model/route/route-io.smithy | 17 +++++------------ model/route/route-types.smithy | 4 ++-- 4 files changed, 12 insertions(+), 22 deletions(-) diff --git a/model/main.smithy b/model/main.smithy index c5a967b..bc95000 100644 --- a/model/main.smithy +++ b/model/main.smithy @@ -16,7 +16,6 @@ use com.shopping.inandout.route#Route use com.shopping.inandout.stand#Stand @mixin -@restJson1 service InAndOut { version: "0.0.1" errors: [ diff --git a/model/route/route-apis.smithy b/model/route/route-apis.smithy index d7c4846..ed85612 100644 --- a/model/route/route-apis.smithy +++ b/model/route/route-apis.smithy @@ -11,12 +11,10 @@ use com.shopping.inandout.util#UUID @documentation("Travelling salesman problem and solution creation/retrieval") resource Route { identifiers: { - brandSlug: Slug - storeUid: UID - routeUid: UID + storeId: UID + routeId: UUID } properties: { - storeId: UID standIdList: IDList solutionList: SolutionList } @@ -25,7 +23,7 @@ resource Route { delete: DeleteRoute } -@http(method: "POST", uri: "/api/brands/{brandSlug}/stores/{storeUid}/routes") +@http(method: "POST", uri: "/api/stores/{storeId}/routes") operation CreateRoute { input: CreateRouteInput output: RouteSummary @@ -36,7 +34,7 @@ operation CreateRoute { } @readonly -@http(method: "GET", uri: "/api/brands/{brandSlug}/stores/{storeUid}/routes/{routeUid}") +@http(method: "GET", uri: "/api/stores/{storeId}/routes/{routeId}") operation GetRoute { input: GetRouteInput output: RouteSummary @@ -46,7 +44,7 @@ operation GetRoute { } @idempotent -@http(method: "DELETE", uri: "/api/brands/{brandSlug}/stores/{storeUid}/routes/{routeUid}") +@http(method: "DELETE", uri: "/api/stores/{storeId}/routes/{routeId}") operation DeleteRoute { input: DeleteRouteInput output: RouteSummary diff --git a/model/route/route-io.smithy b/model/route/route-io.smithy index 471b822..01e1dfb 100644 --- a/model/route/route-io.smithy +++ b/model/route/route-io.smithy @@ -8,6 +8,7 @@ use com.shopping.inandout.util#UUID structure CreateRouteInput { @required + @httpLabel storeId: UID @required @@ -17,27 +18,19 @@ structure CreateRouteInput { structure GetRouteInput { @required @httpLabel - brandSlug: Slug - - @required - @httpLabel - storeUid: UID + storeId: UID @required @httpLabel - routeUid: UID + routeId: UUID } structure DeleteRouteInput { @required @httpLabel - brandSlug: Slug - - @required - @httpLabel - storeUid: UID + storeId: UID @required @httpLabel - routeUid: UID + routeId: UUID } diff --git a/model/route/route-types.smithy b/model/route/route-types.smithy index ef9f726..41582b4 100644 --- a/model/route/route-types.smithy +++ b/model/route/route-types.smithy @@ -46,10 +46,10 @@ list SolutionList { structure RouteSummary { @required - brandSlug: Slug + storeId: UID @required - storeId: UID + routeId: UUID @required @documentation("The initial input") From bedbb121c46da0dfb9413f66982fcce993cbbfbf Mon Sep 17 00:00:00 2001 From: Petru Braha Date: Mon, 4 May 2026 09:57:14 +0300 Subject: [PATCH 22/23] feat: route subresource of store --- model/store/store-apis.smithy | 1 + 1 file changed, 1 insertion(+) diff --git a/model/store/store-apis.smithy b/model/store/store-apis.smithy index d00fe4e..b454643 100644 --- a/model/store/store-apis.smithy +++ b/model/store/store-apis.smithy @@ -4,6 +4,7 @@ namespace com.shopping.inandout.store use com.shopping.inandout#ResourceAlreadyExistsError use com.shopping.inandout#ResourceNotFoundError +use com.shopping.inandout.route#Route use com.shopping.inandout.stand#Stand use com.shopping.inandout.util#Currency use com.shopping.inandout.util#Description From 87230fb14497141921b667f7fdf11c0f3088f293 Mon Sep 17 00:00:00 2001 From: Petru Braha Date: Mon, 4 May 2026 13:45:11 +0300 Subject: [PATCH 23/23] rebase --- model/article/article-apis.smithy | 4 ++++ model/article/article-io.smithy | 11 ++++++----- model/article/article-types.smithy | 2 +- model/brand/brand-apis.smithy | 2 -- model/main.smithy | 3 ++- model/route/route-apis.smithy | 13 +++++++------ model/route/route-io.smithy | 24 ++++++++++++++++++------ model/route/route-types.smithy | 10 +++++++--- model/stand/stand-apis.smithy | 15 +++++++-------- model/stand/stand-io.smithy | 16 +++++----------- model/stand/stand-types.smithy | 6 +----- model/store/store-apis.smithy | 8 ++++---- model/store/store-io.smithy | 7 ++++--- model/store/store-types.smithy | 3 ++- model/util/util-basic.smithy | 13 +++++-------- 15 files changed, 73 insertions(+), 64 deletions(-) diff --git a/model/article/article-apis.smithy b/model/article/article-apis.smithy index b0f52ae..b5998cc 100644 --- a/model/article/article-apis.smithy +++ b/model/article/article-apis.smithy @@ -33,6 +33,7 @@ operation CreateArticle { output: ArticleSummary errors: [ ResourceAlreadyExistsError + ResourceNotFoundError ] } @@ -52,6 +53,9 @@ operation GetArticle { operation ListArticles { input: ListArticlesInput output: ArticleSummaries + errors: [ + ResourceNotFoundError + ] } @http(method: "PATCH", uri: "/api/brands/{brandSlug}/articles/{articleSlug}") diff --git a/model/article/article-io.smithy b/model/article/article-io.smithy index 429c9f4..ddfcbcf 100644 --- a/model/article/article-io.smithy +++ b/model/article/article-io.smithy @@ -6,6 +6,7 @@ use com.shopping.inandout.util#InputPagination use com.shopping.inandout.util#PositiveDouble use com.shopping.inandout.util#ResourceName use com.shopping.inandout.util#Slug +use com.shopping.inandout.util#UUID structure CreateArticleInput { @required @@ -14,7 +15,7 @@ structure CreateArticleInput { @required @notProperty - productSlug: Slug + productUuid: UUID @required defaultAmount: PositiveDouble @@ -39,19 +40,19 @@ structure ListArticlesInput with [InputPagination] { amount: PositiveDouble @httpQuery("name") - @documentation("Product name.") + @documentation("Product name") name: ResourceName @httpQuery("subcategory") - @documentation("Product subcategory.") + @documentation("Product subcategory") subcategory: ResourceName @httpQuery("category") - @documentation("Product category.") + @documentation("Product category") category: ResourceName @httpQuery("vendor") - @documentation("Product vendor.") + @documentation("Product vendor") vendor: ResourceName } diff --git a/model/article/article-types.smithy b/model/article/article-types.smithy index 66be7bd..383b2f5 100644 --- a/model/article/article-types.smithy +++ b/model/article/article-types.smithy @@ -12,7 +12,7 @@ use com.shopping.inandout.util#UUID structure ProductSummary { @required - productId: UUID + productUuid: UUID @required name: ResourceName diff --git a/model/brand/brand-apis.smithy b/model/brand/brand-apis.smithy index 1d3428d..79c43ba 100644 --- a/model/brand/brand-apis.smithy +++ b/model/brand/brand-apis.smithy @@ -6,7 +6,6 @@ use com.shopping.inandout#DeleteRestrictedError use com.shopping.inandout#ResourceAlreadyExistsError use com.shopping.inandout#ResourceNotFoundError use com.shopping.inandout.article#Article -use com.shopping.inandout.offer#Offer use com.shopping.inandout.store#Store use com.shopping.inandout.util#Currency use com.shopping.inandout.util#ImageUrl @@ -27,7 +26,6 @@ resource Brand { resources: [ Store Article - Offer ] create: CreateBrand read: GetBrand diff --git a/model/main.smithy b/model/main.smithy index bc95000..339110e 100644 --- a/model/main.smithy +++ b/model/main.smithy @@ -16,6 +16,7 @@ use com.shopping.inandout.route#Route use com.shopping.inandout.stand#Stand @mixin +@restJson1 service InAndOut { version: "0.0.1" errors: [ @@ -38,7 +39,7 @@ service MappingService with [InAndOut] { } @paginated(inputToken: "nextToken", outputToken: "nextToken", pageSize: "pageSize", items: "tokens") -@documentation("Brands, Stores, Articles, Offers.") +@documentation("Manages business resources like Brands, Stores, Articles and Offers") service BusinessService with [InAndOut] { resources: [ Brand diff --git a/model/route/route-apis.smithy b/model/route/route-apis.smithy index ed85612..8423cc3 100644 --- a/model/route/route-apis.smithy +++ b/model/route/route-apis.smithy @@ -5,14 +5,15 @@ namespace com.shopping.inandout.route use com.shopping.inandout#ResourceAlreadyExistsError use com.shopping.inandout#ResourceNotFoundError use com.shopping.inandout.util#IDList +use com.shopping.inandout.util#Slug use com.shopping.inandout.util#UID -use com.shopping.inandout.util#UUID @documentation("Travelling salesman problem and solution creation/retrieval") resource Route { identifiers: { - storeId: UID - routeId: UUID + brandSlug: Slug + storeUid: UID + routeUid: UID } properties: { standIdList: IDList @@ -23,7 +24,7 @@ resource Route { delete: DeleteRoute } -@http(method: "POST", uri: "/api/stores/{storeId}/routes") +@http(method: "POST", uri: "/api/brands/{brandSlug}/stores/{storeUid}/routes") operation CreateRoute { input: CreateRouteInput output: RouteSummary @@ -34,7 +35,7 @@ operation CreateRoute { } @readonly -@http(method: "GET", uri: "/api/stores/{storeId}/routes/{routeId}") +@http(method: "GET", uri: "/api/brands/{brandSlug}/stores/{storeUid}/routes/{routeUid}") operation GetRoute { input: GetRouteInput output: RouteSummary @@ -44,7 +45,7 @@ operation GetRoute { } @idempotent -@http(method: "DELETE", uri: "/api/stores/{storeId}/routes/{routeId}") +@http(method: "DELETE", uri: "/api/brands/{brandSlug}/stores/{storeUid}/routes/{routeUid}") operation DeleteRoute { input: DeleteRouteInput output: RouteSummary diff --git a/model/route/route-io.smithy b/model/route/route-io.smithy index 01e1dfb..6d5764c 100644 --- a/model/route/route-io.smithy +++ b/model/route/route-io.smithy @@ -3,13 +3,17 @@ $version: "2" namespace com.shopping.inandout.route use com.shopping.inandout.util#IDList +use com.shopping.inandout.util#Slug use com.shopping.inandout.util#UID -use com.shopping.inandout.util#UUID structure CreateRouteInput { @required @httpLabel - storeId: UID + brandSlug: Slug + + @required + @httpLabel + storeUid: UID @required standIdList: IDList @@ -18,19 +22,27 @@ structure CreateRouteInput { structure GetRouteInput { @required @httpLabel - storeId: UID + brandSlug: Slug @required @httpLabel - routeId: UUID + storeUid: UID + + @required + @httpLabel + routeUid: UID } structure DeleteRouteInput { @required @httpLabel - storeId: UID + brandSlug: Slug + + @required + @httpLabel + storeUid: UID @required @httpLabel - routeId: UUID + routeUid: UID } diff --git a/model/route/route-types.smithy b/model/route/route-types.smithy index 41582b4..0cbe733 100644 --- a/model/route/route-types.smithy +++ b/model/route/route-types.smithy @@ -2,9 +2,10 @@ $version: "2" namespace com.shopping.inandout.route +use com.shopping.inandout.util#ID use com.shopping.inandout.util#IDList +use com.shopping.inandout.util#Slug use com.shopping.inandout.util#UID -use com.shopping.inandout.util#UUID @documentation("In between nodes navigable stand points") structure StandNode { @@ -46,10 +47,13 @@ list SolutionList { structure RouteSummary { @required - storeId: UID + brandSlug: Slug @required - routeId: UUID + storeUid: UID + + @required + routeUid: UID @required @documentation("The initial input") diff --git a/model/stand/stand-apis.smithy b/model/stand/stand-apis.smithy index a89b1ff..ca9b8a8 100644 --- a/model/stand/stand-apis.smithy +++ b/model/stand/stand-apis.smithy @@ -6,20 +6,19 @@ use com.shopping.inandout#ResourceAlreadyExistsError use com.shopping.inandout#ResourceNotFoundError use com.shopping.inandout.util#ID use com.shopping.inandout.util#PositiveDouble -use com.shopping.inandout.util#Price use com.shopping.inandout.util#Slug use com.shopping.inandout.util#UID resource Stand { identifiers: { brandSlug: Slug - storeId: UID + storeUid: UID standId: ID } properties: { articleSlug: Slug edgeId: ID - price: Price + amount: PositiveDouble sourceNodeDistance: PositiveDouble createdAt: Timestamp updatedAt: Timestamp @@ -31,7 +30,7 @@ resource Stand { delete: DeleteStand } -@http(method: "POST", uri: "/api/brands/{brandSlug}/stores/{storeId}/stands") +@http(method: "POST", uri: "/api/brands/{brandSlug}/stores/{storeUid}/stands") operation CreateStand { input: CreateStandInput output: StandSummary @@ -42,7 +41,7 @@ operation CreateStand { } @readonly -@http(method: "GET", uri: "/api/brands/{brandSlug}/stores/{storeId}/stands/{standId}") +@http(method: "GET", uri: "/api/brands/{brandSlug}/stores/{storeUid}/stands/{standId}") operation GetStand { input: GetStandInput output: StandSummary @@ -53,7 +52,7 @@ operation GetStand { @readonly @paginated -@http(method: "GET", uri: "/api/brands/{brandSlug}/stores/{storeId}/stands") +@http(method: "GET", uri: "/api/brands/{brandSlug}/stores/{storeUid}/stands") operation ListStands { input: ListStandsInput output: StandSummaries @@ -62,7 +61,7 @@ operation ListStands { ] } -@http(method: "PATCH", uri: "/api/brands/{brandSlug}/stores/{storeId}/stands/{standId}") +@http(method: "PATCH", uri: "/api/brands/{brandSlug}/stores/{storeUid}/stands/{standId}") operation UpdateStand { input: UpdateStandInput output: StandSummary @@ -72,7 +71,7 @@ operation UpdateStand { } @idempotent -@http(method: "DELETE", uri: "/api/brands/{brandSlug}/stores/{storeId}/stands/{standId}") +@http(method: "DELETE", uri: "/api/brands/{brandSlug}/stores/{storeUid}/stands/{standId}") operation DeleteStand { input: DeleteStandInput output: StandSummary diff --git a/model/stand/stand-io.smithy b/model/stand/stand-io.smithy index 5e98fac..fb3e557 100644 --- a/model/stand/stand-io.smithy +++ b/model/stand/stand-io.smithy @@ -5,7 +5,6 @@ namespace com.shopping.inandout.stand use com.shopping.inandout.util#ID use com.shopping.inandout.util#InputPagination use com.shopping.inandout.util#PositiveDouble -use com.shopping.inandout.util#Price use com.shopping.inandout.util#ResourceName use com.shopping.inandout.util#Slug use com.shopping.inandout.util#UID @@ -17,7 +16,7 @@ structure CreateStandInput { @required @httpLabel - storeId: UID + storeUid: UID @required articleSlug: Slug @@ -25,9 +24,6 @@ structure CreateStandInput { @required edgeId: ID - @required - edgeId: ID - amount: PositiveDouble sourceNodeDistance: PositiveDouble @@ -40,7 +36,7 @@ structure GetStandInput { @required @httpLabel - storeId: UID + storeUid: UID @required @httpLabel @@ -54,7 +50,7 @@ structure ListStandsInput with [InputPagination] { @required @httpLabel - storeId: UID + storeUid: UID @httpQuery("edgeId") edgeId: ID @@ -73,7 +69,7 @@ structure UpdateStandInput { @required @httpLabel - storeId: UID + storeUid: UID @required @httpLabel @@ -81,8 +77,6 @@ structure UpdateStandInput { edgeId: ID - edgeId: ID - amount: PositiveDouble sourceNodeDistance: PositiveDouble @@ -95,7 +89,7 @@ structure DeleteStandInput { @required @httpLabel - storeId: UID + storeUid: UID @required @httpLabel diff --git a/model/stand/stand-types.smithy b/model/stand/stand-types.smithy index 19295aa..cf147dc 100644 --- a/model/stand/stand-types.smithy +++ b/model/stand/stand-types.smithy @@ -5,7 +5,6 @@ namespace com.shopping.inandout.stand use com.shopping.inandout.util#ID use com.shopping.inandout.util#OutputPagination use com.shopping.inandout.util#PositiveDouble -use com.shopping.inandout.util#Price use com.shopping.inandout.util#Slug use com.shopping.inandout.util#UID @@ -14,7 +13,7 @@ structure StandSummary { brandSlug: Slug @required - storeId: UID + storeUid: UID @required standId: ID @@ -25,9 +24,6 @@ structure StandSummary { @required edgeId: ID - @required - edgeId: ID - amount: PositiveDouble sourceNodeDistance: PositiveDouble diff --git a/model/store/store-apis.smithy b/model/store/store-apis.smithy index b454643..fd2701c 100644 --- a/model/store/store-apis.smithy +++ b/model/store/store-apis.smithy @@ -18,7 +18,7 @@ use com.shopping.inandout.util#UID resource Store { identifiers: { brandSlug: Slug - storeId: UID + storeUid: UID } properties: { name: ResourceName @@ -53,7 +53,7 @@ operation CreateStore { } @readonly -@http(method: "GET", uri: "/api/brands/{brandSlug}/stores/{storeId}") +@http(method: "GET", uri: "/api/brands/{brandSlug}/stores/{storeUid}") operation GetStore { input: GetStoreInput output: StoreSummary @@ -73,7 +73,7 @@ operation ListStores { ] } -@http(method: "PATCH", uri: "/api/brands/{brandSlug}/stores/{storeId}") +@http(method: "PATCH", uri: "/api/brands/{brandSlug}/stores/{storeUid}") operation UpdateStore { input: UpdateStoreInput output: StoreSummary @@ -83,7 +83,7 @@ operation UpdateStore { } @idempotent -@http(method: "DELETE", uri: "/api/brands/{brandSlug}/stores/{storeId}") +@http(method: "DELETE", uri: "/api/brands/{brandSlug}/stores/{storeUid}") @documentation("Not restricted cascading operation, deletes floors, stands, etc.") operation DeleteStore { input: DeleteStoreInput diff --git a/model/store/store-io.smithy b/model/store/store-io.smithy index aefb14c..68870cd 100644 --- a/model/store/store-io.smithy +++ b/model/store/store-io.smithy @@ -2,6 +2,7 @@ $version: "2" namespace com.shopping.inandout.store +use com.shopping.inandout.util#Currency use com.shopping.inandout.util#Description use com.shopping.inandout.util#GeoCoordinates use com.shopping.inandout.util#ImageUrl @@ -41,7 +42,7 @@ structure GetStoreInput { @required @httpLabel - storeId: UID + storeUid: UID } structure ListStoresInput with [InputPagination] { @@ -74,7 +75,7 @@ structure UpdateStoreInput { @required @httpLabel - storeId: UID + storeUid: UID name: ResourceName @@ -98,5 +99,5 @@ structure DeleteStoreInput { @required @httpLabel - storeId: UID + storeUid: UID } diff --git a/model/store/store-types.smithy b/model/store/store-types.smithy index 78df190..a4e711c 100644 --- a/model/store/store-types.smithy +++ b/model/store/store-types.smithy @@ -2,6 +2,7 @@ $version: "2" namespace com.shopping.inandout.store +use com.shopping.inandout.util#Currency use com.shopping.inandout.util#DayType use com.shopping.inandout.util#Description use com.shopping.inandout.util#GeoCoordinates @@ -23,7 +24,7 @@ structure StoreSummary { brandSlug: Slug @required - storeId: UID + storeUid: UID name: ResourceName diff --git a/model/util/util-basic.smithy b/model/util/util-basic.smithy index e367397..f1f46e9 100644 --- a/model/util/util-basic.smithy +++ b/model/util/util-basic.smithy @@ -2,8 +2,9 @@ $version: "2" namespace com.shopping.inandout.util -@pattern("^[a-fA-F]+$") -@documentation("Simple identifier of a resource.") +@pattern("^[0-9]+$") +@length(min: 1) +@documentation("Simple identifier of a resource") string ID list IDList { @@ -12,16 +13,12 @@ list IDList { @pattern("^[0-9a-fA-F]{8}$") @length(min: 8, max: 8) -@documentation("Unique identifier of a resource, scoped to a specific domain.") +@documentation("Unique identifier of a resource, scoped to a specific domain") string UID -list UIDList { - member: UID -} - @pattern("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$") @length(min: 36, max: 36) -@documentation("Universally unique identifier for all scopes.") +@documentation("Universally unique identifier for all scopes") string UUID @pattern("^[a-z0-9]+(?:-[a-z0-9]+)*$")