Kontekst: Zbliżam się do Haskella z punktu widzenia konwersji błędów środowiska wykonawczego na błędy podczas kompilacji. Moja hipoteza jest taka, że jest to możliwe, jeśli można skodyfikować logikę biznesową w samych typach programu.Uszkodzona obecność/brak uwierzytelnienia na poziomie typu
Piszę bota Telegram, który powinien być dostępny dla użytkowników w mojej firmie. Aby osiągnąć to "ograniczenie", za każdym razem, gdy ktoś zacznie czatować z botem, wyszuka w tabeli chat_id
i sprawdzi, czy istnieje ważny oauth_token
. W przeciwnym razie użytkownik otrzyma najpierw link do wypełnienia Google OAuth (poczta e-mail naszej firmy jest hostowana w Google Apps dla Firm).
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
VLUser
email String
chatId Integer
tgramUserId Integer
tgramFirstName String
tgramLastName String Maybe
tgramUsername String Maybe
oauthToken String Maybe
deriving Show
|]
Użytkownicy posiadający ważną oauth_token
będzie w stanie dać bot telegram kilka poleceń, które nieuwierzytelnionych użytkowników nie powinny być w stanie dać.
Teraz próbuję skodyfikować tę logikę na samym poziomie typu. W moim kodzie Haskella będą dostępne pewne funkcje, które będą w stanie przyjąć, jako argumenty, zarówno uwierzytelnione, jak i niezaufane; podczas gdy niektóre funkcje powinny akceptować tylko uwierzytelnionych użytkowników.
Jeśli przechodzę obok obiektów użytkowników tego samego typu, tj. VLUser
wszędzie, to będę musiał uważać, aby sprawdzić, czy w każdej funkcji znajduje się oauthToken
. Czy istnieje sposób, aby utworzyć dwa rodzaje użytkowników - VLUser
i VLUserAuthenticated
gdzie:
- Zarówno mapa do tej samej tabeli podstawowej
VLUserAuthenticated
można instancji tylko wtedy, gdy maoauthToken
Wydaje podobny do problemu mutex. Chcesz określić na poziomie typu, czy funkcja wymaga blokady, czy nie. Możesz zobaczyć jeden z możliwych sposobów radzenia sobie z tym [tutaj] (http://dev.stephendiehl.com/hask/#indexed-monads) spójrz na typ 'IState'. Wymienić 'Locked' i' Unlocked' z 'Authenticated' i' UnAuthenticated' i zapewniają użytkownikowi 'funkcję login' że kontrole na' oauth' token, który jest jedynym sposobem uzyskania 'wartość Authenticated'. – Bakuriu