This project's release branch is master. This log is written from the perspective of the release branch: when changes hit master, they are considered released, and the date should reflect that release.
- Make it possible to use Rhyolite.Backend.Account without notifications. See Rhyolite.Backend.Account.Db for versions of createAccount and ensureAccountExists that don't send notifications.
- Breaking: Drop groundhog support
- Breaking: Use Commutative from commutative-semigroups instead of Additive from patch
- Update to vessel-0.3
- Support ghc-8.10
- Add Data.Vessel.Void
- Move .obelisk/impl to dep/obelisk
- Breaking: handleAuthMapQuery and handlePersonalAuthMapQuery now take pure functions for decrypting user tokens. This is fine in practice because it should almost always be readSignedWithKey from signed-data, partially applied to a CSK. We had a major performance issue when someone stuck a database query inside the function, and it ran in a loop for every connected user on every database notification, so we want to defend against that sort of thing happening. There may still be legitimate reasons to do other IO inside such a thing (e.g. if a different encryption mechanism were used), but if that's needed, we'll reconsider the API further.
-
Breaking: Rhyolite.Frontend.Cookie now always Base64 encodes cookies
-
change taskWorker to not manage the hasRun flag. For the old behavior, use
taskWorker1which adds back the at-most-once execution behavior. The old_task_hasRunfield of Task is a separate argument. -
Task type no longer uses lenses for field accessors. use field labels or regular functions instead.
-
Fix
Rhyolite.DB.Beam.current_timestamp_for PostgreSQL server instances whose time zone is not set to UTC. -
Add helper types for beam code, namely
WrapColumnarandWrapNullable. -
Add beam orphan instances for some functor types, such as
ProductandProxy. -
Bump obelisk 1.0.0.0 and reflex-platform (0.9.2.0)
-
Add rhyolite-account-types and rhyolite-account-backend for use with beam-based rhyolite projects
- Moved groundhog-legacy's
Rhyolite.Accountmodule toRhyolite.Account.Groundhog.Types
- Moved groundhog-legacy's
-
Added Beam versions of
Rhyolite.Task.Groundhog.Worker.taskWorkerandRhyolite.Task.Groundhog.Task, inRhyolite.Task.Groundhog.WorkerandRhyolite.Task.Beamrespectively. -
Removed
Rhyolite.Request.Common, now using functions from Aeson directly. Usedecode'instead ofdecodeValue'. -
Bump vessel to 0.2.1.0 (pre-release)
-
Add mapAuthenticatedV
-
Extend AuthenticatedV to have a personal view component in addition to private and public ones. Personal views are similar to private ones in that they require a token to access, but are computed separately per-user. They're specifically for the case that we expect different users' views to have nothing in common with one another.
-
Breaking changes:
- Rename
Rhyolite.Frontend.App.openWebSocket'toopenWebSocketand remove the previous definition ofopenWebSocket. To get the same output as before:(_appWebSocket_notification x, _appWebSocket_response x). - Remove the
rhyolite-backend-snappackage. It has been released as snap-stream. Use that package instead. - Remove the
backend-dbpackage. See the groundhog-legacy migration guide and the notes below:- Remove
Rhyolite.Backend.DB.PsqlSimple.Orphans. Changes have been moved our fork of postgresql-simple. - Rename
PostgresRawtoPsqland move it topsql-simple-class. - Move Psql (formerly PostgresRaw) instance for groundhog's
DbPersistto psql-simple-groundhog. - Remove
fromIdRowfromRhyolite.Backend.DB.PsqlSimple - Move
traceQueryandtraceExecuteto psql-simple-class - Use
postgresql-simple-interpolatefor quasiquotated postgresql-simple queries. The following function names have changed:- queryQ -> iquery
- executeQ -> iexecute
- executeQ_ -> iexecute_
- traceQueryQ -> itraceQuery (defined in psql-simple-class)
- traceExecuteQ -> itraceExecute (defined in psql-simple-class)
- traceExecuteQ_ -> itraceExecute_ (defined in psql-simple-class)
- Remove
Rhyolite.Backend.DB.PsqlSimpleas all of its functionality has been moved elsewhere. - Move instances from
Database.Groundhog.Postgresql.OrphanstoRhyolite.DB.Groundhog.Orphansin groundhog-legacy. - Move
Network.PushNotification.Workertogroundhog-legacyand rename it toRhyolite.Network.PushNotification.Worker. - Move
Rhyolite.Backend.DBtogroundhog-legacyand rename it toRhyolite.DB.Groundhog. - Move the
PostgresLargeObjectclass topsql-simple-classand move its groundhog-based instances togroundhog-legacy.withStreamedLargeObjectno longer requires groundhog, but does require a connection. UseliftWithConnto use it with groundhog.
- Move
Rhyolite.Backend.DB.SerializabletoDatabase.PostgreSQL.Serializableinpsql-serializableand move its groundhog-based instances togroundhog-legacy'sRhyolite.DB.Groundhog.Serializablemodule. - Move
Rhyolite.Backend.SchemaandRhyolite.Backend.Schema.ClasstoRhyolite.DB.Groundhog.SchemaandRhyolite.DB.Groundhog.Schema.Classingroundhog-legacy. - Move
Rhyolite.Schema.TaskandRhyolite.Backend.Schema.TasktoRhyolite.Task.Groundhog, and moveRhyolite.Backend.TaskWorkertoRhyolite.Task.Groundhog.Worker, both ingroundhog-legacy. - Move
Rhyolite.Backend.Schema.THtoRhyolite.DB.Groundhog.THingroundhog-legacy.
- Remove
- Remove
Rhyolite.Map.Monoidal. For=:useData.Map.Monoidal.singletoninstead, and forrestrictKeysuse monoidal-containers >= 0.6.1.0. - Remove rhyolite-aeson-orphans. It has been renamed and moved to bytestring-aeson-orphans and is now used as a dependency.
- Remove the aeson orphan instances for Alt, Any and Down.
- Move
Rhyolite.Backend.Listento its own projectrhyolite-notify-listen. The module is now calledRhyolite.DB.NotifyListen.insertAndNotifyand related classes and functions can now be found in the groundhog-legacy package in theRhyolite.DB.NotifyListen.Groundhogmodule, and innotify-listen-beamfor beam versions. The variousnotifyfunctions now requirePsql m. - Remove Rhyolite.HList.
- Remove Data.MonoidMap. It has been moved to monoid-map and is now used as a dependency.
- Narrow the type of
signWithKeyso that the input type matches the output's phantom type parameter. - Move
Rhyolite.Backend.EmailandRhyolite.EmailtoRhyolite.Emailin the newrhyolite-emailpackage.- Provide more error information in the interface for sending an email in
rhyolite-email. - The
EmailEnvtype has been changed toEmailConfig, which is a structured record type instead of a flat tuple.
- Provide more error information in the interface for sending an email in
- Move
LargeObjectIdtopsql-simple-class. - Remove the
Rhyolite.THmodule. Usefile-embedinstead. - Move
Rhyolite.Backend.EmailWorkertoRhyolite.DB.Groundhog.EmailWorkeringroundhog-legacy. Change the schema forQueuedEmailto contain a JSON blob of theMailobject instead of the rendered email bytestring. See the groundhog-legacy migration guide for more information. - Move the
Accounttype togroundhog-legacy-typesand move associated backend functionality toRhyolite.DB.Groundhog.Accountingroundhog-legacy. - Move
SignedandMonadSigntosigned-data. MovesignWithKey,readSignedWithKey,SignT, etc tosigned-data-clientsession. Move groundhog instances forMonadSignandSignTtoRhyolite.DB.Groundhog.Orphans. - Move
Accounttogroundhog-legacy-types. Move backend code for accounts, e.g.,ensureAccountExiststoRhyolite.Account.Groundhogingroundhog-legacy. - Move
Rhyolite.Schematogroundhog-legacy-types. - Rename
datastructurestosemimapsince it only contains SemiMap. - Move
Rhyolite.Frontend.Widget,Rhyolite.Frontend.Form, andRhyolite.Frontend.Modal.*torhyolite-widgets.
- Rename
-
New:
- Add a
Psqlinstance for beam'sPg
- Add a
-
Version bumps:
- vessel 0.2.0.0
- Fixed a bug in
handleAuthMapQuerywhere tokens were always validated
- Rhyolite.Concurrent: add taggedWorker to make it easier to determine the source of error messages
- Bump groundhog
- Bump obelisk (develop as of 2021-04-19) and reflex-platform (0.7.1.0)
- Remove rhyolite-logging and use monad-logger-extras in rhyolite-db instead.
LoggingEnvis replaced byLogger. - Remove
runPrerenderedRhyoliteWidget. UserunRhyoliteWidgetinstead. runObeliskRhyoliteWidgetnow also returns a DynamicAppWebSocket.- Emails
- separate build and send for widget email
- Update widget emails for newer routes.
- Use a record for email configuration.
- Add a function for email with a StaticWidget
- Simple authenticated queries
ErrorVvessel captures logic for possibly failing queriesAuthMapVgathers queries associated to different identities so that they can be processed together.AuthenticatedVdistinguishes between public queries that need no authentication and private queries which do.
- Bump Obelisk to version 0.8 which includes a bump to reflex-platform and nixpkgs 19.09
- Add
mapModalTM,mapModalTandmapModalTMfunctions for changing the underlying monads ofModalT. - Fix bug in
functorToWirecausingSelectedCountof0to be considered non-mempty. - Fix regression in rhyolite-frontend so that it builds in GHCJS again
- Move
Rhyolite.Backend.Loggingto its own projectrhyolite-loggingand re-export. - Add
Rhyolite.Backend.DB.Serializablefor doing PostgreSQL transactions inSERIALIZABLEisolation with automatic retrying on serialization errors. - Breaking change: Switch
runDbto use theSerializablemonad for all transactions. This monad is not a transformer and has very few instances. Notably, liftingIOinto it must be done manually, and only with great care. - Add
runDbReadOnlyRepeatableReadtoRunDbto make streaming reads easier. Notably, this transaction mode allowsMonadIObecause it will never retry. - Fix thread-safety bug in
firebaseWorker. - Breaking change: Rework
MonadSignto look a lot more likeMonadReaderso that its instances can more easily avoidMonadIO. - Breaking change: Functions in
Rhyolite.Backend.EmailWorkernow have a constraint requiring thatSerializablebe the base monad. - Add
PostgresRawandPostgresLargeObjectinstances toSignT. - Bump
postgresql-simpleto avoidWARNING: There is no transaction in progresswhen there is a serialization error.
- Deprecated runPrerenderedRhyoliteWidget, use runRhyoliteWidget instead.
- Use GHC 8.6. This necessitated bumps to
- dependent-sum-aeson-orphans
- gargoyle
- groundhog
- obelisk
- postgresql-lo-stream
- reflex-platform
- vessel
- Convert many places using
failto useerrordirectly to avoidMonadFailconstraint - Remove many instances from
Backend.DB.PsqlSimple.Orphansthat were upstreamed topostgresql-simple
- Improve error message on parse failure in certain database instances
- Added
runObeliskRhyoliteWidgetfor integration with obelisk applications.
- Remove
Rhyolite.Backend.Snap. That module has been made obsolete by Obelisk. - Frontend.App: Use reflex's
matchResponsesWithRequestsinstead ofidentifyTags(now deleted). Change the identifier used byTaggedRequestandTaggedResponseto anInt - Remove
mapRequesterT. This has been upstreamed to reflex aswithRequesterT - Remove Frontend.Request and Frontend.WebSocket
- Use
HasId,Id, and related types/functions from database-id-class and database-id-groundhog. Remove the implementations in Rhyolite.Schema and Rhyolite.Backend.Schema - Remove Rhyolite.Backend.DB.TH since the code there was redundant with Rhyolite.Backend.Schema.TH
- Convert all dependencies in default.nix to thunks in
dep/ - Update to use monoidal-containers 0.5
- Add a test that builds all the rhyolite submodules to
test/ - Remove
withDb, which can now be found in gargoyle-postgresql-connect
- Add
Rhyolite.Frontend.Modal.*modules for conveniently creating modals that do not require the use ofz-indexto position correctly. - Add
withLoggingMinLevelfunction inRhyolite.Backend.Loggingwhich allows you to pick the fallback filter when no other filters match. - Bump obelisk to a version that no longer uses
*Tagclasses. - Remove the "HasView" and "HasRequest" classes, and the general concept of having a type level "app" identifier. Instead, everything is explicitly parametrised on query and request types directly, and the query type is no longer required to be a Functor/Align/etc. so that Vessel becomes an option for defining queries and views.
- Remove the "Request" class, as it has been subsumed by more general machinery. You can use deriveArgDict from constraints-extras and deriveJSONGADT from aeson-gadt-th on your request datatypes to obtain the same powers (and more).
- In its place, there is a Request type synonym which stands for (ForallF ToJSON r, Has ToJSON r, FromJSON (Some r), Has FromJSON r).
- Added standardPipeline as a good example of a last argument you can use for serveDbOverWebsockets, in the case that you have a Functor-style query/view type. It now uses condense/disperse from the Vessel library.
- Added vesselPipeline similarly for the case where you're using a functor-parametric container type (such as Vessel) for your queries and views.
- Added a DiffQuery type class which allows us to specify how queries are subtracted. We were doing this in an ad-hoc fashion based on Align instances before, but the generalisation of query types meant that we could no longer assume this was an option.
- If you have a Functor-style query/view, the 'standardDiffQuery' function can be used to implement the 'DiffQuery' instance for it.
- If you're using Vessel, to implement DiffQuery you can use subtractV which is a consequence of the View typeclass.
- Add alternative to groundhog's
==., which has severe performance issues before version 0.10 (to which we can't yet upgrade). SeeRhyolite.Backend.DB.===.. - Add
validationDropdownandvalidationTextArea- Add an extra type parameter
vspecifying the widget value type (typicallyText) toValidationConfig - Add
mkValidationConfigwhich is likedefValidationConfigbut takes the initial value - Add
validationDropdownChangeEventthat returns the change event of the ValidationDropdown
- Add an extra type parameter
- Remove the "HasView" and "HasRequest" classes, and the general concept of having a type level "app" identifier. Instead, everything is explicitly parametrised on query and request types directly, and the query type is no longer required to be a Functor/Align/etc. so that Vessel becomes an option for defining queries and views.
- Remove the "Request" class, as it has been subsumed by more general machinery. You can use deriveArgDict from constraints-extras and deriveJSONGADT from aeson-gadt-th on your request datatypes to obtain the same powers (and more).
- In its place, there is a Request type synonym which stands for (ForallF ToJSON r, Has ToJSON r, FromJSON (Some r), Has FromJSON r).
- Added standardPipeline as a good example of a last argument you can use for serveDbOverWebsockets, in the case that you have a Functor-style query/view type. It now uses condense/disperse from the Vessel library.
- Added vesselPipeline similarly for the case where you're using a functor-parametric container type (such as Vessel) for your queries and views.
- Added a DiffQuery type class which allows us to specify how queries are subtracted. We were doing this in an ad-hoc fashion based on Align instances before, but the generalisation of query types meant that we could no longer assume this was an option.
- If you have a Functor-style query/view, the 'standardDiffQuery' function can be used to implement the 'DiffQuery' instance for it.
- If you're using Vessel, to implement DiffQuery you can use subtractV which is a consequence of the View typeclass.
- Bump obelisk to a version that no longer uses
*Tagclasses
- Add NeverNull instance for our Json newtype that encodes things as JSON in the DB.
- Add change-tracking DB notifications. See
HasChangeNotificationin Rhyolite.Backend.Listen. - Fix bug in
runRhyoliteWidgetandrunPrerenderedRhyoliteWidgetwhen things were explicitly requested 0 times. - Fix
mapAuthto ensure that queries are correctly subtracted from the view selector when switching accounts. - Add
validationInputWithFeedbackwhich separates the widget providing feedback on why their input wasn't valid, allowing it to be placed separately in the DOM. - Create a
RawTask, useful for jobs where it's inconvenient to track "job complete" separate from the other job ready conditions.
- Add a server-side worker to handle sending of push notifications
- Disallow using ExceptT and similar monads to host runDb calls
- Add
mapAuthto rhyolite frontend to allow mapping of application credentials into an "authenticated" subwidget - Update frontend for obelisk's new hydation feature
- Add Rhyolite.Frontend.Widget to collect useful widgets like
extensibleListWidget- a widget for editing a list of values - Add Rhyolite.Frontend.Form, a collection of widgets to help with form validation
- Backend notifications are now typed. This is a breaking change: you'll need to specify your expected notification as a GADT and supply the appropriate GADT constructor when constructing notifications
- Add a worker for handling unqueued tasks that the backend must run. See
Rhyolite.Backend.TaskWorker