From 2bf475c9bc395d8fb055c401ac632af1ea582b05 Mon Sep 17 00:00:00 2001 From: Alex Goth <64845621+GAlexIHU@users.noreply.github.com> Date: Mon, 24 Jun 2024 15:01:07 +0200 Subject: [PATCH] feat: entitlements list API (#1051) * feat: entitlements list API * fix: expose handlers through openmeter * chore: remove misformatted comments * fix: fix api example --- api/api.gen.go | 351 +++++++++--------- api/client/go/client.gen.go | 351 +++++++++--------- api/openapi.yaml | 17 +- internal/entitlement/db_connector.go | 2 + internal/entitlement/entitlement_connector.go | 20 + .../entitlement/httpdriver/entitlement.go | 64 ++++ .../postgresadapter/entitlement.go | 32 ++ internal/server/router/entitlement.go | 10 + internal/server/router/noop.go | 6 - openmeter/entitlement/httpdriver/handlers.go | 1 + openmeter/entitlement/httpdriver/types.go | 3 + pkg/models/model.go | 2 +- 12 files changed, 476 insertions(+), 383 deletions(-) diff --git a/api/api.gen.go b/api/api.gen.go index ce12df781..b1ff16c8b 100644 --- a/api/api.gen.go +++ b/api/api.gen.go @@ -151,7 +151,7 @@ type EntitlementBoolean struct { CreatedAt *time.Time `json:"createdAt,omitempty"` // DeletedAt The date and time the resource was deleted. - DeletedAt *time.Time `json:"deletedAt"` + DeletedAt *time.Time `json:"deletedAt,omitempty"` // FeatureId The feature the subject is entitled to use FeatureId string `json:"featureId"` @@ -213,7 +213,7 @@ type EntitlementGrant struct { CreatedAt *time.Time `json:"createdAt,omitempty"` // DeletedAt The date and time the resource was deleted. - DeletedAt *time.Time `json:"deletedAt"` + DeletedAt *time.Time `json:"deletedAt,omitempty"` // EffectiveAt The effective time. Provided value will be ceiled to metering windowSize (minute). EffectiveAt time.Time `json:"effectiveAt"` @@ -299,7 +299,7 @@ type EntitlementMetered struct { CreatedAt *time.Time `json:"createdAt,omitempty"` // DeletedAt The date and time the resource was deleted. - DeletedAt *time.Time `json:"deletedAt"` + DeletedAt *time.Time `json:"deletedAt,omitempty"` // FeatureId The feature the subject is entitled to use FeatureId string `json:"featureId"` @@ -358,7 +358,7 @@ type EntitlementSharedFields struct { CreatedAt *time.Time `json:"createdAt,omitempty"` // DeletedAt The date and time the resource was deleted. - DeletedAt *time.Time `json:"deletedAt"` + DeletedAt *time.Time `json:"deletedAt,omitempty"` // FeatureId The feature the subject is entitled to use FeatureId string `json:"featureId"` @@ -388,7 +388,7 @@ type EntitlementStatic struct { CreatedAt *time.Time `json:"createdAt,omitempty"` // DeletedAt The date and time the resource was deleted. - DeletedAt *time.Time `json:"deletedAt"` + DeletedAt *time.Time `json:"deletedAt,omitempty"` // FeatureId The feature the subject is entitled to use FeatureId string `json:"featureId"` @@ -474,7 +474,7 @@ type Feature struct { CreatedAt *time.Time `json:"createdAt,omitempty"` // DeletedAt The date and time the resource was deleted. - DeletedAt *time.Time `json:"deletedAt"` + DeletedAt *time.Time `json:"deletedAt,omitempty"` // Id Readonly unique ULID identifier. Id *string `json:"id,omitempty"` @@ -619,13 +619,6 @@ type RecurringPeriod = types.RecurringPeriod // RecurringPeriodEnum List of pre-defined periods that can be used for recurring & scheduling. // // DAY: Every day -// # MONDAY: Every Monday -// # TUESDAY: Every Tuesday -// # WEDNESDAY: Every Wednesday -// # THURSDAY: Every Thursday -// # FRIDAY: Every Friday -// # SATURDAY: Every Saturday -// # SUNDAY: Every Sunday // WEEK: Every week // MONTH: Every month // YEAR: Every year @@ -638,7 +631,7 @@ type SharedMetaFields struct { CreatedAt *time.Time `json:"createdAt,omitempty"` // DeletedAt The date and time the resource was deleted. - DeletedAt *time.Time `json:"deletedAt"` + DeletedAt *time.Time `json:"deletedAt,omitempty"` // Id Readonly unique ULID identifier. Id *string `json:"id,omitempty"` @@ -2967,173 +2960,171 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "dDXjVN9d3v3/AAAA//9s6JkQV+4AAA==", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/client/go/client.gen.go b/api/client/go/client.gen.go index 5930daa4e..88d207a93 100644 --- a/api/client/go/client.gen.go +++ b/api/client/go/client.gen.go @@ -151,7 +151,7 @@ type EntitlementBoolean struct { CreatedAt *time.Time `json:"createdAt,omitempty"` // DeletedAt The date and time the resource was deleted. - DeletedAt *time.Time `json:"deletedAt"` + DeletedAt *time.Time `json:"deletedAt,omitempty"` // FeatureId The feature the subject is entitled to use FeatureId string `json:"featureId"` @@ -213,7 +213,7 @@ type EntitlementGrant struct { CreatedAt *time.Time `json:"createdAt,omitempty"` // DeletedAt The date and time the resource was deleted. - DeletedAt *time.Time `json:"deletedAt"` + DeletedAt *time.Time `json:"deletedAt,omitempty"` // EffectiveAt The effective time. Provided value will be ceiled to metering windowSize (minute). EffectiveAt time.Time `json:"effectiveAt"` @@ -299,7 +299,7 @@ type EntitlementMetered struct { CreatedAt *time.Time `json:"createdAt,omitempty"` // DeletedAt The date and time the resource was deleted. - DeletedAt *time.Time `json:"deletedAt"` + DeletedAt *time.Time `json:"deletedAt,omitempty"` // FeatureId The feature the subject is entitled to use FeatureId string `json:"featureId"` @@ -358,7 +358,7 @@ type EntitlementSharedFields struct { CreatedAt *time.Time `json:"createdAt,omitempty"` // DeletedAt The date and time the resource was deleted. - DeletedAt *time.Time `json:"deletedAt"` + DeletedAt *time.Time `json:"deletedAt,omitempty"` // FeatureId The feature the subject is entitled to use FeatureId string `json:"featureId"` @@ -388,7 +388,7 @@ type EntitlementStatic struct { CreatedAt *time.Time `json:"createdAt,omitempty"` // DeletedAt The date and time the resource was deleted. - DeletedAt *time.Time `json:"deletedAt"` + DeletedAt *time.Time `json:"deletedAt,omitempty"` // FeatureId The feature the subject is entitled to use FeatureId string `json:"featureId"` @@ -474,7 +474,7 @@ type Feature struct { CreatedAt *time.Time `json:"createdAt,omitempty"` // DeletedAt The date and time the resource was deleted. - DeletedAt *time.Time `json:"deletedAt"` + DeletedAt *time.Time `json:"deletedAt,omitempty"` // Id Readonly unique ULID identifier. Id *string `json:"id,omitempty"` @@ -619,13 +619,6 @@ type RecurringPeriod = types.RecurringPeriod // RecurringPeriodEnum List of pre-defined periods that can be used for recurring & scheduling. // // DAY: Every day -// # MONDAY: Every Monday -// # TUESDAY: Every Tuesday -// # WEDNESDAY: Every Wednesday -// # THURSDAY: Every Thursday -// # FRIDAY: Every Friday -// # SATURDAY: Every Saturday -// # SUNDAY: Every Sunday // WEEK: Every week // MONTH: Every month // YEAR: Every year @@ -638,7 +631,7 @@ type SharedMetaFields struct { CreatedAt *time.Time `json:"createdAt,omitempty"` // DeletedAt The date and time the resource was deleted. - DeletedAt *time.Time `json:"deletedAt"` + DeletedAt *time.Time `json:"deletedAt,omitempty"` // Id Readonly unique ULID identifier. Id *string `json:"id,omitempty"` @@ -6556,173 +6549,171 @@ func ParseResetEntitlementUsageResponse(rsp *http.Response) (*ResetEntitlementUs // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "dDXjVN9d3v3/AAAA//9s6JkQV+4AAA==", + "lSApJ/99kfgFpGfp6BfX7qC0IqGpIIaUvPLS8zuh7vdMcmPrgp7ZjXRnxtHp+esG6r590UCvD48agKLX", + "3ffIYi1C8WCqi49BmSNYRy6KHWIttFcwTTc4YBydHx3+dr7/cff4/OjMHraRB1tBlGWLqylaSA5R6psh", + "wKBQwhgOKHP4cSyuWtqGSa442ALltXKxX6oWpc2NbS6Xm2XOXQocWtFSMrHuZQobE6pSKlj232vjq8Ga", + "Gg4ALgkAdzqJjWPNgqU5Vj76+n5CCVDYIK/h2XvtNbzu2xdeQ0ov+f/d9/mLb9UzvyPVyOjmkLtqvPyW", + "ED49IQICWl144fDNiphBUIys5Yrm+HDrUg4KimhRy6tSGK9V8NV6x1AROICq6uJpQlOuEfcVitTcofBk", + "5RVLzOZOMFstMTp4Vrzx0WOklqPDIhU2KReaNHi9XVX2UsxWVgxxRZwOdrZSiU9R4xDlnE2MS6TeWXrM", + "BNMo+Vjm6pyzUo9qrq9CsbYq81ZFdZyVYzkU4lUs04yojLnK/LUJDnVdjGe+Ngvxq6Zo4wdeVfFcm97V", + "6vJT2YtZQJqnh2Ol0qsqOqKrUmuV99FxB9N3FjZWo2m3tiruq+JlskTTCRYmD62FDvvmmrUXkZUmbsas", + "EjqSFh7+KrAV8/5VDeeYOdniG8ZjHIF97NojaalI0wRB6l2k3A5Ff0UUsQkEFqiLUwER3LaFctnwdFpY", + "N65em8qfD6wS7mk+fdUx1JUrZ1h2lW4utWKPjT6qpX087NK9jTfjd+863c47/ny0/Wf/M/klevH++c1o", + "9/3kRWu69WnztNl99+kgefbpzz4++Nz+/Nunzf3Pnecngk7fTn7t999vfbp5fc0cjpAykm4rrsIbKOyn", + "1WzBRMwX7VWvTaTpfnpke0/K6K8uRT0K6aH6uF5QFxqesm71Z8le73IbeftQFQtSSritEUieK7uwHOOe", + "C1AYFJ9BuJczIZOCNYvopvTqroR3Rai0LoFW0urP0vCVexWy/IF9KJJfsrqBmystU1Ovi3Q3tAcVoYQu", + "5YaenBzsoh+ft3982rqgVuBLdkILBeTyFa3QCE/Bf6BiC4oWlSnAN7OW3OqqC/9lquV9Kx/3rXzcX7l8", + "nFNRPoVehj2tVFEu5m+W0Jk2sMOJaTl3r6B4UH/IXLdXFGHeC2Mu9181kvwAauQrG7g4m45SrKceS6rk", + "1zhaMGt1nyajciC4GathVjNns+S/RKuI0PvtFh6HazCua7MA7BKKX4GPH8L8mkafU8gUOcd0GnCc4Vy9", + "JQPZMEEShXQA8W573d93EPxv/5rwKQrw9IK+299/uWP9OCHk6oJCBPZO9isEbl/Q3/e7J3bjKcE8F829", + "QBh3DZwDXlaJ91IM846juoCOZoUG+tUDTtTduLplEMR8haIlubz7MRsnkc3Vdc0L+zENUBkmUjGgFaUI", + "clpynfJSBkC7hkbr4WqC6Qe3loRP935A+EIn/8MBqLjut9lWW8wtGQf32MAIixjpIVoPmDRQSpfJ6M5e", + "gr3fLnXbeg9rkYAYu+IirnxwJBHqTs5RxfjWU5pRbLhF5vXsFDGUaznT+dnwglCMI2zqpe5qywodqWiY", + "+U4DCPMvZn9ZMffDpCfGTNVgWu9sbG49U8ojD8fEzAYf/UR8zPTQsvpeXn7ZhO3UopW5blAX/pY14Ocn", + "fNobYM9S3IuaKZursrx1/kZtq3t+ooWayKJoN23M94yXiKcApk1Hc/HmCNB3nftZD09Z15nm8QERfib2", + "zaq+XWvYKWC5C9S0QY071Hf2e1IrVKvVuCTIP7Tg5uoT3bbWGwsJl43pzAErkhdcobf1A5krUikct31m", + "Pcsu+jhzKAnE2URpU6qDyLzbXAk9K0mu1mKcT1+4Hscr0K08LVLNDOMpFCxQ+wEZybuMXYWkm0hKuXXV", + "PoAcrwnpITweIx9am4ew0r/0U1gfPwoV1mI9XDAOXxLALAxm+c7NlD2COeEHhmmyMf4E1zMuUJy+dfNI", + "GPhbYLBs+mEcj9PJl55WYqD2VPOX+Ock9hyvW5RXJolentKm1pOyZN45UNzppxc4xdEe8x06/x7zE3kG", + "TPBFwiPdW+ysZayhFbK1QA4A9mmfuVzwhL62gjoBYRRDXoWKEE8Lg+oQWx22lHWU6AWXvEBTlqiqqgMi", + "Yh3r2VBXyfp2E8ZUIU3KlkjVSNG6oM1m84J+fzwmXEc5pWUF//u//4OeAHRPEWVq3WDLqIiytHRhSC3I", + "YPtb38MBjUKf6Od3NLl3x9gfEtSB4OAMgfqlPAxf4a083VWsvTrc3T863W92Wu3WMB5FlgfKy+HDa3i5", + "6ONWGxIsxoTicejteButdmtDRZcPYXfB6LteX7NcG+oW21VKDaxsu6UUUcwgDeSwbLJvj9XIPdtdUfMp", + "a7JmPc9ZlWVbbK1fyCyXvzvmAeEqxZFEQdW7mLJR4aXR7MlAW8s3wtit+Ttyry8L7/F12u0ZrzCZ15cc", + "L9TWrJPlYOnlp9W0pyS/jXcNb7O9XjVVuoi1We9twVQab/PHqXqlSj25CL5SF8VJjoXVvadNZujJ/o0U", + "8cCaoqfepRwmpe3r+VSdj5hU5x9yGMHq5Jgaeesg9+vlCR3eFK5L52fMQePWM7AK8vu9WDvrwdo579Xe", + "l9rtCLGlUjj+gjWRIFNnwbVKS8fKFk9ie7Hb651gPXj+Y7O9jYPmZs/3m3jrx6C51dvY2upsbm+QoPPQ", + "i+1ULbZubF0+d2gRpqaOgFSdA9JLBoOQDjRza89nStXPpT5q9lhgXTaHVD9c3jW8MROuUh3QVWSVjxhH", + "PUiesZEpVSwV4T2jGpGLO6rhU/6ob5N+ZsF0BmOwqsH8UGYSNVKX7hpV4zVhbT/MZj1/9ypsf38+U5fN", + "1GYvWSaS43ykZoe2TzSVo8IVvn1wrOt8SKGQBgXHcDdc0UzowatGGeULWhVPamUBQnVq8y9P35Xk+GaZ", + "c5wmUC6xn0TRNOVAf2dWe2ibli4eaymcuszHHJXTtKrSKw/MKH9xEwoOsbGdZlyduIpXlQUWVAJNK0pl", + "SKwALVQdurq9G0R951IMePsy9puptrWAmpMt+lErJv2MgOvZbFVqiqpSJYqVp/NHRjUy2KyrbSymYThr", + "gbnlhVWUSpF7qwajXV81pC7oDkzBI3P1/WiY9ladMWY/h/4QxKy22+zoMh4IcxLWbtOn4e4UmUckdlaB", + "lL9bJdd6U3RFpi6yV00zsl9MVGQv1TmYnUPsG9pJwxJWtPObarK5Ow+P4n+JPdc7sOieN9zy/gWJ7a0M", + "A9dOviDxg2xj+0syFShC8fclC2sjl+EDqmLRbLUQR1GuslFZMVRPQ/3V1UI7ZmZp7XDOIrT2pw7zCg7H", + "og559b7nApqd3vjHrdcNDP0tSf9rt7oO1UwZ+JaFAXqivj5Ni/mirnmcC1N1BddLpREK+yiExxPod9Lq", + "hqotxMlr5eBqcxY9RaaEVj15CXPAcw4AjnrP8hFpXPdlsJvt7fn9d/Ur+F9QbmtyWYZGDSnM4tGqjfv2", + "87Xqv8LLkK9TpahGwt9K6hgtlHC/CC81m/SoeenIUIuhU00+1cbw9905MQff64cIHREgDZPRiDP7z6rh", + "b5XV6ocRkYNd6HfWTXp+teVtypQ8hN2t995taes6wau2s796mbAvdQAb992E3W+OhHon/r//+z9IH6eR", + "Pi2lY1+SRGu38G9T2nKmzjSXN1zQVECqY9ObosM9qOgeJYNq/4I53IvpSjnAa2pMCuC8f+F+OsojJga9", + "GZXEMMOd4Ng+l0fhgTau/Y2BrpCBKpq3XSeP0O2xPMdSvoRKjfo3K0qzn74AUiJmaLYScm48XGxWnaZ2", + "SaWFupyFI/IHo/W7qTcjTMrRYr30sxO1e6Xt780s/rGF0xbgInaNOojbJzfxmi+uK4xIPeNHKObT0H8Q", + "GjTMG+uA34bEZwNwdUFdy2oUflyHHw2qP643rO1pQEhMY71TGmo9P5RCTWf+UJ12aaiOa6iN/FCd3FAq", + "jKWx6chhL7FlKGKrirT+jQMbLPa7HHfXNDTHZWJa6VTFtHZkhQPl1Az6VVQXlx+mwFIy+ppd9Keut8Lg", + "Z0Wk9oDeihTUOeSiMlLyVLOMPlBI3tFPtBMajFlIISN2nPSi0I+miNyMmXp0OWZpP1GhS6iEmwqNYokC", + "yHAFAqlz6Q1I9sJR0SfRcLLp2a8M/dMUly+sgnwTv9/E7xcTvzqrEnhNKfPvw6UkeXfi44dLSd5F8a2z", + "/4pSXPV2smUT5lvBhGt4kkAiODMrK2+urdWIeTw3S2zJDZ3lt7TQntoMKQI6W63F8106W4WHg75gtkut", + "Ow+7ZOQCukR+L765ZWt44gB1Oby5jtHsAEX1Nom7iKfrxsTe3UXvTRYtCuq2jGsbnTlCdF/D5BKQF7qN", + "WZ1wngPm47uoeKhYxUKee215sKYf9sHqdmHJG8gLepgOIypEhOW6VqTpTiAywxQkx1KHBcgtGxLhKHKl", + "RNnfi6w0q3F9B29cpW1hNbNHy58Q6GAPONddXZ6xssb3rEVoA9xg3Yaggknc5dhEvjaH853/+Yuu/wj9", + "YkuZ+9hzmSkc9hFl8Pgdt6sspUWAGzCvntBUAs6OSdBaLoHmTW4hufG+yev58toii7lS22J2c31VdfXe", + "1F1Toela/quHVxMzD/+y7qZHKMlSrczhbkqxe48wmQt6PhaEx8LiIMhkmjCua8oJSzzph+0NkwgYgUBD", + "chOKOHvavpdlVpS6QFORazvGPA6hHKKOdc1Kj4w5uw4DEugKii5SU0sw+7988M2qycx+ZCJmKAEwV68L", + "rhps3VTD+40X1zulighTbcR5TB08eO1W/9dhcMxfkunKIlsM4aUa5szUmezwLHbRkAe+ZnSLIbB8fMvf", + "IRL48UfZzKTPxtLqwAsS16a4FyR+OHJbnRmdcsxqDvk3z/ORZGNt7PI8bYHCWtLMsFsXrJvZiua9am4V", + "aevxJ9Z8q3RVN2u6ULd+PlGpbjauV8KqltNLs2fYaxIGsGcS5DO0G7W7n8Y4Dv1le/+sKgfku1+6ireX", + "kPzr6fERYGd1Jdwr6phYtPCVctNz57gMpfX5Eeao3zfj6XHnuJPcsV84d6qeGFy7tf6SLXTyMDRMnZGV", + "kc/SNDYFdOHdyPQBm9L7HCXty1rJW/2c30OLysq1OtJq30BEC+vrWvcM+UPiX6mXGXdQWhdc6qInB7to", + "Y2NjG6my4ellKFyQUjbR1YEdF6K6srgrTuE+T+E9pEJa2rYazE0/Z/m3MbAeJKi73ln6YqygVlGMvD5T", + "WU5BNV+lHrPgWa/pErDF3T+lrMYyYmZGLkwteshz/8dADIvxRxxFi6nCAGP+ti7CIj4hglQ8tQJvqYCA", + "URW4J1ggLps/5MMqhQu6yzka4T+gwMjXUMLuFqxNouxIOk/lKpQDX7Jyyb3P3uIOjcdZ8eRb/ZLV1S9x", + "UPDKXC66Rkm9M6I6LVeNZDVSafUJ+0UaslwiVbq7QtnXd0lomi8DqWq5fKuat5hHYek6LEuKsWH2AE8t", + "D4J5J2iWJ0HV3jWP8WAuDXA/SkR4TRCG4UKuH8rHNEDkpvSR0EBX8AUdS7/ypF87FiMcRYSjeIhVKQ7r", + "ESgYMBT5CXssHsohxXw917xH9DVEbuHmCPBjfBvwooI87eqNFqvzHD8HXLgJFPOE+hAuocsdSzpLIszD", + "OH1jN6EB4dE0pAO7dolLbuuH++uk6NzHRdIo237B/THi8PxATFss/5CIoGiwepTFzPsCCDqVR0DDBuvX", + "RyNmCLKD4YM5wr1pC+1iKlcuT9WQ8dicKpVNZi24emET+3W0GRQx+2W2JVO3ivlSD+lUq3iubY79VXy6", + "DB32DWeUe2VHTiras3coFGrbsidf7ffuLug3b11tb918ufUFhS43PgW3Wgwuh+xJX01Jyscg5ZsWnYiS", + "iXmoDylTMfd4sxS8nEURCRC7dpeigpms1Z7raiJ/Ha0677Ah/T7x4/CaVL2OC0wRx2gyDP2heR1XIhtf", + "EYFU9wYKShLiLG3ppxxTFwLrJ7rE9pkdgwjudHmAlxcjK5IRrpDuJQKwbaamnVzfuE8V91EneCnHVCHb", + "Mc1sdOc72s9K6lRHwq/dGYIR8yFNOveE3nrnx1a71W6t7zx//vy5Qw+F92BmvFyovsuZ9QIdShtkngvE", + "SWQOgnoCQxK8ZGjp40OayalXI1oX9MMrgjlFI8bJ5ZPKVxPXBiSWYzWBMZJgDUZZk0zvOiSTp3CatLqi", + "359w6pZlMMF6DelAPYQIKkd6SO8Bn+aCTgB1aYCaAOpKhLmE/9pgjRglcfiZrAVYDHsM80BnNzUDck0i", + "yVibgyQMSA5AnSdQE0Ar8H9JZJkRckCkYWU1wcgFNS2OoJw0d9PVjFN9d3n3fwEAAP//COS4vpztAAA=", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/openapi.yaml b/api/openapi.yaml index e3acee591..baae72aa1 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -1192,11 +1192,10 @@ components: example: "2023-01-01T00:00:00Z" deletedAt: type: string - nullable: true format: date-time description: The date and time the resource was deleted. readOnly: true - example: null + example: "2023-01-01T00:00:00Z" ConflictProblem: description: Conflict type: object @@ -1734,25 +1733,11 @@ components: List of pre-defined periods that can be used for recurring & scheduling. DAY: Every day - # MONDAY: Every Monday - # TUESDAY: Every Tuesday - # WEDNESDAY: Every Wednesday - # THURSDAY: Every Thursday - # FRIDAY: Every Friday - # SATURDAY: Every Saturday - # SUNDAY: Every Sunday WEEK: Every week MONTH: Every month YEAR: Every year enum: - DAY - # - MONDAY - # - TUESDAY - # - WEDNESDAY - # - THURSDAY - # - FRIDAY - # - SATURDAY - # - SUNDAY - WEEK - MONTH - YEAR diff --git a/internal/entitlement/db_connector.go b/internal/entitlement/db_connector.go index e7a17e2e7..5ffc7b6c4 100644 --- a/internal/entitlement/db_connector.go +++ b/internal/entitlement/db_connector.go @@ -22,6 +22,8 @@ type EntitlementRepo interface { CreateEntitlement(ctx context.Context, entitlement EntitlementRepoCreateEntitlementInputs) (*Entitlement, error) GetEntitlement(ctx context.Context, entitlementID models.NamespacedID) (*Entitlement, error) + ListEntitlements(ctx context.Context, params ListEntitlementsParams) ([]Entitlement, error) + //FIXME: This is a terrbile hack LockEntitlementForTx(ctx context.Context, entitlementID models.NamespacedID) error diff --git a/internal/entitlement/entitlement_connector.go b/internal/entitlement/entitlement_connector.go index 66568f904..822ba59ee 100644 --- a/internal/entitlement/entitlement_connector.go +++ b/internal/entitlement/entitlement_connector.go @@ -9,11 +9,27 @@ import ( "github.com/openmeterio/openmeter/pkg/models" ) +type ListEntitlementsOrderBy string + +const ( + ListEntitlementsOrderByCreatedAt ListEntitlementsOrderBy = "created_at" + ListEntitlementsOrderByUpdatedAt ListEntitlementsOrderBy = "updated_at" +) + +type ListEntitlementsParams struct { + Namespace string + Limit int + Offset int + OrderBy ListEntitlementsOrderBy +} + type EntitlementConnector interface { // Entitlement Management CreateEntitlement(ctx context.Context, input CreateEntitlementInputs) (Entitlement, error) GetEntitlementsOfSubject(ctx context.Context, namespace string, subjectKey models.SubjectKey) ([]Entitlement, error) GetEntitlementValue(ctx context.Context, entitlementId models.NamespacedID, at time.Time) (EntitlementValue, error) + + ListEntitlements(ctx context.Context, params ListEntitlementsParams) ([]Entitlement, error) } type entitlementConnector struct { @@ -78,3 +94,7 @@ func (c *entitlementConnector) GetEntitlementValue(ctx context.Context, entitlem Overage: balance.Overage, }, nil } + +func (c *entitlementConnector) ListEntitlements(ctx context.Context, params ListEntitlementsParams) ([]Entitlement, error) { + return c.entitlementRepo.ListEntitlements(ctx, params) +} diff --git a/internal/entitlement/httpdriver/entitlement.go b/internal/entitlement/httpdriver/entitlement.go index 98f91572e..927c4f096 100644 --- a/internal/entitlement/httpdriver/entitlement.go +++ b/internal/entitlement/httpdriver/entitlement.go @@ -20,6 +20,7 @@ type EntitlementHandler interface { CreateEntitlement() CreateEntitlementHandler GetEntitlementValue() GetEntitlementValueHandler GetEntitlementsOfSubjectHandler() GetEntitlementsOfSubjectHandler + ListEntitlements() ListEntitlementsHandler } type entitlementHandler struct { @@ -244,6 +245,69 @@ func (h *entitlementHandler) GetEntitlementsOfSubjectHandler() GetEntitlementsOf ) } +type ListEntitlementsHandlerRequest = entitlement.ListEntitlementsParams +type ListEntitlementsHandlerResponse = []APIEntitlementResponse +type ListEntitlementsHandlerParams = api.ListEntitlementsParams + +type ListEntitlementsHandler httptransport.HandlerWithArgs[ListEntitlementsHandlerRequest, ListEntitlementsHandlerResponse, ListEntitlementsHandlerParams] + +func (h *entitlementHandler) ListEntitlements() ListEntitlementsHandler { + return httptransport.NewHandlerWithArgs( + func(ctx context.Context, r *http.Request, params ListEntitlementsHandlerParams) (entitlement.ListEntitlementsParams, error) { + ns, err := h.resolveNamespace(ctx) + if err != nil { + return entitlement.ListEntitlementsParams{}, err + } + + p := entitlement.ListEntitlementsParams{ + Namespace: ns, + Limit: defaultx.WithDefault(params.Limit, 1000), + Offset: defaultx.WithDefault(params.Offset, 0), + } + + switch defaultx.WithDefault(params.OrderBy, "") { + case "createdAt": + p.OrderBy = entitlement.ListEntitlementsOrderByCreatedAt + case "updatedAt": + p.OrderBy = entitlement.ListEntitlementsOrderByUpdatedAt + default: + p.OrderBy = entitlement.ListEntitlementsOrderByCreatedAt + } + + return p, nil + }, + func(ctx context.Context, request ListEntitlementsHandlerRequest) ([]APIEntitlementResponse, error) { + entitlements, err := h.connector.ListEntitlements(ctx, request) + if err != nil { + return nil, err + } + + res := make([]APIEntitlementResponse, len(entitlements)) + for i, ent := range entitlements { + res[i] = APIEntitlementResponse{ + EntitlementMetered: api.EntitlementMetered{ + Id: &ent.ID, + FeatureId: ent.FeatureID, + CreatedAt: &ent.CreatedAt, + UpdatedAt: &ent.UpdatedAt, + DeletedAt: ent.DeletedAt, + SubjectKey: ent.SubjectKey, + Type: "metered", + }, + UsagePeriod: nil, + } + } + + return res, nil + }, + commonhttp.JSONResponseEncoder[[]APIEntitlementResponse], + httptransport.AppendOptions( + h.options, + httptransport.WithOperationName("listEntitlements"), + )..., + ) +} + func (h *entitlementHandler) resolveNamespace(ctx context.Context) (string, error) { ns, ok := h.namespaceDecoder.GetNamespace(ctx) if !ok { diff --git a/internal/entitlement/postgresadapter/entitlement.go b/internal/entitlement/postgresadapter/entitlement.go index 3e37fbc8d..1ad74881c 100644 --- a/internal/entitlement/postgresadapter/entitlement.go +++ b/internal/entitlement/postgresadapter/entitlement.go @@ -74,6 +74,38 @@ func (a *entitlementDBAdapter) GetEntitlementsOfSubject(ctx context.Context, nam } +func (a *entitlementDBAdapter) ListEntitlements(ctx context.Context, params entitlement.ListEntitlementsParams) ([]entitlement.Entitlement, error) { + query := a.db.Entitlement.Query(). + Where(db_entitlement.Namespace(params.Namespace)) + + if params.Limit > 0 { + query = query.Limit(params.Limit) + } + if params.Offset > 0 { + query = query.Offset(params.Offset) + } + + switch params.OrderBy { + case entitlement.ListEntitlementsOrderByCreatedAt: + query = query.Order(db_entitlement.ByCreatedAt()) + case entitlement.ListEntitlementsOrderByUpdatedAt: + query = query.Order(db_entitlement.ByUpdatedAt()) + } + + entities, err := query.All(ctx) + if err != nil { + return nil, err + } + + result := make([]entitlement.Entitlement, 0, len(entities)) + for _, e := range entities { + result = append(result, *mapEntitlementEntity(e)) + } + + return result, nil + +} + func mapEntitlementEntity(e *db.Entitlement) *entitlement.Entitlement { return &entitlement.Entitlement{ NamespacedModel: models.NamespacedModel{ diff --git a/internal/server/router/entitlement.go b/internal/server/router/entitlement.go index 71dc10e1b..f97bd7e91 100644 --- a/internal/server/router/entitlement.go +++ b/internal/server/router/entitlement.go @@ -96,3 +96,13 @@ func (a *Router) GetEntitlementHistory(w http.ResponseWriter, r *http.Request, s Params: params, }).ServeHTTP(w, r) } + +// List entitlements +// (GET /api/v1/entitlements) +func (a *Router) ListEntitlements(w http.ResponseWriter, r *http.Request, params api.ListEntitlementsParams) { + if !a.config.EntitlementsEnabled { + unimplemented.ListEntitlements(w, r, params) + return + } + a.entitlementHandler.ListEntitlements().With(params).ServeHTTP(w, r) +} diff --git a/internal/server/router/noop.go b/internal/server/router/noop.go index 455915f66..d0e668283 100644 --- a/internal/server/router/noop.go +++ b/internal/server/router/noop.go @@ -13,12 +13,6 @@ import ( var unimplemented api.ServerInterface = api.Unimplemented{} -// List entitlements -// (GET /api/v1/entitlements) -func (a *Router) ListEntitlements(w http.ResponseWriter, r *http.Request, params api.ListEntitlementsParams) { - commonhttp.NewHTTPError(http.StatusNotImplemented, fmt.Errorf("not implemented")).EncodeError(context.TODO(), w) -} - // Delete entitlement // (DELETE /api/v1/subjects/{subjectIdOrKey}/entitlements/{entitlementId}) func (a *Router) DeleteEntitlement(w http.ResponseWriter, r *http.Request, subjectIdOrKey api.SubjectIdOrKey, entitlementId api.EntitlementId) { diff --git a/openmeter/entitlement/httpdriver/handlers.go b/openmeter/entitlement/httpdriver/handlers.go index f222ed5ae..c092c86d6 100644 --- a/openmeter/entitlement/httpdriver/handlers.go +++ b/openmeter/entitlement/httpdriver/handlers.go @@ -17,6 +17,7 @@ type GetEntitlementValueHandler = httpdriver.GetEntitlementValueHandler type GetEntitlementsOfSubjectHandler = httpdriver.GetEntitlementsOfSubjectHandler type ListEntitlementGrantsHandler = httpdriver.ListEntitlementGrantsHandler type ResetEntitlementUsageHandler = httpdriver.ResetEntitlementUsageHandler +type ListEntitlementsHandler = httpdriver.ListEntitlementsHandler func NewEntitlementHandler( connector entitlement.EntitlementConnector, diff --git a/openmeter/entitlement/httpdriver/types.go b/openmeter/entitlement/httpdriver/types.go index 7a0143d10..94dc4c4fc 100644 --- a/openmeter/entitlement/httpdriver/types.go +++ b/openmeter/entitlement/httpdriver/types.go @@ -10,6 +10,7 @@ type GetEntitlementValueHandlerRequest = httpdriver.GetEntitlementValueHandlerRe type GetEntitlementsOfSubjectHandlerRequest = httpdriver.GetEntitlementsOfSubjectHandlerRequest type ListEntitlementGrantHandlerRequest = httpdriver.ListEntitlementGrantHandlerRequest type ResetEntitlementUsageHandlerRequest = httpdriver.ResetEntitlementUsageHandlerRequest +type ListEntitlementsHandlerRequest = httpdriver.ListEntitlementsHandlerRequest // responses type CreateEntitlementHandlerResponse = httpdriver.CreateEntitlementHandlerResponse @@ -19,6 +20,7 @@ type GetEntitlementValueHandlerResponse = httpdriver.GetEntitlementValueHandlerR type GetEntitlementsOfSubjectHandlerResponse = httpdriver.GetEntitlementsOfSubjectHandlerResponse type ListEntitlementGrantHandlerResponse = httpdriver.ListEntitlementGrantHandlerResponse type ResetEntitlementUsageHandlerResponse = httpdriver.ResetEntitlementUsageHandlerResponse +type ListEntitlementsHandlerResponse = httpdriver.ListEntitlementsHandlerResponse // params type CreateEntitlementHandlerParams = httpdriver.CreateEntitlementHandlerParams @@ -28,3 +30,4 @@ type GetEntitlementValueHandlerParams = httpdriver.GetEntitlementValueHandlerPar type GetEntitlementsOfSubjectHandlerParams = httpdriver.GetEntitlementsOfSubjectHandlerParams type ListEntitlementGrantsHandlerParams = httpdriver.ListEntitlementGrantsHandlerParams type ResetEntitlementUsageHandlerParams = httpdriver.ResetEntitlementUsageHandlerParams +type ListEntitlementsHandlerParams = httpdriver.ListEntitlementsHandlerParams diff --git a/pkg/models/model.go b/pkg/models/model.go index a37779746..d31878cab 100644 --- a/pkg/models/model.go +++ b/pkg/models/model.go @@ -7,7 +7,7 @@ type ManagedModel struct { // After creation the entity is considered updated. UpdatedAt time.Time `json:"updatedAt"` // Time of soft delete. If not null, the entity is considered deleted. - DeletedAt *time.Time `json:"deletedAt"` + DeletedAt *time.Time `json:"deletedAt,omitempty"` } type NamespacedModel struct {