aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoris2017-11-08 23:47:26 +0100
committerJoris2017-11-08 23:47:26 +0100
commit27e11b20b06f2f2dbfb56c0998a63169b4b8abc4 (patch)
tree845f54d7fe876c9a3078036975ba85ec21d224a1
parenta3601b5e6f5a3e41fa31752a2c704ccd3632790e (diff)
Use a better project structure
-rw-r--r--.gitignore10
-rw-r--r--.tmuxinator.yml4
-rw-r--r--Makefile57
-rw-r--r--cabal-client.project4
-rw-r--r--cabal-server.project3
-rw-r--r--client/LICENSE (renamed from LICENSE)0
-rw-r--r--client/Setup.hs2
-rw-r--r--client/client.cabal24
-rw-r--r--client/src/Component/Button.hs (renamed from src/client/Component/Button.hs)0
-rw-r--r--client/src/Component/Input.hs (renamed from src/client/Component/Input.hs)0
-rw-r--r--client/src/Icon.hs (renamed from src/client/Icon.hs)0
-rw-r--r--client/src/Main.hs (renamed from src/client/Main.hs)1
-rw-r--r--client/src/View/App.hs (renamed from src/client/View/App.hs)0
-rw-r--r--client/src/View/Header.hs (renamed from src/client/View/Header.hs)4
-rw-r--r--client/src/View/Payment.hs (renamed from src/client/View/Payment.hs)0
-rw-r--r--client/src/View/Payment/Table.hs (renamed from src/client/View/Payment/Table.hs)4
-rw-r--r--client/src/View/SignIn.hs (renamed from src/client/View/SignIn.hs)0
-rw-r--r--common/LICENSE674
-rw-r--r--common/Setup.hs2
-rw-r--r--common/common.cabal41
-rw-r--r--common/src/Common/Message.hs (renamed from src/common/Message.hs)0
-rw-r--r--common/src/Common/Message/Key.hs (renamed from src/common/Message/Key.hs)0
-rw-r--r--common/src/Common/Message/Lang.hs (renamed from src/common/Message/Lang.hs)0
-rw-r--r--common/src/Common/Message/Translation.hs (renamed from src/common/Message/Translation.hs)0
-rw-r--r--common/src/Common/Model.hs18
-rw-r--r--common/src/Common/Model/Category.hs (renamed from src/common/Model/Category.hs)0
-rw-r--r--common/src/Common/Model/CreateCategory.hs (renamed from src/common/Model/CreateCategory.hs)0
-rw-r--r--common/src/Common/Model/CreateIncome.hs (renamed from src/common/Model/CreateIncome.hs)0
-rw-r--r--common/src/Common/Model/CreatePayment.hs (renamed from src/common/Model/CreatePayment.hs)0
-rw-r--r--common/src/Common/Model/Currency.hs (renamed from src/common/Model/Currency.hs)0
-rw-r--r--common/src/Common/Model/EditCategory.hs (renamed from src/common/Model/EditCategory.hs)0
-rw-r--r--common/src/Common/Model/EditIncome.hs (renamed from src/common/Model/EditIncome.hs)0
-rw-r--r--common/src/Common/Model/EditPayment.hs (renamed from src/common/Model/EditPayment.hs)0
-rw-r--r--common/src/Common/Model/Frequency.hs (renamed from src/common/Model/Frequency.hs)0
-rw-r--r--common/src/Common/Model/Income.hs (renamed from src/common/Model/Income.hs)0
-rw-r--r--common/src/Common/Model/Init.hs (renamed from src/common/Model/Init.hs)0
-rw-r--r--common/src/Common/Model/InitResult.hs (renamed from src/common/Model/InitResult.hs)0
-rw-r--r--common/src/Common/Model/Payment.hs (renamed from src/common/Model/Payment.hs)0
-rw-r--r--common/src/Common/Model/PaymentCategory.hs (renamed from src/common/Model/PaymentCategory.hs)0
-rw-r--r--common/src/Common/Model/SignIn.hs (renamed from src/common/Model/SignIn.hs)0
-rw-r--r--common/src/Common/Model/User.hs (renamed from src/common/Model/User.hs)6
-rw-r--r--common/src/Common/Util/Text.hs (renamed from src/common/Util/Text.hs)0
-rw-r--r--common/src/Common/View/Format.hs (renamed from src/common/View/Format.hs)2
-rw-r--r--default.nix24
-rw-r--r--server/LICENSE674
-rw-r--r--server/Setup.hs2
-rw-r--r--server/server.cabal47
-rw-r--r--server/src/Conf.hs (renamed from src/server/Conf.hs)2
-rw-r--r--server/src/Controller/Category.hs (renamed from src/server/Controller/Category.hs)12
-rw-r--r--server/src/Controller/Income.hs (renamed from src/server/Controller/Income.hs)0
-rw-r--r--server/src/Controller/Index.hs (renamed from src/server/Controller/Index.hs)0
-rw-r--r--server/src/Controller/Payment.hs (renamed from src/server/Controller/Payment.hs)12
-rw-r--r--server/src/Controller/SignIn.hs (renamed from src/server/Controller/SignIn.hs)6
-rw-r--r--server/src/Cookie.hs (renamed from src/server/Cookie.hs)0
-rw-r--r--server/src/Design/Color.hs (renamed from src/server/Design/Color.hs)0
-rw-r--r--server/src/Design/Constants.hs (renamed from src/server/Design/Constants.hs)0
-rw-r--r--server/src/Design/Dialog.hs (renamed from src/server/Design/Dialog.hs)0
-rw-r--r--server/src/Design/Errors.hs (renamed from src/server/Design/Errors.hs)0
-rw-r--r--server/src/Design/Form.hs (renamed from src/server/Design/Form.hs)0
-rw-r--r--server/src/Design/Global.hs (renamed from src/server/Design/Global.hs)0
-rw-r--r--server/src/Design/Helper.hs (renamed from src/server/Design/Helper.hs)0
-rw-r--r--server/src/Design/Media.hs (renamed from src/server/Design/Media.hs)0
-rw-r--r--server/src/Design/Tooltip.hs (renamed from src/server/Design/Tooltip.hs)0
-rw-r--r--server/src/Design/View/Header.hs (renamed from src/server/Design/View/Header.hs)0
-rw-r--r--server/src/Design/View/Payment.hs (renamed from src/server/Design/View/Payment.hs)0
-rw-r--r--server/src/Design/View/Payment/Header.hs (renamed from src/server/Design/View/Payment/Header.hs)0
-rw-r--r--server/src/Design/View/Payment/Pages.hs (renamed from src/server/Design/View/Payment/Pages.hs)0
-rw-r--r--server/src/Design/View/Payment/Table.hs (renamed from src/server/Design/View/Payment/Table.hs)0
-rw-r--r--server/src/Design/View/SignIn.hs (renamed from src/server/Design/View/SignIn.hs)0
-rw-r--r--server/src/Design/View/Stat.hs (renamed from src/server/Design/View/Stat.hs)0
-rw-r--r--server/src/Design/View/Table.hs (renamed from src/server/Design/View/Table.hs)0
-rw-r--r--server/src/Design/Views.hs (renamed from src/server/Design/Views.hs)0
-rw-r--r--server/src/Job/Daemon.hs (renamed from src/server/Job/Daemon.hs)0
-rw-r--r--server/src/Job/Frequency.hs (renamed from src/server/Job/Frequency.hs)0
-rw-r--r--server/src/Job/Kind.hs (renamed from src/server/Job/Kind.hs)0
-rw-r--r--server/src/Job/Model.hs (renamed from src/server/Job/Model.hs)0
-rw-r--r--server/src/Job/MonthlyPayment.hs (renamed from src/server/Job/MonthlyPayment.hs)0
-rw-r--r--server/src/Job/WeeklyReport.hs (renamed from src/server/Job/WeeklyReport.hs)0
-rw-r--r--server/src/Json.hs (renamed from src/server/Json.hs)0
-rw-r--r--server/src/LoginSession.hs (renamed from src/server/LoginSession.hs)0
-rw-r--r--server/src/Main.hs (renamed from src/server/Main.hs)0
-rw-r--r--server/src/MimeMail.hs (renamed from src/server/MimeMail.hs)0
-rw-r--r--server/src/Model/Category.hs (renamed from src/server/Model/Category.hs)0
-rw-r--r--server/src/Model/Frequency.hs (renamed from src/server/Model/Frequency.hs)2
-rw-r--r--server/src/Model/Income.hs (renamed from src/server/Model/Income.hs)0
-rw-r--r--server/src/Model/Init.hs (renamed from src/server/Model/Init.hs)0
-rw-r--r--server/src/Model/Mail.hs (renamed from src/server/Model/Mail.hs)0
-rw-r--r--server/src/Model/Payer.hs (renamed from src/server/Model/Payer.hs)0
-rw-r--r--server/src/Model/Payment.hs (renamed from src/server/Model/Payment.hs)5
-rw-r--r--server/src/Model/PaymentCategory.hs (renamed from src/server/Model/PaymentCategory.hs)0
-rw-r--r--server/src/Model/Query.hs (renamed from src/server/Model/Query.hs)0
-rw-r--r--server/src/Model/SignIn.hs (renamed from src/server/Model/SignIn.hs)0
-rw-r--r--server/src/Model/UUID.hs (renamed from src/server/Model/UUID.hs)0
-rw-r--r--server/src/Model/User.hs (renamed from src/server/Model/User.hs)0
-rw-r--r--server/src/Resource.hs (renamed from src/server/Resource.hs)0
-rw-r--r--server/src/Secure.hs (renamed from src/server/Secure.hs)0
-rw-r--r--server/src/SendMail.hs (renamed from src/server/SendMail.hs)0
-rw-r--r--server/src/Utils/Time.hs (renamed from src/server/Utils/Time.hs)0
-rw-r--r--server/src/Validation.hs (renamed from src/server/Validation.hs)0
-rw-r--r--server/src/View/Mail/SignIn.hs (renamed from src/server/View/Mail/SignIn.hs)2
-rw-r--r--server/src/View/Mail/WeeklyReport.hs (renamed from src/server/View/Mail/WeeklyReport.hs)4
-rw-r--r--server/src/View/Page.hs (renamed from src/server/View/Page.hs)2
-rw-r--r--sharedCost.cabal104
l---------src/client/Common1
-rw-r--r--src/client/Debug.hs17
-rw-r--r--src/common/Model.hs40
-rw-r--r--src/migrations/1.sql65
-rw-r--r--src/migrations/2.sql23
l---------src/server/Common1
-rw-r--r--tools.nix (renamed from shell.nix)7
110 files changed, 1576 insertions, 332 deletions
diff --git a/.gitignore b/.gitignore
index 0650382..22c4f7e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,14 +1,8 @@
database
database-shm
database-wal
-dist
-sharedCost.nix
+dist-server
+dist-client
public/javascript/main.js
sessionKey
local.conf
-reflex-platform/
-*.js_hi
-*.js_dyn_hi
-*.js_o
-*.js_dyn_o
-Main.jsexe
diff --git a/.tmuxinator.yml b/.tmuxinator.yml
index d8b97c5..86612fb 100644
--- a/.tmuxinator.yml
+++ b/.tmuxinator.yml
@@ -5,7 +5,7 @@ windows:
layout: 3747,239x59,0,0{144x59,0,0,0,94x59,145,0[94x30,145,0,1,94x28,145,31,2]}
panes:
- # Empty
- - make install-client watch-client
- - make install-server watch-server
+ - make watch-client
+ - make watch-server
- db:
- sqlite3 database
diff --git a/Makefile b/Makefile
index 5d695f2..c8bb7ce 100644
--- a/Makefile
+++ b/Makefile
@@ -1,50 +1,49 @@
start:
- @nix-shell --command "tmuxinator local"
+ @nix-shell tools.nix --command "tmuxinator local"
stop:
@tmux kill-session -t sharedCost
dist:
- @nix-shell --command "make clean install build"
+ @nix-shell tools.nix --command "make clean install build"
-clean: clean-server clean-client
-install: install-server install-client
-build: build-server build-client
+clean: clean-client clean-server
+install: install-client install-server
+build: build-client build-server
-# Server
+# Client
# ------
-clean-server:
- @cabal clean
+build-client:
+ @nix-shell -A shells.ghcjs --run "build-client-inside"
-install-server:
- @cabal2nix --shell . > sharedCost.nix
+build-client-inside:
+ @cabal --project-file=cabal-client.project --builddir=dist-client new-build all && make cp-client
-build-server:
- @nix-shell sharedCost.nix --command "cabal build"
+cp-client:
+ @cp dist-client/build/x86_64-linux/ghcjs-0.2.1/client-0.0.1/c/client/build/client/client.jsexe/all.js public/javascript/main.js
-launch-server:
- @killall sharedCost || :
- @cabal run sharedCost
+clean-client:
+ @rm -rf dist-client
-watch-server:
- @nodemon --watch src/server -e hs,conf --exec '(clear && make build-server && make launch-server) || :'
+watch-client:
+ @nix-shell -A shells.ghcjs --run "nodemon --watch client --watch common --ext hs --exec '(clear && make build-client-inside) || true'"
-# Client
+# Server
# ------
-clean-client:
- @rm -rf reflex-platform
+clean-server:
+ @rm -rf dist-server
-install-client:
- @git clone https://github.com/reflex-frp/reflex-platform 2>/dev/null || :
- @cd reflex-platform && ./try-reflex --command exit >/dev/null
+build-server:
+ @nix-shell -A shells.ghc --run "make build-server-inside"
-build-client-inside:
- @cd src/client && ghcjs -Wall -Werror --make Main && mv Main.jsexe/all.js ../../public/javascript/main.js
+build-server-inside:
+ @cabal --project-file=cabal-server.project --builddir=dist-server new-build all
-build-client:
- @./reflex-platform/try-reflex --command "make build-client-inside"
+run-server:
+ @(killall sharedCost &>/dev/null) || :
+ @./dist-server/build/x86_64-linux/ghc-8.0.2/server-0.0.1/c/server/build/server/server
-watch-client:
- @./reflex-platform/try-reflex --command "nodemon --watch src/client -e hs --exec '(clear && make build-client-inside) || true'"
+watch-server:
+ @nix-shell -A shells.ghc --run "nodemon --watch server --watch common --ext hs --exec '(clear && make build-server-inside && make run-server) || :'"
diff --git a/cabal-client.project b/cabal-client.project
new file mode 100644
index 0000000..182ead2
--- /dev/null
+++ b/cabal-client.project
@@ -0,0 +1,4 @@
+compiler: ghcjs
+packages:
+ common/
+ client/
diff --git a/cabal-server.project b/cabal-server.project
new file mode 100644
index 0000000..0ce5568
--- /dev/null
+++ b/cabal-server.project
@@ -0,0 +1,3 @@
+packages:
+ common/
+ server/
diff --git a/LICENSE b/client/LICENSE
index 45644ff..45644ff 100644
--- a/LICENSE
+++ b/client/LICENSE
diff --git a/client/Setup.hs b/client/Setup.hs
new file mode 100644
index 0000000..9a994af
--- /dev/null
+++ b/client/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/client/client.cabal b/client/client.cabal
new file mode 100644
index 0000000..7807d37
--- /dev/null
+++ b/client/client.cabal
@@ -0,0 +1,24 @@
+name: client
+version: 0.0.1
+license: GPL-3
+license-file: LICENSE
+author: Joris Guyonvarch
+maintainer: joris@guyonvarch.me
+category: Web
+build-type: Simple
+cabal-version: >=1.10
+
+executable client
+ main-is: Main.hs
+ ghc-options: -Wall -Werror
+ build-depends: aeson
+ , base >=4.9 && <4.11
+ , bytestring
+ , common
+ , containers
+ , ghcjs-dom-jsffi
+ , reflex-dom
+ , text
+ , time
+ hs-source-dirs: src
+ default-language: Haskell2010
diff --git a/src/client/Component/Button.hs b/client/src/Component/Button.hs
index f21798c..f21798c 100644
--- a/src/client/Component/Button.hs
+++ b/client/src/Component/Button.hs
diff --git a/src/client/Component/Input.hs b/client/src/Component/Input.hs
index 7111630..7111630 100644
--- a/src/client/Component/Input.hs
+++ b/client/src/Component/Input.hs
diff --git a/src/client/Icon.hs b/client/src/Icon.hs
index 7223def..7223def 100644
--- a/src/client/Icon.hs
+++ b/client/src/Icon.hs
diff --git a/src/client/Main.hs b/client/src/Main.hs
index c5f2c50..1f167d4 100644
--- a/src/client/Main.hs
+++ b/client/src/Main.hs
@@ -20,7 +20,6 @@ import qualified View.App as App
main :: JSM ()
main = do
initResult <- readInit
- putStrLn . show $ initResult
App.widget initResult
readInit :: JSM InitResult
diff --git a/src/client/View/App.hs b/client/src/View/App.hs
index 1466811..1466811 100644
--- a/src/client/View/App.hs
+++ b/client/src/View/App.hs
diff --git a/src/client/View/Header.hs b/client/src/View/Header.hs
index 32738f1..705e054 100644
--- a/src/client/View/Header.hs
+++ b/client/src/View/Header.hs
@@ -17,7 +17,7 @@ import Prelude hiding (init, error)
import qualified Common.Message as Message
import qualified Common.Message.Key as Key
import Common.Model (InitResult(..), Init(..), User(..))
-import qualified Common.Model.User as User
+import qualified Common.Model as CM
import Component.Button (ButtonIn(..))
import qualified Component.Button as Component
@@ -53,7 +53,7 @@ nameSignOut initResult = case initResult of
(fmap (const $ M.fromList [("style", "visibility: hidden"), ("class", "nameSignOut")]) signOut)
signOut <- R.elDynAttr "nameSignOut" attr $ do
- case User.find (_init_currentUser init) (_init_users init) of
+ case CM.findUser (_init_currentUser init) (_init_users init) of
Just user -> R.divClass "name" $ R.text (_user_name user)
Nothing -> R.blank
signOutButton
diff --git a/src/client/View/Payment.hs b/client/src/View/Payment.hs
index e80790b..e80790b 100644
--- a/src/client/View/Payment.hs
+++ b/client/src/View/Payment.hs
diff --git a/src/client/View/Payment/Table.hs b/client/src/View/Payment/Table.hs
index 878e7da..f3eb9a7 100644
--- a/src/client/View/Payment/Table.hs
+++ b/client/src/View/Payment/Table.hs
@@ -19,7 +19,7 @@ import qualified Reflex.Dom as R
import qualified Common.Message as Message
import qualified Common.Message.Key as Key
import Common.Model (Payment(..), PaymentCategory(..), Category(..), User(..), Init(..))
-import qualified Common.Model.User as User
+import qualified Common.Model as CM
import qualified Common.Util.Text as T
import qualified Common.View.Format as Format
@@ -59,7 +59,7 @@ paymentRow init payment =
R.divClass "cell name" . R.text $ _payment_name payment
R.divClass "cell cost" . R.text . Format.price (_init_currency init) $ _payment_cost payment
R.divClass "cell user" $
- case User.find (_payment_user payment) (_init_users init) of
+ case CM.findUser (_payment_user payment) (_init_users init) of
Just user -> R.text (_user_name user)
_ -> R.blank
R.divClass "cell category" $
diff --git a/src/client/View/SignIn.hs b/client/src/View/SignIn.hs
index e164ee7..e164ee7 100644
--- a/src/client/View/SignIn.hs
+++ b/client/src/View/SignIn.hs
diff --git a/common/LICENSE b/common/LICENSE
new file mode 100644
index 0000000..45644ff
--- /dev/null
+++ b/common/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/common/Setup.hs b/common/Setup.hs
new file mode 100644
index 0000000..9a994af
--- /dev/null
+++ b/common/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/common/common.cabal b/common/common.cabal
new file mode 100644
index 0000000..e072acf
--- /dev/null
+++ b/common/common.cabal
@@ -0,0 +1,41 @@
+name: common
+version: 0.0.1
+license: GPL-3
+license-file: LICENSE
+author: Joris Guyonvarch
+maintainer: joris@guyonvarch.me
+category: Web
+build-type: Simple
+cabal-version: >=1.10
+
+library
+ ghc-options: -Wall -Werror
+ exposed-modules: Common.Message
+ , Common.Message.Key
+ , Common.Model
+ , Common.Util.Text
+ , Common.View.Format
+ other-modules: Common.Message.Lang
+ , Common.Message.Translation
+ , Common.Model.PaymentCategory
+ , Common.Model.CreateCategory
+ , Common.Model.CreatePayment
+ , Common.Model.CreateIncome
+ , Common.Model.EditCategory
+ , Common.Model.EditPayment
+ , Common.Model.InitResult
+ , Common.Model.EditIncome
+ , Common.Model.Frequency
+ , Common.Model.Currency
+ , Common.Model.Category
+ , Common.Model.Payment
+ , Common.Model.Income
+ , Common.Model.SignIn
+ , Common.Model.Init
+ , Common.Model.User
+ build-depends: aeson
+ , base >=4.9 && <4.11
+ , text
+ , time
+ hs-source-dirs: src
+ default-language: Haskell2010
diff --git a/src/common/Message.hs b/common/src/Common/Message.hs
index 9ae735d..9ae735d 100644
--- a/src/common/Message.hs
+++ b/common/src/Common/Message.hs
diff --git a/src/common/Message/Key.hs b/common/src/Common/Message/Key.hs
index 4127808..4127808 100644
--- a/src/common/Message/Key.hs
+++ b/common/src/Common/Message/Key.hs
diff --git a/src/common/Message/Lang.hs b/common/src/Common/Message/Lang.hs
index 0a32ede..0a32ede 100644
--- a/src/common/Message/Lang.hs
+++ b/common/src/Common/Message/Lang.hs
diff --git a/src/common/Message/Translation.hs b/common/src/Common/Message/Translation.hs
index 900a9e9..900a9e9 100644
--- a/src/common/Message/Translation.hs
+++ b/common/src/Common/Message/Translation.hs
diff --git a/common/src/Common/Model.hs b/common/src/Common/Model.hs
new file mode 100644
index 0000000..80c344b
--- /dev/null
+++ b/common/src/Common/Model.hs
@@ -0,0 +1,18 @@
+module Common.Model (module X) where
+
+import Common.Model.Category as X
+import Common.Model.CreateCategory as X
+import Common.Model.CreateIncome as X
+import Common.Model.CreatePayment as X
+import Common.Model.Currency as X
+import Common.Model.EditCategory as X
+import Common.Model.EditIncome as X
+import Common.Model.EditPayment as X
+import Common.Model.Frequency as X
+import Common.Model.Income as X
+import Common.Model.Init as X
+import Common.Model.InitResult as X
+import Common.Model.Payment as X
+import Common.Model.PaymentCategory as X
+import Common.Model.SignIn as X
+import Common.Model.User as X
diff --git a/src/common/Model/Category.hs b/common/src/Common/Model/Category.hs
index 53a6bdb..53a6bdb 100644
--- a/src/common/Model/Category.hs
+++ b/common/src/Common/Model/Category.hs
diff --git a/src/common/Model/CreateCategory.hs b/common/src/Common/Model/CreateCategory.hs
index bfe24c5..bfe24c5 100644
--- a/src/common/Model/CreateCategory.hs
+++ b/common/src/Common/Model/CreateCategory.hs
diff --git a/src/common/Model/CreateIncome.hs b/common/src/Common/Model/CreateIncome.hs
index 4ee3a50..4ee3a50 100644
--- a/src/common/Model/CreateIncome.hs
+++ b/common/src/Common/Model/CreateIncome.hs
diff --git a/src/common/Model/CreatePayment.hs b/common/src/Common/Model/CreatePayment.hs
index b5b6256..b5b6256 100644
--- a/src/common/Model/CreatePayment.hs
+++ b/common/src/Common/Model/CreatePayment.hs
diff --git a/src/common/Model/Currency.hs b/common/src/Common/Model/Currency.hs
index 7c12545..7c12545 100644
--- a/src/common/Model/Currency.hs
+++ b/common/src/Common/Model/Currency.hs
diff --git a/src/common/Model/EditCategory.hs b/common/src/Common/Model/EditCategory.hs
index 2a3a697..2a3a697 100644
--- a/src/common/Model/EditCategory.hs
+++ b/common/src/Common/Model/EditCategory.hs
diff --git a/src/common/Model/EditIncome.hs b/common/src/Common/Model/EditIncome.hs
index a55c39e..a55c39e 100644
--- a/src/common/Model/EditIncome.hs
+++ b/common/src/Common/Model/EditIncome.hs
diff --git a/src/common/Model/EditPayment.hs b/common/src/Common/Model/EditPayment.hs
index 172c0c1..172c0c1 100644
--- a/src/common/Model/EditPayment.hs
+++ b/common/src/Common/Model/EditPayment.hs
diff --git a/src/common/Model/Frequency.hs b/common/src/Common/Model/Frequency.hs
index 7c46605..7c46605 100644
--- a/src/common/Model/Frequency.hs
+++ b/common/src/Common/Model/Frequency.hs
diff --git a/src/common/Model/Income.hs b/common/src/Common/Model/Income.hs
index 280812f..280812f 100644
--- a/src/common/Model/Income.hs
+++ b/common/src/Common/Model/Income.hs
diff --git a/src/common/Model/Init.hs b/common/src/Common/Model/Init.hs
index 68fcfb8..68fcfb8 100644
--- a/src/common/Model/Init.hs
+++ b/common/src/Common/Model/Init.hs
diff --git a/src/common/Model/InitResult.hs b/common/src/Common/Model/InitResult.hs
index 43c16f9..43c16f9 100644
--- a/src/common/Model/InitResult.hs
+++ b/common/src/Common/Model/InitResult.hs
diff --git a/src/common/Model/Payment.hs b/common/src/Common/Model/Payment.hs
index 804b501..804b501 100644
--- a/src/common/Model/Payment.hs
+++ b/common/src/Common/Model/Payment.hs
diff --git a/src/common/Model/PaymentCategory.hs b/common/src/Common/Model/PaymentCategory.hs
index a0e94f9..a0e94f9 100644
--- a/src/common/Model/PaymentCategory.hs
+++ b/common/src/Common/Model/PaymentCategory.hs
diff --git a/src/common/Model/SignIn.hs b/common/src/Common/Model/SignIn.hs
index f4da97f..f4da97f 100644
--- a/src/common/Model/SignIn.hs
+++ b/common/src/Common/Model/SignIn.hs
diff --git a/src/common/Model/User.hs b/common/src/Common/Model/User.hs
index 8c64bc2..694c70e 100644
--- a/src/common/Model/User.hs
+++ b/common/src/Common/Model/User.hs
@@ -3,7 +3,7 @@
module Common.Model.User
( UserId
, User(..)
- , find
+ , findUser
) where
import Data.Aeson (FromJSON, ToJSON)
@@ -25,5 +25,5 @@ data User = User
instance FromJSON User
instance ToJSON User
-find :: UserId -> [User] -> Maybe User
-find userId users = L.find ((== userId) . _user_id) users
+findUser :: UserId -> [User] -> Maybe User
+findUser userId users = L.find ((== userId) . _user_id) users
diff --git a/src/common/Util/Text.hs b/common/src/Common/Util/Text.hs
index 4af7a4c..4af7a4c 100644
--- a/src/common/Util/Text.hs
+++ b/common/src/Common/Util/Text.hs
diff --git a/src/common/View/Format.hs b/common/src/Common/View/Format.hs
index a7fa4e3..7165965 100644
--- a/src/common/View/Format.hs
+++ b/common/src/Common/View/Format.hs
@@ -15,7 +15,7 @@ import Data.Time.Calendar (Day, toGregorian)
import qualified Common.Message as Message
import qualified Common.Message.Key as Key
-import Common.Model.Currency (Currency(..))
+import Common.Model (Currency(..))
shortDay :: Day -> Text
shortDay date =
diff --git a/default.nix b/default.nix
new file mode 100644
index 0000000..15dfdae
--- /dev/null
+++ b/default.nix
@@ -0,0 +1,24 @@
+with import <nixpkgs> {};
+
+let
+ reflex-platform = import (pkgs.fetchFromGitHub {
+ owner = "reflex-frp";
+ repo = "reflex-platform";
+ rev = "504b0344dfa6d03e4c89cf70ab9792b0a1fa021b";
+ sha256 = "01hvdwc6bw48falpha5kaq4p7w98hc804kkwrayipb5ld1snchpz";
+ }) {};
+
+ buildInputs = [ pkgs.noDemon ];
+in
+ reflex-platform.project ({ pkgs, ... }: {
+ packages = {
+ common = ./common;
+ server = ./server;
+ client = ./client;
+ };
+
+ shells = {
+ ghc = [ "common" "server" ];
+ ghcjs = [ "common" "client" ];
+ };
+ })
diff --git a/server/LICENSE b/server/LICENSE
new file mode 100644
index 0000000..45644ff
--- /dev/null
+++ b/server/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/server/Setup.hs b/server/Setup.hs
new file mode 100644
index 0000000..9a994af
--- /dev/null
+++ b/server/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/server/server.cabal b/server/server.cabal
new file mode 100644
index 0000000..2e1f7be
--- /dev/null
+++ b/server/server.cabal
@@ -0,0 +1,47 @@
+name: server
+version: 0.0.1
+license: GPL-3
+license-file: LICENSE
+author: Joris Guyonvarch
+maintainer: joris@guyonvarch.me
+category: Web
+build-type: Simple
+cabal-version: >=1.10
+
+executable server
+ main-is: Main.hs
+ ghc-options: -Wall -Werror
+ build-depends: aeson
+ , base >=4.9 && <4.11
+ , base64-bytestring
+ , blaze-builder
+ , blaze-html
+ , bytestring
+ , clay
+ , clientsession
+ , common
+ , config-manager
+ , containers
+ , cookie
+ , email-validate
+ , filepath
+ , http-conduit
+ , http-types
+ , lens
+ , monad-logger
+ , mtl
+ , parsec
+ , process
+ , resourcet
+ , random
+ , scotty
+ , sqlite-simple
+ , text
+ , time
+ , transformers
+ , unordered-containers
+ , uuid
+ , wai
+ , wai-middleware-static
+ hs-source-dirs: src
+ default-language: Haskell2010
diff --git a/src/server/Conf.hs b/server/src/Conf.hs
index 92df4e9..26c5c28 100644
--- a/src/server/Conf.hs
+++ b/server/src/Conf.hs
@@ -10,7 +10,7 @@ import qualified Data.Text as T
import qualified Data.ConfigManager as Conf
import Data.Time.Clock (NominalDiffTime)
-import Common.Model.Currency (Currency(..))
+import Common.Model (Currency(..))
data Conf = Conf
{ hostname :: Text
diff --git a/src/server/Controller/Category.hs b/server/src/Controller/Category.hs
index 1a44083..d6ed2f2 100644
--- a/src/server/Controller/Category.hs
+++ b/server/src/Controller/Category.hs
@@ -11,11 +11,9 @@ import Network.HTTP.Types.Status (ok200, badRequest400)
import qualified Data.Text.Lazy as TL
import Web.Scotty hiding (delete)
-import Common.Model.Category (CategoryId)
import qualified Common.Message as Message
import qualified Common.Message.Key as Key
-import qualified Common.Model.CreateCategory as Json
-import qualified Common.Model.EditCategory as Json
+import Common.Model (CategoryId, CreateCategory(..), EditCategory(..))
import Json (jsonId)
import qualified Model.Category as Category
@@ -23,14 +21,14 @@ import qualified Model.PaymentCategory as PaymentCategory
import qualified Model.Query as Query
import qualified Secure
-create :: Json.CreateCategory -> ActionM ()
-create (Json.CreateCategory name color) =
+create :: CreateCategory -> ActionM ()
+create (CreateCategory name color) =
Secure.loggedAction (\_ ->
(liftIO . Query.run $ Category.create name color) >>= jsonId
)
-edit :: Json.EditCategory -> ActionM ()
-edit (Json.EditCategory categoryId name color) =
+edit :: EditCategory -> ActionM ()
+edit (EditCategory categoryId name color) =
Secure.loggedAction (\_ -> do
updated <- liftIO . Query.run $ Category.edit categoryId name color
if updated
diff --git a/src/server/Controller/Income.hs b/server/src/Controller/Income.hs
index 148b713..148b713 100644
--- a/src/server/Controller/Income.hs
+++ b/server/src/Controller/Income.hs
diff --git a/src/server/Controller/Index.hs b/server/src/Controller/Index.hs
index 8473c5c..8473c5c 100644
--- a/src/server/Controller/Index.hs
+++ b/server/src/Controller/Index.hs
diff --git a/src/server/Controller/Payment.hs b/server/src/Controller/Payment.hs
index 6a9ede7..dc10311 100644
--- a/src/server/Controller/Payment.hs
+++ b/server/src/Controller/Payment.hs
@@ -11,9 +11,7 @@ import Control.Monad.IO.Class (liftIO)
import Network.HTTP.Types.Status (ok200, badRequest400)
import Web.Scotty
-import qualified Common.Model.CreatePayment as M
-import qualified Common.Model.EditPayment as M
-import Common.Model (PaymentId, User(..))
+import Common.Model (PaymentId, User(..), CreatePayment(..), EditPayment(..))
import Json (jsonId)
import qualified Model.Payment as Payment
@@ -27,8 +25,8 @@ list =
(liftIO . Query.run $ Payment.list) >>= json
)
-create :: M.CreatePayment -> ActionM ()
-create (M.CreatePayment name cost date category frequency) =
+create :: CreatePayment -> ActionM ()
+create (CreatePayment name cost date category frequency) =
Secure.loggedAction (\user ->
(liftIO . Query.run $ do
PaymentCategory.save name category
@@ -36,8 +34,8 @@ create (M.CreatePayment name cost date category frequency) =
) >>= jsonId
)
-editOwn :: M.EditPayment -> ActionM ()
-editOwn (M.EditPayment paymentId name cost date category frequency) =
+editOwn :: EditPayment -> ActionM ()
+editOwn (EditPayment paymentId name cost date category frequency) =
Secure.loggedAction (\user -> do
updated <- liftIO . Query.run $ do
edited <- Payment.editOwn (_user_id user) paymentId name cost date frequency
diff --git a/src/server/Controller/SignIn.hs b/server/src/Controller/SignIn.hs
index 932ce53..0086fa5 100644
--- a/src/server/Controller/SignIn.hs
+++ b/server/src/Controller/SignIn.hs
@@ -13,7 +13,7 @@ import Web.Scotty
import qualified Common.Message as Message
import qualified Common.Message.Key as Key
-import qualified Common.Model.SignIn as M
+import Common.Model (SignIn(..))
import Conf (Conf)
import qualified Conf
@@ -24,8 +24,8 @@ import qualified SendMail
import qualified Text.Email.Validate as Email
import qualified View.Mail.SignIn as SignIn
-signIn :: Conf -> M.SignIn -> ActionM ()
-signIn conf (M.SignIn email) =
+signIn :: Conf -> SignIn -> ActionM ()
+signIn conf (SignIn email) =
if Email.isValid (TE.encodeUtf8 email)
then do
maybeUser <- liftIO . Query.run $ User.get email
diff --git a/src/server/Cookie.hs b/server/src/Cookie.hs
index 96d45da..96d45da 100644
--- a/src/server/Cookie.hs
+++ b/server/src/Cookie.hs
diff --git a/src/server/Design/Color.hs b/server/src/Design/Color.hs
index 06c468e..06c468e 100644
--- a/src/server/Design/Color.hs
+++ b/server/src/Design/Color.hs
diff --git a/src/server/Design/Constants.hs b/server/src/Design/Constants.hs
index 4e2b8cc..4e2b8cc 100644
--- a/src/server/Design/Constants.hs
+++ b/server/src/Design/Constants.hs
diff --git a/src/server/Design/Dialog.hs b/server/src/Design/Dialog.hs
index 4678633..4678633 100644
--- a/src/server/Design/Dialog.hs
+++ b/server/src/Design/Dialog.hs
diff --git a/src/server/Design/Errors.hs b/server/src/Design/Errors.hs
index 57aaeee..57aaeee 100644
--- a/src/server/Design/Errors.hs
+++ b/server/src/Design/Errors.hs
diff --git a/src/server/Design/Form.hs b/server/src/Design/Form.hs
index ebb8ac8..ebb8ac8 100644
--- a/src/server/Design/Form.hs
+++ b/server/src/Design/Form.hs
diff --git a/src/server/Design/Global.hs b/server/src/Design/Global.hs
index 47ea4a9..47ea4a9 100644
--- a/src/server/Design/Global.hs
+++ b/server/src/Design/Global.hs
diff --git a/src/server/Design/Helper.hs b/server/src/Design/Helper.hs
index 41528ed..41528ed 100644
--- a/src/server/Design/Helper.hs
+++ b/server/src/Design/Helper.hs
diff --git a/src/server/Design/Media.hs b/server/src/Design/Media.hs
index 77220ee..77220ee 100644
--- a/src/server/Design/Media.hs
+++ b/server/src/Design/Media.hs
diff --git a/src/server/Design/Tooltip.hs b/server/src/Design/Tooltip.hs
index 1da8764..1da8764 100644
--- a/src/server/Design/Tooltip.hs
+++ b/server/src/Design/Tooltip.hs
diff --git a/src/server/Design/View/Header.hs b/server/src/Design/View/Header.hs
index 20627e6..20627e6 100644
--- a/src/server/Design/View/Header.hs
+++ b/server/src/Design/View/Header.hs
diff --git a/src/server/Design/View/Payment.hs b/server/src/Design/View/Payment.hs
index d3c7650..d3c7650 100644
--- a/src/server/Design/View/Payment.hs
+++ b/server/src/Design/View/Payment.hs
diff --git a/src/server/Design/View/Payment/Header.hs b/server/src/Design/View/Payment/Header.hs
index f02da8a..f02da8a 100644
--- a/src/server/Design/View/Payment/Header.hs
+++ b/server/src/Design/View/Payment/Header.hs
diff --git a/src/server/Design/View/Payment/Pages.hs b/server/src/Design/View/Payment/Pages.hs
index ade81a8..ade81a8 100644
--- a/src/server/Design/View/Payment/Pages.hs
+++ b/server/src/Design/View/Payment/Pages.hs
diff --git a/src/server/Design/View/Payment/Table.hs b/server/src/Design/View/Payment/Table.hs
index a866b40..a866b40 100644
--- a/src/server/Design/View/Payment/Table.hs
+++ b/server/src/Design/View/Payment/Table.hs
diff --git a/src/server/Design/View/SignIn.hs b/server/src/Design/View/SignIn.hs
index 214e663..214e663 100644
--- a/src/server/Design/View/SignIn.hs
+++ b/server/src/Design/View/SignIn.hs
diff --git a/src/server/Design/View/Stat.hs b/server/src/Design/View/Stat.hs
index 0a5b258..0a5b258 100644
--- a/src/server/Design/View/Stat.hs
+++ b/server/src/Design/View/Stat.hs
diff --git a/src/server/Design/View/Table.hs b/server/src/Design/View/Table.hs
index 95abf90..95abf90 100644
--- a/src/server/Design/View/Table.hs
+++ b/server/src/Design/View/Table.hs
diff --git a/src/server/Design/Views.hs b/server/src/Design/Views.hs
index bc6ac83..bc6ac83 100644
--- a/src/server/Design/Views.hs
+++ b/server/src/Design/Views.hs
diff --git a/src/server/Job/Daemon.hs b/server/src/Job/Daemon.hs
index 0bc6f6e..0bc6f6e 100644
--- a/src/server/Job/Daemon.hs
+++ b/server/src/Job/Daemon.hs
diff --git a/src/server/Job/Frequency.hs b/server/src/Job/Frequency.hs
index 263f6e6..263f6e6 100644
--- a/src/server/Job/Frequency.hs
+++ b/server/src/Job/Frequency.hs
diff --git a/src/server/Job/Kind.hs b/server/src/Job/Kind.hs
index af5d4f8..af5d4f8 100644
--- a/src/server/Job/Kind.hs
+++ b/server/src/Job/Kind.hs
diff --git a/src/server/Job/Model.hs b/server/src/Job/Model.hs
index e1a3c77..e1a3c77 100644
--- a/src/server/Job/Model.hs
+++ b/server/src/Job/Model.hs
diff --git a/src/server/Job/MonthlyPayment.hs b/server/src/Job/MonthlyPayment.hs
index ba24cca..ba24cca 100644
--- a/src/server/Job/MonthlyPayment.hs
+++ b/server/src/Job/MonthlyPayment.hs
diff --git a/src/server/Job/WeeklyReport.hs b/server/src/Job/WeeklyReport.hs
index 5737c75..5737c75 100644
--- a/src/server/Job/WeeklyReport.hs
+++ b/server/src/Job/WeeklyReport.hs
diff --git a/src/server/Json.hs b/server/src/Json.hs
index cc6327a..cc6327a 100644
--- a/src/server/Json.hs
+++ b/server/src/Json.hs
diff --git a/src/server/LoginSession.hs b/server/src/LoginSession.hs
index 6f6d620..6f6d620 100644
--- a/src/server/LoginSession.hs
+++ b/server/src/LoginSession.hs
diff --git a/src/server/Main.hs b/server/src/Main.hs
index db73474..db73474 100644
--- a/src/server/Main.hs
+++ b/server/src/Main.hs
diff --git a/src/server/MimeMail.hs b/server/src/MimeMail.hs
index 0faaf98..0faaf98 100644
--- a/src/server/MimeMail.hs
+++ b/server/src/MimeMail.hs
diff --git a/src/server/Model/Category.hs b/server/src/Model/Category.hs
index 6b7a488..6b7a488 100644
--- a/src/server/Model/Category.hs
+++ b/server/src/Model/Category.hs
diff --git a/src/server/Model/Frequency.hs b/server/src/Model/Frequency.hs
index 4f7b83d..b334a40 100644
--- a/src/server/Model/Frequency.hs
+++ b/server/src/Model/Frequency.hs
@@ -11,7 +11,7 @@ import Database.SQLite.Simple.Ok (Ok(Ok, Errors))
import Database.SQLite.Simple.ToField (ToField(toField))
import qualified Data.Text as T
-import Common.Model.Frequency (Frequency)
+import Common.Model (Frequency)
instance FromField Frequency where
fromField field = case fieldData field of
diff --git a/src/server/Model/Income.hs b/server/src/Model/Income.hs
index bbe7657..bbe7657 100644
--- a/src/server/Model/Income.hs
+++ b/server/src/Model/Income.hs
diff --git a/src/server/Model/Init.hs b/server/src/Model/Init.hs
index 8c6a961..8c6a961 100644
--- a/src/server/Model/Init.hs
+++ b/server/src/Model/Init.hs
diff --git a/src/server/Model/Mail.hs b/server/src/Model/Mail.hs
index 9a4db73..9a4db73 100644
--- a/src/server/Model/Mail.hs
+++ b/server/src/Model/Mail.hs
diff --git a/src/server/Model/Payer.hs b/server/src/Model/Payer.hs
index de4abd1..de4abd1 100644
--- a/src/server/Model/Payer.hs
+++ b/server/src/Model/Payer.hs
diff --git a/src/server/Model/Payment.hs b/server/src/Model/Payment.hs
index 3893850..14efe77 100644
--- a/src/server/Model/Payment.hs
+++ b/server/src/Model/Payment.hs
@@ -24,10 +24,7 @@ import Database.SQLite.Simple.ToField (ToField(toField))
import Prelude hiding (id)
import qualified Database.SQLite.Simple as SQLite
-import Common.Model.Frequency
-import Common.Model.Payment (Payment(..))
-import Common.Model.User (UserId)
-import Common.Model.Payment (PaymentId)
+import Common.Model (Frequency(..), Payment(..), PaymentId, UserId)
import Model.Frequency ()
import Model.Query (Query(Query))
diff --git a/src/server/Model/PaymentCategory.hs b/server/src/Model/PaymentCategory.hs
index 6e1d304..6e1d304 100644
--- a/src/server/Model/PaymentCategory.hs
+++ b/server/src/Model/PaymentCategory.hs
diff --git a/src/server/Model/Query.hs b/server/src/Model/Query.hs
index d15fb5f..d15fb5f 100644
--- a/src/server/Model/Query.hs
+++ b/server/src/Model/Query.hs
diff --git a/src/server/Model/SignIn.hs b/server/src/Model/SignIn.hs
index c5182f0..c5182f0 100644
--- a/src/server/Model/SignIn.hs
+++ b/server/src/Model/SignIn.hs
diff --git a/src/server/Model/UUID.hs b/server/src/Model/UUID.hs
index 6cb7ce0..6cb7ce0 100644
--- a/src/server/Model/UUID.hs
+++ b/server/src/Model/UUID.hs
diff --git a/src/server/Model/User.hs b/server/src/Model/User.hs
index e14fcef..e14fcef 100644
--- a/src/server/Model/User.hs
+++ b/server/src/Model/User.hs
diff --git a/src/server/Resource.hs b/server/src/Resource.hs
index f52bbfa..f52bbfa 100644
--- a/src/server/Resource.hs
+++ b/server/src/Resource.hs
diff --git a/src/server/Secure.hs b/server/src/Secure.hs
index f427304..f427304 100644
--- a/src/server/Secure.hs
+++ b/server/src/Secure.hs
diff --git a/src/server/SendMail.hs b/server/src/SendMail.hs
index f7ba3fd..f7ba3fd 100644
--- a/src/server/SendMail.hs
+++ b/server/src/SendMail.hs
diff --git a/src/server/Utils/Time.hs b/server/src/Utils/Time.hs
index 97457c7..97457c7 100644
--- a/src/server/Utils/Time.hs
+++ b/server/src/Utils/Time.hs
diff --git a/src/server/Validation.hs b/server/src/Validation.hs
index 1f332c9..1f332c9 100644
--- a/src/server/Validation.hs
+++ b/server/src/Validation.hs
diff --git a/src/server/View/Mail/SignIn.hs b/server/src/View/Mail/SignIn.hs
index 12c4f34..1daca1e 100644
--- a/src/server/View/Mail/SignIn.hs
+++ b/server/src/View/Mail/SignIn.hs
@@ -8,7 +8,7 @@ import Data.Text (Text)
import qualified Common.Message as Message
import qualified Common.Message.Key as Key
-import Common.Model.User (User(..))
+import Common.Model (User(..))
import Conf (Conf)
import qualified Conf as Conf
diff --git a/src/server/View/Mail/WeeklyReport.hs b/server/src/View/Mail/WeeklyReport.hs
index 0bafb70..b5f2b67 100644
--- a/src/server/View/Mail/WeeklyReport.hs
+++ b/server/src/View/Mail/WeeklyReport.hs
@@ -16,7 +16,7 @@ import qualified Data.Text as T
import qualified Common.Message as Message
import qualified Common.Message.Key as Key
import Common.Model (Payment(..), User(..), UserId, Income(..))
-import qualified Common.Model.User as User
+import qualified Common.Model as CM
import qualified Common.View.Format as Format
import Model.Mail (Mail(Mail))
@@ -91,7 +91,7 @@ isPayedFrom status conf users income =
for = Format.longDay $ _income_date income
formatUserName :: UserId -> [User] -> Text
-formatUserName userId = fromMaybe "−" . fmap _user_name . User.find userId
+formatUserName userId = fromMaybe "−" . fmap _user_name . CM.findUser userId
section :: Text -> [Text] -> Text
section title items =
diff --git a/src/server/View/Page.hs b/server/src/View/Page.hs
index 1c072a4..6bf9527 100644
--- a/src/server/View/Page.hs
+++ b/server/src/View/Page.hs
@@ -17,8 +17,8 @@ import qualified Text.Blaze.Html5.Attributes as A
import Text.Blaze.Html.Renderer.Text (renderHtml)
import qualified Common.Message as Message
-import Common.Model.InitResult (InitResult)
import qualified Common.Message.Key as Key
+import Common.Model (InitResult)
import Design.Global (globalDesign)
diff --git a/sharedCost.cabal b/sharedCost.cabal
deleted file mode 100644
index 275c849..0000000
--- a/sharedCost.cabal
+++ /dev/null
@@ -1,104 +0,0 @@
-name: sharedCost
-version: 0.1
-license: GPL-3
-license-file: LICENSE
-author: Joris
-maintainer: joris@guyonvarch.me
-category: Web
-build-type: Simple
-cabal-version: >=1.10
-
-executable sharedCost
- main-is: Main.hs
- hs-source-dirs: src/server
- default-language: Haskell2010
- ghc-options: -Wall -Werror
- build-depends: base < 5
- , scotty
- , wai
- , wai-middleware-static
- , http-types
- , http-conduit
- , time
- , text
- , blaze-builder
- , cookie
- , bytestring
- , monad-logger
- , resourcet
- , transformers
- , blaze-html
- , clay
- , aeson
- , clientsession
- , uuid
- , mtl
- , lens
- , parsec
- , unordered-containers
- , containers
- , email-validate
- , config-manager
- , process
- , sqlite-simple
-
- , random
- , process
- , filepath
- , base64-bytestring
- -- , mime-mail
-
- other-modules: Common.Model.SignIn
- , Conf
- , Controller.Category
- , Controller.Income
- , Controller.Index
- , Controller.Payment
- , Controller.SignIn
- , Cookie
- , Design.View.Payment.Table
- , Design.View.Stat
- , Design.View.Table
- , Design.Media
- , Design.Tooltip
- , Design.Color
- , Design.Constants
- , Design.Dialog
- , Design.Errors
- , Design.Form
- , Design.Global
- , Design.Helper
- , Design.Views
- , Design.View.Header
- , Design.View.Payment
- , Design.View.Payment.Header
- , Design.View.Payment.Pages
- , Design.View.SignIn
- , Job.Daemon
- , Job.Frequency
- , Job.Kind
- , Job.Model
- , Job.MonthlyPayment
- , Job.WeeklyReport
- , Json
- , LoginSession
- , MimeMail
- , Model.Category
- , Model.Frequency
- , Model.Income
- , Model.Init
- , Model.Mail
- , Model.Payer
- , Model.Payment
- , Model.PaymentCategory
- , Model.Query
- , Model.SignIn
- , Model.UUID
- , Model.User
- , Resource
- , Secure
- , SendMail
- , Utils.Time
- , View.Mail.SignIn
- , View.Mail.WeeklyReport
- , View.Page
diff --git a/src/client/Common b/src/client/Common
deleted file mode 120000
index 60d3b0a..0000000
--- a/src/client/Common
+++ /dev/null
@@ -1 +0,0 @@
-../common \ No newline at end of file
diff --git a/src/client/Debug.hs b/src/client/Debug.hs
deleted file mode 100644
index 0c5c979..0000000
--- a/src/client/Debug.hs
+++ /dev/null
@@ -1,17 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-
-module Debug
- ( event
- ) where
-
-import Data.Text (Text)
-import qualified Data.Text as T
-import Reflex.Dom (MonadWidget, Event, Dynamic)
-import qualified Reflex.Dom as R
-
-event :: forall t m a. MonadWidget t m => Text -> Event t a -> m ()
-event name e = do
- count <- R.count e :: m (Dynamic t Int)
- let text = fmap (\c -> T.concat [name, " ", (T.pack . show $ c)]) count
- R.el "div" $ R.dynText text
diff --git a/src/common/Model.hs b/src/common/Model.hs
deleted file mode 100644
index 075021f..0000000
--- a/src/common/Model.hs
+++ /dev/null
@@ -1,40 +0,0 @@
-module Common.Model
- ( Category(..)
- , CategoryId
- , CreateCategory(..)
- , CreateIncome(..)
- , CreatePayment(..)
- , Currency(..)
- , EditCategory(..)
- , EditIncome(..)
- , EditPayment(..)
- , Frequency(..)
- , Income(..)
- , IncomeId
- , Init(..)
- , InitResult(..)
- , Payment(..)
- , PaymentId
- , PaymentCategory(..)
- , PaymentCategoryId
- , SignIn(..)
- , User(..)
- , UserId
- ) where
-
-import Common.Model.Category (Category(..), CategoryId)
-import Common.Model.CreateCategory (CreateCategory(..))
-import Common.Model.CreateIncome (CreateIncome(..))
-import Common.Model.CreatePayment (CreatePayment(..))
-import Common.Model.Currency (Currency(..))
-import Common.Model.EditCategory (EditCategory(..))
-import Common.Model.EditIncome (EditIncome(..))
-import Common.Model.EditPayment (EditPayment(..))
-import Common.Model.Frequency (Frequency(..))
-import Common.Model.Income (Income(..), IncomeId)
-import Common.Model.Init (Init(..))
-import Common.Model.InitResult (InitResult(..))
-import Common.Model.Payment (Payment(..), PaymentId)
-import Common.Model.PaymentCategory (PaymentCategory(..), PaymentCategoryId)
-import Common.Model.SignIn (SignIn(..))
-import Common.Model.User (User(..), UserId)
diff --git a/src/migrations/1.sql b/src/migrations/1.sql
deleted file mode 100644
index d7c300e..0000000
--- a/src/migrations/1.sql
+++ /dev/null
@@ -1,65 +0,0 @@
-CREATE TABLE IF NOT EXISTS "user" (
- "id" INTEGER PRIMARY KEY,
- "creation" TIMESTAMP NOT NULL,
- "email" VARCHAR NOT NULL,
- "name" VARCHAR NOT NULL,
- CONSTRAINT "uniq_user_email" UNIQUE ("email"),
- CONSTRAINT "uniq_user_name" UNIQUE ("name")
-);
-
-CREATE TABLE IF NOT EXISTS "job" (
- "id" INTEGER PRIMARY KEY,
- "kind" VARCHAR NOT NULL,
- "last_execution" TIMESTAMP NULL,
- "last_check" TIMESTAMP NULL,
- CONSTRAINT "uniq_job_kind" UNIQUE ("kind")
-);
-
-CREATE TABLE IF NOT EXISTS "sign_in"(
- "id" INTEGER PRIMARY KEY,
- "token" VARCHAR NOT NULL,
- "creation" TIMESTAMP NOT NULL,
- "email" VARCHAR NOT NULL,
- "is_used" BOOLEAN NOT NULL,
- CONSTRAINT "uniq_sign_in_token" UNIQUE ("token")
-);
-
-CREATE TABLE IF NOT EXISTS "payment"(
- "id" INTEGER PRIMARY KEY,
- "user_id" INTEGER NOT NULL REFERENCES "user",
- "name" VARCHAR NOT NULL,
- "cost" INTEGER NOT NULL,
- "date" DATE NOT NULL,
- "frequency" VARCHAR NOT NULL,
- "created_at" TIMESTAMP NOT NULL,
- "edited_at" TIMESTAMP NULL,
- "deleted_at" TIMESTAMP NULL
-);
-
-CREATE TABLE IF NOT EXISTS "income"(
- "id" INTEGER PRIMARY KEY,
- "user_id" INTEGER NOT NULL REFERENCES "user",
- "date" DATE NOT NULL,
- "amount" INTEGERNOT NULL,
- "created_at" TIMESTAMP NOT NULL,
- "edited_at" TIMESTAMP NULL,
- "deleted_at" TIMESTAMP NULL
-);
-
-CREATE TABLE IF NOT EXISTS "category"(
- "id" INTEGER PRIMARY KEY,
- "name" VARCHAR NOT NULL,
- "color" VARCHAR NOT NULL,
- "created_at" TIMESTAMP NOT NULL,
- "edited_at" TIMESTAMP NULL,
- "deleted_at" TIMESTAMP NULL
-);
-
-CREATE TABLE IF NOT EXISTS "payment_category"(
- "id" INTEGER PRIMARY KEY,
- "name" VARCHAR NOT NULL,
- "category" INTEGER NOT NULL REFERENCES "category",
- "created_at" TIMESTAMP NOT NULL,
- "edited_at" TIMESTAMP NULL,
- CONSTRAINT "uniq_payment_category_name" UNIQUE ("name")
-);
diff --git a/src/migrations/2.sql b/src/migrations/2.sql
deleted file mode 100644
index ec0d1b0..0000000
--- a/src/migrations/2.sql
+++ /dev/null
@@ -1,23 +0,0 @@
-BEGIN TRANSACTION;
-
-ALTER TABLE payment RENAME TO tmp_payment;
-
-CREATE TABLE IF NOT EXISTS "payment"(
- "id" INTEGER PRIMARY KEY,
- "user" INTEGER NOT NULL REFERENCES "user",
- "name" VARCHAR NOT NULL,
- "cost" INTEGER NOT NULL,
- "date" DATE NOT NULL,
- "frequency" VARCHAR NOT NULL,
- "created_at" TIMESTAMP NOT NULL,
- "edited_at" TIMESTAMP NULL,
- "deleted_at" TIMESTAMP NULL
-);
-
-INSERT INTO payment(id, user, name, cost, date, frequency, created_at, edited_at, deleted_at)
-SELECT id, user_id, name, cost, date, frequency, created_at, edited_at, deleted_at
-FROM tmp_payment;
-
-DROP TABLE tmp_payment;
-
-COMMIT;
diff --git a/src/server/Common b/src/server/Common
deleted file mode 120000
index 60d3b0a..0000000
--- a/src/server/Common
+++ /dev/null
@@ -1 +0,0 @@
-../common \ No newline at end of file
diff --git a/shell.nix b/tools.nix
index 23a7255..a06757e 100644
--- a/shell.nix
+++ b/tools.nix
@@ -1,17 +1,12 @@
with import <nixpkgs> {}; {
env = stdenv.mkDerivation {
- name = "env";
+ name = "tools";
buildInputs = with pkgs; [
- elmPackages.elm
nodePackages.nodemon
sqlite
cabal-install
- cabal2nix
tmux
tmuxinator
];
- shellHook = ''
- export PATH=node_modules/.bin:$PATH;
- '';
};
}