diff --git a/docs/.vitepress/config.js b/docs/.vitepress/config.js index 833b5dc..a84ca3a 100644 --- a/docs/.vitepress/config.js +++ b/docs/.vitepress/config.js @@ -1,12 +1,522 @@ import 'dotenv/config'; +const referenceSidebarItems = [ + { + text: 'Wiki', + collapsed: true, + items: [ + { + text: 'Anime', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/anime/' }, + { text: 'Destroy', link: '/wiki/anime/destroy/' }, + { text: 'Force Delete', link: '/wiki/anime/forceDelete/' }, + { text: 'Index', link: '/wiki/anime/index/' }, + { text: 'Restore', link: '/wiki/anime/restore/' }, + { text: 'Show', link: '/wiki/anime/show/' }, + { text: 'Store', link: '/wiki/anime/store/' }, + { text: 'Update', link: '/wiki/anime/update/' }, + { text: 'Year Index', link: '/wiki/animeyear/index/' }, + { text: 'Year Show', link: '/wiki/animeyear/show/' } + ] + }, + { + text: 'Anime Image', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/animeimage/' }, + { text: 'Destroy', link: '/wiki/animeimage/destroy/' }, + { text: 'Index', link: '/wiki/animeimage/index/' }, + { text: 'Show', link: '/wiki/animeimage/show/' }, + { text: 'Store', link: '/wiki/animeimage/store/' } + ] + }, + { + text: 'Anime Resource', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/animeresource/' }, + { text: 'Destroy', link: '/wiki/animeresource/destroy/' }, + { text: 'Index', link: '/wiki/animeresource/index/' }, + { text: 'Show', link: '/wiki/animeresource/show/' }, + { text: 'Store', link: '/wiki/animeresource/store/' }, + { text: 'Update', link: '/wiki/animeresource/update/' } + ] + }, + { + text: 'Anime Series', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/animeseries/' }, + { text: 'Destroy', link: '/wiki/animeseries/destroy/' }, + { text: 'Index', link: '/wiki/animeseries/index/' }, + { text: 'Show', link: '/wiki/animeseries/show/' }, + { text: 'Store', link: '/wiki/animeseries/store/' } + ] + }, + { + text: 'Anime Studio', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/animestudio/' }, + { text: 'Destroy', link: '/wiki/animestudio/destroy/' }, + { text: 'Index', link: '/wiki/animestudio/index/' }, + { text: 'Show', link: '/wiki/animestudio/show/' }, + { text: 'Store', link: '/wiki/animestudio/store/' } + ] + }, + { + text: 'Anime Synonym', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/animesynonym/' }, + { text: 'Destroy', link: '/wiki/animesynonym/destroy/' }, + { text: 'Force Delete', link: '/wiki/animesynonym/forceDelete/' }, + { text: 'Index', link: '/wiki/animesynonym/index/' }, + { text: 'Restore', link: '/wiki/animesynonym/restore/' }, + { text: 'Show', link: '/wiki/animesynonym/show/' }, + { text: 'Store', link: '/wiki/animesynonym/store/' }, + { text: 'Update', link: '/wiki/animesynonym/update/' } + ] + }, + { + text: 'Anime Theme', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/animetheme/' }, + { text: 'Destroy', link: '/wiki/animetheme/destroy/' }, + { text: 'Force Delete', link: '/wiki/animetheme/forceDelete/' }, + { text: 'Index', link: '/wiki/animetheme/index/' }, + { text: 'Restore', link: '/wiki/animetheme/restore/' }, + { text: 'Show', link: '/wiki/animetheme/show/' }, + { text: 'Store', link: '/wiki/animetheme/store/' }, + { text: 'Update', link: '/wiki/animetheme/update/' } + ] + }, + { + text: 'Anime Theme Entry', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/animethemeentry/' }, + { text: 'Destroy', link: '/wiki/animethemeentry/destroy/' }, + { text: 'Force Delete', link: '/wiki/animethemeentry/forceDelete/' }, + { text: 'Index', link: '/wiki/animethemeentry/index/' }, + { text: 'Restore', link: '/wiki/animethemeentry/restore/' }, + { text: 'Show', link: '/wiki/animethemeentry/show/' }, + { text: 'Store', link: '/wiki/animethemeentry/store/' }, + { text: 'Update', link: '/wiki/animethemeentry/update/' } + ] + }, + { + text: 'Anime Theme Entry Video', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/animethemeentryvideo/' }, + { text: 'Destroy', link: '/wiki/animethemeentryvideo/destroy/' }, + { text: 'Index', link: '/wiki/animethemeentryvideo/index/' }, + { text: 'Show', link: '/wiki/animethemeentryvideo/show/' }, + { text: 'Store', link: '/wiki/animethemeentryvideo/store/' } + ] + }, + { + text: 'Artist', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/artist/' }, + { text: 'Destroy', link: '/wiki/artist/destroy/' }, + { text: 'Force Delete', link: '/wiki/artist/forceDelete/' }, + { text: 'Index', link: '/wiki/artist/index/' }, + { text: 'Restore', link: '/wiki/artist/restore/' }, + { text: 'Show', link: '/wiki/artist/show/' }, + { text: 'Store', link: '/wiki/artist/store/' }, + { text: 'Update', link: '/wiki/artist/update/' } + ] + }, + { + text: 'Artist Image', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/artistimage/' }, + { text: 'Destroy', link: '/wiki/artistimage/destroy/' }, + { text: 'Index', link: '/wiki/artistimage/index/' }, + { text: 'Show', link: '/wiki/artistimage/show/' }, + { text: 'Store', link: '/wiki/artistimage/store/' }, + { text: 'Update', link: '/wiki/artistimage/update/' } + ] + }, + { + text: 'Artist Member', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/artistmember/' }, + { text: 'Destroy', link: '/wiki/artistmember/destroy/' }, + { text: 'Index', link: '/wiki/artistmember/index/' }, + { text: 'Show', link: '/wiki/artistmember/show/' }, + { text: 'Store', link: '/wiki/artistmember/store/' }, + { text: 'Update', link: '/wiki/artistmember/update/' } + ] + }, + { + text: 'Artist Resource', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/artistresource/' }, + { text: 'Destroy', link: '/wiki/artistresource/destroy/' }, + { text: 'Index', link: '/wiki/artistresource/index/' }, + { text: 'Show', link: '/wiki/artistresource/show/' }, + { text: 'Store', link: '/wiki/artistresource/store/' }, + { text: 'Update', link: '/wiki/artistresource/update/' } + ] + }, + { + text: 'Artist Song', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/artistsong/' }, + { text: 'Destroy', link: '/wiki/artistsong/destroy/' }, + { text: 'Index', link: '/wiki/artistsong/index/' }, + { text: 'Show', link: '/wiki/artistsong/show/' }, + { text: 'Store', link: '/wiki/artistsong/store/' }, + { text: 'Update', link: '/wiki/artistsong/update/' } + ] + }, + { + text: 'Audio', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/audio/' }, + { text: 'Destroy', link: '/wiki/audio/destroy/' }, + { text: 'Force Delete', link: '/wiki/audio/forceDelete/' }, + { text: 'Index', link: '/wiki/audio/index/' }, + { text: 'Restore', link: '/wiki/audio/restore/' }, + { text: 'Show', link: '/wiki/audio/show/' }, + { text: 'Store', link: '/wiki/audio/store/' }, + { text: 'Update', link: '/wiki/audio/update/' } + ] + }, + { + text: 'Group', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/group/' }, + { text: 'Destroy', link: '/wiki/group/destroy/' }, + { text: 'Force Delete', link: '/wiki/group/forceDelete/' }, + { text: 'Index', link: '/wiki/group/index/' }, + { text: 'Restore', link: '/wiki/group/restore/' }, + { text: 'Show', link: '/wiki/group/show/' }, + { text: 'Store', link: '/wiki/group/store/' }, + { text: 'Update', link: '/wiki/group/update/' } + ] + }, + { + text: 'Image', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/image/' }, + { text: 'Destroy', link: '/wiki/image/destroy/' }, + { text: 'Force Delete', link: '/wiki/image/forceDelete/' }, + { text: 'Index', link: '/wiki/image/index/' }, + { text: 'Restore', link: '/wiki/image/restore/' }, + { text: 'Show', link: '/wiki/image/show/' }, + { text: 'Store', link: '/wiki/image/store/' }, + { text: 'Update', link: '/wiki/image/update/' } + ] + }, + { + text: 'Resource', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/resource/' }, + { text: 'Destroy', link: '/wiki/resource/destroy/' }, + { text: 'Force Delete', link: '/wiki/resource/forceDelete/' }, + { text: 'Index', link: '/wiki/resource/index/' }, + { text: 'Restore', link: '/wiki/resource/restore/' }, + { text: 'Show', link: '/wiki/resource/show/' }, + { text: 'Store', link: '/wiki/resource/store/' }, + { text: 'Update', link: '/wiki/resource/update/' } + ] + }, + { + text: 'Series', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/series/' }, + { text: 'Destroy', link: '/wiki/series/destroy/' }, + { text: 'Force Delete', link: '/wiki/series/forceDelete/' }, + { text: 'Index', link: '/wiki/series/index/' }, + { text: 'Restore', link: '/wiki/series/restore/' }, + { text: 'Show', link: '/wiki/series/show/' }, + { text: 'Store', link: '/wiki/series/store/' }, + { text: 'Update', link: '/wiki/series/update/' } + ] + }, + { + text: 'Song', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/song/' }, + { text: 'Destroy', link: '/wiki/song/destroy/' }, + { text: 'Force Delete', link: '/wiki/song/forceDelete/' }, + { text: 'Index', link: '/wiki/song/index/' }, + { text: 'Restore', link: '/wiki/song/restore/' }, + { text: 'Show', link: '/wiki/song/show/' }, + { text: 'Store', link: '/wiki/song/store/' }, + { text: 'Update', link: '/wiki/song/update/' } + ] + }, + { + text: 'Song Resource', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/songresource/' }, + { text: 'Destroy', link: '/wiki/songresource/destroy/' }, + { text: 'Index', link: '/wiki/songresource/index/' }, + { text: 'Show', link: '/wiki/songresource/show/' }, + { text: 'Store', link: '/wiki/songresource/store/' }, + { text: 'Update', link: '/wiki/songresource/update/' } + ] + }, + { + text: 'Studio', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/studio/' }, + { text: 'Destroy', link: '/wiki/studio/destroy/' }, + { text: 'Force Delete', link: '/wiki/studio/forceDelete/' }, + { text: 'Index', link: '/wiki/studio/index/' }, + { text: 'Restore', link: '/wiki/studio/restore/' }, + { text: 'Show', link: '/wiki/studio/show/' }, + { text: 'Store', link: '/wiki/studio/store/' }, + { text: 'Update', link: '/wiki/studio/update/' } + ] + }, + { + text: 'Studio Image', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/studioimage/' }, + { text: 'Destroy', link: '/wiki/studioimage/destroy/' }, + { text: 'Index', link: '/wiki/studioimage/index/' }, + { text: 'Show', link: '/wiki/studioimage/show/' }, + { text: 'Store', link: '/wiki/studioimage/store/' } + ] + }, + { + text: 'Studio Resource', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/studioresource/' }, + { text: 'Destroy', link: '/wiki/studioresource/destroy/' }, + { text: 'Index', link: '/wiki/studioresource/index/' }, + { text: 'Show', link: '/wiki/studioresource/show/' }, + { text: 'Store', link: '/wiki/studioresource/store/' }, + { text: 'Update', link: '/wiki/studioresource/update/' } + ] + }, + { + text: 'Video', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/video/' }, + { text: 'Destroy', link: '/wiki/video/destroy/' }, + { text: 'Force Delete', link: '/wiki/video/forceDelete/' }, + { text: 'Index', link: '/wiki/video/index/' }, + { text: 'Restore', link: '/wiki/video/restore/' }, + { text: 'Show', link: '/wiki/video/show/' }, + { text: 'Store', link: '/wiki/video/store/' }, + { text: 'Update', link: '/wiki/video/update/' } + ] + }, + { + text: 'Video Script', + collapsed: true, + items: [ + { text: 'Resource', link: '/wiki/videoscript/' }, + { text: 'Destroy', link: '/wiki/videoscript/destroy/' }, + { text: 'Force Delete', link: '/wiki/videoscript/forceDelete/' }, + { text: 'Index', link: '/wiki/videoscript/index/' }, + { text: 'Restore', link: '/wiki/videoscript/restore/' }, + { text: 'Show', link: '/wiki/videoscript/show/' }, + { text: 'Store', link: '/wiki/videoscript/store/' }, + { text: 'Update', link: '/wiki/videoscript/update/' } + ] + } + ] + }, + { + text: 'Search', + collapsed: true, + items: [ + { + text: 'Index', + link: '/search/', + } + ] + }, + { + text: 'Admin', + collapsed: true, + items: [ + { + text: 'Announcement', + collapsed: true, + items: [ + { text: 'Resource', link: '/admin/announcement/' }, + { text: 'Destroy', link: '/admin/announcement/destroy/' }, + { text: 'Index', link: '/admin/announcement/index/' }, + { text: 'Show', link: '/admin/announcement/show/' }, + { text: 'Store', link: '/admin/announcement/store/' }, + { text: 'Update', link: '/admin/announcement/update/' } + ] + }, + { + text: 'Dump', + collapsed: true, + items: [ + { text: 'Resource', link: '/admin/dump/' }, + { text: 'Destroy', link: '/admin/dump/destroy/' }, + { text: 'Index', link: '/admin/dump/index/' }, + { text: 'Show', link: '/admin/dump/show/' }, + { text: 'Store', link: '/admin/dump/store/' }, + { text: 'Update', link: '/admin/dump/update/' } + ] + }, + { + text: 'Feature', + collapsed: true, + items: [ + { text: 'Resource', link: '/admin/feature/' }, + { text: 'Index', link: '/admin/feature/index/' }, + { text: 'Show', link: '/admin/feature/show/' }, + { text: 'Update', link: '/admin/feature/update/' } + ] + }, + { + text: 'Featured Theme', + collapsed: true, + items: [ + { text: 'Resource', link: '/admin/featuredtheme/' }, + { text: 'Current', link: '/admin/featuredtheme/current/' }, + { text: 'Destroy', link: '/admin/featuredtheme/destroy/' }, + { text: 'Index', link: '/admin/featuredtheme/index/' }, + { text: 'Show', link: '/admin/featuredtheme/show/' }, + { text: 'Store', link: '/admin/featuredtheme/store/' }, + { text: 'Update', link: '/admin/featuredtheme/update/' } + ] + }, + ] + }, + { + text: 'Auth', + collapsed: true, + items: [ + { + text: 'Me', + collapsed: true, + items: [ + { text: 'Resource', link: '/auth/user/me/' }, + { text: 'Show', link: '/auth/user/me/show/' }, + { text: 'Playlists', link: '/auth/user/me/playlist/' } + ] + }, + { + text: 'Permission', + collapsed: true, + items: [ + { text: 'Resource', link: '/auth/permission/' } + ] + }, + { + text: 'Role', + collapsed: true, + items: [ + { text: 'Resource', link: '/auth/role/' } + ] + }, + { + text: 'User', + collapsed: true, + items: [ + { text: 'Resource', link: '/auth/user/' } + ] + }, + ] + }, + { + text: 'Document', + collapsed: true, + items: [ + { + text: 'Page', + collapsed: true, + items: [ + { text: 'Resource', link: '/document/page/' }, + { text: 'Destroy', link: '/document/page/destroy/' }, + { text: 'Force Delete', link: '/document/page/forceDelete/' }, + { text: 'Index', link: '/document/page/index/' }, + { text: 'Restore', link: '/document/page/restore/' }, + { text: 'Show', link: '/document/page/show/' }, + { text: 'Store', link: '/document/page/store/' }, + { text: 'Update', link: '/document/page/update/' } + ] + }, + ] + }, + { + text: 'List', + collapsed: true, + items: [ + { + text: 'Playlist', + collapsed: true, + items: [ + { text: 'Resource', link: '/list/playlist/' }, + { text: 'Destroy', link: '/list/playlist/destroy/' }, + { text: 'Index', link: '/list/playlist/index/' }, + { text: 'Show', link: '/list/playlist/show/' }, + { text: 'Store', link: '/list/playlist/store/' }, + { text: 'Update', link: '/list/playlist/update/' }, + { text: 'Forward Index', link: '/list/playlist/forward/' }, + { text: 'Backward Index', link: '/list/playlist/backward/' } + ] + }, + { + text: 'Playlist Image', + collapsed: true, + items: [ + { text: 'Resource', link: '/list/playlistimage/' }, + { text: 'Destroy', link: '/list/playlistimage/destroy/' }, + { text: 'Index', link: '/list/playlistimage/index/' }, + { text: 'Show', link: '/list/playlistimage/show/' }, + { text: 'Store', link: '/list/playlistimage/store/' } + ] + }, + { + text: 'Playlist Track', + collapsed: true, + items: [ + { text: 'Resource', link: '/list/playlist/track/' }, + { text: 'Destroy', link: '/list/playlist/track/destroy/' }, + { text: 'Index', link: '/list/playlist/track/index/' }, + { text: 'Show', link: '/list/playlist/track/show/' }, + { text: 'Store', link: '/list/playlist/track/store/' }, + { text: 'Update', link: '/list/playlist/track/update/' }, + { text: 'Forward Index', link: '/list/playlist/track/forward/' }, + { text: 'Backward Index', link: '/list/playlist/track/backward/' } + ] + }, + ] + }, +]; + export default { base: process.env.VITEPRESS_BASE, lang: 'en-US', lastUpdated: true, title: 'AnimeThemes', - titleTemplate: 'AnimeThemes API Documentation', - description: 'AnimeThemes API Documentation', + titleTemplate: 'AnimeThemes GraphQL API Documentation', + description: 'AnimeThemes GraphQL API Documentation', markdown: { lineNumbers: true }, @@ -23,7 +533,7 @@ export default { socialLinks: [ { icon: 'discord', link: 'https://discordapp.com/invite/m9zbVyQ' }, { icon: 'github', link: 'https://github.com/AnimeThemes' }, - { icon: 'twitter', link: 'https://twitter.com/AnimeThemesMoe' } + { icon: 'twitter', link: 'https://x.com/AnimeThemesMoe' } ], footer: { message: 'Released under the MIT License.', @@ -34,581 +544,95 @@ export default { }, nav: [ { - text: 'Intro', + text: 'JSON:API', items: [ - { text: 'Index', link: '/intro/' }, - { text: 'JSON:API', link: '/intro/jsonapi/' }, - { text: 'Rate Limiting', link: '/intro/ratelimiting/' }, - { text: 'Authentication', link: '/intro/authentication/' }, - { text: 'Validation', link: '/intro/validation/' } - ], - }, - { - text: 'Admin', - items: [ - { text: 'Index', link: '/admin/' }, - { text: 'Announcement', link: '/admin/announcement/' }, - { text: 'Dump', link: '/admin/dump/' }, - { text: 'Feature', link: '/admin/feature/' }, - { text: 'Featured Theme', link: '/admin/featuredtheme/' } - ], - }, - { - text: 'Auth', - items: [ - { text: 'Index', link: '/auth/' }, - { text: 'Me', link: '/auth/user/me/' }, - { text: 'Permission', link: '/auth/permission/' }, - { text: 'Role', link: '/auth/role/' }, - { text: 'User', link: '/auth/user/' } - ], - }, - { - text: 'Document', - items: [ - { text: 'Index', link: '/document/' }, - { text: 'Page', link: '/document/page/' } + { + text: 'Getting Started', + link: '/intro', + }, + { + text: 'API Reference', + link: '/', + } ] }, { - text: 'List', + text: 'GraphQL', items: [ - { text: 'Index', link: '/list/' }, - { text: 'Playlist', link: '/list/playlist/' }, - { text: 'Playlist Image', link: '/list/playlistimage/' }, - { text: 'Playlist Track', link: '/list/playlist/track/' } + { + text: 'Getting Started', + link: '/graphql/intro', + }, + { + text: 'GraphiQL', + link: 'https://graphql.animethemes.moe/graphiql', + }, ] }, { - text: 'Search', - collapsed: true, - items: [ - { text: 'Search', link: '/search/' } - ] + text: 'AnimeThemes', + link: 'https://animethemes.moe', }, - { - text: 'Wiki', - items: [ - { text: 'Index', link: '/wiki/' }, - { text: 'Anime', link: '/wiki/anime/' }, - { text: 'Anime Image', link: '/wiki/animeimage/' }, - { text: 'Anime Resource', link: '/wiki/animeresource/' }, - { text: 'Anime Series', link: '/wiki/animeseries/' }, - { text: 'Anime Studio', link: '/wiki/animestudio/' }, - { text: 'Anime Synonym', link: '/wiki/animesynonym/' }, - { text: 'Anime Theme', link: '/wiki/animetheme/' }, - { text: 'Anime Theme Entry', link: '/wiki/animethemeentry/' }, - { text: 'Anime Theme Entry Video', link: '/wiki/animethemeentryvideo/' }, - { text: 'Artist', link: '/wiki/artist/' }, - { text: 'Artist Image', link: '/wiki/artistimage/' }, - { text: 'Artist Member', link: '/wiki/artistmember/' }, - { text: 'Artist Resource', link: '/wiki/artistresource/' }, - { text: 'Artist Song', link: '/wiki/artistsong/' }, - { text: 'Audio', link: '/wiki/audio/' }, - { text: 'Group', link: '/wiki/group/' }, - { text: 'Image', link: '/wiki/image/' }, - { text: 'Resource', link: '/wiki/resource/' }, - { text: 'Series', link: '/wiki/series/' }, - { text: 'Song', link: '/wiki/song/' }, - { text: 'Song Resource', link: '/wiki/songresource/' }, - { text: 'Studio', link: '/wiki/studio/' }, - { text: 'Studio Image', link: '/wiki/studioimage/' }, - { text: 'Studio Resource', link: '/wiki/studioresource/' }, - { text: 'Video', link: '/wiki/video/' }, - { text: 'Video Script', link: '/wiki/videoscript/' } - ] - } ], sidebar: { - '/admin/': [ + '/guide/': [ { - text: 'Announcement', - collapsed: true, + text: 'Introduction', + collapsed: false, items: [ - { text: 'Resource', link: '/admin/announcement/' }, - { text: 'Destroy', link: '/admin/announcement/destroy/' }, - { text: 'Index', link: '/admin/announcement/index/' }, - { text: 'Show', link: '/admin/announcement/show/' }, - { text: 'Store', link: '/admin/announcement/store/' }, - { text: 'Update', link: '/admin/announcement/update/' } + { text: 'Rate Limiting', link: '/guide/intro/ratelimiting/' }, + { text: 'Authentication', link: '/guide/intro/authentication/' }, + { text: 'Validation', link: '/guide/intro/validation/' }, ] }, { - text: 'Dump', - collapsed: true, + text: 'GraphQL', + collapsed: false, items: [ - { text: 'Resource', link: '/admin/dump/' }, - { text: 'Destroy', link: '/admin/dump/destroy/' }, - { text: 'Index', link: '/admin/dump/index/' }, - { text: 'Show', link: '/admin/dump/show/' }, - { text: 'Store', link: '/admin/dump/store/' }, - { text: 'Update', link: '/admin/dump/update/' } - ] + { text: 'Getting Started', link: '/guide/graphql/getting-started/' }, + { text: 'Pagination', link: '/guide/graphql/pagination/' }, + { text: 'Filtering', link: '/guide/graphql/filtering/' }, + { text: 'Sorting', link: '/guide/graphql/sorting/' }, + { text: 'Relationships', link: '/guide/graphql/relationships/' }, + ], }, { - text: 'Feature', - collapsed: true, + text: 'Examples', + collapsed: false, items: [ - { text: 'Resource', link: '/admin/feature/' }, - { text: 'Index', link: '/admin/feature/index/' }, - { text: 'Show', link: '/admin/feature/show/' }, - { text: 'Update', link: '/admin/feature/update/' } - ] + { text: 'Search', link: '/guide/examples/search/' }, + { text: 'Filter by External Site', link: '/guide/examples/filter-by-external-site/' }, + ], }, { - text: 'Featured Theme', - collapsed: true, + text: 'Migrating', + collapsed: false, items: [ - { text: 'Resource', link: '/admin/featuredtheme/' }, - { text: 'Current', link: '/admin/featuredtheme/current/' }, - { text: 'Destroy', link: '/admin/featuredtheme/destroy/' }, - { text: 'Index', link: '/admin/featuredtheme/index/' }, - { text: 'Show', link: '/admin/featuredtheme/show/' }, - { text: 'Store', link: '/admin/featuredtheme/store/' }, - { text: 'Update', link: '/admin/featuredtheme/update/' } - ] - } - ], - '/auth/': [ - { - text: 'Me', - collapsed: true, - items: [ - { text: 'Resource', link: '/auth/user/me/' }, - { text: 'Show', link: '/auth/user/me/show/' }, - { text: 'Playlists', link: '/auth/user/me/playlist/' } - ] - }, - { - text: 'Permission', - collapsed: true, - items: [ - { text: 'Resource', link: '/auth/permission/' } - ] - }, - { - text: 'Role', - collapsed: true, - items: [ - { text: 'Resource', link: '/auth/role/' } - ] - }, - { - text: 'User', - collapsed: true, - items: [ - { text: 'Resource', link: '/auth/user/' } - ] - } - ], - '/document/': [ - { - text: 'Page', - collapsed: true, - items: [ - { text: 'Resource', link: '/document/page/' }, - { text: 'Destroy', link: '/document/page/destroy/' }, - { text: 'Force Delete', link: '/document/page/forceDelete/' }, - { text: 'Index', link: '/document/page/index/' }, - { text: 'Restore', link: '/document/page/restore/' }, - { text: 'Show', link: '/document/page/show/' }, - { text: 'Store', link: '/document/page/store/' }, - { text: 'Update', link: '/document/page/update/' } - ] + { text: 'Migrating from REST API', link: '/guide/migrating/' }, + ], } ], '/intro/': [ { text: 'Introduction', - collapsed: true, items: [ { text: 'JSON:API', link: '/intro/jsonapi/' }, { text: 'Rate Limiting', link: '/intro/ratelimiting/' }, { text: 'Authentication', link: '/intro/authentication/' }, { text: 'Validation', link: '/intro/validation/' } ] - } + }, ], - '/list/': [ - { - text: 'Playlist', - collapsed: true, - items: [ - { text: 'Resource', link: '/list/playlist/' }, - { text: 'Destroy', link: '/list/playlist/destroy/' }, - { text: 'Index', link: '/list/playlist/index/' }, - { text: 'Show', link: '/list/playlist/show/' }, - { text: 'Store', link: '/list/playlist/store/' }, - { text: 'Update', link: '/list/playlist/update/' }, - { text: 'Forward Index', link: '/list/playlist/forward/' }, - { text: 'Backward Index', link: '/list/playlist/backward/' } - ] - }, - { - text: 'Playlist Image', - collapsed: true, - items: [ - { text: 'Resource', link: '/list/playlistimage/' }, - { text: 'Destroy', link: '/list/playlistimage/destroy/' }, - { text: 'Index', link: '/list/playlistimage/index/' }, - { text: 'Show', link: '/list/playlistimage/show/' }, - { text: 'Store', link: '/list/playlistimage/store/' } - ] - }, - { - text: 'Playlist Track', - collapsed: true, - items: [ - { text: 'Resource', link: '/list/playlist/track/' }, - { text: 'Destroy', link: '/list/playlist/track/destroy/' }, - { text: 'Index', link: '/list/playlist/track/index/' }, - { text: 'Show', link: '/list/playlist/track/show/' }, - { text: 'Store', link: '/list/playlist/track/store/' }, - { text: 'Update', link: '/list/playlist/track/update/' }, - { text: 'Forward Index', link: '/list/playlist/track/forward/' }, - { text: 'Backward Index', link: '/list/playlist/track/backward/' } - ] - } - ], - '/wiki/': [ - { - text: 'Anime', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/anime/' }, - { text: 'Destroy', link: '/wiki/anime/destroy/' }, - { text: 'Force Delete', link: '/wiki/anime/forceDelete/' }, - { text: 'Index', link: '/wiki/anime/index/' }, - { text: 'Restore', link: '/wiki/anime/restore/' }, - { text: 'Show', link: '/wiki/anime/show/' }, - { text: 'Store', link: '/wiki/anime/store/' }, - { text: 'Update', link: '/wiki/anime/update/' }, - { text: 'Year Index', link: '/wiki/animeyear/index/' }, - { text: 'Year Show', link: '/wiki/animeyear/show/' } - ] - }, - { - text: 'Anime Image', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/animeimage/' }, - { text: 'Destroy', link: '/wiki/animeimage/destroy/' }, - { text: 'Index', link: '/wiki/animeimage/index/' }, - { text: 'Show', link: '/wiki/animeimage/show/' }, - { text: 'Store', link: '/wiki/animeimage/store/' } - ] - }, - { - text: 'Anime Resource', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/animeresource/' }, - { text: 'Destroy', link: '/wiki/animeresource/destroy/' }, - { text: 'Index', link: '/wiki/animeresource/index/' }, - { text: 'Show', link: '/wiki/animeresource/show/' }, - { text: 'Store', link: '/wiki/animeresource/store/' }, - { text: 'Update', link: '/wiki/animeresource/update/' } - ] - }, - { - text: 'Anime Series', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/animeseries/' }, - { text: 'Destroy', link: '/wiki/animeseries/destroy/' }, - { text: 'Index', link: '/wiki/animeseries/index/' }, - { text: 'Show', link: '/wiki/animeseries/show/' }, - { text: 'Store', link: '/wiki/animeseries/store/' } - ] - }, - { - text: 'Anime Studio', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/animestudio/' }, - { text: 'Destroy', link: '/wiki/animestudio/destroy/' }, - { text: 'Index', link: '/wiki/animestudio/index/' }, - { text: 'Show', link: '/wiki/animestudio/show/' }, - { text: 'Store', link: '/wiki/animestudio/store/' } - ] - }, - { - text: 'Anime Synonym', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/animesynonym/' }, - { text: 'Destroy', link: '/wiki/animesynonym/destroy/' }, - { text: 'Force Delete', link: '/wiki/animesynonym/forceDelete/' }, - { text: 'Index', link: '/wiki/animesynonym/index/' }, - { text: 'Restore', link: '/wiki/animesynonym/restore/' }, - { text: 'Show', link: '/wiki/animesynonym/show/' }, - { text: 'Store', link: '/wiki/animesynonym/store/' }, - { text: 'Update', link: '/wiki/animesynonym/update/' } - ] - }, - { - text: 'Anime Theme', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/animetheme/' }, - { text: 'Destroy', link: '/wiki/animetheme/destroy/' }, - { text: 'Force Delete', link: '/wiki/animetheme/forceDelete/' }, - { text: 'Index', link: '/wiki/animetheme/index/' }, - { text: 'Restore', link: '/wiki/animetheme/restore/' }, - { text: 'Show', link: '/wiki/animetheme/show/' }, - { text: 'Store', link: '/wiki/animetheme/store/' }, - { text: 'Update', link: '/wiki/animetheme/update/' } - ] - }, - { - text: 'Anime Theme Entry', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/animethemeentry/' }, - { text: 'Destroy', link: '/wiki/animethemeentry/destroy/' }, - { text: 'Force Delete', link: '/wiki/animethemeentry/forceDelete/' }, - { text: 'Index', link: '/wiki/animethemeentry/index/' }, - { text: 'Restore', link: '/wiki/animethemeentry/restore/' }, - { text: 'Show', link: '/wiki/animethemeentry/show/' }, - { text: 'Store', link: '/wiki/animethemeentry/store/' }, - { text: 'Update', link: '/wiki/animethemeentry/update/' } - ] - }, - { - text: 'Anime Theme Entry Video', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/animethemeentryvideo/' }, - { text: 'Destroy', link: '/wiki/animethemeentryvideo/destroy/' }, - { text: 'Index', link: '/wiki/animethemeentryvideo/index/' }, - { text: 'Show', link: '/wiki/animethemeentryvideo/show/' }, - { text: 'Store', link: '/wiki/animethemeentryvideo/store/' } - ] - }, - { - text: 'Artist', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/artist/' }, - { text: 'Destroy', link: '/wiki/artist/destroy/' }, - { text: 'Force Delete', link: '/wiki/artist/forceDelete/' }, - { text: 'Index', link: '/wiki/artist/index/' }, - { text: 'Restore', link: '/wiki/artist/restore/' }, - { text: 'Show', link: '/wiki/artist/show/' }, - { text: 'Store', link: '/wiki/artist/store/' }, - { text: 'Update', link: '/wiki/artist/update/' } - ] - }, - { - text: 'Artist Image', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/artistimage/' }, - { text: 'Destroy', link: '/wiki/artistimage/destroy/' }, - { text: 'Index', link: '/wiki/artistimage/index/' }, - { text: 'Show', link: '/wiki/artistimage/show/' }, - { text: 'Store', link: '/wiki/artistimage/store/' }, - { text: 'Update', link: '/wiki/artistimage/update/' } - ] - }, - { - text: 'Artist Member', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/artistmember/' }, - { text: 'Destroy', link: '/wiki/artistmember/destroy/' }, - { text: 'Index', link: '/wiki/artistmember/index/' }, - { text: 'Show', link: '/wiki/artistmember/show/' }, - { text: 'Store', link: '/wiki/artistmember/store/' }, - { text: 'Update', link: '/wiki/artistmember/update/' } - ] - }, - { - text: 'Artist Resource', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/artistresource/' }, - { text: 'Destroy', link: '/wiki/artistresource/destroy/' }, - { text: 'Index', link: '/wiki/artistresource/index/' }, - { text: 'Show', link: '/wiki/artistresource/show/' }, - { text: 'Store', link: '/wiki/artistresource/store/' }, - { text: 'Update', link: '/wiki/artistresource/update/' } - ] - }, - { - text: 'Artist Song', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/artistsong/' }, - { text: 'Destroy', link: '/wiki/artistsong/destroy/' }, - { text: 'Index', link: '/wiki/artistsong/index/' }, - { text: 'Show', link: '/wiki/artistsong/show/' }, - { text: 'Store', link: '/wiki/artistsong/store/' }, - { text: 'Update', link: '/wiki/artistsong/update/' } - ] - }, - { - text: 'Audio', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/audio/' }, - { text: 'Destroy', link: '/wiki/audio/destroy/' }, - { text: 'Force Delete', link: '/wiki/audio/forceDelete/' }, - { text: 'Index', link: '/wiki/audio/index/' }, - { text: 'Restore', link: '/wiki/audio/restore/' }, - { text: 'Show', link: '/wiki/audio/show/' }, - { text: 'Store', link: '/wiki/audio/store/' }, - { text: 'Update', link: '/wiki/audio/update/' } - ] - }, - { - text: 'Group', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/group/' }, - { text: 'Destroy', link: '/wiki/group/destroy/' }, - { text: 'Force Delete', link: '/wiki/group/forceDelete/' }, - { text: 'Index', link: '/wiki/group/index/' }, - { text: 'Restore', link: '/wiki/group/restore/' }, - { text: 'Show', link: '/wiki/group/show/' }, - { text: 'Store', link: '/wiki/group/store/' }, - { text: 'Update', link: '/wiki/group/update/' } - ] - }, - { - text: 'Image', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/image/' }, - { text: 'Destroy', link: '/wiki/image/destroy/' }, - { text: 'Force Delete', link: '/wiki/image/forceDelete/' }, - { text: 'Index', link: '/wiki/image/index/' }, - { text: 'Restore', link: '/wiki/image/restore/' }, - { text: 'Show', link: '/wiki/image/show/' }, - { text: 'Store', link: '/wiki/image/store/' }, - { text: 'Update', link: '/wiki/image/update/' } - ] - }, - { - text: 'Resource', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/resource/' }, - { text: 'Destroy', link: '/wiki/resource/destroy/' }, - { text: 'Force Delete', link: '/wiki/resource/forceDelete/' }, - { text: 'Index', link: '/wiki/resource/index/' }, - { text: 'Restore', link: '/wiki/resource/restore/' }, - { text: 'Show', link: '/wiki/resource/show/' }, - { text: 'Store', link: '/wiki/resource/store/' }, - { text: 'Update', link: '/wiki/resource/update/' } - ] - }, - { - text: 'Series', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/series/' }, - { text: 'Destroy', link: '/wiki/series/destroy/' }, - { text: 'Force Delete', link: '/wiki/series/forceDelete/' }, - { text: 'Index', link: '/wiki/series/index/' }, - { text: 'Restore', link: '/wiki/series/restore/' }, - { text: 'Show', link: '/wiki/series/show/' }, - { text: 'Store', link: '/wiki/series/store/' }, - { text: 'Update', link: '/wiki/series/update/' } - ] - }, - { - text: 'Song', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/song/' }, - { text: 'Destroy', link: '/wiki/song/destroy/' }, - { text: 'Force Delete', link: '/wiki/song/forceDelete/' }, - { text: 'Index', link: '/wiki/song/index/' }, - { text: 'Restore', link: '/wiki/song/restore/' }, - { text: 'Show', link: '/wiki/song/show/' }, - { text: 'Store', link: '/wiki/song/store/' }, - { text: 'Update', link: '/wiki/song/update/' } - ] - }, - { - text: 'Song Resource', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/songresource/' }, - { text: 'Destroy', link: '/wiki/songresource/destroy/' }, - { text: 'Index', link: '/wiki/songresource/index/' }, - { text: 'Show', link: '/wiki/songresource/show/' }, - { text: 'Store', link: '/wiki/songresource/store/' }, - { text: 'Update', link: '/wiki/songresource/update/' } - ] - }, - { - text: 'Studio', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/studio/' }, - { text: 'Destroy', link: '/wiki/studio/destroy/' }, - { text: 'Force Delete', link: '/wiki/studio/forceDelete/' }, - { text: 'Index', link: '/wiki/studio/index/' }, - { text: 'Restore', link: '/wiki/studio/restore/' }, - { text: 'Show', link: '/wiki/studio/show/' }, - { text: 'Store', link: '/wiki/studio/store/' }, - { text: 'Update', link: '/wiki/studio/update/' } - ] - }, - { - text: 'Studio Image', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/studioimage/' }, - { text: 'Destroy', link: '/wiki/studioimage/destroy/' }, - { text: 'Index', link: '/wiki/studioimage/index/' }, - { text: 'Show', link: '/wiki/studioimage/show/' }, - { text: 'Store', link: '/wiki/studioimage/store/' } - ] - }, - { - text: 'Studio Resource', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/studioresource/' }, - { text: 'Destroy', link: '/wiki/studioresource/destroy/' }, - { text: 'Index', link: '/wiki/studioresource/index/' }, - { text: 'Show', link: '/wiki/studioresource/show/' }, - { text: 'Store', link: '/wiki/studioresource/store/' }, - { text: 'Update', link: '/wiki/studioresource/update/' } - ] - }, - { - text: 'Video', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/video/' }, - { text: 'Destroy', link: '/wiki/video/destroy/' }, - { text: 'Force Delete', link: '/wiki/video/forceDelete/' }, - { text: 'Index', link: '/wiki/video/index/' }, - { text: 'Restore', link: '/wiki/video/restore/' }, - { text: 'Show', link: '/wiki/video/show/' }, - { text: 'Store', link: '/wiki/video/store/' }, - { text: 'Update', link: '/wiki/video/update/' } - ] - }, - { - text: 'Video Script', - collapsed: true, - items: [ - { text: 'Resource', link: '/wiki/videoscript/' }, - { text: 'Destroy', link: '/wiki/videoscript/destroy/' }, - { text: 'Force Delete', link: '/wiki/videoscript/forceDelete/' }, - { text: 'Index', link: '/wiki/videoscript/index/' }, - { text: 'Restore', link: '/wiki/videoscript/restore/' }, - { text: 'Show', link: '/wiki/videoscript/show/' }, - { text: 'Store', link: '/wiki/videoscript/store/' }, - { text: 'Update', link: '/wiki/videoscript/update/' } - ] - } - ] + '/admin/': referenceSidebarItems, + '/auth/': referenceSidebarItems, + '/document/': referenceSidebarItems, + '/list/': referenceSidebarItems, + '/search/': referenceSidebarItems, + '/wiki/': referenceSidebarItems, } + }, + rewrites: { + 'jsonapi/intro/:path*': 'intro/:path*', + 'jsonapi/reference/:path*': ':path*', } } diff --git a/docs/guide/examples/search/index.md b/docs/guide/examples/search/index.md new file mode 100644 index 0000000..eb5f543 --- /dev/null +++ b/docs/guide/examples/search/index.md @@ -0,0 +1,96 @@ +--- +title: Global Search +--- + +# Global Search Query + +The global search query returns a listing of resources that match a given search term. + +## Query Example + +```graphql +query ($search: String!) { + search(search: $search) { + anime { + name + } + artists { + name + } + animethemes { + type + } + playlists { + name + } + series { + name + } + songs { + title + } + studios { + name + } + videos { + basename + } + } +} +``` + +## Authentication + +None + +## Parameters + +| Name | Type | Description | +| :----------: | :------: | :----------------------------- | +| page | Int | Index of the current page | +| perPage | Int | Number of items per page | +| search | String! | The term used for the search | + +## Response + +```json +{ + search: { + anime: [ + { + name: "name" + } + ], + animethemes: [ + { + type: "type" + } + ], + artists: [ + { + name: "name" + } + ], + playlists: [ + { + name: "name" + } + ], + series: [ + { + name: "name" + } + ], + songs: [ + { + title: "title" + } + ], + videos: [ + { + basename: "basename" + } + ] + } +} +``` \ No newline at end of file diff --git a/docs/guide/graphql/filtering/index.md b/docs/guide/graphql/filtering/index.md new file mode 100644 index 0000000..bdbeba1 --- /dev/null +++ b/docs/guide/graphql/filtering/index.md @@ -0,0 +1,11 @@ +--- +title: Filtering +--- + +# Filtering + +--- + +// TODO + +// Note: Waiting API refactor. \ No newline at end of file diff --git a/docs/guide/graphql/getting-started/index.md b/docs/guide/graphql/getting-started/index.md new file mode 100644 index 0000000..18508e6 --- /dev/null +++ b/docs/guide/graphql/getting-started/index.md @@ -0,0 +1,57 @@ +--- +title: Getting Started +--- + +# Getting Started + +--- + +The AnimeThemes API selectively implements the [**GraphQL Tool**](https://graphql.org). + +Here we will provide an overview of where the AnimeThemes API adheres to or deviates from the specification. + +It is recommended that you learn how to wrap a [GraphQL API](https://graphql.org/learn/). + +## Content Negotiation + +The AnimeThemes API needs a `Content-Type` header. + +```powershell +# A simple curl request works like this. +curl -X POST + -H "Content-Type: application/json" + -d "{\"query\": \"{ animes { data { name } } }\"}" + https://graphql.animethemes.moe/ +``` + +## Document Structure + +### Top Level + +The AnimeThemes API specifies a custom `data` wrap for top-level members. + +The following query +```graphql +query { + animes { + data { + name + } + } +} +``` +will return the JSON: +```json +{ + "data": { + "animes": { + "data": [ + { + "name": ".hack//Liminality" + }, + ... + ] + } + } +} +``` \ No newline at end of file diff --git a/docs/guide/graphql/ordering/index.md b/docs/guide/graphql/ordering/index.md new file mode 100644 index 0000000..6cd195b --- /dev/null +++ b/docs/guide/graphql/ordering/index.md @@ -0,0 +1,11 @@ +--- +title: Ordering +--- + +# Ordering + +--- + +// TODO + +// Note: Waiting API refactor. \ No newline at end of file diff --git a/docs/guide/graphql/pagination/index.md b/docs/guide/graphql/pagination/index.md new file mode 100644 index 0000000..02e20a1 --- /dev/null +++ b/docs/guide/graphql/pagination/index.md @@ -0,0 +1,31 @@ +--- +title: Pagination +--- + +# Pagination + +--- + +The AnimeThemes API query that uses pagination shall contain a `paginatorInfo` object for pagination strategies and a `data` collection with the resources. + +```json +// The animes query contains a paginatorInfo object +{ + "data": { + "animes": { + "paginatorInfo": { + "count": count, + "currentPage": currentPage, + "firstItem": firstItem, + "hasMorePages": hasMorePages, + "lastItem": lastItem, + "lastPage": lastPage, + "perPage": perPage, + "total": total + }, + "data": [ + ... + ] + } + } +} \ No newline at end of file diff --git a/docs/guide/graphql/relationships/index.md b/docs/guide/graphql/relationships/index.md new file mode 100644 index 0000000..0f72cf8 --- /dev/null +++ b/docs/guide/graphql/relationships/index.md @@ -0,0 +1,13 @@ +--- +title: Relationships +--- + +# Relationships + +--- + +// TODO + +## Many-to-Many + +// TODO \ No newline at end of file diff --git a/docs/guide/intro/authentication/index.md b/docs/guide/intro/authentication/index.md new file mode 100644 index 0000000..737d2a6 --- /dev/null +++ b/docs/guide/intro/authentication/index.md @@ -0,0 +1,36 @@ +--- +title: Authentication +--- + +# Authentication + +--- + +The AnimeThemes API uses token-based authentication to grant the user access to mutations. + +## Token Authentication + +The AnimeThemes API uses the [**Bearer authentication scheme**](https://www.rfc-editor.org/rfc/rfc6750.html) to validate requests for mutations. + +The `Bearer` token in the `Authorization` request header must correspond to a valid API token. + +```sh +# Returns the currently authenticated user +curl -X POST + -H "Content-Type: application/json" + -H "Authorization: Bearer {token}" + -d "{\"query\": \"{ me { name } }\"}" + https://graphql.animethemes.moe +``` + +## Status Codes + +The AnimeThemes API uses framework-default response status codes for authenticated requests. + +| Code | Description | Examples | +| :--: | :--------------------------------------------------- | :----------------: | +| 200 | OK - request succeeded | DELETE, PATCH, PUT | +| 201 | Created - new resource was created | POST | +| 401 | Unauthorized - invalid or no authentication provided | All | +| 403 | Forbidden - request is not authorized for user | All | +| 404 | Not Found - no resource was found | All | \ No newline at end of file diff --git a/docs/guide/intro/index.md b/docs/guide/intro/index.md new file mode 100644 index 0000000..2bb5c1d --- /dev/null +++ b/docs/guide/intro/index.md @@ -0,0 +1,43 @@ +--- +title: Introduction +--- + +# Introduction + +--- + +AnimeThemes is a simple and consistent repository of anime opening and ending themes. We provide direct links to high quality WebMs of your favorite OPs and EDs for your listening and discussion needs. + +The AnimeThemes API provides access to our repository resources for your development needs. + +## [GraphQL](/guide/intro/graphql/) + +The AnimeThemes API selectively implements the [**GraphQL Tool**](https://graphql.org). + +We provide an overview of where the AnimeThemes API adheres to or deviates from the specification. + +## [Rate Limiting](/guide/intro/ratelimiting/) + +The AnimeThemes API applies the standard named rate limiter of the Laravel Framework. + +We provide an overview of managing request quotas. + +## [Authentication](/guide/intro/authentication/) + +The AnimeThemes API uses token-based authentication to grant the user access to mutations. + +## [Validation](/guide/intro/validation/) + +The AnimeThemes API uses form requests to validate query parameters. + +## Terms of Use + +The AnimeThemes API applies the [**AnimeThemes Terms of Service**](https://animethemes.moe/about/terms-of-service). + +## Resources + +For API support, please make use of the **#graphql** channel in the [**Discord Server**](https://discordapp.com/invite/m9zbVyQ). + +To report an issue with or request a new feature for the API, please make use of the [**animethemes-server**](https://github.com/AnimeThemes/animethemes-server) Github. + +To report an issue with or request a new feature for this documentation, please make use of the [**animethemes-api-docs**](https://github.com/AnimeThemes/animethemes-api-docs) Github. \ No newline at end of file diff --git a/docs/guide/intro/ratelimiting/index.md b/docs/guide/intro/ratelimiting/index.md new file mode 100644 index 0000000..45f1e4c --- /dev/null +++ b/docs/guide/intro/ratelimiting/index.md @@ -0,0 +1,49 @@ +--- +title: Rate Limiting +--- + +# Rate Limiting + +--- + +The AnimeThemes API applies the standard named rate limiter of the Laravel Framework. + +Here we will provide an overview of managing request quotas. + +## Response Headers + +The AnimeThemes GraphQL API limits requests to 80 per minute. + +The AnimeThemes API will return `X-RateLimit-Limit` and `X-RateLimit-Remaining` headers in the response. + +```sh +... +X-RateLimit-Limit: 80 +X-RateLimit-Remaining: 79 +... +``` + +## Exceeding the Rate Limit + +If the rate limit is exceeded, the AnimeThemes API will return `Retry-After` and `X-RateLimit-Reset` headers in the response. + +```sh +... +X-RateLimit-Limit: 80 +X-RateLimit-Remaining: 0 +Retry-After: 60 +X-RateLimit-Reset: 1625073463180 +... +``` + +Additionally, the AnimeThemes API will return an error message in the response body. + +```json +{ + message: "Too Many Attempts." +} +``` + +## Query Complexity Limit + +// TODO \ No newline at end of file diff --git a/docs/guide/intro/validation/index.md b/docs/guide/intro/validation/index.md new file mode 100644 index 0000000..bb4406c --- /dev/null +++ b/docs/guide/intro/validation/index.md @@ -0,0 +1,9 @@ +--- +title: Validation +--- + +# Validation + +--- + +// TODO \ No newline at end of file diff --git a/docs/guide/migrating/index.md b/docs/guide/migrating/index.md new file mode 100644 index 0000000..4ea1119 --- /dev/null +++ b/docs/guide/migrating/index.md @@ -0,0 +1,33 @@ +--- +title: Migrating from REST API +--- + +# Migrating from REST API + +--- + +While writing the GraphQL API, it was decided to make some changes to follow the [best practices recommended by GraphQL](https://graphql.org/learn/best-practices/). + +## Field names + +Fields in the REST API are snake_case, but now it is camelCase instead. + +Affected Fields: + +* start_at -> startAt +* end_at -> endAt +* email_verified_at -> emailVerifiedAt +* two_factor_confirmed_at -> twoFactorConfirmedAt +* guard_name -> guardName +* media_format -> mediaFormat +* views_count -> viewsCount +* external_id -> externalId +* created_at -> createdAt +* updated_at -> updatedAt +* deleted_at -> deletedAt + +## From Group to ThemeGroup + +It is easy to confuse what a group is. They can be a group of animethemes (e.g. "English Version") or a group of artists (e.g. "Aqours"). + +The `group` query/type does not exist. For a group of animethemes, the query is `themegroups`. For a group of artists, they are included globally in the `artists` query. \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 627aa96..0c4f730 100644 --- a/docs/index.md +++ b/docs/index.md @@ -3,7 +3,7 @@ layout: home hero: name: AnimeThemes - text: API Documentation + text: GraphQL API Documentation tagline: Access our repository of Anime opening and ending themes for your development needs image: light: /logo.svg @@ -12,26 +12,14 @@ hero: actions: - theme: brand text: Get Started - link: /intro/ + link: /guide/intro/ + - theme: alt + text: GraphiQL + link: https://graphql.animethemes.moe/graphiql features: - - icon: πŸ“» - title: Media Links - details: Embed or download audio and video using links provided by resources - link: /wiki/video/show/#response - linkText: Example - - icon: πŸ•ΈοΈ - title: External Mappings - details: Find resources based on their mappings to sites like MyAnimeList or AniList - link: /intro/jsonapi/#has-filter - linkText: Example - icon: πŸ” title: Advanced Querying details: Support for randomization, searching and filtering by direct fields and relation fields out of the box - link: /intro/jsonapi/#filtering - linkText: Example - - icon: ✍️ - title: Resource Management - details: Apply edits to our database (for users with requisite permissions) - link: /wiki/anime/store/ + link: /guide/graphql/filtering/ linkText: Example --- \ No newline at end of file diff --git a/package.json b/package.json index 748c414..3f50d9a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "animethemes-api-docs", - "version": "3.0.0", - "description": "AnimeThemes.moe API Documentation", + "version": "4.0.0", + "description": "AnimeThemes.moe GraphQL API Documentation", "main": "index.js", "authors": { "name": "AnimeThemes",