0votos

Acceso a edificio en Haskell

por josejuan hace 5 años

Hay infinidad de formas de hacer este tipo de apps. En todo caso, un "no mal" punto de partida es independizar el backend (la bbdd) y el negocio de todo lo demás, a partir de ahí, se puede crecer adecuadamente. Aquí se muestra un backend (sólo la tabla de usuarios) y la lógica (de control de acceso y todas las acciones posibles sobre la tabla).

Controlar en php el acceso a un edificio

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
-- ARCHIVO: Oac.hs -------------------------------------------------------------- 
{-# LANGUAGE NoMonomorphismRestriction, TypeFamilies, GADTs  #-} 
module Oac ( 
  Credentials (..) 
, adminSelect 
, adminInsert 
, adminDelete 
, adminUpdate 
, module Oac.Model 
) where 
 
import Oac.Model 
import Database.Persist 
import Data.Maybe 
import Data.Either 
 
data Credentials = Credentials String String 
 
withUser (Credentials usr pwd) = selectFirst [UserLogin ==. usr, UserPassword ==. pwd] [] >>= 
                                 return . maybe (Left "Wrong user and/or password!") Right 
 
withAdmin crs = withUser crs >>= return . either Left (\eu -> 
  if userAdmin (entityVal eu) 
    then Right eu 
    else Left "You must be administrator to perform that operation!") 
 
adminAction crs action = withAdmin crs >>= either (return.Left) (\_ -> action >>= return.Right) 
 
adminSelect crs a b = adminAction crs $ selectList a b 
adminInsert crs a   = adminAction crs $ insert a 
adminDelete crs a   = adminAction crs $ delete a 
adminUpdate crs a b = adminAction crs $ update a b 
 
-- TODO: si sólo se trata de crud, con ésto vale, para añadir alguna acción de usuario se haría `userAction`, etc... 
 
-- ARCHIVO: Oac/Model.hs -------------------------------------------------------------- 
{-# LANGUAGE QuasiQuotes, TypeFamilies, FlexibleContexts, TemplateHaskell, OverloadedStrings, GADTs  #-} 
module Oac.Model where 
 
import Database.Persist.TH 
 
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase| 
 
User json 
    login    String 
    password String 
    admin    Bool 
    UniqueLogin login 
    deriving Show     
     
|] 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.