aboutsummaryrefslogtreecommitdiff
path: root/server/src
diff options
context:
space:
mode:
authorJoris2019-08-11 22:40:09 +0200
committerJoris2019-08-11 22:40:09 +0200
commit2d79ab0e0a11f55255fc21a5dfab1598d3beeba3 (patch)
tree80ab3cd98cebfb9694f66aa7718f6bc5d1c83d22 /server/src
parentc542424b7b41c78a170763f6996c12f56b359860 (diff)
downloadbudget-2d79ab0e0a11f55255fc21a5dfab1598d3beeba3.tar.gz
budget-2d79ab0e0a11f55255fc21a5dfab1598d3beeba3.tar.bz2
budget-2d79ab0e0a11f55255fc21a5dfab1598d3beeba3.zip
Add payment clone
Diffstat (limited to 'server/src')
-rw-r--r--server/src/Controller/Payment.hs29
-rw-r--r--server/src/Design/Modal.hs4
-rw-r--r--server/src/Design/View/Payment/Form.hs35
-rw-r--r--server/src/Persistence/Payment.hs66
4 files changed, 98 insertions, 36 deletions
diff --git a/server/src/Controller/Payment.hs b/server/src/Controller/Payment.hs
index 3d857be..c700240 100644
--- a/server/src/Controller/Payment.hs
+++ b/server/src/Controller/Payment.hs
@@ -10,9 +10,9 @@ import qualified Network.HTTP.Types.Status as Status
import Web.Scotty hiding (delete)
import Common.Model (CreatePayment (..),
- CreatedPayment (..),
EditPayment (..), Payment (..),
- PaymentId, User (..))
+ PaymentId, SavedPayment (..),
+ User (..))
import qualified Model.Query as Query
import qualified Persistence.Payment as PaymentPersistence
import qualified Persistence.PaymentCategory as PaymentCategoryPersistence
@@ -33,7 +33,7 @@ create createPayment@(CreatePayment name cost date category frequency) =
(liftIO . Query.run $ do
pc <- PaymentCategoryPersistence.save name category
p <- PaymentPersistence.create (_user_id user) name cost date frequency
- return $ CreatedPayment p pc
+ return $ SavedPayment p pc
) >>= json
Just validationError ->
do
@@ -44,15 +44,20 @@ create createPayment@(CreatePayment name cost date category frequency) =
edit :: EditPayment -> ActionM ()
edit (EditPayment paymentId name cost date category frequency) =
Secure.loggedAction (\user -> do
- updated <- liftIO . Query.run $ do
- edited <- PaymentPersistence.edit (_user_id user) paymentId name cost date frequency
- _ <- if edited
- then PaymentCategoryPersistence.save name category >> return ()
- else return ()
- return edited
- if updated
- then status Status.ok200
- else status Status.badRequest400
+ result <- liftIO . Query.run $ do
+ editedPayment <- PaymentPersistence.edit (_user_id user) paymentId name cost date frequency
+ case editedPayment of
+ Just p -> do
+ pc <- PaymentCategoryPersistence.save name category
+ PaymentCategoryPersistence.deleteIfUnused name
+ return $ Just (p, pc)
+ Nothing ->
+ return Nothing
+ case result of
+ Just (p, pc) ->
+ json $ SavedPayment p pc
+ Nothing ->
+ status Status.badRequest400
)
delete :: PaymentId -> ActionM ()
diff --git a/server/src/Design/Modal.hs b/server/src/Design/Modal.hs
index dce2ef9..4020eb0 100644
--- a/server/src/Design/Modal.hs
+++ b/server/src/Design/Modal.hs
@@ -7,6 +7,7 @@ import Data.Monoid ((<>))
import qualified Design.View.Payment.Add as Add
import qualified Design.View.Payment.Delete as Delete
+import qualified Design.View.Payment.Form as Form
design :: Css
design = do
@@ -14,9 +15,9 @@ design = do
appearKeyframe
".g-Modal" ? do
+ display none
appearAnimation
transition "all" (sec 0.2) ease (sec 0)
- display none
opacity 0
".g-Modal--Show" & do
@@ -47,6 +48,7 @@ design = do
boxShadow . pure . bsColor (rgba 0 0 0 0.5) $ shadowWithBlur (px 0) (px 0) (px 15)
".add" ? Add.design
+ ".form" ? Form.design
".delete" ? Delete.design
".paymentModal" & do
diff --git a/server/src/Design/View/Payment/Form.hs b/server/src/Design/View/Payment/Form.hs
new file mode 100644
index 0000000..aada12b
--- /dev/null
+++ b/server/src/Design/View/Payment/Form.hs
@@ -0,0 +1,35 @@
+module Design.View.Payment.Form
+ ( design
+ ) where
+
+import Clay
+
+import qualified Design.Color as Color
+import qualified Design.Constants as Constants
+import qualified Design.Helper as Helper
+
+design :: Css
+design = do
+ ".formHeader" ? do
+ backgroundColor Color.chestnutRose
+ fontSize (px 18)
+ color Color.white
+ sym2 padding (px 20) (px 30)
+ textAlign (alignSide sideCenter)
+ borderRadius (px 5) (px 5) (px 0) (px 0)
+
+ ".formContent" ? do
+ sym2 padding (px 20) (px 30)
+
+ ".buttons" ? do
+ display flex
+ justifyContent spaceAround
+ marginTop (em 1.5)
+
+ ".confirm" ?
+ Helper.button Color.chestnutRose Color.white (px Constants.inputHeight) Constants.focusLighten
+ ".undo" ?
+ Helper.button Color.silver Color.white (px Constants.inputHeight) Constants.focusLighten
+
+ (".confirm" <> ".undo") ?
+ width (px 90)
diff --git a/server/src/Persistence/Payment.hs b/server/src/Persistence/Payment.hs
index 3d8f129..b3f2b2e 100644
--- a/server/src/Persistence/Payment.hs
+++ b/server/src/Persistence/Payment.hs
@@ -129,33 +129,53 @@ createMany payments =
(map InsertRow payments)
)
-edit :: UserId -> PaymentId -> Text -> Int -> Day -> Frequency -> Query Bool
-edit userId paymentId paymentName paymentCost paymentDate paymentFrequency =
+edit :: UserId -> PaymentId -> Text -> Int -> Day -> Frequency -> Query (Maybe Payment)
+edit userId paymentId name cost date frequency =
Query (\conn -> do
mbPayment <- fmap (\(Row p) -> p) . listToMaybe <$>
- SQLite.query conn "SELECT * FROM payment WHERE id = ?" (Only paymentId)
+ SQLite.query
+ conn
+ "SELECT * FROM payment WHERE id = ? and userId = ?"
+ (paymentId, userId)
case mbPayment of
- Just payment ->
- if _payment_user payment == userId
- then do
- now <- getCurrentTime
- SQLite.execute
- conn
- (SQLite.Query $ T.intercalate " "
- [ "UPDATE payment"
- , "SET edited_at = ?,"
- , " name = ?,"
- , " cost = ?,"
- , " date = ?,"
- , " frequency = ?"
- , "WHERE id = ?"
- ])
- (now, paymentName, paymentCost, paymentDate, FrequencyField paymentFrequency, paymentId)
- return True
- else
- return False
+ Just payment -> do
+ now <- getCurrentTime
+ SQLite.execute
+ conn
+ (SQLite.Query $ T.intercalate " "
+ [ "UPDATE"
+ , " payment"
+ , "SET"
+ , " edited_at = ?,"
+ , " name = ?,"
+ , " cost = ?,"
+ , " date = ?,"
+ , " frequency = ?"
+ , "WHERE"
+ , " id = ?"
+ , " AND user_id = ?"
+ ])
+ ( now
+ , name
+ , cost
+ , date
+ , FrequencyField frequency
+ , paymentId
+ , userId
+ )
+ return . Just $ Payment
+ { _payment_id = paymentId
+ , _payment_user = userId
+ , _payment_name = name
+ , _payment_cost = cost
+ , _payment_date = date
+ , _payment_frequency = frequency
+ , _payment_createdAt = _payment_createdAt payment
+ , _payment_editedAt = Just now
+ , _payment_deletedAt = Nothing
+ }
Nothing ->
- return False
+ return Nothing
)
delete :: UserId -> PaymentId -> Query ()