diff options
| author | Joris | 2020-01-30 11:35:31 +0000 | 
|---|---|---|
| committer | Joris | 2020-01-30 11:35:31 +0000 | 
| commit | 960fa7cb7ae4c57d01306f78cd349f3a8337d0ab (patch) | |
| tree | 5077cc720525fb025e4dba65a9a8b631862cbcc8 /common/src/Common/Model | |
| parent | 14bdbc8c937f5d0b35c61350dba28cb41c3737cd (diff) | |
| parent | 6a04e640955051616c3ad0874605830c448f2d75 (diff) | |
Merge branch 'with-ghcjs' into 'master'
Use Haskell on the frontend
See merge request guyonvarch/shared-cost!2
Diffstat (limited to 'common/src/Common/Model')
24 files changed, 454 insertions, 0 deletions
| diff --git a/common/src/Common/Model/Category.hs b/common/src/Common/Model/Category.hs new file mode 100644 index 0000000..cc3f795 --- /dev/null +++ b/common/src/Common/Model/Category.hs @@ -0,0 +1,24 @@ +module Common.Model.Category +  ( CategoryId +  , Category(..) +  ) where + +import           Data.Aeson   (FromJSON, ToJSON) +import           Data.Int     (Int64) +import           Data.Text    (Text) +import           Data.Time    (UTCTime) +import           GHC.Generics (Generic) + +type CategoryId = Int64 + +data Category = Category +  { _category_id        :: CategoryId +  , _category_name      :: Text +  , _category_color     :: Text +  , _category_createdAt :: UTCTime +  , _category_editedAt  :: Maybe UTCTime +  , _category_deletedAt :: Maybe UTCTime +  } deriving (Eq, Show, Generic) + +instance FromJSON Category +instance ToJSON Category diff --git a/common/src/Common/Model/CategoryPage.hs b/common/src/Common/Model/CategoryPage.hs new file mode 100644 index 0000000..e20f49f --- /dev/null +++ b/common/src/Common/Model/CategoryPage.hs @@ -0,0 +1,18 @@ +module Common.Model.CategoryPage +  ( CategoryPage(..) +  ) where + +import           Data.Aeson            (FromJSON, ToJSON) +import           GHC.Generics          (Generic) + +import           Common.Model.Category (Category, CategoryId) + +data CategoryPage = CategoryPage +  { _categoryPage_page           :: Int +  , _categoryPage_categories     :: [Category] +  , _categoryPage_usedCategories :: [CategoryId] +  , _categoryPage_totalCount     :: Int +  } deriving (Eq, Show, Generic) + +instance FromJSON CategoryPage +instance ToJSON CategoryPage diff --git a/common/src/Common/Model/CreateCategoryForm.hs b/common/src/Common/Model/CreateCategoryForm.hs new file mode 100644 index 0000000..4668ef4 --- /dev/null +++ b/common/src/Common/Model/CreateCategoryForm.hs @@ -0,0 +1,15 @@ +module Common.Model.CreateCategoryForm +  ( CreateCategoryForm(..) +  ) where + +import           Data.Aeson   (FromJSON, ToJSON) +import           Data.Text    (Text) +import           GHC.Generics (Generic) + +data CreateCategoryForm = CreateCategoryForm +  { _createCategoryForm_name  :: Text +  , _createCategoryForm_color :: Text +  } deriving (Show, Generic) + +instance FromJSON CreateCategoryForm +instance ToJSON CreateCategoryForm diff --git a/common/src/Common/Model/CreateIncomeForm.hs b/common/src/Common/Model/CreateIncomeForm.hs new file mode 100644 index 0000000..e83bf0a --- /dev/null +++ b/common/src/Common/Model/CreateIncomeForm.hs @@ -0,0 +1,15 @@ +module Common.Model.CreateIncomeForm +  ( CreateIncomeForm(..) +  ) where + +import           Data.Aeson   (FromJSON, ToJSON) +import           Data.Text    (Text) +import           GHC.Generics (Generic) + +data CreateIncomeForm = CreateIncomeForm +  { _createIncomeForm_amount :: Text +  , _createIncomeForm_date   :: Text +  } deriving (Show, Generic) + +instance FromJSON CreateIncomeForm +instance ToJSON CreateIncomeForm diff --git a/common/src/Common/Model/CreatePaymentForm.hs b/common/src/Common/Model/CreatePaymentForm.hs new file mode 100644 index 0000000..60c5423 --- /dev/null +++ b/common/src/Common/Model/CreatePaymentForm.hs @@ -0,0 +1,21 @@ +module Common.Model.CreatePaymentForm +  ( CreatePaymentForm(..) +  ) where + +import           Data.Aeson             (FromJSON, ToJSON) +import           Data.Text              (Text) +import           GHC.Generics           (Generic) + +import           Common.Model.Category  (CategoryId) +import           Common.Model.Frequency (Frequency) + +data CreatePaymentForm = CreatePaymentForm +  { _createPaymentForm_name      :: Text +  , _createPaymentForm_cost      :: Text +  , _createPaymentForm_date      :: Text +  , _createPaymentForm_category  :: CategoryId +  , _createPaymentForm_frequency :: Frequency +  } deriving (Show, Generic) + +instance FromJSON CreatePaymentForm +instance ToJSON CreatePaymentForm diff --git a/common/src/Common/Model/Currency.hs b/common/src/Common/Model/Currency.hs new file mode 100644 index 0000000..175aeba --- /dev/null +++ b/common/src/Common/Model/Currency.hs @@ -0,0 +1,12 @@ +module Common.Model.Currency +  ( Currency(..) +  ) where + +import           Data.Aeson   (FromJSON, ToJSON) +import           Data.Text    (Text) +import           GHC.Generics (Generic) + +newtype Currency = Currency Text deriving (Show, Generic) + +instance FromJSON Currency +instance ToJSON Currency diff --git a/common/src/Common/Model/EditCategoryForm.hs b/common/src/Common/Model/EditCategoryForm.hs new file mode 100644 index 0000000..a2ceca0 --- /dev/null +++ b/common/src/Common/Model/EditCategoryForm.hs @@ -0,0 +1,18 @@ +module Common.Model.EditCategoryForm +  ( EditCategoryForm(..) +  ) where + +import           Data.Aeson            (FromJSON, ToJSON) +import           Data.Text             (Text) +import           GHC.Generics          (Generic) + +import           Common.Model.Category (CategoryId) + +data EditCategoryForm = EditCategoryForm +  { _editCategoryForm_id    :: CategoryId +  , _editCategoryForm_name  :: Text +  , _editCategoryForm_color :: Text +  } deriving (Show, Generic) + +instance FromJSON EditCategoryForm +instance ToJSON EditCategoryForm diff --git a/common/src/Common/Model/EditIncome.hs b/common/src/Common/Model/EditIncome.hs new file mode 100644 index 0000000..0e65f12 --- /dev/null +++ b/common/src/Common/Model/EditIncome.hs @@ -0,0 +1,17 @@ +module Common.Model.EditIncome +  ( EditIncome(..) +  ) where + +import           Data.Aeson          (FromJSON) +import           Data.Time.Calendar  (Day) +import           GHC.Generics        (Generic) + +import           Common.Model.Income (IncomeId) + +data EditIncome = EditIncome +  { _editIncome_id     :: IncomeId +  , _editIncome_date   :: Day +  , _editIncome_amount :: Int +  } deriving (Show, Generic) + +instance FromJSON EditIncome diff --git a/common/src/Common/Model/EditIncomeForm.hs b/common/src/Common/Model/EditIncomeForm.hs new file mode 100644 index 0000000..ff975fc --- /dev/null +++ b/common/src/Common/Model/EditIncomeForm.hs @@ -0,0 +1,18 @@ +module Common.Model.EditIncomeForm +  ( EditIncomeForm(..) +  ) where + +import           Data.Aeson          (FromJSON, ToJSON) +import           Data.Text           (Text) +import           GHC.Generics        (Generic) + +import           Common.Model.Income (IncomeId) + +data EditIncomeForm = EditIncomeForm +  { _editIncomeForm_id     :: IncomeId +  , _editIncomeForm_amount :: Text +  , _editIncomeForm_date   :: Text +  } deriving (Show, Generic) + +instance FromJSON EditIncomeForm +instance ToJSON EditIncomeForm diff --git a/common/src/Common/Model/EditPaymentForm.hs b/common/src/Common/Model/EditPaymentForm.hs new file mode 100644 index 0000000..168c9ff --- /dev/null +++ b/common/src/Common/Model/EditPaymentForm.hs @@ -0,0 +1,23 @@ +module Common.Model.EditPaymentForm +  ( EditPaymentForm(..) +  ) where + +import           Data.Aeson             (FromJSON, ToJSON) +import           Data.Text              (Text) +import           GHC.Generics           (Generic) + +import           Common.Model.Category  (CategoryId) +import           Common.Model.Frequency (Frequency) +import           Common.Model.Payment   (PaymentId) + +data EditPaymentForm = EditPaymentForm +  { _editPaymentForm_id        :: PaymentId +  , _editPaymentForm_name      :: Text +  , _editPaymentForm_cost      :: Text +  , _editPaymentForm_date      :: Text +  , _editPaymentForm_category  :: CategoryId +  , _editPaymentForm_frequency :: Frequency +  } deriving (Show, Generic) + +instance FromJSON EditPaymentForm +instance ToJSON EditPaymentForm diff --git a/common/src/Common/Model/Email.hs b/common/src/Common/Model/Email.hs new file mode 100644 index 0000000..e938f83 --- /dev/null +++ b/common/src/Common/Model/Email.hs @@ -0,0 +1,12 @@ +module Common.Model.Email +  ( Email(..) +  ) where + +import           Data.Aeson   (FromJSON, ToJSON) +import           Data.Text    (Text) +import           GHC.Generics (Generic) + +newtype Email = Email Text deriving (Show, Generic) + +instance FromJSON Email +instance ToJSON Email diff --git a/common/src/Common/Model/ExceedingPayer.hs b/common/src/Common/Model/ExceedingPayer.hs new file mode 100644 index 0000000..b7d3efb --- /dev/null +++ b/common/src/Common/Model/ExceedingPayer.hs @@ -0,0 +1,16 @@ +module Common.Model.ExceedingPayer +  ( ExceedingPayer(..) +  ) where + +import           Data.Aeson        (FromJSON, ToJSON) +import           GHC.Generics      (Generic) + +import           Common.Model.User (UserId) + +data ExceedingPayer = ExceedingPayer +  { _exceedingPayer_userId :: UserId +  , _exceedingPayer_amount :: Int +  } deriving (Eq, Show, Generic) + +instance FromJSON ExceedingPayer +instance ToJSON ExceedingPayer diff --git a/common/src/Common/Model/Frequency.hs b/common/src/Common/Model/Frequency.hs new file mode 100644 index 0000000..48e75ea --- /dev/null +++ b/common/src/Common/Model/Frequency.hs @@ -0,0 +1,14 @@ +module Common.Model.Frequency +  ( Frequency(..) +  ) where + +import           Data.Aeson   (FromJSON, ToJSON) +import           GHC.Generics (Generic) + +data Frequency = +  Punctual +  | Monthly +  deriving (Eq, Read, Show, Generic, Ord) + +instance FromJSON Frequency +instance ToJSON Frequency diff --git a/common/src/Common/Model/Income.hs b/common/src/Common/Model/Income.hs new file mode 100644 index 0000000..57d07f1 --- /dev/null +++ b/common/src/Common/Model/Income.hs @@ -0,0 +1,27 @@ +module Common.Model.Income +  ( IncomeId +  , Income(..) +  ) where + +import           Data.Aeson         (FromJSON, ToJSON) +import           Data.Int           (Int64) +import           Data.Time          (UTCTime) +import           Data.Time.Calendar (Day) +import           GHC.Generics       (Generic) + +import           Common.Model.User  (UserId) + +type IncomeId = Int64 + +data Income = Income +  { _income_id        :: IncomeId +  , _income_userId    :: UserId +  , _income_date      :: Day +  , _income_amount    :: Int +  , _income_createdAt :: UTCTime +  , _income_editedAt  :: Maybe UTCTime +  , _income_deletedAt :: Maybe UTCTime +  } deriving (Eq, Show, Generic) + +instance FromJSON Income +instance ToJSON Income diff --git a/common/src/Common/Model/IncomeHeader.hs b/common/src/Common/Model/IncomeHeader.hs new file mode 100644 index 0000000..7e712e8 --- /dev/null +++ b/common/src/Common/Model/IncomeHeader.hs @@ -0,0 +1,18 @@ +module Common.Model.IncomeHeader +  ( IncomeHeader(..) +  ) where + +import           Data.Aeson         (FromJSON, ToJSON) +import           Data.Map           (Map) +import           Data.Time.Calendar (Day) +import           GHC.Generics       (Generic) + +import           Common.Model.User  (UserId) + +data IncomeHeader = IncomeHeader +  { _incomeHeader_since  :: Maybe Day +  , _incomeHeader_byUser :: Map UserId Int +  } deriving (Eq, Show, Generic) + +instance FromJSON IncomeHeader +instance ToJSON IncomeHeader diff --git a/common/src/Common/Model/IncomePage.hs b/common/src/Common/Model/IncomePage.hs new file mode 100644 index 0000000..977b0ea --- /dev/null +++ b/common/src/Common/Model/IncomePage.hs @@ -0,0 +1,19 @@ +module Common.Model.IncomePage +  ( IncomePage(..) +  ) where + +import           Data.Aeson                (FromJSON, ToJSON) +import           GHC.Generics              (Generic) + +import           Common.Model.Income       (Income) +import           Common.Model.IncomeHeader (IncomeHeader) + +data IncomePage = IncomePage +  { _incomePage_page       :: Int +  , _incomePage_header     :: IncomeHeader +  , _incomePage_incomes    :: [Income] +  , _incomePage_totalCount :: Int +  } deriving (Eq, Show, Generic) + +instance FromJSON IncomePage +instance ToJSON IncomePage diff --git a/common/src/Common/Model/Init.hs b/common/src/Common/Model/Init.hs new file mode 100644 index 0000000..5ef1535 --- /dev/null +++ b/common/src/Common/Model/Init.hs @@ -0,0 +1,18 @@ +module Common.Model.Init +  ( Init(..) +  ) where + +import           Data.Aeson            (FromJSON, ToJSON) +import           GHC.Generics          (Generic) + +import           Common.Model.Currency (Currency) +import           Common.Model.User     (User, UserId) + +data Init = Init +  { _init_users       :: [User] +  , _init_currentUser :: UserId +  , _init_currency    :: Currency +  } deriving (Show, Generic) + +instance FromJSON Init +instance ToJSON Init diff --git a/common/src/Common/Model/Password.hs b/common/src/Common/Model/Password.hs new file mode 100644 index 0000000..1b51a47 --- /dev/null +++ b/common/src/Common/Model/Password.hs @@ -0,0 +1,12 @@ +module Common.Model.Password +  ( Password(..) +  ) where + +import           Data.Aeson   (FromJSON, ToJSON) +import           Data.Text    (Text) +import           GHC.Generics (Generic) + +newtype Password = Password Text deriving (Show, Generic) + +instance FromJSON Password +instance ToJSON Password diff --git a/common/src/Common/Model/Payment.hs b/common/src/Common/Model/Payment.hs new file mode 100644 index 0000000..733a145 --- /dev/null +++ b/common/src/Common/Model/Payment.hs @@ -0,0 +1,33 @@ +module Common.Model.Payment +  ( PaymentId +  , Payment(..) +  ) where + +import           Data.Aeson             (FromJSON, ToJSON) +import           Data.Int               (Int64) +import           Data.Text              (Text) +import           Data.Time              (UTCTime) +import           Data.Time.Calendar     (Day) +import           GHC.Generics           (Generic) + +import           Common.Model.Category  (CategoryId) +import           Common.Model.Frequency +import           Common.Model.User      (UserId) + +type PaymentId = Int64 + +data Payment = Payment +  { _payment_id        :: PaymentId +  , _payment_user      :: UserId +  , _payment_name      :: Text +  , _payment_cost      :: Int +  , _payment_date      :: Day +  , _payment_category  :: CategoryId +  , _payment_frequency :: Frequency +  , _payment_createdAt :: UTCTime +  , _payment_editedAt  :: Maybe UTCTime +  , _payment_deletedAt :: Maybe UTCTime +  } deriving (Eq, Show, Generic) + +instance FromJSON Payment +instance ToJSON Payment diff --git a/common/src/Common/Model/PaymentHeader.hs b/common/src/Common/Model/PaymentHeader.hs new file mode 100644 index 0000000..35f5e1a --- /dev/null +++ b/common/src/Common/Model/PaymentHeader.hs @@ -0,0 +1,18 @@ +module Common.Model.PaymentHeader +  ( PaymentHeader(..) +  ) where + +import           Data.Aeson                  (FromJSON, ToJSON) +import           Data.Map                    (Map) +import           GHC.Generics                (Generic) + +import           Common.Model.ExceedingPayer (ExceedingPayer) +import           Common.Model.User           (UserId) + +data PaymentHeader = PaymentHeader +  { _paymentHeader_exceedingPayers :: [ExceedingPayer] +  , _paymentHeader_repartition     :: Map UserId Int +  } deriving (Eq, Show, Generic) + +instance FromJSON PaymentHeader +instance ToJSON PaymentHeader diff --git a/common/src/Common/Model/PaymentPage.hs b/common/src/Common/Model/PaymentPage.hs new file mode 100644 index 0000000..88d9715 --- /dev/null +++ b/common/src/Common/Model/PaymentPage.hs @@ -0,0 +1,21 @@ +module Common.Model.PaymentPage +  ( PaymentPage(..) +  ) where + +import           Data.Aeson                 (FromJSON, ToJSON) +import           GHC.Generics               (Generic) + +import           Common.Model.Frequency     (Frequency) +import           Common.Model.Payment       (Payment) +import           Common.Model.PaymentHeader (PaymentHeader) + +data PaymentPage = PaymentPage +  { _paymentPage_page       :: Int +  , _paymentPage_frequency  :: Frequency +  , _paymentPage_header     :: PaymentHeader +  , _paymentPage_payments   :: [Payment] +  , _paymentPage_totalCount :: Int +  } deriving (Eq, Show, Generic) + +instance FromJSON PaymentPage +instance ToJSON PaymentPage diff --git a/common/src/Common/Model/SignInForm.hs b/common/src/Common/Model/SignInForm.hs new file mode 100644 index 0000000..7a25935 --- /dev/null +++ b/common/src/Common/Model/SignInForm.hs @@ -0,0 +1,15 @@ +module Common.Model.SignInForm +  ( SignInForm(..) +  ) where + +import           Data.Aeson   (FromJSON, ToJSON) +import           Data.Text    (Text) +import           GHC.Generics (Generic) + +data SignInForm = SignInForm +  { _signInForm_email    :: Text +  , _signInForm_password :: Text +  } deriving (Show, Generic) + +instance FromJSON SignInForm +instance ToJSON SignInForm diff --git a/common/src/Common/Model/Stats.hs b/common/src/Common/Model/Stats.hs new file mode 100644 index 0000000..86e6ab9 --- /dev/null +++ b/common/src/Common/Model/Stats.hs @@ -0,0 +1,23 @@ +module Common.Model.Stats +  ( Stats +  , MonthStats(..) +  ) where + +import           Data.Aeson            (FromJSON, ToJSON) +import           Data.Map              (Map) +import           Data.Time.Calendar    (Day) +import           GHC.Generics          (Generic) + +import           Common.Model.Category (CategoryId) +import           Common.Model.User     (UserId) + +type Stats = [MonthStats] + +data MonthStats = MonthStats +  { _monthStats_start              :: Day +  , _monthStats_paymentsByCategory :: Map CategoryId Int +  , _monthStats_incomeByUser       :: Map UserId Int +  } deriving (Eq, Show, Generic) + +instance FromJSON MonthStats +instance ToJSON MonthStats diff --git a/common/src/Common/Model/User.hs b/common/src/Common/Model/User.hs new file mode 100644 index 0000000..a30d104 --- /dev/null +++ b/common/src/Common/Model/User.hs @@ -0,0 +1,27 @@ +module Common.Model.User +  ( UserId +  , User(..) +  , findUser +  ) where + +import           Data.Aeson   (FromJSON, ToJSON) +import           Data.Int     (Int64) +import qualified Data.List    as L +import           Data.Text    (Text) +import           Data.Time    (UTCTime) +import           GHC.Generics (Generic) + +type UserId = Int64 + +data User = User +  { _user_id       :: UserId +  , _user_creation :: UTCTime +  , _user_email    :: Text +  , _user_name     :: Text +  } deriving (Show, Generic) + +instance FromJSON User +instance ToJSON User + +findUser :: UserId -> [User] -> Maybe User +findUser userId users = L.find ((== userId) . _user_id) users | 
