stripe-servant 0.1.0.0 → 0.1.1.0
raw patch · 3 files changed
+80/−4 lines, 3 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Stripe.Api: type SubscriptionApi = StripeAuth :> ReqBody '[FormUrlEncoded] SubscriptionCreate :> Post '[JSON] Subscription :<|> StripeAuth :> Capture ":subscription_id" SubscriptionId :> Get '[JSON] Subscription :<|> StripeAuth :> QueryParam "customer" CustomerId :> Get '[JSON] (StripeList Subscription)
+ Stripe.Resources: Subscription :: SubscriptionId -> Bool -> TimeStamp -> TimeStamp -> CustomerId -> StripeList SubscriptionItem -> Text -> Subscription
+ Stripe.Resources: SubscriptionCreate :: CustomerId -> [SubscriptionCreateItem] -> Maybe Bool -> Maybe TimeStamp -> SubscriptionCreate
+ Stripe.Resources: SubscriptionCreateItem :: PriceId -> Maybe Int -> SubscriptionCreateItem
+ Stripe.Resources: SubscriptionItem :: SubscriptionItemId -> Price -> Maybe Int -> SubscriptionId -> SubscriptionItem
+ Stripe.Resources: [sCancelAtPeriodEnd] :: Subscription -> Bool
+ Stripe.Resources: [sCurrentPeriodEnd] :: Subscription -> TimeStamp
+ Stripe.Resources: [sCurrentPeriodStart] :: Subscription -> TimeStamp
+ Stripe.Resources: [sCustomer] :: Subscription -> CustomerId
+ Stripe.Resources: [sId] :: Subscription -> SubscriptionId
+ Stripe.Resources: [sItems] :: Subscription -> StripeList SubscriptionItem
+ Stripe.Resources: [sStatus] :: Subscription -> Text
+ Stripe.Resources: [scCancelAtPeriodEnd] :: SubscriptionCreate -> Maybe Bool
+ Stripe.Resources: [scCustomer] :: SubscriptionCreate -> CustomerId
+ Stripe.Resources: [scItems] :: SubscriptionCreate -> [SubscriptionCreateItem]
+ Stripe.Resources: [scTrialEnd] :: SubscriptionCreate -> Maybe TimeStamp
+ Stripe.Resources: [sciPrice] :: SubscriptionCreateItem -> PriceId
+ Stripe.Resources: [sciQuantity] :: SubscriptionCreateItem -> Maybe Int
+ Stripe.Resources: [siId] :: SubscriptionItem -> SubscriptionItemId
+ Stripe.Resources: [siPrice] :: SubscriptionItem -> Price
+ Stripe.Resources: [siQuantity] :: SubscriptionItem -> Maybe Int
+ Stripe.Resources: [siSubscription] :: SubscriptionItem -> SubscriptionId
+ Stripe.Resources: data Subscription
+ Stripe.Resources: data SubscriptionCreate
+ Stripe.Resources: data SubscriptionCreateItem
+ Stripe.Resources: data SubscriptionItem
+ Stripe.Resources: instance Data.Aeson.Types.FromJSON.FromJSON Stripe.Resources.Subscription
+ Stripe.Resources: instance Data.Aeson.Types.FromJSON.FromJSON Stripe.Resources.SubscriptionItem
+ Stripe.Resources: instance Data.Aeson.Types.FromJSON.FromJSON Stripe.Resources.SubscriptionItemId
+ Stripe.Resources: instance Data.Aeson.Types.ToJSON.ToJSON Stripe.Resources.Subscription
+ Stripe.Resources: instance Data.Aeson.Types.ToJSON.ToJSON Stripe.Resources.SubscriptionItem
+ Stripe.Resources: instance Data.Aeson.Types.ToJSON.ToJSON Stripe.Resources.SubscriptionItemId
+ Stripe.Resources: instance GHC.Base.Applicative Stripe.Resources.StripeList
+ Stripe.Resources: instance GHC.Base.Functor Stripe.Resources.StripeList
+ Stripe.Resources: instance GHC.Base.Monoid (Stripe.Resources.StripeList a)
+ Stripe.Resources: instance GHC.Base.Semigroup (Stripe.Resources.StripeList a)
+ Stripe.Resources: instance GHC.Classes.Eq Stripe.Resources.Subscription
+ Stripe.Resources: instance GHC.Classes.Eq Stripe.Resources.SubscriptionCreate
+ Stripe.Resources: instance GHC.Classes.Eq Stripe.Resources.SubscriptionCreateItem
+ Stripe.Resources: instance GHC.Classes.Eq Stripe.Resources.SubscriptionItem
+ Stripe.Resources: instance GHC.Classes.Eq Stripe.Resources.SubscriptionItemId
+ Stripe.Resources: instance GHC.Generics.Generic Stripe.Resources.SubscriptionCreate
+ Stripe.Resources: instance GHC.Generics.Generic Stripe.Resources.SubscriptionCreateItem
+ Stripe.Resources: instance GHC.Show.Show Stripe.Resources.Subscription
+ Stripe.Resources: instance GHC.Show.Show Stripe.Resources.SubscriptionCreate
+ Stripe.Resources: instance GHC.Show.Show Stripe.Resources.SubscriptionCreateItem
+ Stripe.Resources: instance GHC.Show.Show Stripe.Resources.SubscriptionItem
+ Stripe.Resources: instance GHC.Show.Show Stripe.Resources.SubscriptionItemId
+ Stripe.Resources: instance Web.Internal.FormUrlEncoded.ToForm Stripe.Resources.SubscriptionCreate
+ Stripe.Resources: instance Web.Internal.HttpApiData.ToHttpApiData Stripe.Resources.SubscriptionItemId
+ Stripe.Resources: instance Web.Internal.HttpApiData.ToHttpApiData Stripe.Resources.TimeStamp
- Stripe.Api: type StripeApiInternal = "customers" :> CustomerApi :<|> "products" :> ProductApi :<|> "prices" :> PriceApi :<|> "checkout" :> "sessions" :> CheckoutApi :<|> "billing_portal" :> "sessions" :> CustomerPortalApi :<|> "events" :> EventApi
+ Stripe.Api: type StripeApiInternal = "customers" :> CustomerApi :<|> "products" :> ProductApi :<|> "prices" :> PriceApi :<|> "subscriptions" :> SubscriptionApi :<|> "checkout" :> "sessions" :> CheckoutApi :<|> "billing_portal" :> "sessions" :> CustomerPortalApi :<|> "events" :> EventApi
Files
- src/Stripe/Api.hs +6/−0
- src/Stripe/Resources.hs +72/−2
- stripe-servant.cabal +2/−2
src/Stripe/Api.hs view
@@ -16,6 +16,7 @@ = "customers" :> CustomerApi :<|> "products" :> ProductApi :<|> "prices" :> PriceApi+ :<|> "subscriptions" :> SubscriptionApi :<|> "checkout" :> "sessions" :> CheckoutApi :<|> "billing_portal" :> "sessions" :> CustomerPortalApi :<|> "events" :> EventApi@@ -38,6 +39,11 @@ = StripeAuth :> ReqBody '[FormUrlEncoded] PriceCreate :> Post '[JSON] Price :<|> StripeAuth :> Capture ":product_id" PriceId :> Get '[JSON] Price :<|> StripeAuth :> QueryParam "lookup_keys[]" T.Text :> Get '[JSON] (StripeList Price)++type SubscriptionApi+ = StripeAuth :> ReqBody '[FormUrlEncoded] SubscriptionCreate :> Post '[JSON] Subscription+ :<|> StripeAuth :> Capture ":subscription_id" SubscriptionId :> Get '[JSON] Subscription+ :<|> StripeAuth :> QueryParam "customer" CustomerId :> Get '[JSON] (StripeList Subscription) type CheckoutApi = StripeAuth :> ReqBody '[FormUrlEncoded] CheckoutSessionCreate :> Post '[JSON] CheckoutSession
src/Stripe/Resources.hs view
@@ -10,7 +10,7 @@ , Product(..), ProductCreate(..) , Price(..), PriceRecurring(..), PriceCreate(..), PriceCreateRecurring(..) -- * Subscriptions- , SubscriptionId(..)+ , SubscriptionId(..), Subscription(..), SubscriptionItem(..), SubscriptionCreate(..), SubscriptionCreateItem(..) -- * Customer Portal , CustomerPortalId(..), CustomerPortal(..), CustomerPortalCreate(..) -- * Checkout@@ -52,13 +52,29 @@ A.withScientific "unix timestamp" $ \sci -> pure $ TimeStamp $ posixSecondsToUTCTime (fromRational $ toRational sci) +instance ToHttpApiData TimeStamp where+ toUrlPiece x =+ let unix :: Int+ unix = round . utcTimeToPOSIXSeconds . unTimeStamp $ x+ in T.pack (show unix)+ -- | A 'V.Vector' wrapper with an indication is there are more items available through pagination. data StripeList a = StripeList { slHasMore :: Bool , slData :: V.Vector a- } deriving (Show, Eq)+ } deriving (Show, Eq, Functor) +instance Semigroup (StripeList a) where+ (<>) a b = StripeList (slHasMore a || slHasMore b) (slData a <> slData b)++instance Monoid (StripeList a) where+ mempty = StripeList False mempty++instance Applicative StripeList where+ pure = StripeList False . pure+ (<*>) go x = StripeList (slHasMore go || slHasMore x) (slData go <*> slData x)+ newtype CustomerId = CustomerId { unCustomerId :: T.Text } deriving (Show, Eq, ToJSON, FromJSON, ToHttpApiData)@@ -164,6 +180,43 @@ = SubscriptionId { unSubscriptionId :: T.Text } deriving (Show, Eq, ToJSON, FromJSON, ToHttpApiData) +data Subscription+ = Subscription+ { sId :: SubscriptionId+ , sCancelAtPeriodEnd :: Bool+ , sCurrentPeriodEnd :: TimeStamp+ , sCurrentPeriodStart :: TimeStamp+ , sCustomer :: CustomerId+ , sItems :: StripeList SubscriptionItem+ , sStatus :: T.Text -- TODO: make enum+ } deriving (Show, Eq)++newtype SubscriptionItemId+ = SubscriptionItemId { unSubscriptionItemId :: T.Text }+ deriving (Show, Eq, ToJSON, FromJSON, ToHttpApiData)++data SubscriptionItem+ = SubscriptionItem+ { siId :: SubscriptionItemId+ , siPrice :: Price+ , siQuantity :: Maybe Int+ , siSubscription :: SubscriptionId+ } deriving (Show, Eq)++data SubscriptionCreateItem+ = SubscriptionCreateItem+ { sciPrice :: PriceId+ , sciQuantity :: Maybe Int+ } deriving (Show, Eq, Generic)++data SubscriptionCreate+ = SubscriptionCreate+ { scCustomer :: CustomerId+ , scItems :: [SubscriptionCreateItem]+ , scCancelAtPeriodEnd :: Maybe Bool+ , scTrialEnd :: Maybe TimeStamp+ } deriving (Show, Eq, Generic)+ newtype CheckoutSessionId = CheckoutSessionId { unCheckoutSessionId :: T.Text } deriving (Show, Eq, ToJSON, FromJSON, ToHttpApiData)@@ -224,6 +277,8 @@ $(deriveJSON (jsonOpts 1) ''Price) $(deriveJSON (jsonOpts 2) ''PriceRecurring) $(deriveJSON (jsonOpts 2) ''Product)+$(deriveJSON (jsonOpts 1) ''Subscription)+$(deriveJSON (jsonOpts 2) ''SubscriptionItem) $(deriveJSON (jsonOpts 2) ''CustomerPortal) instance ToForm CustomerCreate where@@ -254,6 +309,21 @@ , ("lookup_key", maybeToList $ pcLookupKey pc) , ("transfer_lookup_key", [toUrlPiece $ pcTransferLookupKey pc]) ] <> recurringPiece++instance ToForm SubscriptionCreate where+ toForm sc =+ let convertItem (idx, itm) =+ [ ("items[" <> toUrlPiece idx <> "][price]", [toUrlPiece $ sciPrice itm])+ , ("items[" <> toUrlPiece idx <> "][quantity]", maybeToList $ toUrlPiece <$> sciQuantity itm)+ ]+ lineItems =+ concatMap convertItem (zip ([0..] :: [Int]) (scItems sc))+ in Form $ HM.fromList $+ [ ("customer", [toUrlPiece $ scCustomer sc])+ , ("cancel_at_period_end", maybeToList $ toUrlPiece <$> scCancelAtPeriodEnd sc)+ , ("trial_end", maybeToList $ toUrlPiece <$> scTrialEnd sc)+ ] <> lineItems+ instance ToForm CheckoutSessionCreate where toForm csc =
stripe-servant.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: 44759c17c1b913f08638e1ae86cf9a71e9a090db0772cb4d9da196ae9447d461+-- hash: 1f5f0b69e2e75cbd3ee8f140d941a1803f791d24425d21b0cdb669d63e9ab462 name: stripe-servant-version: 0.1.0.0+version: 0.1.1.0 synopsis: Unofficial Stripe servant types description: Unofficial description of the Stripe API using servant types category: Web