packages feed

lucienne-0.0.1: Lucienne/Model/User.hs

module Lucienne.Model.User 
  ( User, newUser, name, mayAddUsers, changePassword
  , userByNameQuery, userByNameAndPasswordQuery)
where

import qualified Data.ByteString.Lazy.Char8 as BS
import           Data.Digest.Pure.SHA (showDigest,sha1)
import           Data.Bson (Document,(=:),at)
import qualified Data.CompactString.UTF8 as CS
import           Lucienne.DatabaseAble (DatabaseAble(..))

data User = User { name        :: String
                 , password    :: String
                 , mayAddUsers :: Bool
                 } deriving (Show)

newUser :: String -> String -> Bool -> User
newUser name password mayAddUsers = 
  User name (hashPassword password) mayAddUsers

hashPassword :: String -> String
hashPassword = showDigest . sha1 . BS.pack

changePassword :: User -> String -> User
changePassword user newPassword =
  user { password = hashPassword newPassword }

instance DatabaseAble User where
  toDocument user = [ "_id"         =: CS.pack (name     user)
                    , "password"    =: CS.pack (password user)
                    , "mayAddUsers" =: mayAddUsers user
                    ]

  fromDocument document = 
    let name        = CS.unpack $ "_id"         `at` document
        password    = CS.unpack $ "password"    `at` document
        mayAddUsers =             "mayAddUsers" `at` document
    in
      User name password mayAddUsers

userByNameQuery :: String -> Document
userByNameQuery name = [ "_id" =: CS.pack name ]

userByNameAndPasswordQuery :: String -> String -> Document
userByNameAndPasswordQuery name password = 
  [ "_id"      =: CS.pack name
  , "password" =: CS.pack (hashPassword password)
  ]