Commit Graph

411 Commits

Author SHA1 Message Date
Toby Zerner
b7617fa5d3 Get rid of total count from UserSearcher
Same reasoning as 64e6b7d26c
2015-06-18 12:42:56 +09:30
Toby Zerner
11b740c768 Make sure user activity is synced when whole discussions are deleted
We need to fire the PostWasDeleted event for every post when a
discussion is deleted. This means deleting big discussions will be an
intensive process, but that’s OK because it’s very rare.
2015-06-18 12:41:00 +09:30
Toby Zerner
9cb257e11d Update core permissions stuff 2015-06-18 12:38:24 +09:30
Toby Zerner
1dd46526a8 Merge query params into request input as well 2015-06-18 12:24:51 +09:30
Toby Zerner
7bf1fad9d6 Fix fatal error on delete actions 2015-06-18 12:24:31 +09:30
Toby Zerner
4792a47265 Define static properties on SerializeAction subclasses
Explained in d1e7453ffd.

If we ever come up with a better way of doing this it should be easy to
change over, since modification of these properties by extensions is
abstracted by an Extend API.
2015-06-18 12:24:18 +09:30
Toby Zerner
64b87f55c5 Revert "Prefix API routes for now"
This reverts commit f669b95fd1.
2015-06-17 18:14:41 +09:30
Toby Zerner
25d375cad4 Back to rewritten URLs 2015-06-17 17:58:43 +09:30
Toby Zerner
f669b95fd1 Prefix API routes for now 2015-06-17 17:48:50 +09:30
Toby Zerner
7596dec7b9 Comply to new interface 2015-06-17 12:48:10 +09:30
Toby Zerner
61bea371ab Use UrlGenerator to get avatar URL 2015-06-17 12:48:01 +09:30
Toby Zerner
b91ca93e09 Fix LoginWithCookie middleware being ineffective
Flarum\Support\Actor needs to be a singleton. There is a comment in
LoginWithHeader - is there a better approach to the whole Actor thing?
2015-06-17 12:47:49 +09:30
Toby Zerner
00cb2f2e55 Change event so that data can be modified before it is serialized 2015-06-17 12:46:50 +09:30
Franz Liedke
708782637e Change config values to match new base URLs 2015-06-17 02:37:06 +02:00
Franz Liedke
e8aff5bc95 Make sure generated usernames cannot break validation 2015-06-17 02:36:51 +02:00
Franz Liedke
ce34d922d7 Fix merge conflict 2015-06-17 01:27:44 +02:00
Franz Liedke
29c7bf1b42 Remove debug statement 2015-06-17 00:53:03 +02:00
Franz Liedke
1cbc60ca41 Merge branch 'master' into psr-7
Conflicts:
	src/Api/Actions/Discussions/IndexAction.php
	src/Api/Actions/SerializeAction.php
	src/Core/Formatter/FormatterManager.php
	src/Extend/ForumAssets.php
	src/Forum/Actions/IndexAction.php
	src/Forum/ForumServiceProvider.php
2015-06-17 00:52:50 +02:00
Franz Liedke
ffb28838b5 Add TODO message 2015-06-17 00:18:16 +02:00
Franz Liedke
33d663bc8e Revamp routing
All routes are now stored in a RouteCollection, which is then used
for dispatching by the (reusable) RouterMiddleware.

This change also entails moving all routes to the service providers.
This may be changed again later, and is done for convenience reasons
right now.
2015-06-17 00:16:35 +02:00
Toby Zerner
d1e7453ffd Override static property
@franzliedke I didn’t realise that static properties are static to the
class they are defined on, and not each individual subclass. All of the
static members of the SerializeAction class (which are intended for
extensions to alter per-action) are being inherited by all actions.

Any ideas on how to work around this other than defining every static
member on each individual subclass?
2015-06-16 21:55:59 +09:30
Toby Zerner
4b4ff1e7fd Add API to add a link to an action 2015-06-16 17:39:47 +09:30
Toby Zerner
f0df751465 Overhaul permissions
Get rid of Permissible - too complex and inefficient. Replace with:
- a “Locked” trait which works similarly but only evaluates logic on
hydrated models.
- a “VisibleScope” trait which also works similarly but only scopes
queries

This is all we need, Permissible is overkill. There is only one
instance where we have to duplicate some logic
(Discussion::scopeVisiblePosts and Post::allow(‘view’, …)) but it’s
barely anything.

Haven’t decoupled for now, we can definitely look at doing that later.

Permissions table seeder slightly updated.

Also did a bit of a query audit, there’s still a lot to be done but
it’s much better than it was. Some relatively low-hanging fruit
detailed in EloquentPostRepository.
2015-06-16 17:33:56 +09:30
Toby Zerner
be2d0ac682 Add WillRespond event
So that custom data can be loaded onto a model before it is serialized.
(Tags extension uses this to load tags onto the forum model.)
2015-06-16 17:22:15 +09:30
Toby Zerner
c20a5bb793 Static relationship collections need to be initialised on subclasses
Will probably make this whole “custom relationships” thing a trait
instead of being on the base class
2015-06-16 17:21:04 +09:30
Toby Zerner
963078b375 Cache user permissions between calls 2015-06-16 17:18:02 +09:30
Toby Zerner
9ac1f53244 Add todo about query optimization 2015-06-16 16:59:48 +09:30
Toby Zerner
64e6b7d26c Remove total results from discussion searching
It’s too inefficient (requires a whole table scan) to do a query like:
select count(*) from discussions where [conditions determining
visibility]
2015-06-16 16:58:10 +09:30
Toby Zerner
c1e3820480 Add a serializer and API action to get information about the forum 2015-06-15 12:18:20 +09:30
Toby Zerner
823027b839 Prefer passing an array to ServiceProvider::extend 2015-06-15 08:59:33 +09:30
Toby Zerner
9997c5d7a3 Update permissions 2015-06-12 16:41:46 +09:30
Toby Zerner
8cebb4d8e6 API: Reorder Extend\Relationship arguments 2015-06-11 18:42:49 +09:30
Toby Zerner
48e33591c9 Add newline in-between JS files, in case last line is a comment 2015-06-11 18:42:26 +09:30
Toby Zerner
8b162344cd Lay the groundwork for translation & refactor asset compilation
Ditched the idea of having language packs as extensions. Reasoning:

1. Because we use machine keys for translations (rather than English
keys), extensions need to be able to define default translations. If
English translations are to be included in extensions and not in a
language pack extension, then it doesn’t make sense to have other
languages as language pack extensions. Inconsistency → complexity.

2. Translations should maintain version parity with their respective
extensions. There’s no way to do this if extension translations are
external to the extension.

Instead, localisation will be a core effort, as well as a per-extension
effort. Translators will be encouraged to send PRs to core + extensions.

In core, each locale has a directory containing three files:
- translations.yml
- config.js: contains pluralisation logic for the JS app, as well as
moment.js localisation if necessary
- config.php: contains pluralisation logic for the PHP app

Extensions can use the Flarum\Extend\Locale extender to add/override
translations/config to a locale.

Asset compilation has been completely refactored with a better
architecture. Translations + config.js are compiled and cached for the
currently active locale.
2015-06-10 14:23:56 +09:30
Franz Liedke
b65d18ee7f Use singleton method 2015-06-09 02:51:20 +02:00
Franz Liedke
d1cd4b174b Remove last remaining usage of DB facade 2015-06-09 02:40:02 +02:00
Franz Liedke
2a713ccb67 Remove HTTP method from generated URLs 2015-06-09 00:06:33 +02:00
Franz Liedke
fed3c2ebd1 Remove facade usage 2015-06-09 00:06:08 +02:00
Franz Liedke
238893a601 Get rid of more facade usage 2015-06-08 11:21:42 +02:00
Franz Liedke
38dfe787f2 Avoid usage of facade in user model 2015-06-08 11:20:46 +02:00
Franz Liedke
4db5cc347b Fix cookie retrieval in admin panel 2015-06-08 10:00:29 +02:00
Franz Liedke
f3c854ca57 Always initialize variable 2015-06-08 09:49:07 +02:00
Toby Zerner
0450aba462 Remove old code. 2015-06-08 14:57:05 +09:30
Toby Zerner
36257b1534 Load extensions from the root directory, with precedence. 2015-06-08 14:56:49 +09:30
Toby Zerner
b864ada389 Add extension generator command. 2015-06-08 14:56:19 +09:30
Toby Zerner
4d2f58b693 Clear bio HTML cache when saving bio 2015-06-08 09:50:07 +09:30
Toby Zerner
7a76bf175d Make HTMLPurifier config extensible; allow images 2015-06-08 09:37:30 +09:30
Toby Zerner
f928e746d9 Prevent formatter from being invoked if bio is empty 2015-06-08 09:34:39 +09:30
Franz Liedke
1962eeab72 Remove outdated column name from user table seeder 2015-06-07 22:04:11 +02:00
Franz Liedke
c2df8d5214 Merge branch 'master' into psr-7
Conflicts:
	composer.json
	composer.lock
	src/Api/Actions/TokenAction.php
	src/Core/Formatter/FormatterManager.php
	src/Core/Handlers/Events/EmailConfirmationMailer.php
	src/Forum/Actions/ConfirmEmailAction.php
	src/Forum/Actions/IndexAction.php
	src/Forum/Actions/ResetPasswordAction.php
	src/Forum/Actions/SavePasswordAction.php
	src/Forum/routes.php
2015-06-06 13:59:59 +02:00
Toby Zerner
381e7a2c57 Usernames must only contain alphanumeric chars/dashes/underscores
Perhaps we can relax this a little bit, but right now these are the
only characters that are parsed for @mentions anyway
2015-06-04 11:19:23 +09:30
Toby Zerner
aae7678cea Really rough fulltext driver implementation 2015-06-04 11:11:56 +09:30
Toby Zerner
42851f425b Rejig formatting API. closes flarum/core#85
It works but it’s not the most pretty thing in the world. @franzliedke
Would be great if you could take a look at the whole formatting API and
work your magic on it sometime… my brain is fried!
2015-06-04 10:48:07 +09:30
Toby Zerner
9487a56d61 Allow <hr> in posts 2015-06-03 18:12:15 +09:30
Toby Zerner
5d89618bbd Implement search on front end 2015-06-03 18:10:56 +09:30
Franz Liedke
9564778701 Upgrade to stable cookie dependency 2015-06-03 10:17:59 +02:00
Franz Liedke
5151a5aef5 Fix login response not containing the token 2015-06-03 03:41:09 +02:00
Franz Liedke
82ccf28072 Fix redirect after logout 2015-06-03 03:36:49 +02:00
Franz Liedke
ed79f7c4ea Fix middleware if cookie does not exist. 2015-06-03 03:36:17 +02:00
Franz Liedke
2ba7a2044b Fix redirect helper. 2015-06-03 03:35:30 +02:00
Franz Liedke
79480242a7 Use contracts for typehints where possible. 2015-06-03 03:21:24 +02:00
Franz Liedke
7383c14eae Remove lots of unneeded imports. 2015-06-03 03:20:58 +02:00
Franz Liedke
8c40c2b4ad Get rid of unneeded injected dependency. 2015-06-03 03:19:32 +02:00
Franz Liedke
203c21846c Use API client class in admin action, too 2015-06-03 03:18:33 +02:00
Franz Liedke
7b45ca3a78 Typehint container contract instead of application class.
This helps us in decoupling from Laravel, as we only need any
implementation of the container contract now.
2015-06-03 03:05:10 +02:00
Franz Liedke
c616cd811b Use the new client class to consume API actions 2015-06-03 02:40:24 +02:00
Franz Liedke
a94a9afdcc Create an API client class.
This should make it easier to make API calls from the frontends.
2015-06-03 02:39:01 +02:00
Franz Liedke
d462eb585e Convert forum app to be PSR-7 compatible.
I also installed one new dependency: a helper library that makes it
easier to read and write cookies, given that there are no helper methods
for these purposes in the PSR-7 standard.
2015-06-03 02:04:57 +02:00
Franz Liedke
7f83552cbb Make JSON parameter middleware a bit more generic 2015-06-03 02:04:00 +02:00
Franz Liedke
33ae52a30c Fix responses returned by JSON helper. 2015-06-03 02:02:28 +02:00
Toby Zerner
6cf1dbe648 Add HTMLPurifier after formatters are run.
After a morning of searching, it seems there is no PHP Markdown library
that has built-in XSS/sanitization support. The recommended solution is
to use HTMLPurifier.

This actually works out OK, though, as it’s probably a good idea to
enforce sanitization regardless of which formatters are enabled, and to
not leave them with the responsibility of sanitization (it’s a big
responsibility). Since we cache rendered posts, the slow speed of
HTMLPurifier isn’t a concern.

Note that HTMLPurifier requires a file to be loaded by Composer, but
Studio does not yet support this, so for now I have included it
manually.
2015-06-02 11:36:25 +09:30
Toby Zerner
fb3038d128 Password cannot be null 2015-06-01 17:55:52 +09:30
Toby Zerner
82377f2302 Fix error on account registration 2015-06-01 17:55:41 +09:30
Toby Zerner
5d28fc2713 Only validate dirty attributes
To prevent unique-checking queries on every update
2015-06-01 12:26:44 +09:30
Toby Zerner
3334063740 Use pre-loaded state if applicable. closes flarum/core#89 2015-06-01 12:26:11 +09:30
Toby Zerner
bb1491e19e Extract current user attributes into a separate serializer
This prevents the unread notifications count query being run for every
post by the currently authenticated user
2015-06-01 12:25:40 +09:30
Toby Zerner
0f9549f4b9 Remove default relationships from serializers 2015-06-01 12:24:06 +09:30
Toby Zerner
351775ef02 Add NotificationWillBeSent event 2015-06-01 08:52:04 +09:30
Toby Zerner
a1da95962d Move theme config to database 2015-05-31 11:18:19 +09:30
Toby Zerner
78e10ec541 Eager load notification relationships 2015-05-30 13:57:39 +09:30
Franz Liedke
a1f5060c05 Remove obsolete imports 2015-05-28 23:52:40 +02:00
Franz Liedke
8a57922833 For now, inject URL generator instead of providing helper method. 2015-05-28 23:46:56 +02:00
Franz Liedke
76114f2979 Implement helper for generating routes in API actions. 2015-05-27 23:59:41 +02:00
Franz Liedke
9526dbf210 Create URL generator interface.
Also bind a default implementation to the container.
2015-05-27 23:58:43 +02:00
Toby Zerner
2741923714 Improvements to change/forgot password 2015-05-27 16:25:44 +09:30
Toby Zerner
696bfe5a07 Improve email changing/confirmation stuff 2015-05-27 16:24:54 +09:30
Franz Liedke
7ab3437136 Switch admin app to new PSR-7 driven architecture 2015-05-27 03:02:10 +02:00
Franz Liedke
95677e05e3 Add another abstract action base class for dealing with returned views 2015-05-27 03:01:09 +02:00
Franz Liedke
cff0e96eaa Implement helper method for redirecting 2015-05-27 02:48:08 +02:00
Franz Liedke
05cecf080e Fixes to comply with PSR-2 2015-05-27 02:37:27 +02:00
Franz Liedke
97e43c5431 Update ForgotAction to comply with changes in base class 2015-05-27 01:58:39 +02:00
Franz Liedke
343da9fc40 Extract another middleware from API routing 2015-05-27 01:55:46 +02:00
Franz Liedke
3ff230dc26 Change API to use PSR-7 style requests and responses
This required some interface changes (mostly changing Laravel's or
Symfony's request and response classes to those of Zend's Diactoros.
Some smaller changes to the execution flow in a few of the abstract
action base classes, but nothing substantial.

Note: The request and response classes are immutable, so we usually
need to return new instances after modifying the old ones.
2015-05-27 01:55:05 +02:00
Franz Liedke
910d96f905 Fix a typo 2015-05-27 01:49:14 +02:00
Franz Liedke
be97f5f303 Implement a minimal router using FastRoute.
This will be able to dispatch PSR-7-style requests to any callback
that returns a proper response object.

Largely based on my original work for FluxBB 2.0.
2015-05-27 01:49:14 +02:00
Toby Zerner
1ec2a4c742 Update email address confirmation subject 2015-05-26 18:07:27 +09:30
Toby Zerner
e5532d9618 Roughly implement change password/email, delete account modals 2015-05-26 18:03:02 +09:30
Toby Zerner
85ba97ed5c Improve appearance/behaviour of login/signup/forgot modals 2015-05-26 16:25:25 +09:30
Toby Zerner
feb4676aa0 Very rough implementation of forgot password 2015-05-26 11:14:06 +09:30
Toby Zerner
d481a38029 Old code, don't need these! 2015-05-23 08:36:14 +09:30
Toby Zerner
f54acebaf0 Fix bad logic in edit permission that was allowing guests to edit posts. Closes #88 2015-05-21 15:53:59 +09:30
Toby Zerner
edc59f37e3 PSR-2: Remove empty lines 2015-05-20 12:33:26 +09:30
Toby Zerner
3c7078b423 New user activity feed API.
Originally the user activity feed was implemented using UNIONs. I was
looking at make an API to add activity “sources”, or extra UNION
queries (select from posts, mentions, etc.) but quickly realised that
this is too slow and there’s no way to make it scale.

So I’ve implemented an API which is very similar to how notifications
work (see previous commit). The `activity` table is an aggregation of
stuff that happens, and it’s kept in sync by an ActivitySyncer which is
used whenever a post it created/edited/deleted, a user is
mentioned/unmentioned, etc.

Again, the API is very simple (see Core\Activity\PostedActivity +
Core\Handlers\Events\UserActivitySyncer)
2015-05-20 12:30:27 +09:30
Toby Zerner
98b3d0f89e Simplify and improve notifications API.
It turns out that the idea of “sending” a notification is flawed. (What
happens if the notification subject is deleted shortly after? The
notified user would end up with a dud notification which would be
confusing. What about if a post is edited to mention an extra user? If
you sent out notifications, the users who’ve already been mentioned
would get a duplicate notification.)

Instead, I’ve introduced the idea of notification “syncing”. Whenever a
change is made to a piece of data (e.g. a post is created, edited, or
deleted), you make a common notification and “sync” it to a set of
users. The users who’ve received this notification before won’t get it
again. It will be sent out to new users, and hidden from users who’ve
received it before but are no longer recipients (e.g. users who’ve been
“unmentioned” in a post).

To keep track of this, we use the existing notifications database
table, with an added `is_deleted` column. The syncing/diffing is
handled all behind the scenes; the API is extremely simple (see
Core\Notifications\DiscussionRenamedNotification +
Core\Events\Handlers\DiscussionRenamedNotifier)
2015-05-20 12:24:01 +09:30
Toby Zerner
f2d1100ec3 Fix broken DeleteAction 2015-05-20 11:13:32 +09:30
Toby Zerner
5fede6fe6d Limit notifications to one per user when dispatching events 2015-05-19 11:24:43 +09:30
Toby Zerner
248c19de73 Experimenting with some new ways to handle config
For now I’ve chucked it on Flarum\Core as a static method, but
ultimately I think we will need a ConfigRepository abstraction (whether
it replaces or sits underneath the Flarum\Core static method I’m not
sure).

Also starting to think about multisite scenarios, I think this is
important. The Forum model could actually end up with a database table
behind it, and each forum would have its own config settings? Haven’t
really thought about it too hard yet…
2015-05-19 10:59:57 +09:30
Toby Zerner
0724aec77e Fix broken notification emailer 2015-05-19 10:53:17 +09:30
Toby Zerner
54c2eaff8e Fix notification preferences not being enabled by default 2015-05-19 10:12:19 +09:30
Toby Zerner
278ff7b9c2 Give all users guest permissions as well 2015-05-19 09:36:20 +09:30
Toby Zerner
811df6c278 Fix errors in DeleteAvatarAction/Command 2015-05-19 09:27:04 +09:30
Franz Liedke
1ab1631849 Fix the config table seeder
It should include the "extensions_enabled" key which is read
when initializing all extensions.
2015-05-19 01:53:37 +02:00
Franz Liedke
dd54803aaf Fix remaining PSR-2 issues. 2015-05-19 01:07:22 +02:00
Franz Liedke
7885c9a002 Fix coding standards to conform to PSR-2 2015-05-19 01:03:12 +02:00
Franz Liedke
7e4693a855 Fix code error, static methods can not be abstract. 2015-05-18 17:17:10 +02:00
Toby Zerner
8e24e7197e Rename ActivityPost to EventPost 2015-05-18 18:47:34 +09:30
Toby Zerner
1b4b03356a Better API error handling 2015-05-18 18:13:16 +09:30
Toby Zerner
4dfe6ee1d1 Add some extra optional functionality to the Extend\Permission API
- Automatically serialise the attribute
- Apply Permissible grant callbacks

Need to consider splitting the $permission property into two arguments
(currently have to explode by ‘.’)
2015-05-18 13:51:30 +09:30
Toby Zerner
7f48a98af8 Make discussion edit permission specific to renaming 2015-05-18 12:34:03 +09:30
Toby Zerner
50ea261c47 Update permissions table seeder with new structure 2015-05-18 12:31:38 +09:30
Toby Zerner
6522ecffbc Fix permission query error for Guest model. Fixes #84 2015-05-18 12:29:31 +09:30
Toby Zerner
4494001ef7 Fix error on discussion page 2015-05-18 08:00:14 +09:30
Toby Zerner
a577910d04 New object-based extension APIs 2015-05-17 10:19:54 +09:30
Toby Zerner
8e6adb9be0 Expose serializer/actor to extensions 2015-05-15 17:06:09 +09:30
Toby Zerner
b4e5f0e6e5 Simplify permissions and add API to register configurable ones
Lots of thought has gone into this; it will show up later when I do the
admin permissions interface / category permissions :)
2015-05-15 17:05:46 +09:30
Toby Zerner
9ca77d79a0 GitHub for Mac is silly, this should've been in the last commit 2015-05-14 22:41:08 +09:30
Toby Zerner
3925e5892c Rework notifications architecture
- The recipient(s) are the concern of the notifier/sender, not the
notification itself
- Allow “retraction” of notifications (e.g. if a discussion is
stickied, but then it is unstickied)
- Misc. cleanup
2015-05-14 22:41:08 +09:30
Toby Zerner
6517b1ec3e Fix user searching 2015-05-14 22:41:08 +09:30
Toby Zerner
23caaf668a Make MappedMorphTo available on all models
In case extensions want to add that kind of relationship to an existing
model (there’s no way to include traits at runtime)
2015-05-14 22:41:08 +09:30
Toby Zerner
9e81e9f955 Properly include to-many relations 2015-05-14 22:41:07 +09:30
Toby Zerner
c5420ef7df Include user in post creation response 2015-05-14 22:41:07 +09:30
Toby Zerner
9284db5076 Allow finding a post by discussion ID and number 2015-05-14 22:41:07 +09:30
Toby Zerner
781dc2ef0c New component for post excerpts, which will be shown in search results
Perhaps also in user activity stream. They are used in the mentions
extension.

In order to generate the excerpt, each formatter can implement a
“strip” method which basically converts block formatting into inline
formatting.
2015-05-14 22:41:05 +09:30
Toby Zerner
85fa9ca609 Fix incorrect attribute name 2015-05-11 12:12:00 +09:30
Toby Zerner
a1cd6417c7 Add API for adding a formatter 2015-05-11 12:11:26 +09:30
Toby Zerner
b4fd662000 Remove BasicFormatter; add LinkifyFormatter 2015-05-11 12:11:19 +09:30
Toby Zerner
e5f2355d17 Post can't be abstract because it needs to be instantiable for querying 2015-05-11 10:40:41 +09:30
Toby Zerner
d166757930 Extract mappedMorphTo function into a trait
Not sure if this is the best thing to do, it could also just be put on
the base Model class
2015-05-11 10:39:54 +09:30
Franz Liedke
825b4082de Copy the config.php file upon installation.
This allows us to know whether Flarum is already installed, so that
we can disable certain service providers when it isn't.

This should fix #67.
2015-05-08 20:44:53 +02:00
Franz Liedke
e1569beb00 Fix discussion seeder not using the correct post subtypes.
Related to #67.
2015-05-08 18:12:02 +02:00
Franz Liedke
2245b11bb1 Seed command: Only run seeders that have not been run as part of flarum:install command. 2015-05-08 15:15:09 +02:00
Franz Liedke
df8a035935 Remove obsolete line.
Related to #67.
2015-05-08 15:15:08 +02:00
Toby Zerner
023b8b9a9c Don't attempt deletion if the user doesn't have an avatar 2015-05-07 16:54:26 +09:30
Toby Zerner
c58fc07798 Actually use the calculated offset 2015-05-07 16:54:14 +09:30
Toby Zerner
b5169512cb Move some API error handling code around. It still sucks though 2015-05-07 16:08:20 +09:30
Toby Zerner
59d8d63acd Add preliminary avatar resizing 2015-05-07 13:59:07 +09:30
Toby Zerner
05e561d3d6 Add pagination links to JSON-API index actions 2015-05-07 08:22:15 +09:30
Toby Zerner
8e1f6db85d Change mergeInto return signature; only merge posts if same user 2015-05-07 06:38:40 +09:30
Toby Zerner
80aaf42a53 Fix signup error 2015-05-06 12:12:31 +09:30
Toby Zerner
bde9bf9378 Fix FontAwesome path 2015-05-06 12:12:22 +09:30