Skip to content

Commit 10b73cd

Browse files
tirumaraiselvanlexi-lambdamarionschleifercodingkarthikAleksandra Sikora
committed
Scheduled triggers (close hasura#1914) (hasura#3553)
server: add scheduled triggers Co-authored-by: Alexis King <[email protected]> Co-authored-by: Marion Schleifer <[email protected]> Co-authored-by: Karthikeyan Chinnakonda <[email protected]> Co-authored-by: Aleksandra Sikora <[email protected]>
1 parent ec04fc6 commit 10b73cd

File tree

19 files changed

+54
-26
lines changed

19 files changed

+54
-26
lines changed

CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,19 @@
22

33
## Next release
44

5+
### Scheduled Triggers
6+
7+
A scheduled trigger can be used to execute custom business logic based on time. There are two types of timing events: cron based or timestamp based.
8+
9+
A cron trigger will be useful when something needs to be done periodically. For example, you can create a cron trigger to generate an end-of-day sales report every weekday at 9pm.
10+
11+
You can also schedule one-off events based on a timestamp. For example, a new scheduled event can be created for 2 weeks from when a user signs up to send them an email about their experience.
12+
13+
<Add docs links>
14+
15+
(close #1914)
16+
17+
518
### Allow access to session variables by computed fields (fix #3846)
619

720
Sometimes it is useful for computed fields to have access to the Hasura session variables directly. For example, suppose you want to fetch some articles but also get related user info, say `likedByMe`. Now, you can define a function like:

scripts/dev.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ if [ "$MODE" = "graphql-engine" ]; then
215215
echo_pretty " $ $0 postgres"
216216
echo_pretty ""
217217

218-
RUN_INVOCATION=(cabal new-run --project-file=cabal.project.dev-sh --RTS --
218+
RUN_INVOCATION=(cabal new-run --project-file=cabal.project.dev-sh --RTS --
219219
exe:graphql-engine +RTS -N -T -s -RTS serve
220220
--enable-console --console-assets-dir "$PROJECT_ROOT/console/static/dist"
221221
)

server/cabal.project.freeze

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,11 @@ constraints: any.Cabal ==3.2.0.0,
137137
any.ghc-heap-view ==0.6.2,
138138
ghc-heap-view -prim-supports-any,
139139
any.ghc-prim ==0.6.1,
140+
any.happy ==1.19.12,
141+
happy +small_base,
140142
any.hashable ==1.3.0.0,
141143
hashable -examples +integer-gmp +sse2 -sse41,
144+
hashable -examples +integer-gmp +sse2 -sse41,
142145
any.hashtables ==1.2.3.4,
143146
hashtables -bounds-checking -debug -detailed-profiling -portable -sse42 +unsafe-tricks,
144147
any.hasql ==1.4.2,

server/commit_diff.txt

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -333,16 +333,3 @@ Author: Brandon Simmons <[email protected]>
333333
Date: Wed May 13 17:38:16 2020 -0400
334334

335335
dev.sh: bump version due to addition of croniter python dependency
336-
337-
commit cc8e2ccc78bf154c5da90fea0967bd5ac2ca8b4b
338-
Author: Tirumarai Selvan <[email protected]>
339-
Date: Wed May 13 18:03:16 2020 +0530
340-
341-
Scheduled triggers (close #1914) (#3553)
342-
343-
server: add scheduled triggers
344-
345-
Co-authored-by: Alexis King <[email protected]>
346-
Co-authored-by: Marion Schleifer <[email protected]>
347-
Co-authored-by: Karthikeyan Chinnakonda <[email protected]>
348-
Co-authored-by: Aleksandra Sikora <[email protected]>

server/graphql-engine.cabal

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@ common common-all
7171
TypeFamilyDependencies
7272
TypeOperators
7373

74+
-- ApplicativeDo BangPatterns BlockArguments ConstraintKinds DataKinds DefaultSignatures DeriveDataTypeable
75+
-- DeriveFoldable DeriveFunctor DeriveGeneric DeriveLift DeriveTraversable DerivingVia EmptyCase
76+
-- FlexibleContexts FlexibleInstances FunctionalDependencies GeneralizedNewtypeDeriving
77+
-- InstanceSigs LambdaCase MultiParamTypeClasses MultiWayIf NamedFieldPuns NoImplicitPrelude
78+
-- OverloadedStrings QuantifiedConstraints QuasiQuotes RankNTypes RecordWildCards ScopedTypeVariables
79+
-- StandaloneDeriving TemplateHaskell TupleSections TypeApplications TypeFamilies TypeOperators
7480

7581
common common-exe
7682
ghc-options:
@@ -115,7 +121,7 @@ library
115121
, http-types
116122
, attoparsec
117123
, attoparsec-iso8601 >= 1.0
118-
, time
124+
, time >= 1.9
119125
, scientific
120126
, Spock-core
121127
, split
@@ -246,6 +252,9 @@ library
246252
-- scheduled triggers
247253
, cron >= 0.6.2
248254

255+
-- scheduled triggers
256+
, cron >= 0.6.2
257+
249258
exposed-modules: Control.Arrow.Extended
250259
, Control.Arrow.Trans
251260
, Control.Monad.Stateless

server/src-lib/Hasura/Eventing/EventTrigger.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ import Data.Time.Clock
5656
import Data.Word
5757
import Hasura.Eventing.HTTP
5858
import Hasura.Eventing.Common
59+
5960
import Hasura.HTTP
6061
import Hasura.Prelude
6162
import Hasura.RQL.DDL.Headers
@@ -72,6 +73,7 @@ import qualified Hasura.Logging as L
7273
import qualified Network.HTTP.Client as HTTP
7374
import qualified Database.PG.Query.PTI as PTI
7475
import qualified PostgreSQL.Binary.Encoding as PE
76+
import qualified Data.Set as Set
7577

7678
data TriggerMetadata
7779
= TriggerMetadata { tmName :: TriggerName }

server/src-lib/Hasura/Eventing/HTTP.hs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,15 @@ import qualified Data.TByteString as TBS
4646
import qualified Data.Text as T
4747
import qualified Data.Text.Encoding as TE
4848
import qualified Data.Text.Encoding.Error as TE
49+
4950
import qualified Network.HTTP.Client as HTTP
5051
import qualified Network.HTTP.Types as HTTP
5152
import qualified Data.Time.Clock as Time
5253

5354
import Control.Exception (try)
55+
-- import Control.Monad.IO.Class (MonadIO, liftIO)
56+
-- import Control.Monad.Reader (MonadReader)
57+
5458
import Data.Aeson
5559
import Data.Aeson.Casing
5660
import Data.Aeson.TH

server/src-lib/Hasura/Eventing/ScheduledTrigger.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ import Hasura.RQL.DDL.EventTrigger (getHeaderInfosFromConf)
9090
import Hasura.SQL.DML
9191
import Hasura.SQL.Types
9292
import Hasura.Eventing.Common
93+
9394
import System.Cron
9495

9596
import qualified Data.Aeson as J

server/src-lib/Hasura/Incremental/Internal/Dependency.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import Data.GADT.Compare
1818
import Data.Int
1919
import Data.Scientific (Scientific)
2020
import Data.Set (Set)
21+
2122
import Data.Time.Clock
2223
import Data.Vector (Vector)
2324
import GHC.Generics ((:*:) (..), (:+:) (..), Generic (..), K1 (..),

server/src-lib/Hasura/RQL/DDL/Action.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import Hasura.EncJSON
2727
import Hasura.GraphQL.Utils
2828
import Hasura.Prelude
2929
import Hasura.RQL.Types
30+
import Data.URL.Template
3031
import Hasura.Session
3132
import Hasura.SQL.Types
3233

@@ -35,10 +36,10 @@ import qualified Data.Aeson.Casing as J
3536
import qualified Data.Aeson.TH as J
3637
import qualified Data.HashMap.Strict as Map
3738
import qualified Data.Text as T
39+
3840
import qualified Database.PG.Query as Q
3941
import qualified Language.GraphQL.Draft.Syntax as G
4042

41-
import Data.URL.Template (renderURLTemplate)
4243
import Language.Haskell.TH.Syntax (Lift)
4344

4445
getActionInfo

server/src-lib/Hasura/RQL/DDL/Metadata.hs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,11 @@ saveMetadata (ReplaceMetadata _ tables functionsMeta
206206
withPathK "custom_types" $
207207
CustomTypes.persistCustomTypes customTypes
208208

209+
-- cron triggers
210+
withPathK "cron_triggers" $
211+
indexedForM_ cronTriggers $ \ct -> liftTx $ do
212+
addCronTriggerToCatalog ct
213+
209214
-- actions
210215
withPathK "actions" $
211216
indexedForM_ actions $ \action -> do
@@ -217,6 +222,7 @@ saveMetadata (ReplaceMetadata _ tables functionsMeta
217222
let createActionPermission = CreateActionPermission (_amName action)
218223
(_apmRole permission) Nothing (_apmComment permission)
219224
Action.persistCreateActionPermission createActionPermission
225+
220226
where
221227
processPerms tableName perms = indexedForM_ perms $ Permission.addPermP2 tableName
222228

server/src-lib/Hasura/RQL/DDL/Metadata/Generator.hs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ import Hasura.RQL.DDL.Metadata.Types
3535
import Hasura.RQL.Types
3636
import Hasura.SQL.Types
3737

38-
3938
genReplaceMetadata :: Gen ReplaceMetadata
4039
genReplaceMetadata = do
4140
version <- arbitrary

server/src-lib/Hasura/RQL/DDL/Schema/Cache.hs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import Data.Aeson
3232
import Data.List (nub)
3333

3434
import qualified Hasura.Incremental as Inc
35-
import qualified Language.GraphQL.Draft.Syntax as G
3635

3736
import Hasura.Db
3837
import Hasura.GraphQL.Execute.Types
@@ -263,8 +262,6 @@ buildSchemaCacheRule = proc (catalogMetadata, invalidationKeys) -> do
263262
, "custom types are inconsistent" )
264263
returnA -< (M.empty, emptyAnnotatedCustomTypes)
265264

266-
-- remote schemas
267-
268265
cronTriggersMap <- buildCronTriggers -< ((),cronTriggers)
269266

270267
returnA -< BuildOutputs

server/src-lib/Hasura/RQL/DDL/Schema/Cache/Common.hs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,10 @@ data BuildInputs
5252
-- 'MonadWriter' side channel.
5353
data BuildOutputs
5454
= BuildOutputs
55-
{ _boTables :: !TableCache
56-
, _boActions :: !ActionCache
57-
, _boFunctions :: !FunctionCache
58-
, _boRemoteSchemas :: !(HashMap RemoteSchemaName (RemoteSchemaCtx, MetadataObject))
55+
{ _boTables :: !TableCache
56+
, _boActions :: !ActionCache
57+
, _boFunctions :: !FunctionCache
58+
, _boRemoteSchemas :: !(HashMap RemoteSchemaName (RemoteSchemaCtx, MetadataObject))
5959
-- ^ We preserve the 'MetadataObject' from the original catalog metadata in the output so we can
6060
-- reuse it later if we need to mark the remote schema inconsistent during GraphQL schema
6161
-- generation (because of field conflicts).

server/src-lib/Hasura/RQL/Types/Common.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ import Hasura.Prelude
4949
import Hasura.RQL.DDL.Headers ()
5050
import Hasura.RQL.Types.Error
5151
import Hasura.SQL.Types
52+
import Hasura.RQL.DDL.Headers ()
53+
5254

5355

5456
import Control.Lens (makeLenses)

server/src-lib/Hasura/RQL/Types/SchemaCache.hs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,12 +131,15 @@ import Hasura.RQL.Types.Metadata
131131
--import Hasura.RQL.Types.Permission
132132
import Hasura.RQL.Types.QueryCollection
133133
import Hasura.RQL.Types.RemoteSchema
134+
--import Hasura.RQL.Types.EventTrigger
135+
134136
import Hasura.RQL.Types.ScheduledTrigger
135137
import Hasura.RQL.Types.SchemaCacheTypes
136138
import Hasura.RQL.Types.Table
137139
import Hasura.Session
138140
import Hasura.SQL.Types
139141

142+
140143
import Data.Aeson
141144
import Data.Aeson.Casing
142145
import Data.Aeson.TH

server/src-lib/Hasura/Server/API/Query.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ queryModifiesSchemaCache (RQV1 qi) = case qi of
283283
RQAddCollectionToAllowlist _ -> True
284284
RQDropCollectionFromAllowlist _ -> True
285285

286-
RQRunSql q -> isSchemaCacheBuildRequiredRunSQL q
286+
RQRunSql q -> isSchemaCacheBuildRequiredRunSQL q
287287

288288
RQReplaceMetadata _ -> True
289289
RQExportMetadata _ -> False

server/src-lib/Hasura/Server/Auth/JWT.hs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ import qualified Data.Aeson as J
4747
import qualified Data.Aeson.Casing as J
4848
import qualified Data.Aeson.Internal as J
4949
import qualified Data.Aeson.TH as J
50-
import qualified Data.Aeson.Internal as J
5150
import qualified Data.ByteString.Lazy as BL
5251
import qualified Data.ByteString.Lazy.Char8 as BLC
5352
import qualified Data.CaseInsensitive as CI

server/tests-py/conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@ def gql_server(request, hge_ctx):
292292
yield server
293293
server.teardown()
294294

295+
295296
@pytest.fixture(scope='class')
296297
def ws_client(request, hge_ctx):
297298
"""

0 commit comments

Comments
 (0)