-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Unofficial Haskell Client Library for the Orchestrate.io API -- @package OrchestrateDB @version 1.0.0.0 -- | This library implements most parts of the Orchestrate.io API in -- Haskell. It provides a convenient way of accessing these parts of the -- REST API: -- --
-- import qualified Orchestrate as DB ---- -- Once you have it, you can use all the supported API functions(Check -- out the documentation on REST for detailed information). One -- important thing you need to remeber when working with this library is, -- that it uses Aeson under the hood, so if you want to store your -- Haskell types in an Orchestrate database, Aseon must know how -- convert them into JSON. The best way to achive that, is to use the -- DeriveGeneric Langauge extension. -- -- Here is an example of how to store a haskell value in an Orchestrate -- Collection: -- --
-- {-# LANGUAGE DeriveGeneric #-}
-- module Main where
--
-- import GHC.Generics
-- import Data.Aeson
-- import qualified Orchestrate as DB
--
-- data SherlockHolmesCase = SherlockHolmesCase {
-- title :: String,
-- typeOfCrime :: String,
-- shortStory :: Bool,
-- index :: Integer,
-- solved :: Bool
-- } deriving (Show,Read,Generic,Eq)
--
-- {-This automatically creates both a JSON parser and a JSON encoder based on the data type SherlockHolmesCase, if you however
-- want the property names in JSON and haskell to differ, you will have to write your own parser and you own encoder.
-- Please check out the Aeson documentation for information on how to do that.-}
-- instance FromJSON SherlockHolmesCase
-- instance ToJSON SherlockHolmesCase
--
-- main :: IO ()
-- main = do
-- -- Create an application record. Oh, BTW, in case you planned to store your api-key in the source code, it is a very very bad idea.
-- let dbApplcation = DB.createStdApplication "your.orchestrate.application.name" "one-of-your-api-keys"
-- -- Create an collection record. This collection does not have to exist, if it does not, it will be created as soon as you try to store something in it.
-- let dbCollection = DB.createStdCollection "TheCasebookOfSherlockHolmes"
-- let aStudyInScarlet = SherlockHolmesCase {
-- title = "A Study in Scarlet",
-- typeOfCrime = "Murder",
-- shortStory = False,
-- index = 0,
-- solved = True
-- }
-- -- Store a haskell value in the collection we created earlier. The "withOutKey" lets the server generate the key, so no key must be specified.
-- didItWork <- DB.orchestrateCollectionPutWithoutKey dbApplcation dbCollection aStudyInScarlet
-- if didItWork
-- then putStrLn "Invictus maneo!"
-- else putStrLn "Something is rotten in the state of Denmark!"
--
--
-- If this application does say "Invictus maneo!", you should get this
-- result if you LIST the "TheCasebookOfSherlockHolmes" collection:
--
--
-- "count" : 1,
-- "results" : [ {
-- "path" : {
-- "collection" : "TheCasebookOfSherlockHolmes ",
-- "kind" : "item",
-- "key" : "0b8b506cf0204ce9",
-- "ref" : "--------------",
-- "reftime" : --------------
-- },
-- "value" : {
-- "solved" : true,
-- "shortStory" : false,
-- "title" : "A Study in Scarlet ",
-- "index" : 0,
-- "typeOfCrime" : "Murder "
-- },
-- "reftime" : --------------
-- } ]
--
--
-- If you don't get that result, you either have run the example more
-- than once, it did not return "Invictus maneo", or something really
-- strange is going on. If you are fairly certain, that something strange
-- is going on, and it is most likely my fault and you might want to open
-- an issue at github.
--
--
-- ("a valid api key","something funny(it will be used as a name for the test collection)")
--
--
-- If you are asking yourself now, if there really is no way of checking
-- that this library works, before installing it, there is nothing to
-- worry about. You should consult the travis-ci
-- server(https://travis-ci.org/dwd31415/Haskell-OrchestrateDB) on
-- the state of the project, it does not only check wether or not ther
-- library can be built, but also runs the tests with an valid api key.
module Orchestrate
-- | Represents a collection inside an OrchestrateApplication, it stores
-- all data necessary to access it.
data OrchestrateCollection
OrchestrateCollection :: String -> OrchestrateCollection
collectionName :: OrchestrateCollection -> String
-- | A data type, that represents an Orchestrate application. It stores an
-- api key (generated online) and a https-endpoint.
data OrchestrateApplication
OrchestrateApplication :: String -> String -> String -> OrchestrateApplication
applicationName :: OrchestrateApplication -> String
apiKey :: OrchestrateApplication -> String
httpsEndpoint :: OrchestrateApplication -> String
-- | The validateApplication function validates your API key, by
-- making an authenticated HEAD request to the endpoint specified in the
-- OrchestrateApplication record. The function returns False when
-- the key is invalid or no connection with the endpoint could be
-- established.
validateApplication :: OrchestrateApplication -> IO Bool
-- | The orchestrateCollectionGet function request a value from an
-- Orchestrate.io database, and tries to convert it to the specified
-- Haskell type, if either gettings the value from the database or
-- converting it to the Haskell type fails Nothing is returned.
-- The value is requested by making a GET request to the
-- /$collection/$key endpoint(Offical
-- documentation:https://orchestrate.io/docs/apiref#keyvalue-get)
--
--
-- data TestRecord = TestRecord
-- { string :: String
-- , number :: Int
-- } deriving (Show,Read,Generic,Eq)
--
-- instance FromJSON TestRecord
-- instance ToJSON TestRecord
--
-- let dbApplication = DB.createStdApplication "APPLICATION_NAME" "API_KEY"
-- let dbCollection = DB.createStdCollection "COLLECTION_NAME"
-- let testRecord = TestRecord {string = "You may delay, but time will not!",number = 903}
-- dbValue <- DB.orchestrateCollectionGet dbApplication dbCollection KEY :: IO (Maybe TestRecord)
--
--
orchestrateCollectionGet :: FromJSON res => OrchestrateApplication -> OrchestrateCollection -> String -> IO (Maybe res)
-- | The orchestrateCollectionPut function stores a Haskell
-- value(with a ToJSON instance) in an Orchestrate.io database. It
-- does so by making a PUT request to the /$collection/$key
-- endpoint(Offical API
-- docs:https://orchestrate.io/docs/apiref#keyvalue-put). In order
-- to upload a Haskell Value to the database, it must have an instance of
-- ToJSON because this client library uses Aeson to convert
-- Haskel Values to JSON, which is required by Orchestrate.io.
--
--
-- data TestRecord = TestRecord
-- { string :: String
-- , number :: Int
-- } deriving (Show,Read,Generic,Eq)
--
-- instance FromJSON TestRecord
-- instance ToJSON TestRecord
--
-- let dbApplication = DB.createStdApplication "APPLICATION_NAME" "API_KEY"
-- let dbCollection = DB.createStdCollection "COLLECTION_NAME"
-- let testRecord = TestRecord {string = "You may delay, but time will not!",number = 903}
-- _ <- DB.orchestrateCollectionPutWithoutKey dbApplication dbCollection KEY testRecord
--
--
orchestrateCollectionPut :: ToJSON obj => OrchestrateApplication -> OrchestrateCollection -> String -> obj -> IO Bool
-- | The orchestrateCollectionPutWithoutKey function stores a
-- Haskell value(with a ToJSON instance) in an Orchestrate.io
-- database. It does so by making a POST request to the /$collection
-- endpoint(Offical API
-- docs:https://orchestrate.io/docs/apiref#keyvalue-post). This
-- function does not need a user specified key, because it uses a
-- server-generated key, if you want to know the key use
-- orchestrateCollectionPut instead of this function.
--
--
-- data TestRecord = TestRecord
-- { string :: String
-- , number :: Int
-- } deriving (Show,Read,Generic,Eq)
--
-- instance FromJSON TestRecord
-- instance ToJSON TestRecord
--
-- let dbApplication = DB.createStdApplication "APPLICATION_NAME" "API_KEY"
-- let dbCollection = DB.createStdCollection "COLLECTION_NAME"
-- let testRecord = TestRecord {string = "You may delay, but time will not!",number = 903}
-- _ <- DB.orchestrateCollectionPutWithoutKey dbApplication dbCollection testRecord
--
--
orchestrateCollectionPutWithoutKey :: ToJSON obj => OrchestrateApplication -> OrchestrateCollection -> obj -> IO Bool
-- | The orchestrateCollectionDelete function deletes a collection
-- from an Orchestrate.io application. This is done by making a DELETE
-- request to the /$collection endpoint(Offical
-- documentation:https://orchestrate.io/docs/apiref#collections-delete)
--
-- -- let dbApplication = DB.createStdApplication "APPLICATION_NAME" "API_KEY" -- let dbCollection = DB.createStdCollection "COLLECTION_NAME" -- _ <- DB.orchestrateCollectionDelete dbApplication dbCollection -- --orchestrateCollectionDelete :: OrchestrateApplication -> OrchestrateCollection -> IO Bool -- | The orchestrateCollectionDeleteKey function deletes a value -- from an Orchestrate.io database. This is done by making a DELETE -- request to the /$collection/$key endpoint(Offical -- documentation:https://orchestrate.io/docs/apiref#keyvalue-delete) -- --
-- data TestRecord = TestRecord
-- { string :: String
-- , number :: Int
-- } deriving (Show,Read,Generic,Eq)
--
-- instance FromJSON TestRecord
-- instance ToJSON TestRecord
--
-- let dbApplication = DB.createStdApplication "APPLICATION_NAME" "API_KEY"
-- let dbCollection = DB.createStdCollection "COLLECTION_NAME"
-- _ <- DB.orchestrateCollectionKey dbApplication dbCollection KEY
--
--
orchestrateCollectionDeleteKey :: OrchestrateApplication -> OrchestrateCollection -> String -> IO Bool
-- | Please see orchestrateCollectionSearchWithOffset for more
-- information. This function just calls it without an offset and with a
-- limit of 10.
orchestrateCollectionSearch :: OrchestrateApplication -> OrchestrateCollection -> String -> IO (Maybe ([Object], Bool))
-- | The orchestrateCollectionSearchWithOffset function searches for
-- the query in the database and returns an array of the type
-- "Maybe [Object]". Nothing is returned when establishing
-- a connection or authenticating failed. The function uses the SEARCH
-- method of the Orchestrate.io API (Offical
-- documentation:https://orchestrate.io/docs/apiref#search-collection)
-- , but automatically parsers the response. It returns a tupel of the
-- type (Maybe([Object],Bool)), the boolean
-- indicates wether or not more results are availble on the server. If
-- that is true, the function should be called again with an increased
-- offset, until (Just _,False) is returned.
--
-- -- dbSearchResults query num = -- let results = DB.orchestrateCollectionSearchWithOffset query num (num+10) -- let currentResults = fromJust $ fst results -- if snd results -- then currentResults:(dbSearchResults query (num+10)) -- else currentResults -- -- let dbApplication = DB.createStdApplication "APPLICATION_NAME" "API_KEY" -- let dbCollection = DB.createStdCollection "COLLECTION_NAME" -- let completeDBSearchResults = dbSearchResults QUERY 0 -- --orchestrateCollectionSearchWithOffset :: OrchestrateApplication -> OrchestrateCollection -> String -> Integer -> Integer -> IO (Maybe ([Object], Bool)) -- | The orchestrateCollectionList function lists the contents of -- the specified collection, by making GET request to the -- /$collection?limit=$limit endpoint. For more information check out the -- Orchestrate.io API docs: -- https://orchestrate.io/docs/apiref#keyvalue-list. If connecting -- to the api fails, or the api key stored in the application record is -- invlaid, Nothing is returned. Otherwise an array of the type -- Object(see the documentation of Aeson for more -- information) is returned, it contains the values from the HTTP -- response(see https://orchestrate.io/docs/apiref#keyvalue-list -- for an example of how the response looks like in JSON). -- --
-- let dbApplication = DB.createStdApplication "APPLICATION_NAME" "API_KEY" -- let dbCollection = DB.createStdCollection "COLLECTION_NAME" -- dbContents <- DB.orchestrateCollectionList dbApplication dbCollection 10 -- --orchestrateCollectionList :: OrchestrateApplication -> OrchestrateCollection -> Integer -> IO (Maybe [Object]) -- | Creates an collection record. createStdCollection :: String -> OrchestrateCollection -- | Creates an application record with the -- std.("https:/api.orchestrate.iov0") enpoint. createStdApplication :: String -> String -> OrchestrateApplication