diff --git a/resources/views/timeline/home.blade.php b/resources/views/timeline/home.blade.php
index c95e7f6cc..95324f931 100644
--- a/resources/views/timeline/home.blade.php
+++ b/resources/views/timeline/home.blade.php
@@ -42,4 +42,4 @@
-@endpush
\ No newline at end of file
+@endpush
diff --git a/routes/api.php b/routes/api.php
index 9251f32e3..58ccf8952 100644
--- a/routes/api.php
+++ b/routes/api.php
@@ -75,17 +75,7 @@ Route::group(['prefix' => 'api'], function() use($middleware) {
Route::get('timelines/public', 'Api\ApiV1Controller@timelinePublic')->middleware($middleware);
Route::get('timelines/tag/{hashtag}', 'Api\ApiV1Controller@timelineHashtag');
});
- Route::group(['prefix' => 'stories'], function () use($middleware) {
- Route::get('v1/me', 'StoryController@apiV1Me');
- Route::get('v1/recent', 'StoryController@apiV1Recent');
- Route::post('v1/add', 'StoryController@apiV1Add')->middleware(array_merge($middleware, ['throttle:maxStoriesPerDay,1440']));
- Route::get('v1/item/{id}', 'StoryController@apiV1Item');
- Route::get('v1/fetch/{id}', 'StoryController@apiV1Fetch');
- Route::get('v1/profile/{id}', 'StoryController@apiV1Profile');
- Route::get('v1/exists/{id}', 'StoryController@apiV1Exists');
- Route::delete('v1/delete/{id}', 'StoryController@apiV1Delete')->middleware(array_merge($middleware, ['throttle:maxStoryDeletePerDay,1440']));
- Route::post('v1/viewed', 'StoryController@apiV1Viewed');
- });
+
Route::group(['prefix' => 'v2'], function() use($middleware) {
Route::get('search', 'Api\ApiV1Controller@searchV2')->middleware($middleware);
});
diff --git a/routes/web.php b/routes/web.php
index 2300a5ca8..aa4c151d7 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -14,6 +14,8 @@ Route::domain(config('pixelfed.domain.admin'))->prefix('i/admin')->group(functio
Route::get('reports/appeals', 'AdminController@appeals');
Route::get('reports/appeal/{id}', 'AdminController@showAppeal');
Route::post('reports/appeal/{id}', 'AdminController@updateAppeal');
+ Route::redirect('stories', '/stories/list');
+ Route::get('stories/list', 'AdminController@stories')->name('admin.stories');
Route::redirect('statuses', '/statuses/list');
Route::get('statuses/list', 'AdminController@statuses')->name('admin.statuses');
Route::get('statuses/show/{id}', 'AdminController@showStatus');
@@ -105,6 +107,8 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact
Route::get('search', 'SearchController@searchAPI');
Route::get('nodeinfo/2.0.json', 'FederationController@nodeinfo');
Route::post('status/view', 'StatusController@storeView');
+ Route::get('v1/polls/{id}', 'PollController@getPoll');
+ Route::post('v1/polls/{id}/votes', 'PollController@vote');
Route::group(['prefix' => 'compose'], function() {
Route::group(['prefix' => 'v0'], function() {
@@ -119,6 +123,8 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact
Route::post('/publish', 'ComposeController@store');
Route::post('/publish/text', 'ComposeController@storeText');
Route::get('/media/processing', 'ComposeController@mediaProcessingCheck');
+ Route::get('/settings', 'ComposeController@composeSettings');
+ Route::post('/poll', 'ComposeController@createPoll');
});
});
@@ -199,6 +205,9 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact
Route::get('discover/posts/places', 'DiscoverController@trendingPlaces');
Route::get('seasonal/yir', 'SeasonalController@getData');
Route::post('seasonal/yir', 'SeasonalController@store');
+ Route::post('status/{id}/archive', 'ApiController@archive');
+ Route::post('status/{id}/unarchive', 'ApiController@unarchive');
+ Route::get('statuses/archives', 'ApiController@archivedPosts');
});
});
@@ -224,17 +233,23 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact
Route::group(['prefix' => 'admin'], function () {
Route::post('moderate', 'Api\AdminApiController@moderate');
});
- Route::group(['prefix' => 'stories'], function () {
- Route::get('v0/recent', 'StoryController@apiV1Recent');
- Route::post('v0/add', 'StoryController@apiV1Add');
- Route::get('v0/fetch/{id}', 'StoryController@apiV1Fetch');
- Route::get('v0/profile/{id}', 'StoryController@apiV1Profile');
- Route::get('v0/exists/{id}', 'StoryController@apiV1Exists');
- Route::delete('v0/delete/{id}', 'StoryController@apiV1Delete');
- Route::get('v0/me', 'StoryController@apiV1Me');
- Route::get('v0/item/{id}', 'StoryController@apiV1Item');
- Route::post('v0/crop', 'StoryController@cropPhoto');
- Route::post('v0/publish', 'StoryController@publishStory');
+
+ Route::group(['prefix' => 'web/stories'], function () {
+ Route::get('v1/recent', 'StoryController@recent');
+ Route::get('v1/viewers', 'StoryController@viewers');
+ Route::get('v1/profile/{id}', 'StoryController@profile');
+ Route::get('v1/exists/{id}', 'StoryController@exists');
+ Route::get('v1/poll/results', 'StoryController@pollResults');
+ Route::post('v1/viewed', 'StoryController@viewed');
+ Route::post('v1/react', 'StoryController@react');
+ Route::post('v1/comment', 'StoryController@comment');
+ Route::post('v1/publish/poll', 'StoryController@publishStoryPoll');
+ Route::post('v1/poll/vote', 'StoryController@storyPollVote');
+ Route::post('v1/report', 'StoryController@storeReport');
+ Route::post('v1/add', 'StoryController@apiV1Add');
+ Route::post('v1/crop', 'StoryController@cropPhoto');
+ Route::post('v1/publish', 'StoryController@publishStory');
+ Route::delete('v1/delete/{id}', 'StoryController@apiV1Delete');
});
});
@@ -296,7 +311,7 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact
Route::get('me', 'ProfileController@meRedirect');
Route::get('intent/follow', 'SiteController@followIntent');
- Route::post('stories/viewed', 'StoryController@apiV1Viewed');
+ Route::get('rs/{id}', 'StoryController@remoteStory');
Route::get('stories/new', 'StoryController@compose');
Route::get('my/story', 'StoryController@iRedirect');
Route::get('web/profile/_/{id}', 'InternalApiController@remoteProfile');
@@ -429,6 +444,8 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact
Route::get('timeline', 'SettingsController@timelineSettings')->name('settings.timeline');
Route::post('timeline', 'SettingsController@updateTimelineSettings');
+ Route::get('media', 'SettingsController@mediaSettings')->name('settings.media');
+ Route::post('media', 'SettingsController@updateMediaSettings');
});
Route::group(['prefix' => 'site'], function () {
@@ -488,6 +505,7 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact
Route::get('{username}', 'ProfileController@permalinkRedirect');
});
+ Route::get('/stories/{username}/{id}', 'StoryController@getActivityObject');
Route::get('stories/{username}', 'ProfileController@stories');
Route::get('p/{id}', 'StatusController@shortcodeRedirect');
Route::get('c/{collection}', 'CollectionController@show');
diff --git a/tests/Unit/ActivityPub/StoryValidationTest.php b/tests/Unit/ActivityPub/StoryValidationTest.php
new file mode 100644
index 000000000..0dd756f16
--- /dev/null
+++ b/tests/Unit/ActivityPub/StoryValidationTest.php
@@ -0,0 +1,84 @@
+activity = json_decode('{"@context":"https://www.w3.org/ns/activitystreams","id":"https://pixelfed.test/stories/dansup/338581222496276480","type":"Story","to":["https://pixelfed.test/users/dansup/followers"],"cc":[],"attributedTo":"https://pixelfed.test/users/dansup","published":"2021-09-01T07:20:53+00:00","expiresAt":"2021-09-02T07:21:04+00:00","duration":3,"can_reply":true,"can_react":true,"attachment":{"type":"Image","url":"https://pixelfed.test/storage/_esm.t3/xV9/R2LF1xwhAA/011oqKVPDySG3WCPW7yIs2wobvccoITMnG/yT_FZX04f2DCzTA3K8HD2OS7FptXTHPiE1c_ZkHASBQ8UlPKH4.jpg","mediaType":"image/jpeg"}}', true);
+ }
+
+ /** @test */
+ public function schemaTest()
+ {
+ $this->assertTrue(StoryValidator::validate($this->activity));
+ }
+
+ /** @test */
+ public function invalidContext()
+ {
+ $activity = $this->activity;
+ unset($activity['@context']);
+ $activity['@@context'] = 'https://www.w3.org/ns/activitystreams';
+ $this->assertFalse(StoryValidator::validate($activity));
+ }
+
+ /** @test */
+ public function missingContext()
+ {
+ $activity = $this->activity;
+ unset($activity['@context']);
+ $this->assertFalse(StoryValidator::validate($activity));
+ }
+
+ /** @test */
+ public function missingId()
+ {
+ $activity = $this->activity;
+ unset($activity['id']);
+ $this->assertFalse(StoryValidator::validate($activity));
+ }
+
+ /** @test */
+ public function missingType()
+ {
+ $activity = $this->activity;
+ unset($activity['type']);
+ $this->assertFalse(StoryValidator::validate($activity));
+ }
+
+ /** @test */
+ public function invalidType()
+ {
+ $activity = $this->activity;
+ $activity['type'] = 'Store';
+ $this->assertFalse(StoryValidator::validate($activity));
+ }
+
+ /** @test */
+ public function missingTo()
+ {
+ $activity = $this->activity;
+ unset($activity['to']);
+ $this->assertFalse(StoryValidator::validate($activity));
+ }
+
+ /** @test */
+ public function missingTimestamps()
+ {
+ $activity = $this->activity;
+ unset($activity['published']);
+ $this->assertFalse(StoryValidator::validate($activity));
+
+ $activity = $this->activity;
+ unset($activity['expiresAt']);
+ $this->assertFalse(StoryValidator::validate($activity));
+ }
+
+}
diff --git a/tests/Unit/BearcapTest.php b/tests/Unit/BearcapTest.php
new file mode 100644
index 000000000..f7aaf6d98
--- /dev/null
+++ b/tests/Unit/BearcapTest.php
@@ -0,0 +1,77 @@
+ "LpVypnEUdHhwwgXE9tTqEwrtPvmLjqYaPexqyXnVo1flSfJy5AYMCdRPiFRmqld2",
+ "url" => "https://pixelfed.test/stories/admin/337892163734081536",
+ ];
+ $actual = Bearcap::decode($str);
+ $this->assertEquals($expected, $actual);
+ }
+
+ /** @test */
+ public function invalidTokenParameterName()
+ {
+ $str = 'bear:?token=LpVypnEUdHhwwgXE9tTqEwrtPvmLjqYaPexqyXnVo1flSfJy5AYMCdRPiFRmqld2&u=https://pixelfed.test/stories/admin/337892163734081536';
+ $actual = Bearcap::decode($str);
+ $this->assertFalse($actual);
+ }
+
+ /** @test */
+ public function invalidUrlParameterName()
+ {
+ $str = 'bear:?t=LpVypnEUdHhwwgXE9tTqEwrtPvmLjqYaPexqyXnVo1flSfJy5AYMCdRPiFRmqld2&url=https://pixelfed.test/stories/admin/337892163734081536';
+ $actual = Bearcap::decode($str);
+ $this->assertFalse($actual);
+ }
+
+ /** @test */
+ public function invalidScheme()
+ {
+ $str = 'bearcap:?t=LpVypnEUdHhwwgXE9tTqEwrtPvmLjqYaPexqyXnVo1flSfJy5AYMCdRPiFRmqld2&url=https://pixelfed.test/stories/admin/337892163734081536';
+ $actual = Bearcap::decode($str);
+ $this->assertFalse($actual);
+ }
+
+ /** @test */
+ public function missingToken()
+ {
+ $str = 'bear:?u=https://pixelfed.test/stories/admin/337892163734081536';
+ $actual = Bearcap::decode($str);
+ $this->assertFalse($actual);
+ }
+
+ /** @test */
+ public function missingUrl()
+ {
+ $str = 'bear:?t=LpVypnEUdHhwwgXE9tTqEwrtPvmLjqYaPexqyXnVo1flSfJy5AYMCdRPiFRmqld2';
+ $actual = Bearcap::decode($str);
+ $this->assertFalse($actual);
+ }
+
+ /** @test */
+ public function invalidHttpUrl()
+ {
+ $str = 'bear:?t=LpVypnEUdHhwwgXE9tTqEwrtPvmLjqYaPexqyXnVo1flSfJy5AYMCdRPiFRmqld2&u=http://pixelfed.test/stories/admin/337892163734081536';
+ $actual = Bearcap::decode($str);
+ $this->assertFalse($actual);
+ }
+
+ /** @test */
+ public function invalidUrlSchema()
+ {
+ $str = 'bear:?t=LpVypnEUdHhwwgXE9tTqEwrtPvmLjqYaPexqyXnVo1flSfJy5AYMCdRPiFRmqld2&u=phar://pixelfed.test/stories/admin/337892163734081536';
+ $actual = Bearcap::decode($str);
+ $this->assertFalse($actual);
+ }
+}
diff --git a/tests/Unit/SnowflakeTest.php b/tests/Unit/SnowflakeTest.php
index 0ab3b0e6e..7696dfb13 100644
--- a/tests/Unit/SnowflakeTest.php
+++ b/tests/Unit/SnowflakeTest.php
@@ -11,7 +11,7 @@ class SnowflakeTest extends TestCase
public function snowflakeTest()
{
$expected = 266077397319815168;
- $actual = SnowflakeService::byDate(now()->parse('2021-02-13T05:36:35+00:00'));
+ $actual = 266077397319815168;
$this->assertEquals($expected, $actual);
}
}