Age | Commit message (Collapse) | Author | Files | Lines | |
---|---|---|---|---|---|
2018-04-15 | feat(handlers): Implement post editing handler | Vincent Ambo | 3 | -2/+31 | |
Implements a handler that receives the edit form result and updates the database accordingly if the user identity matches. | |||||
2018-04-15 | feat(db): Support UpdatePost message | Vincent Ambo | 1 | -0/+23 | |
Simple message intended to be used for post editing. | |||||
2018-04-15 | feat(handlers/render): Display edit form for user's own posts | Vincent Ambo | 4 | -1/+62 | |
Displays an edit form for posts that are owned by a user (which is currently defined as "email addresses match"). | |||||
2018-04-15 | feat(db): Support GetPost message | Vincent Ambo | 1 | -0/+16 | |
Very simple message that retrieves a post from the DB. | |||||
2018-04-15 | refactor: Add a message!-macro to reduce message boilerplate | Vincent Ambo | 4 | -48/+22 | |
2018-04-15 | refactor(render): Pass serializable structs to Tera directly | Vincent Ambo | 1 | -9/+3 | |
No need to go the intermediate step via `Context::new()` | |||||
2018-04-15 | refactor(templates/render): Add generic post editing template | Vincent Ambo | 3 | -15/+52 | |
Adds a generic template that can be used for submitting, responding to and editing posts. | |||||
2018-04-15 | refactor(main): Split enormous main() into smaller methods | Vincent Ambo | 1 | -38/+58 | |
A little bit of logical grouping of things has never hurt anyone. | |||||
2018-04-15 | fix(handlers): Trim leading/trailing whitespace from new threads | Vincent Ambo | 1 | -6/+12 | |
2018-04-15 | feat(handlers): Determine whether current user can edit a post | Vincent Ambo | 3 | -3/+19 | |
2018-04-14 | refactor(handlers): Receive search terms via query parameters | Vincent Ambo | 2 | -4/+4 | |
There are several reasons for this, but one important one is that people expect to be able to share search links. | |||||
2018-04-14 | fix(render): Escape post bodies | Vincent Ambo | 1 | -1/+2 | |
... derp. Well, the CSP prevented script executions already. | |||||
2018-04-14 | feat: Implement search result view & enable search | Vincent Ambo | 4 | -1/+39 | |
Implements a very simple and currently kinda broken-looking search result view. | |||||
2018-04-14 | chore(db): Arbitrarily limit search result size | Vincent Ambo | 1 | -0/+1 | |
... until pagination is in place. | |||||
2018-04-14 | feat(main/db): Schedule regular search view refresh | Vincent Ambo | 3 | -0/+50 | |
Schedules refreshes of the database view used for search at one-minute intervals. | |||||
2018-04-14 | refactor(schema): Unify integer type usage across tables | Vincent Ambo | 1 | -2/+2 | |
2018-04-14 | refactor(handlers): Improve error handling in post creation | Vincent Ambo | 1 | -2/+2 | |
2018-04-14 | feat(db): Implement handling of 'SearchPosts' message | Vincent Ambo | 2 | -1/+61 | |
Adds support for executing full-text search across a forum instance by sending the `SearchPosts` message with a search query to the DB actor. The struct used for results is mapped manually to the expected query result as the query is embedded via raw SQL. | |||||
2018-04-14 | feat(templates): Highlight stickied threads in index | Vincent Ambo | 1 | -0/+2 | |
2018-04-14 | feat(db): Add support for stickies in database | Vincent Ambo | 3 | -5/+13 | |
Adds a 'sticky' column to threads and rewrites the thread index to take sticky markings into account when ordering threads. Stickies are not yet highlighted in any way in the forum overview. | |||||
2018-04-14 | feat(db): Add view for ordering thread index by most recent post | Vincent Ambo | 4 | -7/+29 | |
This implements the classic thread ordering expected by most forum users (i.e. the thread with the most recent post is at the top). | |||||
2018-04-14 | feat: License project under GPLv3 | Vincent Ambo | 7 | -0/+112 | |
2018-04-14 | refactor(db): Store thread body in the posts table | Vincent Ambo | 5 | -23/+36 | |
This is a simplification over the previous approach. The OP of a thread is just a normal post like any other in this model, which allows some code simplifications (and future query convenience). | |||||
2018-04-12 | feat(handlers/main): Add 'anonymous' mode for forum | Vincent Ambo | 2 | -9/+27 | |
Adds a `REQUIRE_LOGIN` environment variable which, if set to anything other than true, will let users post anonymously on the forums. | |||||
2018-04-12 | feat(handler): Perform basic input validation on new thread view | Vincent Ambo | 2 | -5/+32 | |
2018-04-12 | fix(handlers): Fix chained error handling in actors | Vincent Ambo | 1 | -14/+15 | |
This took me some time to figure out so it's useful to document in the commit message. When chaining messages from actors, the result type of a message (i.e. the actual `<M as Message>::Result`) is sometimes itself a `Result<T, E>`. In many cases this leads to a situation where the return type of a message sending process is something like (simplified): Future<Item=Result<Foo, ConverseError>, Error=actix::MailboxError> Due to the implementation of `From<actix::MailboxError> for ConverseError` it is possible to use `.from_err()` on these futures to convert the future's `Error` to `ConverseError`. The type `Result` apparently implements `IntoFuture`, which means that due to some trait magic that's been applied somewhere in the futures API a call to `flatten()` can "lift" the contained error if the error types match and give us a "simple" Future<Item=Foo, Error=ConverseError> From that point on chaining becomes easy. | |||||
2018-04-11 | chore(handlers): Remove unused code | Vincent Ambo | 1 | -8/+0 | |
2018-04-11 | fix(templates/handlers): Fix post anchors | Vincent Ambo | 1 | -1/+1 | |
- ensure users are correctly linked to a post actor after replying - ensure timestamps are clickable to get post IDs | |||||
2018-04-11 | chore: Clean up unused imports | Vincent Ambo | 2 | -3/+1 | |
2018-04-11 | feat(render): Use a more human-readable format for dates | Vincent Ambo | 1 | -5/+15 | |
2018-04-11 | fix(render): Escape thread titles in index | Vincent Ambo | 1 | -1/+19 | |
2018-04-11 | feat(render): Implement Markdown thread rendering & Gravatar | Vincent Ambo | 2 | -10/+79 | |
Implements a new thread rendering pipeline which all posts and the main thread body are first converted to a `RenderablePost` structure. During the conversion to this structure, the post body is rendered as Markdown and the author's email address is converted into the format required by Gravatar. | |||||
2018-04-11 | chore(cargo): Add md5 crate dependency | Vincent Ambo | 1 | -0/+2 | |
Required for Gravatar. | |||||
2018-04-11 | fix(main): Correctly set up rendering actor | Vincent Ambo | 1 | -3/+7 | |
2018-04-11 | refactor(handlers): Use rendering actor for page renders | Vincent Ambo | 1 | -45/+27 | |
This currently breaks error handling in page render flows. To fix it properly, the database actor should return failable futures instead of `Result<T>` wrapped in a future. | |||||
2018-04-11 | feat(render): Add rendering actor | Vincent Ambo | 2 | -1/+72 | |
Adds a separate actor that handles page rendering, templating engine state and other related topics. | |||||
2018-04-10 | fix(main): Update cookie session setup for new actix-web | Vincent Ambo | 1 | -4/+3 | |
2018-04-09 | fix(db): Order index threads in descending post time | Vincent Ambo | 1 | -1/+3 | |
Technically the last post date should matter more here, but we'll get there. | |||||
2018-04-09 | feat(handlers/templates): Add "New Thread" handler and template | Vincent Ambo | 2 | -1/+10 | |
2018-04-09 | feat(handlers): Extract & add author to thread and post information | Vincent Ambo | 3 | -6/+46 | |
2018-04-09 | feat(main): Initialise RequireLogin middleware on launch | Vincent Ambo | 1 | -4/+11 | |
2018-04-09 | feat(handlers): Add RequireLogin middleware | Vincent Ambo | 2 | -4/+27 | |
Adds a middleware that automatically redirects users to the login page if they don't have an active session (i.e. 'author' set). | |||||
2018-04-09 | fix(main): Generate random session key | Vincent Ambo | 1 | -1/+10 | |
2018-04-08 | feat(handlers): Use cookie session backend to store author info | Vincent Ambo | 3 | -12/+34 | |
2018-04-08 | feat(main): Configure & start OIDC actor when Converse launches | Vincent Ambo | 1 | -5/+33 | |
2018-04-08 | feat(handler): Implement OIDC login & callback handlers | Vincent Ambo | 1 | -0/+23 | |
2018-04-08 | chore(models/schema): Update with author fields | Vincent Ambo | 2 | -0/+8 | |
2018-04-08 | feat(oidc): Implement initial OIDC actor | Vincent Ambo | 3 | -2/+152 | |
Implements an actor that can perform OAuth2 logins (not really OIDC-compliant yet because Rust doesn't have an easy to use JWT library that supports JWKS, and I don't have time for that right now). Currently this hardcodes some Office365-specific stuff. | |||||
2018-04-08 | feat(handlers): Add reply_thread handler for posts | Vincent Ambo | 2 | -2/+18 | |
2018-04-08 | feat(db/models): Add handling of CreatePost message | Vincent Ambo | 2 | -2/+30 | |