diff options
27 files changed, 7694 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c7dc6b5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,21 @@ +# Xcode +*.xcodeproj/* +!*.xcodeproj/project.pbxproj +!*.xcodeproj/xcshareddata/ +!*.xcodeproj/*.xcworkspace/ + +*.xcodeproj/*.xcworkspace/* +!*.xcodeproj/*.xcworkspace/contents.xcworkspacedata +!*.xcodeproj/*.xcworkspace/xcshareddata/ + +*.xcodeproj/*.xcworkspace/xcshareddata/* +!*.xcodeproj/*.xcworkspace/xcshareddata/swiftpm/ + +build/ + +# Other +.DS_Store + +# Apollo iOS +apollo-ios-cli + diff --git a/.swift-version b/.swift-version new file mode 100644 index 0000000..819e07a --- /dev/null +++ b/.swift-version @@ -0,0 +1 @@ +5.0 diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..390b3b2 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,17 @@ +All Rights Reserved + +Copyright (c) 2025 Fuwn + +THE CONTENTS OF THIS PROJECT ARE PROPRIETARY AND CONFIDENTIAL. +UNAUTHORIZED COPYING, TRANSFERRING OR REPRODUCTION OF THE CONTENTS OF THIS PROJECT, VIA ANY MEDIUM IS STRICTLY PROHIBITED. + +The receipt or possession of the source code and/or any parts thereof does not convey or imply any right to use them +for any purpose other than the purpose for which they were provided to you. + +The software is provided "AS IS", without warranty of any kind, express or implied, including but not limited to +the warranties of merchantability, fitness for a particular purpose and non infringement. +In no event shall the authors or copyright holders be liable for any claim, damages or other liability, +whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software +or the use or other dealings in the software. + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the software. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c04bba7 --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ +.PHONY: default lint format clean build + +default: format lint build + +format: + swiftformat . + +lint: + swiftlint + +clean: + xcodebuild clean + +build: + xcodebuild -configuration Release -scheme Tonbo clean build + diff --git a/Tonbo.xcodeproj/project.pbxproj b/Tonbo.xcodeproj/project.pbxproj new file mode 100644 index 0000000..df1d8cf --- /dev/null +++ b/Tonbo.xcodeproj/project.pbxproj @@ -0,0 +1,646 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXBuildFile section */ + 4CB1EACE2D5DFD9D00612E79 /* Apollo in Frameworks */ = {isa = PBXBuildFile; productRef = 4CB1EACD2D5DFD9D00612E79 /* Apollo */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 4CB1EAAF2D5DFBB700612E79 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 4CB1EA922D5DFBB600612E79 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4CB1EA992D5DFBB600612E79; + remoteInfo = Tonbo; + }; + 4CB1EAB92D5DFBB700612E79 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 4CB1EA922D5DFBB600612E79 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4CB1EA992D5DFBB600612E79; + remoteInfo = Tonbo; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 4CB1EA9A2D5DFBB600612E79 /* Tonbo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Tonbo.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CB1EAAE2D5DFBB700612E79 /* TonboTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TonboTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CB1EAB82D5DFBB700612E79 /* TonboUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TonboUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 4CB1EAC02D5DFBB700612E79 /* Exceptions for "Tonbo" folder in "Tonbo" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Info.plist, + ); + target = 4CB1EA992D5DFBB600612E79 /* Tonbo */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 4CB1EA9C2D5DFBB600612E79 /* Tonbo */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 4CB1EAC02D5DFBB700612E79 /* Exceptions for "Tonbo" folder in "Tonbo" target */, + ); + path = Tonbo; + sourceTree = "<group>"; + }; + 4CB1EAB12D5DFBB700612E79 /* TonboTests */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = TonboTests; + sourceTree = "<group>"; + }; + 4CB1EABB2D5DFBB700612E79 /* TonboUITests */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = TonboUITests; + sourceTree = "<group>"; + }; + 4CB1EACF2D5DFDA900612E79 /* graphql */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = graphql; + sourceTree = "<group>"; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + 4CB1EA972D5DFBB600612E79 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 4CB1EACE2D5DFD9D00612E79 /* Apollo in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4CB1EAAB2D5DFBB700612E79 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4CB1EAB52D5DFBB700612E79 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 4CB1EA912D5DFBB600612E79 = { + isa = PBXGroup; + children = ( + 4CB1EACF2D5DFDA900612E79 /* graphql */, + 4CB1EA9C2D5DFBB600612E79 /* Tonbo */, + 4CB1EAB12D5DFBB700612E79 /* TonboTests */, + 4CB1EABB2D5DFBB700612E79 /* TonboUITests */, + 4CB1EA9B2D5DFBB600612E79 /* Products */, + ); + sourceTree = "<group>"; + }; + 4CB1EA9B2D5DFBB600612E79 /* Products */ = { + isa = PBXGroup; + children = ( + 4CB1EA9A2D5DFBB600612E79 /* Tonbo.app */, + 4CB1EAAE2D5DFBB700612E79 /* TonboTests.xctest */, + 4CB1EAB82D5DFBB700612E79 /* TonboUITests.xctest */, + ); + name = Products; + sourceTree = "<group>"; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 4CB1EA992D5DFBB600612E79 /* Tonbo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4CB1EAC12D5DFBB700612E79 /* Build configuration list for PBXNativeTarget "Tonbo" */; + buildPhases = ( + 4CB1EA962D5DFBB600612E79 /* Sources */, + 4CB1EA972D5DFBB600612E79 /* Frameworks */, + 4CB1EA982D5DFBB600612E79 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 4CB1EA9C2D5DFBB600612E79 /* Tonbo */, + 4CB1EACF2D5DFDA900612E79 /* graphql */, + ); + name = Tonbo; + packageProductDependencies = ( + 4CB1EACD2D5DFD9D00612E79 /* Apollo */, + ); + productName = Tonbo; + productReference = 4CB1EA9A2D5DFBB600612E79 /* Tonbo.app */; + productType = "com.apple.product-type.application"; + }; + 4CB1EAAD2D5DFBB700612E79 /* TonboTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4CB1EAC62D5DFBB700612E79 /* Build configuration list for PBXNativeTarget "TonboTests" */; + buildPhases = ( + 4CB1EAAA2D5DFBB700612E79 /* Sources */, + 4CB1EAAB2D5DFBB700612E79 /* Frameworks */, + 4CB1EAAC2D5DFBB700612E79 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 4CB1EAB02D5DFBB700612E79 /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + 4CB1EAB12D5DFBB700612E79 /* TonboTests */, + ); + name = TonboTests; + packageProductDependencies = ( + ); + productName = TonboTests; + productReference = 4CB1EAAE2D5DFBB700612E79 /* TonboTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 4CB1EAB72D5DFBB700612E79 /* TonboUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4CB1EAC92D5DFBB700612E79 /* Build configuration list for PBXNativeTarget "TonboUITests" */; + buildPhases = ( + 4CB1EAB42D5DFBB700612E79 /* Sources */, + 4CB1EAB52D5DFBB700612E79 /* Frameworks */, + 4CB1EAB62D5DFBB700612E79 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 4CB1EABA2D5DFBB700612E79 /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + 4CB1EABB2D5DFBB700612E79 /* TonboUITests */, + ); + name = TonboUITests; + packageProductDependencies = ( + ); + productName = TonboUITests; + productReference = 4CB1EAB82D5DFBB700612E79 /* TonboUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 4CB1EA922D5DFBB600612E79 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1620; + LastUpgradeCheck = 1620; + TargetAttributes = { + 4CB1EA992D5DFBB600612E79 = { + CreatedOnToolsVersion = 16.2; + }; + 4CB1EAAD2D5DFBB700612E79 = { + CreatedOnToolsVersion = 16.2; + TestTargetID = 4CB1EA992D5DFBB600612E79; + }; + 4CB1EAB72D5DFBB700612E79 = { + CreatedOnToolsVersion = 16.2; + TestTargetID = 4CB1EA992D5DFBB600612E79; + }; + }; + }; + buildConfigurationList = 4CB1EA952D5DFBB600612E79 /* Build configuration list for PBXProject "Tonbo" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 4CB1EA912D5DFBB600612E79; + minimizedProjectReferenceProxies = 1; + packageReferences = ( + 4CB1EACC2D5DFD9D00612E79 /* XCRemoteSwiftPackageReference "apollo-ios" */, + ); + preferredProjectObjectVersion = 77; + productRefGroup = 4CB1EA9B2D5DFBB600612E79 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 4CB1EA992D5DFBB600612E79 /* Tonbo */, + 4CB1EAAD2D5DFBB700612E79 /* TonboTests */, + 4CB1EAB72D5DFBB700612E79 /* TonboUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 4CB1EA982D5DFBB600612E79 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4CB1EAAC2D5DFBB700612E79 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4CB1EAB62D5DFBB700612E79 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 4CB1EA962D5DFBB600612E79 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4CB1EAAA2D5DFBB700612E79 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4CB1EAB42D5DFBB700612E79 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 4CB1EAB02D5DFBB700612E79 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4CB1EA992D5DFBB600612E79 /* Tonbo */; + targetProxy = 4CB1EAAF2D5DFBB700612E79 /* PBXContainerItemProxy */; + }; + 4CB1EABA2D5DFBB700612E79 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4CB1EA992D5DFBB600612E79 /* Tonbo */; + targetProxy = 4CB1EAB92D5DFBB700612E79 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 4CB1EAC22D5DFBB700612E79 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = Tonbo/Tonbo.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"Tonbo/Preview Content\""; + DEVELOPMENT_TEAM = D6JHZ49FTL; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = Tonbo/Info.plist; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 18.2; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.fuwned.Tonbo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + XROS_DEPLOYMENT_TARGET = 2.2; + }; + name = Debug; + }; + 4CB1EAC32D5DFBB700612E79 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = Tonbo/Tonbo.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"Tonbo/Preview Content\""; + DEVELOPMENT_TEAM = D6JHZ49FTL; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = Tonbo/Info.plist; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 18.2; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.fuwned.Tonbo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + XROS_DEPLOYMENT_TARGET = 2.2; + }; + name = Release; + }; + 4CB1EAC42D5DFBB700612E79 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 4CB1EAC52D5DFBB700612E79 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SWIFT_COMPILATION_MODE = wholemodule; + }; + name = Release; + }; + 4CB1EAC72D5DFBB700612E79 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = D6JHZ49FTL; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.2; + MACOSX_DEPLOYMENT_TARGET = 15.2; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = me.fuwned.TonboTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Tonbo.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Tonbo"; + XROS_DEPLOYMENT_TARGET = 2.2; + }; + name = Debug; + }; + 4CB1EAC82D5DFBB700612E79 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = D6JHZ49FTL; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.2; + MACOSX_DEPLOYMENT_TARGET = 15.2; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = me.fuwned.TonboTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Tonbo.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Tonbo"; + XROS_DEPLOYMENT_TARGET = 2.2; + }; + name = Release; + }; + 4CB1EACA2D5DFBB700612E79 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = D6JHZ49FTL; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.2; + MACOSX_DEPLOYMENT_TARGET = 15.2; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = me.fuwned.TonboUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + TEST_TARGET_NAME = Tonbo; + XROS_DEPLOYMENT_TARGET = 2.2; + }; + name = Debug; + }; + 4CB1EACB2D5DFBB700612E79 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = D6JHZ49FTL; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.2; + MACOSX_DEPLOYMENT_TARGET = 15.2; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = me.fuwned.TonboUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + TEST_TARGET_NAME = Tonbo; + XROS_DEPLOYMENT_TARGET = 2.2; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 4CB1EA952D5DFBB600612E79 /* Build configuration list for PBXProject "Tonbo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4CB1EAC42D5DFBB700612E79 /* Debug */, + 4CB1EAC52D5DFBB700612E79 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4CB1EAC12D5DFBB700612E79 /* Build configuration list for PBXNativeTarget "Tonbo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4CB1EAC22D5DFBB700612E79 /* Debug */, + 4CB1EAC32D5DFBB700612E79 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4CB1EAC62D5DFBB700612E79 /* Build configuration list for PBXNativeTarget "TonboTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4CB1EAC72D5DFBB700612E79 /* Debug */, + 4CB1EAC82D5DFBB700612E79 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4CB1EAC92D5DFBB700612E79 /* Build configuration list for PBXNativeTarget "TonboUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4CB1EACA2D5DFBB700612E79 /* Debug */, + 4CB1EACB2D5DFBB700612E79 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 4CB1EACC2D5DFD9D00612E79 /* XCRemoteSwiftPackageReference "apollo-ios" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/apollographql/apollo-ios.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.17.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 4CB1EACD2D5DFD9D00612E79 /* Apollo */ = { + isa = XCSwiftPackageProductDependency; + package = 4CB1EACC2D5DFD9D00612E79 /* XCRemoteSwiftPackageReference "apollo-ios" */; + productName = Apollo; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 4CB1EA922D5DFBB600612E79 /* Project object */; +} diff --git a/Tonbo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Tonbo.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/Tonbo.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Workspace + version = "1.0"> + <FileRef + location = "self:"> + </FileRef> +</Workspace> diff --git a/Tonbo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Tonbo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..2689329 --- /dev/null +++ b/Tonbo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,24 @@ +{ + "originHash" : "931440278103ba39b2d835f2c346aeb873ebcb4ff41767ce2ae24e250b359dbe", + "pins" : [ + { + "identity" : "apollo-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apollographql/apollo-ios.git", + "state" : { + "revision" : "e98e9d3b398b6005149074d51b097e31aaa44f63", + "version" : "1.17.0" + } + }, + { + "identity" : "sqlite.swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/stephencelis/SQLite.swift.git", + "state" : { + "revision" : "a95fc6df17d108bd99210db5e8a9bac90fe984b8", + "version" : "0.15.3" + } + } + ], + "version" : 3 +} diff --git a/Tonbo/Assets.xcassets/AccentColor.colorset/Contents.json b/Tonbo/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/Tonbo/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Tonbo/Assets.xcassets/AppIcon.appiconset/Contents.json b/Tonbo/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..ffdfe15 --- /dev/null +++ b/Tonbo/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,85 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Tonbo/Assets.xcassets/Contents.json b/Tonbo/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Tonbo/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Tonbo/ContentView.swift b/Tonbo/ContentView.swift new file mode 100644 index 0000000..b806ec4 --- /dev/null +++ b/Tonbo/ContentView.swift @@ -0,0 +1,59 @@ +import SwiftData +import SwiftUI + +struct ContentView: View { + @Environment(\.modelContext) private var modelContext + @Query private var items: [Item] + + var body: some View { + NavigationSplitView { + List { + ForEach(items) { item in + NavigationLink { + Text("Item at \(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard))") + } label: { + Text(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard)) + } + } + .onDelete(perform: deleteItems) + } + #if os(macOS) + .navigationSplitViewColumnWidth(min: 180, ideal: 200) + #endif + .toolbar { + #if os(iOS) + ToolbarItem(placement: .navigationBarTrailing) { + EditButton() + } + #endif + ToolbarItem { + Button(action: addItem) { + Label("Add Item", systemImage: "plus") + } + } + } + } detail: { + Text("Select an item") + } + } + + private func addItem() { + withAnimation { + let newItem = Item(timestamp: Date()) + modelContext.insert(newItem) + } + } + + private func deleteItems(offsets: IndexSet) { + withAnimation { + for index in offsets { + modelContext.delete(items[index]) + } + } + } +} + +#Preview { + ContentView() + .modelContainer(for: Item.self, inMemory: true) +} diff --git a/Tonbo/Info.plist b/Tonbo/Info.plist new file mode 100644 index 0000000..ca9a074 --- /dev/null +++ b/Tonbo/Info.plist @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>UIBackgroundModes</key> + <array> + <string>remote-notification</string> + </array> +</dict> +</plist> diff --git a/Tonbo/Item.swift b/Tonbo/Item.swift new file mode 100644 index 0000000..a2f85bf --- /dev/null +++ b/Tonbo/Item.swift @@ -0,0 +1,11 @@ +import Foundation +import SwiftData + +@Model +final class Item { + var timestamp: Date + + init(timestamp: Date) { + self.timestamp = timestamp + } +} diff --git a/Tonbo/Operations/Queries/UserIDQuery.graphql.swift b/Tonbo/Operations/Queries/UserIDQuery.graphql.swift new file mode 100644 index 0000000..e5ebf5f --- /dev/null +++ b/Tonbo/Operations/Queries/UserIDQuery.graphql.swift @@ -0,0 +1,44 @@ +// @generated +// This file was automatically generated and should not be edited. + +@_exported import ApolloAPI + +public class UserIDQuery: GraphQLQuery { + public static let operationName: String = "UserID" + public static let operationDocument: ApolloAPI.OperationDocument = .init( + definition: .init( + #"query UserID { User(name: "fuwn") { __typename id } }"# + )) + + public init() {} + + public struct Data: Tonbo.SelectionSet { + public let __data: DataDict + public init(_dataDict: DataDict) { __data = _dataDict } + + public static var __parentType: any ApolloAPI.ParentType { Tonbo.Objects.Query } + public static var __selections: [ApolloAPI.Selection] { [ + .field("User", User?.self, arguments: ["name": "fuwn"]), + ] } + + /// User query + public var user: User? { __data["User"] } + + /// User + /// + /// Parent Type: `User` + public struct User: Tonbo.SelectionSet { + public let __data: DataDict + public init(_dataDict: DataDict) { __data = _dataDict } + + public static var __parentType: any ApolloAPI.ParentType { Tonbo.Objects.User } + public static var __selections: [ApolloAPI.Selection] { [ + .field("__typename", String.self), + .field("id", Int.self), + ] } + + /// The id of the user + public var id: Int { __data["id"] } + } + } +} diff --git a/Tonbo/Preview Content/Preview Assets.xcassets/Contents.json b/Tonbo/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Tonbo/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Tonbo/Schema/Objects/Query.graphql.swift b/Tonbo/Schema/Objects/Query.graphql.swift new file mode 100644 index 0000000..3ebe37d --- /dev/null +++ b/Tonbo/Schema/Objects/Query.graphql.swift @@ -0,0 +1,12 @@ +// @generated +// This file was automatically generated and should not be edited. + +import ApolloAPI + +public extension Objects { + static let Query = ApolloAPI.Object( + typename: "Query", + implementedInterfaces: [], + keyFields: nil + ) +}
\ No newline at end of file diff --git a/Tonbo/Schema/Objects/User.graphql.swift b/Tonbo/Schema/Objects/User.graphql.swift new file mode 100644 index 0000000..cd0bf77 --- /dev/null +++ b/Tonbo/Schema/Objects/User.graphql.swift @@ -0,0 +1,13 @@ +// @generated +// This file was automatically generated and should not be edited. + +import ApolloAPI + +public extension Objects { + /// A user + static let User = ApolloAPI.Object( + typename: "User", + implementedInterfaces: [], + keyFields: nil + ) +}
\ No newline at end of file diff --git a/Tonbo/Schema/SchemaConfiguration.swift b/Tonbo/Schema/SchemaConfiguration.swift new file mode 100644 index 0000000..8723501 --- /dev/null +++ b/Tonbo/Schema/SchemaConfiguration.swift @@ -0,0 +1,15 @@ +// @generated +// This file was automatically generated and can be edited to +// provide custom configuration for a generated GraphQL schema. +// +// Any changes to this file will not be overwritten by future +// code generation execution. + +import ApolloAPI + +public enum SchemaConfiguration: ApolloAPI.SchemaConfiguration { + public static func cacheKeyInfo(for type: ApolloAPI.Object, object: ApolloAPI.ObjectData) -> CacheKeyInfo? { + // Implement this function to configure cache key resolution for your schema types. + return nil + } +} diff --git a/Tonbo/Schema/SchemaMetadata.graphql.swift b/Tonbo/Schema/SchemaMetadata.graphql.swift new file mode 100644 index 0000000..2607e16 --- /dev/null +++ b/Tonbo/Schema/SchemaMetadata.graphql.swift @@ -0,0 +1,32 @@ +// @generated +// This file was automatically generated and should not be edited. + +import ApolloAPI + +public protocol SelectionSet: ApolloAPI.SelectionSet & ApolloAPI.RootSelectionSet +where Schema == Tonbo.SchemaMetadata {} + +public protocol InlineFragment: ApolloAPI.SelectionSet & ApolloAPI.InlineFragment +where Schema == Tonbo.SchemaMetadata {} + +public protocol MutableSelectionSet: ApolloAPI.MutableRootSelectionSet +where Schema == Tonbo.SchemaMetadata {} + +public protocol MutableInlineFragment: ApolloAPI.MutableSelectionSet & ApolloAPI.InlineFragment +where Schema == Tonbo.SchemaMetadata {} + +public enum SchemaMetadata: ApolloAPI.SchemaMetadata { + public static let configuration: any ApolloAPI.SchemaConfiguration.Type = SchemaConfiguration.self + + public static func objectType(forTypename typename: String) -> ApolloAPI.Object? { + switch typename { + case "Query": return Tonbo.Objects.Query + case "User": return Tonbo.Objects.User + default: return nil + } + } +} + +public enum Objects {} +public enum Interfaces {} +public enum Unions {} diff --git a/Tonbo/Tonbo.entitlements b/Tonbo/Tonbo.entitlements new file mode 100644 index 0000000..53000f3 --- /dev/null +++ b/Tonbo/Tonbo.entitlements @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>aps-environment</key> + <string>development</string> + <key>com.apple.developer.aps-environment</key> + <string>development</string> + <key>com.apple.developer.icloud-container-identifiers</key> + <array/> + <key>com.apple.developer.icloud-services</key> + <array> + <string>CloudKit</string> + </array> + <key>com.apple.security.app-sandbox</key> + <true/> + <key>com.apple.security.files.user-selected.read-only</key> + <true/> +</dict> +</plist> diff --git a/Tonbo/TonboApp.swift b/Tonbo/TonboApp.swift new file mode 100644 index 0000000..b9ed870 --- /dev/null +++ b/Tonbo/TonboApp.swift @@ -0,0 +1,23 @@ +import SwiftData +import SwiftUI + +@main +struct TonboApp: App { + var sharedModelContainer: ModelContainer = { + let schema = Schema([Item.self]) + let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false) + + do { + return try ModelContainer(for: schema, configurations: [modelConfiguration]) + } catch { + fatalError("Could not create ModelContainer: \(error)") + } + }() + + var body: some Scene { + WindowGroup { + ContentView() + } + .modelContainer(sharedModelContainer) + } +} diff --git a/TonboTests/TonboTests.swift b/TonboTests/TonboTests.swift new file mode 100644 index 0000000..a107f90 --- /dev/null +++ b/TonboTests/TonboTests.swift @@ -0,0 +1,31 @@ +import Testing +import Foundation +import Apollo +import Tonbo + +struct TonboTests { + private let apolloClient = ApolloClient(url: URL(string: "https://graphql.anilist.co")!) + + private func fetchUserID(completion: @escaping (Int) -> Void) { + apolloClient.fetch(query: UserIDQuery()) { result in + switch result { + case .success(let graphQLResult): + if let userID = graphQLResult.data?.user?.id { + completion(userID) + } else if let errors = graphQLResult.errors { + print(errors) + completion(-1) + } + case .failure(let error): + print(error) + completion(-2) + } + } + } + + @Test private func userIDQuery() async throws { + fetchUserID { userID in + #expect(userID == 5678223) + } + } +} diff --git a/TonboUITests/TonboUITests.swift b/TonboUITests/TonboUITests.swift new file mode 100644 index 0000000..59884d4 --- /dev/null +++ b/TonboUITests/TonboUITests.swift @@ -0,0 +1,36 @@ +import XCTest + +final class TonboUITests: XCTestCase { + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests + // before they run. The setUp method is a good place to do this. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + @MainActor + func testExample() throws { + // UI tests must launch the application that they test. + let app = XCUIApplication() + app.launch() + + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + @MainActor + func testLaunchPerformance() throws { + if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) { + // This measures how long it takes to launch your application. + measure(metrics: [XCTApplicationLaunchMetric()]) { + XCUIApplication().launch() + } + } + } +} diff --git a/TonboUITests/TonboUITestsLaunchTests.swift b/TonboUITests/TonboUITestsLaunchTests.swift new file mode 100644 index 0000000..ce35cd4 --- /dev/null +++ b/TonboUITests/TonboUITestsLaunchTests.swift @@ -0,0 +1,25 @@ +import XCTest + +final class TonboUITestsLaunchTests: XCTestCase { + override static var runsForEachTargetApplicationUIConfiguration: Bool { + true + } + + override func setUpWithError() throws { + continueAfterFailure = false + } + + @MainActor + func testLaunch() throws { + let app = XCUIApplication() + app.launch() + + // Insert steps here to perform after app launch but before taking a screenshot, + // such as logging into a test account or navigating somewhere in the app + + let attachment = XCTAttachment(screenshot: app.screenshot()) + attachment.name = "Launch Screen" + attachment.lifetime = .keepAlways + add(attachment) + } +} diff --git a/apollo-codegen-config.json b/apollo-codegen-config.json new file mode 100644 index 0000000..7698749 --- /dev/null +++ b/apollo-codegen-config.json @@ -0,0 +1,43 @@ +{ + "schemaNamespace" : "Tonbo", + "schemaDownload": { + "downloadMethod": { + "introspection": { + "endpointURL": "https://graphql.anilist.co", + "httpMethod": { + "POST": {} + }, + "includeDeprecatedInputValues": false, + "outputFormat": "SDL" + } + }, + "downloadTimeout": 60, + "headers": [], + "outputPath": "./graphql/schema.graphqls" + }, + "input" : { + "operationSearchPaths" : [ + "**/*.graphql" + ], + "schemaSearchPaths" : [ + "**/*.graphqls" + ] + }, + "output" : { + "testMocks" : { + "none" : { + } + }, + "schemaTypes" : { + "path" : "./Tonbo", + "moduleType" : { + "other" : { + } + } + }, + "operations" : { + "inSchemaModule" : { + } + } + } +} diff --git a/graphql/Operations/UserID.graphql b/graphql/Operations/UserID.graphql new file mode 100644 index 0000000..1dd60f6 --- /dev/null +++ b/graphql/Operations/UserID.graphql @@ -0,0 +1,5 @@ +query UserID { + User(name: "fuwn") { + id + } +} diff --git a/graphql/schema.graphqls b/graphql/schema.graphqls new file mode 100644 index 0000000..ac1a3be --- /dev/null +++ b/graphql/schema.graphqls @@ -0,0 +1,6475 @@ +""" +A directive used by the Apollo iOS client to annotate operations or fragments that should be used exclusively for generating local cache mutations instead of as standard operations. +""" +directive @apollo_client_ios_localCacheMutation on QUERY | MUTATION | SUBSCRIPTION | FRAGMENT_DEFINITION + +""" +A directive used by the Apollo iOS code generation engine to generate custom import statements in operation or fragment definition files. An import statement to import a module with the name provided in the `module` argument will be added to the generated definition file. +""" +directive @import( + """The name of the module to import.""" + module: String! +) repeatable on QUERY | MUTATION | SUBSCRIPTION | FRAGMENT_DEFINITION + +""" +Directs the executor to defer this fragment when the `if` argument is true or undefined. +""" +directive @defer( + """Deferred when true or undefined.""" + if: Boolean + + """Unique name""" + label: String +) on FRAGMENT_SPREAD | INLINE_FRAGMENT + +type Query { + Page( + """The page number""" + page: Int + + """The amount of entries per page, max 50""" + perPage: Int + ): Page + + """Media query""" + Media( + """Filter by the media id""" + id: Int + + """Filter by the media's MyAnimeList id""" + idMal: Int + + """Filter by the start date of the media""" + startDate: FuzzyDateInt + + """Filter by the end date of the media""" + endDate: FuzzyDateInt + + """Filter by the season the media was released in""" + season: MediaSeason + + """ + The year of the season (Winter 2017 would also include December 2016 releases). Requires season argument + """ + seasonYear: Int + + """Filter by the media's type""" + type: MediaType + + """Filter by the media's format""" + format: MediaFormat + + """Filter by the media's current release status""" + status: MediaStatus + + """Filter by amount of episodes the media has""" + episodes: Int + + """Filter by the media's episode length""" + duration: Int + + """Filter by the media's chapter count""" + chapters: Int + + """Filter by the media's volume count""" + volumes: Int + + """Filter by if the media's intended for 18+ adult audiences""" + isAdult: Boolean + + """Filter by the media's genres""" + genre: String + + """Filter by the media's tags""" + tag: String + + """ + Only apply the tags filter argument to tags above this rank. Default: 18 + """ + minimumTagRank: Int + + """Filter by the media's tags with in a tag category""" + tagCategory: String + + """Filter by the media on the authenticated user's lists""" + onList: Boolean + + """Filter media by sites name with a online streaming or reading license""" + licensedBy: String + + """Filter media by sites id with a online streaming or reading license""" + licensedById: Int + + """Filter by the media's average score""" + averageScore: Int + + """Filter by the number of users with this media on their list""" + popularity: Int + + """Filter by the source type of the media""" + source: MediaSource + + """Filter by the media's country of origin""" + countryOfOrigin: CountryCode + + """If the media is officially licensed or a self-published doujin release""" + isLicensed: Boolean + + """Filter by search query""" + search: String + + """Filter by the media id""" + id_not: Int + + """Filter by the media id""" + id_in: [Int] + + """Filter by the media id""" + id_not_in: [Int] + + """Filter by the media's MyAnimeList id""" + idMal_not: Int + + """Filter by the media's MyAnimeList id""" + idMal_in: [Int] + + """Filter by the media's MyAnimeList id""" + idMal_not_in: [Int] + + """Filter by the start date of the media""" + startDate_greater: FuzzyDateInt + + """Filter by the start date of the media""" + startDate_lesser: FuzzyDateInt + + """Filter by the start date of the media""" + startDate_like: String + + """Filter by the end date of the media""" + endDate_greater: FuzzyDateInt + + """Filter by the end date of the media""" + endDate_lesser: FuzzyDateInt + + """Filter by the end date of the media""" + endDate_like: String + + """Filter by the media's format""" + format_in: [MediaFormat] + + """Filter by the media's format""" + format_not: MediaFormat + + """Filter by the media's format""" + format_not_in: [MediaFormat] + + """Filter by the media's current release status""" + status_in: [MediaStatus] + + """Filter by the media's current release status""" + status_not: MediaStatus + + """Filter by the media's current release status""" + status_not_in: [MediaStatus] + + """Filter by amount of episodes the media has""" + episodes_greater: Int + + """Filter by amount of episodes the media has""" + episodes_lesser: Int + + """Filter by the media's episode length""" + duration_greater: Int + + """Filter by the media's episode length""" + duration_lesser: Int + + """Filter by the media's chapter count""" + chapters_greater: Int + + """Filter by the media's chapter count""" + chapters_lesser: Int + + """Filter by the media's volume count""" + volumes_greater: Int + + """Filter by the media's volume count""" + volumes_lesser: Int + + """Filter by the media's genres""" + genre_in: [String] + + """Filter by the media's genres""" + genre_not_in: [String] + + """Filter by the media's tags""" + tag_in: [String] + + """Filter by the media's tags""" + tag_not_in: [String] + + """Filter by the media's tags with in a tag category""" + tagCategory_in: [String] + + """Filter by the media's tags with in a tag category""" + tagCategory_not_in: [String] + + """Filter media by sites name with a online streaming or reading license""" + licensedBy_in: [String] + + """Filter media by sites id with a online streaming or reading license""" + licensedById_in: [Int] + + """Filter by the media's average score""" + averageScore_not: Int + + """Filter by the media's average score""" + averageScore_greater: Int + + """Filter by the media's average score""" + averageScore_lesser: Int + + """Filter by the number of users with this media on their list""" + popularity_not: Int + + """Filter by the number of users with this media on their list""" + popularity_greater: Int + + """Filter by the number of users with this media on their list""" + popularity_lesser: Int + + """Filter by the source type of the media""" + source_in: [MediaSource] + + """The order the results will be returned in""" + sort: [MediaSort] + ): Media + + """Media Trend query""" + MediaTrend( + """Filter by the media id""" + mediaId: Int + + """Filter by date""" + date: Int + + """Filter by trending amount""" + trending: Int + + """Filter by score""" + averageScore: Int + + """Filter by popularity""" + popularity: Int + + """Filter by episode number""" + episode: Int + + """Filter to stats recorded while the media was releasing""" + releasing: Boolean + + """Filter by the media id""" + mediaId_not: Int + + """Filter by the media id""" + mediaId_in: [Int] + + """Filter by the media id""" + mediaId_not_in: [Int] + + """Filter by date""" + date_greater: Int + + """Filter by date""" + date_lesser: Int + + """Filter by trending amount""" + trending_greater: Int + + """Filter by trending amount""" + trending_lesser: Int + + """Filter by trending amount""" + trending_not: Int + + """Filter by score""" + averageScore_greater: Int + + """Filter by score""" + averageScore_lesser: Int + + """Filter by score""" + averageScore_not: Int + + """Filter by popularity""" + popularity_greater: Int + + """Filter by popularity""" + popularity_lesser: Int + + """Filter by popularity""" + popularity_not: Int + + """Filter by episode number""" + episode_greater: Int + + """Filter by episode number""" + episode_lesser: Int + + """Filter by episode number""" + episode_not: Int + + """The order the results will be returned in""" + sort: [MediaTrendSort] + ): MediaTrend + + """Airing schedule query""" + AiringSchedule( + """Filter by the id of the airing schedule item""" + id: Int + + """Filter by the id of associated media""" + mediaId: Int + + """Filter by the airing episode number""" + episode: Int + + """Filter by the time of airing""" + airingAt: Int + + """Filter to episodes that haven't yet aired""" + notYetAired: Boolean + + """Filter by the id of the airing schedule item""" + id_not: Int + + """Filter by the id of the airing schedule item""" + id_in: [Int] + + """Filter by the id of the airing schedule item""" + id_not_in: [Int] + + """Filter by the id of associated media""" + mediaId_not: Int + + """Filter by the id of associated media""" + mediaId_in: [Int] + + """Filter by the id of associated media""" + mediaId_not_in: [Int] + + """Filter by the airing episode number""" + episode_not: Int + + """Filter by the airing episode number""" + episode_in: [Int] + + """Filter by the airing episode number""" + episode_not_in: [Int] + + """Filter by the airing episode number""" + episode_greater: Int + + """Filter by the airing episode number""" + episode_lesser: Int + + """Filter by the time of airing""" + airingAt_greater: Int + + """Filter by the time of airing""" + airingAt_lesser: Int + + """The order the results will be returned in""" + sort: [AiringSort] + ): AiringSchedule + + """Character query""" + Character( + """Filter by character id""" + id: Int + + """Filter by character by if its their birthday today""" + isBirthday: Boolean + + """Filter by search query""" + search: String + + """Filter by character id""" + id_not: Int + + """Filter by character id""" + id_in: [Int] + + """Filter by character id""" + id_not_in: [Int] + + """The order the results will be returned in""" + sort: [CharacterSort] + ): Character + + """Staff query""" + Staff( + """Filter by the staff id""" + id: Int + + """Filter by staff by if its their birthday today""" + isBirthday: Boolean + + """Filter by search query""" + search: String + + """Filter by the staff id""" + id_not: Int + + """Filter by the staff id""" + id_in: [Int] + + """Filter by the staff id""" + id_not_in: [Int] + + """The order the results will be returned in""" + sort: [StaffSort] + ): Staff + + """Media list query""" + MediaList( + """Filter by a list entry's id""" + id: Int + + """Filter by a user's id""" + userId: Int + + """Filter by a user's name""" + userName: String + + """Filter by the list entries media type""" + type: MediaType + + """Filter by the watching/reading status""" + status: MediaListStatus + + """Filter by the media id of the list entry""" + mediaId: Int + + """ + Filter list entries to users who are being followed by the authenticated user + """ + isFollowing: Boolean + + """Filter by note words and #tags""" + notes: String + + """Filter by the date the user started the media""" + startedAt: FuzzyDateInt + + """Filter by the date the user completed the media""" + completedAt: FuzzyDateInt + + """ + Limit to only entries also on the auth user's list. Requires user id or name arguments. + """ + compareWithAuthList: Boolean + + """Filter by a user's id""" + userId_in: [Int] + + """Filter by the watching/reading status""" + status_in: [MediaListStatus] + + """Filter by the watching/reading status""" + status_not_in: [MediaListStatus] + + """Filter by the watching/reading status""" + status_not: MediaListStatus + + """Filter by the media id of the list entry""" + mediaId_in: [Int] + + """Filter by the media id of the list entry""" + mediaId_not_in: [Int] + + """Filter by note words and #tags""" + notes_like: String + + """Filter by the date the user started the media""" + startedAt_greater: FuzzyDateInt + + """Filter by the date the user started the media""" + startedAt_lesser: FuzzyDateInt + + """Filter by the date the user started the media""" + startedAt_like: String + + """Filter by the date the user completed the media""" + completedAt_greater: FuzzyDateInt + + """Filter by the date the user completed the media""" + completedAt_lesser: FuzzyDateInt + + """Filter by the date the user completed the media""" + completedAt_like: String + + """The order the results will be returned in""" + sort: [MediaListSort] + ): MediaList + + """ + Media list collection query, provides list pre-grouped by status & custom lists. User ID and Media Type arguments required. + """ + MediaListCollection( + """Filter by a user's id""" + userId: Int + + """Filter by a user's name""" + userName: String + + """Filter by the list entries media type""" + type: MediaType + + """Filter by the watching/reading status""" + status: MediaListStatus + + """Filter by note words and #tags""" + notes: String + + """Filter by the date the user started the media""" + startedAt: FuzzyDateInt + + """Filter by the date the user completed the media""" + completedAt: FuzzyDateInt + + """ + Always return completed list entries in one group, overriding the user's split completed option. + """ + forceSingleCompletedList: Boolean + + """Which chunk of list entries to load""" + chunk: Int + + """The amount of entries per chunk, max 500""" + perChunk: Int + + """Filter by the watching/reading status""" + status_in: [MediaListStatus] + + """Filter by the watching/reading status""" + status_not_in: [MediaListStatus] + + """Filter by the watching/reading status""" + status_not: MediaListStatus + + """Filter by note words and #tags""" + notes_like: String + + """Filter by the date the user started the media""" + startedAt_greater: FuzzyDateInt + + """Filter by the date the user started the media""" + startedAt_lesser: FuzzyDateInt + + """Filter by the date the user started the media""" + startedAt_like: String + + """Filter by the date the user completed the media""" + completedAt_greater: FuzzyDateInt + + """Filter by the date the user completed the media""" + completedAt_lesser: FuzzyDateInt + + """Filter by the date the user completed the media""" + completedAt_like: String + + """The order the results will be returned in""" + sort: [MediaListSort] + ): MediaListCollection + + """Collection of all the possible media genres""" + GenreCollection: [String] + + """Collection of all the possible media tags""" + MediaTagCollection( + """Mod Only""" + status: Int + ): [MediaTag] + + """User query""" + User( + """Filter by the user id""" + id: Int + + """Filter by the name of the user""" + name: String + + """Filter to moderators only if true""" + isModerator: Boolean + + """Filter by search query""" + search: String + + """The order the results will be returned in""" + sort: [UserSort] + ): User + + """Get the currently authenticated user""" + Viewer: User + + """Notification query""" + Notification( + """Filter by the type of notifications""" + type: NotificationType + + """Reset the unread notification count to 0 on load""" + resetNotificationCount: Boolean + + """Filter by the type of notifications""" + type_in: [NotificationType] + ): NotificationUnion + + """Studio query""" + Studio( + """Filter by the studio id""" + id: Int + + """Filter by search query""" + search: String + + """Filter by the studio id""" + id_not: Int + + """Filter by the studio id""" + id_in: [Int] + + """Filter by the studio id""" + id_not_in: [Int] + + """The order the results will be returned in""" + sort: [StudioSort] + ): Studio + + """Review query""" + Review( + """Filter by Review id""" + id: Int + + """Filter by media id""" + mediaId: Int + + """Filter by user id""" + userId: Int + + """Filter by media type""" + mediaType: MediaType + + """The order the results will be returned in""" + sort: [ReviewSort] + ): Review + + """Activity query""" + Activity( + """Filter by the activity id""" + id: Int + + """Filter by the owner user id""" + userId: Int + + """Filter by the id of the user who sent a message""" + messengerId: Int + + """Filter by the associated media id of the activity""" + mediaId: Int + + """Filter by the type of activity""" + type: ActivityType + + """ + Filter activity to users who are being followed by the authenticated user + """ + isFollowing: Boolean + + """Filter activity to only activity with replies""" + hasReplies: Boolean + + """Filter activity to only activity with replies or is of type text""" + hasRepliesOrTypeText: Boolean + + """Filter by the time the activity was created""" + createdAt: Int + + """Filter by the activity id""" + id_not: Int + + """Filter by the activity id""" + id_in: [Int] + + """Filter by the activity id""" + id_not_in: [Int] + + """Filter by the owner user id""" + userId_not: Int + + """Filter by the owner user id""" + userId_in: [Int] + + """Filter by the owner user id""" + userId_not_in: [Int] + + """Filter by the id of the user who sent a message""" + messengerId_not: Int + + """Filter by the id of the user who sent a message""" + messengerId_in: [Int] + + """Filter by the id of the user who sent a message""" + messengerId_not_in: [Int] + + """Filter by the associated media id of the activity""" + mediaId_not: Int + + """Filter by the associated media id of the activity""" + mediaId_in: [Int] + + """Filter by the associated media id of the activity""" + mediaId_not_in: [Int] + + """Filter by the type of activity""" + type_not: ActivityType + + """Filter by the type of activity""" + type_in: [ActivityType] + + """Filter by the type of activity""" + type_not_in: [ActivityType] + + """Filter by the time the activity was created""" + createdAt_greater: Int + + """Filter by the time the activity was created""" + createdAt_lesser: Int + + """The order the results will be returned in""" + sort: [ActivitySort] + ): ActivityUnion + + """Activity reply query""" + ActivityReply( + """Filter by the reply id""" + id: Int + + """Filter by the parent id""" + activityId: Int + ): ActivityReply + + """Follow query""" + Following( + """User id of the follower/followed""" + userId: Int! + + """The order the results will be returned in""" + sort: [UserSort] + ): User + + """Follow query""" + Follower( + """User id of the follower/followed""" + userId: Int! + + """The order the results will be returned in""" + sort: [UserSort] + ): User + + """Thread query""" + Thread( + """Filter by the thread id""" + id: Int + + """Filter by the user id of the thread's creator""" + userId: Int + + """Filter by the user id of the last user to comment on the thread""" + replyUserId: Int + + """Filter by if the currently authenticated user's subscribed threads""" + subscribed: Boolean + + """Filter by thread category id""" + categoryId: Int + + """Filter by thread media id category""" + mediaCategoryId: Int + + """Filter by search query""" + search: String + + """Filter by the thread id""" + id_in: [Int] + + """The order the results will be returned in""" + sort: [ThreadSort] + ): Thread + + """Comment query""" + ThreadComment( + """Filter by the comment id""" + id: Int + + """Filter by the thread id""" + threadId: Int + + """Filter by the user id of the comment's creator""" + userId: Int + + """The order the results will be returned in""" + sort: [ThreadCommentSort] + ): [ThreadComment] + + """Recommendation query""" + Recommendation( + """Filter by recommendation id""" + id: Int + + """Filter by media id""" + mediaId: Int + + """Filter by media recommendation id""" + mediaRecommendationId: Int + + """Filter by user who created the recommendation""" + userId: Int + + """Filter by total rating of the recommendation""" + rating: Int + + """Filter by the media on the authenticated user's lists""" + onList: Boolean + + """Filter by total rating of the recommendation""" + rating_greater: Int + + """Filter by total rating of the recommendation""" + rating_lesser: Int + + """The order the results will be returned in""" + sort: [RecommendationSort] + ): Recommendation + + """Like query""" + Like( + """The id of the likeable type""" + likeableId: Int + + """The type of model the id applies to""" + type: LikeableType + ): User + + """Provide AniList markdown to be converted to html (Requires auth)""" + Markdown( + """The markdown to be parsed to html""" + markdown: String! + ): ParsedMarkdown + AniChartUser: AniChartUser + + """Site statistics query""" + SiteStatistics: SiteStatistics + + """ExternalLinkSource collection query""" + ExternalLinkSourceCollection( + """Filter by the link id""" + id: Int + type: ExternalLinkType + mediaType: ExternalLinkMediaType + ): [MediaExternalLink] +} + +"""Page of data""" +type Page { + """The pagination information""" + pageInfo: PageInfo + users( + """Filter by the user id""" + id: Int + + """Filter by the name of the user""" + name: String + + """Filter to moderators only if true""" + isModerator: Boolean + + """Filter by search query""" + search: String + + """The order the results will be returned in""" + sort: [UserSort] + ): [User] + media( + """Filter by the media id""" + id: Int + + """Filter by the media's MyAnimeList id""" + idMal: Int + + """Filter by the start date of the media""" + startDate: FuzzyDateInt + + """Filter by the end date of the media""" + endDate: FuzzyDateInt + + """Filter by the season the media was released in""" + season: MediaSeason + + """ + The year of the season (Winter 2017 would also include December 2016 releases). Requires season argument + """ + seasonYear: Int + + """Filter by the media's type""" + type: MediaType + + """Filter by the media's format""" + format: MediaFormat + + """Filter by the media's current release status""" + status: MediaStatus + + """Filter by amount of episodes the media has""" + episodes: Int + + """Filter by the media's episode length""" + duration: Int + + """Filter by the media's chapter count""" + chapters: Int + + """Filter by the media's volume count""" + volumes: Int + + """Filter by if the media's intended for 18+ adult audiences""" + isAdult: Boolean + + """Filter by the media's genres""" + genre: String + + """Filter by the media's tags""" + tag: String + + """ + Only apply the tags filter argument to tags above this rank. Default: 18 + """ + minimumTagRank: Int + + """Filter by the media's tags with in a tag category""" + tagCategory: String + + """Filter by the media on the authenticated user's lists""" + onList: Boolean + + """Filter media by sites name with a online streaming or reading license""" + licensedBy: String + + """Filter media by sites id with a online streaming or reading license""" + licensedById: Int + + """Filter by the media's average score""" + averageScore: Int + + """Filter by the number of users with this media on their list""" + popularity: Int + + """Filter by the source type of the media""" + source: MediaSource + + """Filter by the media's country of origin""" + countryOfOrigin: CountryCode + + """If the media is officially licensed or a self-published doujin release""" + isLicensed: Boolean + + """Filter by search query""" + search: String + + """Filter by the media id""" + id_not: Int + + """Filter by the media id""" + id_in: [Int] + + """Filter by the media id""" + id_not_in: [Int] + + """Filter by the media's MyAnimeList id""" + idMal_not: Int + + """Filter by the media's MyAnimeList id""" + idMal_in: [Int] + + """Filter by the media's MyAnimeList id""" + idMal_not_in: [Int] + + """Filter by the start date of the media""" + startDate_greater: FuzzyDateInt + + """Filter by the start date of the media""" + startDate_lesser: FuzzyDateInt + + """Filter by the start date of the media""" + startDate_like: String + + """Filter by the end date of the media""" + endDate_greater: FuzzyDateInt + + """Filter by the end date of the media""" + endDate_lesser: FuzzyDateInt + + """Filter by the end date of the media""" + endDate_like: String + + """Filter by the media's format""" + format_in: [MediaFormat] + + """Filter by the media's format""" + format_not: MediaFormat + + """Filter by the media's format""" + format_not_in: [MediaFormat] + + """Filter by the media's current release status""" + status_in: [MediaStatus] + + """Filter by the media's current release status""" + status_not: MediaStatus + + """Filter by the media's current release status""" + status_not_in: [MediaStatus] + + """Filter by amount of episodes the media has""" + episodes_greater: Int + + """Filter by amount of episodes the media has""" + episodes_lesser: Int + + """Filter by the media's episode length""" + duration_greater: Int + + """Filter by the media's episode length""" + duration_lesser: Int + + """Filter by the media's chapter count""" + chapters_greater: Int + + """Filter by the media's chapter count""" + chapters_lesser: Int + + """Filter by the media's volume count""" + volumes_greater: Int + + """Filter by the media's volume count""" + volumes_lesser: Int + + """Filter by the media's genres""" + genre_in: [String] + + """Filter by the media's genres""" + genre_not_in: [String] + + """Filter by the media's tags""" + tag_in: [String] + + """Filter by the media's tags""" + tag_not_in: [String] + + """Filter by the media's tags with in a tag category""" + tagCategory_in: [String] + + """Filter by the media's tags with in a tag category""" + tagCategory_not_in: [String] + + """Filter media by sites name with a online streaming or reading license""" + licensedBy_in: [String] + + """Filter media by sites id with a online streaming or reading license""" + licensedById_in: [Int] + + """Filter by the media's average score""" + averageScore_not: Int + + """Filter by the media's average score""" + averageScore_greater: Int + + """Filter by the media's average score""" + averageScore_lesser: Int + + """Filter by the number of users with this media on their list""" + popularity_not: Int + + """Filter by the number of users with this media on their list""" + popularity_greater: Int + + """Filter by the number of users with this media on their list""" + popularity_lesser: Int + + """Filter by the source type of the media""" + source_in: [MediaSource] + + """The order the results will be returned in""" + sort: [MediaSort] + ): [Media] + characters( + """Filter by character id""" + id: Int + + """Filter by character by if its their birthday today""" + isBirthday: Boolean + + """Filter by search query""" + search: String + + """Filter by character id""" + id_not: Int + + """Filter by character id""" + id_in: [Int] + + """Filter by character id""" + id_not_in: [Int] + + """The order the results will be returned in""" + sort: [CharacterSort] + ): [Character] + staff( + """Filter by the staff id""" + id: Int + + """Filter by staff by if its their birthday today""" + isBirthday: Boolean + + """Filter by search query""" + search: String + + """Filter by the staff id""" + id_not: Int + + """Filter by the staff id""" + id_in: [Int] + + """Filter by the staff id""" + id_not_in: [Int] + + """The order the results will be returned in""" + sort: [StaffSort] + ): [Staff] + studios( + """Filter by the studio id""" + id: Int + + """Filter by search query""" + search: String + + """Filter by the studio id""" + id_not: Int + + """Filter by the studio id""" + id_in: [Int] + + """Filter by the studio id""" + id_not_in: [Int] + + """The order the results will be returned in""" + sort: [StudioSort] + ): [Studio] + mediaList( + """Filter by a list entry's id""" + id: Int + + """Filter by a user's id""" + userId: Int + + """Filter by a user's name""" + userName: String + + """Filter by the list entries media type""" + type: MediaType + + """Filter by the watching/reading status""" + status: MediaListStatus + + """Filter by the media id of the list entry""" + mediaId: Int + + """ + Filter list entries to users who are being followed by the authenticated user + """ + isFollowing: Boolean + + """Filter by note words and #tags""" + notes: String + + """Filter by the date the user started the media""" + startedAt: FuzzyDateInt + + """Filter by the date the user completed the media""" + completedAt: FuzzyDateInt + + """ + Limit to only entries also on the auth user's list. Requires user id or name arguments. + """ + compareWithAuthList: Boolean + + """Filter by a user's id""" + userId_in: [Int] + + """Filter by the watching/reading status""" + status_in: [MediaListStatus] + + """Filter by the watching/reading status""" + status_not_in: [MediaListStatus] + + """Filter by the watching/reading status""" + status_not: MediaListStatus + + """Filter by the media id of the list entry""" + mediaId_in: [Int] + + """Filter by the media id of the list entry""" + mediaId_not_in: [Int] + + """Filter by note words and #tags""" + notes_like: String + + """Filter by the date the user started the media""" + startedAt_greater: FuzzyDateInt + + """Filter by the date the user started the media""" + startedAt_lesser: FuzzyDateInt + + """Filter by the date the user started the media""" + startedAt_like: String + + """Filter by the date the user completed the media""" + completedAt_greater: FuzzyDateInt + + """Filter by the date the user completed the media""" + completedAt_lesser: FuzzyDateInt + + """Filter by the date the user completed the media""" + completedAt_like: String + + """The order the results will be returned in""" + sort: [MediaListSort] + ): [MediaList] + airingSchedules( + """Filter by the id of the airing schedule item""" + id: Int + + """Filter by the id of associated media""" + mediaId: Int + + """Filter by the airing episode number""" + episode: Int + + """Filter by the time of airing""" + airingAt: Int + + """Filter to episodes that haven't yet aired""" + notYetAired: Boolean + + """Filter by the id of the airing schedule item""" + id_not: Int + + """Filter by the id of the airing schedule item""" + id_in: [Int] + + """Filter by the id of the airing schedule item""" + id_not_in: [Int] + + """Filter by the id of associated media""" + mediaId_not: Int + + """Filter by the id of associated media""" + mediaId_in: [Int] + + """Filter by the id of associated media""" + mediaId_not_in: [Int] + + """Filter by the airing episode number""" + episode_not: Int + + """Filter by the airing episode number""" + episode_in: [Int] + + """Filter by the airing episode number""" + episode_not_in: [Int] + + """Filter by the airing episode number""" + episode_greater: Int + + """Filter by the airing episode number""" + episode_lesser: Int + + """Filter by the time of airing""" + airingAt_greater: Int + + """Filter by the time of airing""" + airingAt_lesser: Int + + """The order the results will be returned in""" + sort: [AiringSort] + ): [AiringSchedule] + mediaTrends( + """Filter by the media id""" + mediaId: Int + + """Filter by date""" + date: Int + + """Filter by trending amount""" + trending: Int + + """Filter by score""" + averageScore: Int + + """Filter by popularity""" + popularity: Int + + """Filter by episode number""" + episode: Int + + """Filter to stats recorded while the media was releasing""" + releasing: Boolean + + """Filter by the media id""" + mediaId_not: Int + + """Filter by the media id""" + mediaId_in: [Int] + + """Filter by the media id""" + mediaId_not_in: [Int] + + """Filter by date""" + date_greater: Int + + """Filter by date""" + date_lesser: Int + + """Filter by trending amount""" + trending_greater: Int + + """Filter by trending amount""" + trending_lesser: Int + + """Filter by trending amount""" + trending_not: Int + + """Filter by score""" + averageScore_greater: Int + + """Filter by score""" + averageScore_lesser: Int + + """Filter by score""" + averageScore_not: Int + + """Filter by popularity""" + popularity_greater: Int + + """Filter by popularity""" + popularity_lesser: Int + + """Filter by popularity""" + popularity_not: Int + + """Filter by episode number""" + episode_greater: Int + + """Filter by episode number""" + episode_lesser: Int + + """Filter by episode number""" + episode_not: Int + + """The order the results will be returned in""" + sort: [MediaTrendSort] + ): [MediaTrend] + notifications( + """Filter by the type of notifications""" + type: NotificationType + + """Reset the unread notification count to 0 on load""" + resetNotificationCount: Boolean + + """Filter by the type of notifications""" + type_in: [NotificationType] + ): [NotificationUnion] + followers( + """User id of the follower/followed""" + userId: Int! + + """The order the results will be returned in""" + sort: [UserSort] + ): [User] + following( + """User id of the follower/followed""" + userId: Int! + + """The order the results will be returned in""" + sort: [UserSort] + ): [User] + activities( + """Filter by the activity id""" + id: Int + + """Filter by the owner user id""" + userId: Int + + """Filter by the id of the user who sent a message""" + messengerId: Int + + """Filter by the associated media id of the activity""" + mediaId: Int + + """Filter by the type of activity""" + type: ActivityType + + """ + Filter activity to users who are being followed by the authenticated user + """ + isFollowing: Boolean + + """Filter activity to only activity with replies""" + hasReplies: Boolean + + """Filter activity to only activity with replies or is of type text""" + hasRepliesOrTypeText: Boolean + + """Filter by the time the activity was created""" + createdAt: Int + + """Filter by the activity id""" + id_not: Int + + """Filter by the activity id""" + id_in: [Int] + + """Filter by the activity id""" + id_not_in: [Int] + + """Filter by the owner user id""" + userId_not: Int + + """Filter by the owner user id""" + userId_in: [Int] + + """Filter by the owner user id""" + userId_not_in: [Int] + + """Filter by the id of the user who sent a message""" + messengerId_not: Int + + """Filter by the id of the user who sent a message""" + messengerId_in: [Int] + + """Filter by the id of the user who sent a message""" + messengerId_not_in: [Int] + + """Filter by the associated media id of the activity""" + mediaId_not: Int + + """Filter by the associated media id of the activity""" + mediaId_in: [Int] + + """Filter by the associated media id of the activity""" + mediaId_not_in: [Int] + + """Filter by the type of activity""" + type_not: ActivityType + + """Filter by the type of activity""" + type_in: [ActivityType] + + """Filter by the type of activity""" + type_not_in: [ActivityType] + + """Filter by the time the activity was created""" + createdAt_greater: Int + + """Filter by the time the activity was created""" + createdAt_lesser: Int + + """The order the results will be returned in""" + sort: [ActivitySort] + ): [ActivityUnion] + activityReplies( + """Filter by the reply id""" + id: Int + + """Filter by the parent id""" + activityId: Int + ): [ActivityReply] + threads( + """Filter by the thread id""" + id: Int + + """Filter by the user id of the thread's creator""" + userId: Int + + """Filter by the user id of the last user to comment on the thread""" + replyUserId: Int + + """Filter by if the currently authenticated user's subscribed threads""" + subscribed: Boolean + + """Filter by thread category id""" + categoryId: Int + + """Filter by thread media id category""" + mediaCategoryId: Int + + """Filter by search query""" + search: String + + """Filter by the thread id""" + id_in: [Int] + + """The order the results will be returned in""" + sort: [ThreadSort] + ): [Thread] + threadComments( + """Filter by the comment id""" + id: Int + + """Filter by the thread id""" + threadId: Int + + """Filter by the user id of the comment's creator""" + userId: Int + + """The order the results will be returned in""" + sort: [ThreadCommentSort] + ): [ThreadComment] + reviews( + """Filter by Review id""" + id: Int + + """Filter by media id""" + mediaId: Int + + """Filter by user id""" + userId: Int + + """Filter by media type""" + mediaType: MediaType + + """The order the results will be returned in""" + sort: [ReviewSort] + ): [Review] + recommendations( + """Filter by recommendation id""" + id: Int + + """Filter by media id""" + mediaId: Int + + """Filter by media recommendation id""" + mediaRecommendationId: Int + + """Filter by user who created the recommendation""" + userId: Int + + """Filter by total rating of the recommendation""" + rating: Int + + """Filter by the media on the authenticated user's lists""" + onList: Boolean + + """Filter by total rating of the recommendation""" + rating_greater: Int + + """Filter by total rating of the recommendation""" + rating_lesser: Int + + """The order the results will be returned in""" + sort: [RecommendationSort] + ): [Recommendation] + likes( + """The id of the likeable type""" + likeableId: Int + + """The type of model the id applies to""" + type: LikeableType + ): [User] +} + +type PageInfo { + """ + The total number of items. Note: This value is not guaranteed to be accurate, do not rely on this for logic + """ + total: Int + + """The count on a page""" + perPage: Int + + """The current page""" + currentPage: Int + + """The last page""" + lastPage: Int + + """If there is another page""" + hasNextPage: Boolean +} + +"""User sort enums""" +enum UserSort { + ID + ID_DESC + USERNAME + USERNAME_DESC + WATCHED_TIME + WATCHED_TIME_DESC + CHAPTERS_READ + CHAPTERS_READ_DESC + SEARCH_MATCH +} + +"""A user""" +type User { + """The id of the user""" + id: Int! + + """The name of the user""" + name: String! + + """The bio written by user (Markdown)""" + about( + """Return the string in pre-parsed html instead of markdown""" + asHtml: Boolean + ): String + + """The user's avatar images""" + avatar: UserAvatar + + """The user's banner images""" + bannerImage: String + + """If the authenticated user if following this user""" + isFollowing: Boolean + + """If this user if following the authenticated user""" + isFollower: Boolean + + """If the user is blocked by the authenticated user""" + isBlocked: Boolean + bans: Json + + """The user's general options""" + options: UserOptions + + """The user's media list options""" + mediaListOptions: MediaListOptions + + """The users favourites""" + favourites( + """Deprecated. Use page arguments on each favourite field instead.""" + page: Int + ): Favourites + + """The users anime & manga list statistics""" + statistics: UserStatisticTypes + + """The number of unread notifications the user has""" + unreadNotificationCount: Int + + """The url for the user page on the AniList website""" + siteUrl: String + + """The donation tier of the user""" + donatorTier: Int + + """Custom donation badge text""" + donatorBadge: String + + """The user's moderator roles if they are a site moderator""" + moderatorRoles: [ModRole] + + """ + When the user's account was created. (Does not exist for accounts created before 2020) + """ + createdAt: Int + + """When the user's data was last updated""" + updatedAt: Int + + """The user's statistics""" + stats: UserStats @deprecated(reason: "Deprecated. Replaced with statistics field.") + + """If the user is a moderator or data moderator""" + moderatorStatus: String @deprecated(reason: "Deprecated. Replaced with moderatorRoles field.") + + """The user's previously used names.""" + previousNames: [UserPreviousName] +} + +"""A user's avatars""" +type UserAvatar { + """The avatar of user at its largest size""" + large: String + + """The avatar of user at medium size""" + medium: String +} + +"""""" +scalar Json + +"""A user's general options""" +type UserOptions { + """The language the user wants to see media titles in""" + titleLanguage: UserTitleLanguage + + """Whether the user has enabled viewing of 18+ content""" + displayAdultContent: Boolean + + """ + Whether the user receives notifications when a show they are watching aires + """ + airingNotifications: Boolean + + """Profile highlight color (blue, purple, pink, orange, red, green, gray)""" + profileColor: String + + """Notification options""" + notificationOptions: [NotificationOption] + + """The user's timezone offset (Auth user only)""" + timezone: String + + """ + Minutes between activity for them to be merged together. 0 is Never, Above 2 weeks (20160 mins) is Always. + """ + activityMergeTime: Int + + """The language the user wants to see staff and character names in""" + staffNameLanguage: UserStaffNameLanguage + + """Whether the user only allow messages from users they follow""" + restrictMessagesToFollowing: Boolean + + """ + The list activity types the user has disabled from being created from list updates + """ + disabledListActivity: [ListActivityOption] +} + +"""The language the user wants to see media titles in""" +enum UserTitleLanguage { + """The romanization of the native language title""" + ROMAJI + + """The official english title""" + ENGLISH + + """Official title in it's native language""" + NATIVE + + """ + The romanization of the native language title, stylised by media creator + """ + ROMAJI_STYLISED + + """The official english title, stylised by media creator""" + ENGLISH_STYLISED + + """Official title in it's native language, stylised by media creator""" + NATIVE_STYLISED +} + +"""Notification option""" +type NotificationOption { + """The type of notification""" + type: NotificationType + + """Whether this type of notification is enabled""" + enabled: Boolean +} + +"""Notification type enum""" +enum NotificationType { + """A user has sent you message""" + ACTIVITY_MESSAGE + + """A user has replied to your activity""" + ACTIVITY_REPLY + + """A user has followed you""" + FOLLOWING + + """A user has mentioned you in their activity""" + ACTIVITY_MENTION + + """A user has mentioned you in a forum comment""" + THREAD_COMMENT_MENTION + + """A user has commented in one of your subscribed forum threads""" + THREAD_SUBSCRIBED + + """A user has replied to your forum comment""" + THREAD_COMMENT_REPLY + + """An anime you are currently watching has aired""" + AIRING + + """A user has liked your activity""" + ACTIVITY_LIKE + + """A user has liked your activity reply""" + ACTIVITY_REPLY_LIKE + + """A user has liked your forum thread""" + THREAD_LIKE + + """A user has liked your forum comment""" + THREAD_COMMENT_LIKE + + """A user has replied to activity you have also replied to""" + ACTIVITY_REPLY_SUBSCRIBED + + """ + A new anime or manga has been added to the site where its related media is on the user's list + """ + RELATED_MEDIA_ADDITION + + """ + An anime or manga has had a data change that affects how a user may track it in their lists + """ + MEDIA_DATA_CHANGE + + """ + Anime or manga entries on the user's list have been merged into a single entry + """ + MEDIA_MERGE + + """An anime or manga on the user's list has been deleted from the site""" + MEDIA_DELETION +} + +"""The language the user wants to see staff and character names in""" +enum UserStaffNameLanguage { + """ + The romanization of the staff or character's native name, with western name ordering + """ + ROMAJI_WESTERN + + """The romanization of the staff or character's native name""" + ROMAJI + + """The staff or character's name in their native language""" + NATIVE +} + +type ListActivityOption { + disabled: Boolean + type: MediaListStatus +} + +"""Media list watching/reading status enum.""" +enum MediaListStatus { + """Currently watching/reading""" + CURRENT + + """Planning to watch/read""" + PLANNING + + """Finished watching/reading""" + COMPLETED + + """Stopped watching/reading before completing""" + DROPPED + + """Paused watching/reading""" + PAUSED + + """Re-watching/reading""" + REPEATING +} + +"""A user's list options""" +type MediaListOptions { + """The score format the user is using for media lists""" + scoreFormat: ScoreFormat + + """The default order list rows should be displayed in""" + rowOrder: String + useLegacyLists: Boolean @deprecated(reason: "No longer used") + + """The user's anime list options""" + animeList: MediaListTypeOptions + + """The user's manga list options""" + mangaList: MediaListTypeOptions + + """The list theme options for both lists""" + sharedTheme: Json @deprecated(reason: "No longer used") + + """ + If the shared theme should be used instead of the individual list themes + """ + sharedThemeEnabled: Boolean @deprecated(reason: "No longer used") +} + +"""Media list scoring type""" +enum ScoreFormat { + """An integer from 0-100""" + POINT_100 + + """A float from 0-10 with 1 decimal place""" + POINT_10_DECIMAL + + """An integer from 0-10""" + POINT_10 + + """An integer from 0-5. Should be represented in Stars""" + POINT_5 + + """ + An integer from 0-3. Should be represented in Smileys. 0 => No Score, 1 => :(, 2 => :|, 3 => :) + """ + POINT_3 +} + +"""A user's list options for anime or manga lists""" +type MediaListTypeOptions { + """The order each list should be displayed in""" + sectionOrder: [String] + + """If the completed sections of the list should be separated by format""" + splitCompletedSectionByFormat: Boolean + + """The list theme options""" + theme: Json @deprecated(reason: "This field has not yet been fully implemented and may change without warning") + + """The names of the user's custom lists""" + customLists: [String] + + """The names of the user's advanced scoring sections""" + advancedScoring: [String] + + """If advanced scoring is enabled""" + advancedScoringEnabled: Boolean +} + +"""User's favourite anime, manga, characters, staff & studios""" +type Favourites { + """Favourite anime""" + anime( + """The page number""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): MediaConnection + + """Favourite manga""" + manga( + """The page number""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): MediaConnection + + """Favourite characters""" + characters( + """The page number""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): CharacterConnection + + """Favourite staff""" + staff( + """The page number""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): StaffConnection + + """Favourite studios""" + studios( + """The page number""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): StudioConnection +} + +type MediaConnection { + edges: [MediaEdge] + nodes: [Media] + + """The pagination information""" + pageInfo: PageInfo +} + +"""Media connection edge""" +type MediaEdge { + node: Media + + """The id of the connection""" + id: Int + + """The type of relation to the parent model""" + relationType( + """Provide 2 to use new version 2 of relation enum""" + version: Int + ): MediaRelation + + """ + If the studio is the main animation studio of the media (For Studio->MediaConnection field only) + """ + isMainStudio: Boolean! + + """The characters in the media voiced by the parent actor""" + characters: [Character] + + """The characters role in the media""" + characterRole: CharacterRole + + """Media specific character name""" + characterName: String + + """Notes regarding the VA's role for the character""" + roleNotes: String + + """ + Used for grouping roles where multiple dubs exist for the same language. Either dubbing company name or language variant. + """ + dubGroup: String + + """The role of the staff member in the production of the media""" + staffRole: String + + """The voice actors of the character""" + voiceActors(language: StaffLanguage, sort: [StaffSort]): [Staff] + + """The voice actors of the character with role date""" + voiceActorRoles(language: StaffLanguage, sort: [StaffSort]): [StaffRoleType] + + """The order the media should be displayed from the users favourites""" + favouriteOrder: Int +} + +"""Anime or Manga""" +type Media { + """The id of the media""" + id: Int! + + """The mal id of the media""" + idMal: Int + + """The official titles of the media in various languages""" + title: MediaTitle + + """The type of the media; anime or manga""" + type: MediaType + + """The format the media was released in""" + format: MediaFormat + + """The current releasing status of the media""" + status( + """Provide 2 to use new version 2 of sources enum""" + version: Int + ): MediaStatus + + """Short description of the media's story and characters""" + description( + """Return the string in pre-parsed html instead of markdown""" + asHtml: Boolean + ): String + + """The first official release date of the media""" + startDate: FuzzyDate + + """The last official release date of the media""" + endDate: FuzzyDate + + """The season the media was initially released in""" + season: MediaSeason + + """The season year the media was initially released in""" + seasonYear: Int + + """The year & season the media was initially released in""" + seasonInt: Int @deprecated(reason: "") + + """The amount of episodes the anime has when complete""" + episodes: Int + + """The general length of each anime episode in minutes""" + duration: Int + + """The amount of chapters the manga has when complete""" + chapters: Int + + """The amount of volumes the manga has when complete""" + volumes: Int + + """Where the media was created. (ISO 3166-1 alpha-2)""" + countryOfOrigin: CountryCode + + """If the media is officially licensed or a self-published doujin release""" + isLicensed: Boolean + + """Source type the media was adapted from.""" + source( + """Provide 2 or 3 to use new version 2 or 3 of sources enum""" + version: Int + ): MediaSource + + """Official Twitter hashtags for the media""" + hashtag: String + + """Media trailer or advertisement""" + trailer: MediaTrailer + + """When the media's data was last updated""" + updatedAt: Int + + """The cover images of the media""" + coverImage: MediaCoverImage + + """The banner image of the media""" + bannerImage: String + + """The genres of the media""" + genres: [String] + + """Alternative titles of the media""" + synonyms: [String] + + """A weighted average score of all the user's scores of the media""" + averageScore: Int + + """Mean score of all the user's scores of the media""" + meanScore: Int + + """The number of users with the media on their list""" + popularity: Int + + """ + Locked media may not be added to lists our favorited. This may be due to the entry pending for deletion or other reasons. + """ + isLocked: Boolean + + """The amount of related activity in the past hour""" + trending: Int + + """The amount of user's who have favourited the media""" + favourites: Int + + """List of tags that describes elements and themes of the media""" + tags: [MediaTag] + + """Other media in the same or connecting franchise""" + relations: MediaConnection + + """The characters in the media""" + characters( + sort: [CharacterSort] + role: CharacterRole + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): CharacterConnection + + """The staff who produced the media""" + staff( + sort: [StaffSort] + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): StaffConnection + + """The companies who produced the media""" + studios(sort: [StudioSort], isMain: Boolean): StudioConnection + + """If the media is marked as favourite by the current authenticated user""" + isFavourite: Boolean! + + """If the media is blocked from being added to favourites""" + isFavouriteBlocked: Boolean! + + """If the media is intended only for 18+ adult audiences""" + isAdult: Boolean + + """The media's next episode airing schedule""" + nextAiringEpisode: AiringSchedule + + """The media's entire airing schedule""" + airingSchedule( + """Filter to episodes that have not yet aired""" + notYetAired: Boolean + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): AiringScheduleConnection + + """The media's daily trend stats""" + trends( + sort: [MediaTrendSort] + + """Filter to stats recorded while the media was releasing""" + releasing: Boolean + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): MediaTrendConnection + + """External links to another site related to the media""" + externalLinks: [MediaExternalLink] + + """Data and links to legal streaming episodes on external sites""" + streamingEpisodes: [MediaStreamingEpisode] + + """ + The ranking of the media in a particular time span and format compared to other media + """ + rankings: [MediaRank] + + """The authenticated user's media list entry for the media""" + mediaListEntry: MediaList + + """User reviews of the media""" + reviews( + limit: Int + sort: [ReviewSort] + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): ReviewConnection + + """User recommendations for similar media""" + recommendations( + sort: [RecommendationSort] + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): RecommendationConnection + stats: MediaStats + + """The url for the media page on the AniList website""" + siteUrl: String + + """ + If the media should have forum thread automatically created for it on airing episode release + """ + autoCreateForumThread: Boolean + + """If the media is blocked from being recommended to/from""" + isRecommendationBlocked: Boolean + + """If the media is blocked from being reviewed""" + isReviewBlocked: Boolean + + """Notes for site moderators""" + modNotes: String +} + +"""The official titles of the media in various languages""" +type MediaTitle { + """The romanization of the native language title""" + romaji(stylised: Boolean): String + + """The official english title""" + english(stylised: Boolean): String + + """Official title in it's native language""" + native(stylised: Boolean): String + + """ + The currently authenticated users preferred title language. Default romaji for non-authenticated + """ + userPreferred: String +} + +"""Media type enum, anime or manga.""" +enum MediaType { + """Japanese Anime""" + ANIME + + """Asian comic""" + MANGA +} + +"""The format the media was released in""" +enum MediaFormat { + """Anime broadcast on television""" + TV + + """Anime which are under 15 minutes in length and broadcast on television""" + TV_SHORT + + """Anime movies with a theatrical release""" + MOVIE + + """ + Special episodes that have been included in DVD/Blu-ray releases, picture dramas, pilots, etc + """ + SPECIAL + + """ + (Original Video Animation) Anime that have been released directly on DVD/Blu-ray without originally going through a theatrical release or television broadcast + """ + OVA + + """ + (Original Net Animation) Anime that have been originally released online or are only available through streaming services. + """ + ONA + + """Short anime released as a music video""" + MUSIC + + """Professionally published manga with more than one chapter""" + MANGA + + """Written books released as a series of light novels""" + NOVEL + + """Manga with just one chapter""" + ONE_SHOT +} + +"""The current releasing status of the media""" +enum MediaStatus { + """Has completed and is no longer being released""" + FINISHED + + """Currently releasing""" + RELEASING + + """To be released at a later date""" + NOT_YET_RELEASED + + """Ended before the work could be finished""" + CANCELLED + + """ + Version 2 only. Is currently paused from releasing and will resume at a later date + """ + HIATUS +} + +"""Date object that allows for incomplete date values (fuzzy)""" +type FuzzyDate { + """Numeric Year (2017)""" + year: Int + + """Numeric Month (3)""" + month: Int + + """Numeric Day (24)""" + day: Int +} + +enum MediaSeason { + """Months December to February""" + WINTER + + """Months March to May""" + SPRING + + """Months June to August""" + SUMMER + + """Months September to November""" + FALL +} + +"""ISO 3166-1 alpha-2 country code""" +scalar CountryCode + +"""Source type the media was adapted from""" +enum MediaSource { + """An original production not based of another work""" + ORIGINAL + + """Asian comic book""" + MANGA + + """Written work published in volumes""" + LIGHT_NOVEL + + """Video game driven primary by text and narrative""" + VISUAL_NOVEL + + """Video game""" + VIDEO_GAME + + """Other""" + OTHER + + """Version 2+ only. Written works not published in volumes""" + NOVEL + + """Version 2+ only. Self-published works""" + DOUJINSHI + + """Version 2+ only. Japanese Anime""" + ANIME + + """Version 3 only. Written works published online""" + WEB_NOVEL + + """Version 3 only. Live action media such as movies or TV show""" + LIVE_ACTION + + """Version 3 only. Games excluding video games""" + GAME + + """Version 3 only. Comics excluding manga""" + COMIC + + """Version 3 only. Multimedia project""" + MULTIMEDIA_PROJECT + + """Version 3 only. Picture book""" + PICTURE_BOOK +} + +"""Media trailer or advertisement""" +type MediaTrailer { + """The trailer video id""" + id: String + + """ + The site the video is hosted by (Currently either youtube or dailymotion) + """ + site: String + + """The url for the thumbnail image of the video""" + thumbnail: String +} + +type MediaCoverImage { + """ + The cover image url of the media at its largest size. If this size isn't available, large will be provided instead. + """ + extraLarge: String + + """The cover image url of the media at a large size""" + large: String + + """The cover image url of the media at medium size""" + medium: String + + """Average #hex color of cover image""" + color: String +} + +"""A tag that describes a theme or element of the media""" +type MediaTag { + """The id of the tag""" + id: Int! + + """The name of the tag""" + name: String! + + """A general description of the tag""" + description: String + + """The categories of tags this tag belongs to""" + category: String + + """The relevance ranking of the tag out of the 100 for this media""" + rank: Int + + """If the tag could be a spoiler for any media""" + isGeneralSpoiler: Boolean + + """If the tag is a spoiler for this media""" + isMediaSpoiler: Boolean + + """If the tag is only for adult 18+ media""" + isAdult: Boolean + + """The user who submitted the tag""" + userId: Int +} + +"""Character sort enums""" +enum CharacterSort { + ID + ID_DESC + ROLE + ROLE_DESC + SEARCH_MATCH + FAVOURITES + FAVOURITES_DESC + + """Order manually decided by moderators""" + RELEVANCE +} + +"""The role the character plays in the media""" +enum CharacterRole { + """A primary character role in the media""" + MAIN + + """A supporting character role in the media""" + SUPPORTING + + """A background character in the media""" + BACKGROUND +} + +type CharacterConnection { + edges: [CharacterEdge] + nodes: [Character] + + """The pagination information""" + pageInfo: PageInfo +} + +"""Character connection edge""" +type CharacterEdge { + node: Character + + """The id of the connection""" + id: Int + + """The characters role in the media""" + role: CharacterRole + + """Media specific character name""" + name: String + + """The voice actors of the character""" + voiceActors(language: StaffLanguage, sort: [StaffSort]): [Staff] + + """The voice actors of the character with role date""" + voiceActorRoles(language: StaffLanguage, sort: [StaffSort]): [StaffRoleType] + + """The media the character is in""" + media: [Media] + + """The order the character should be displayed from the users favourites""" + favouriteOrder: Int +} + +"""A character that features in an anime or manga""" +type Character { + """The id of the character""" + id: Int! + + """The names of the character""" + name: CharacterName + + """Character images""" + image: CharacterImage + + """A general description of the character""" + description( + """Return the string in pre-parsed html instead of markdown""" + asHtml: Boolean + ): String + + """ + The character's gender. Usually Male, Female, or Non-binary but can be any string. + """ + gender: String + + """The character's birth date""" + dateOfBirth: FuzzyDate + + """ + The character's age. Note this is a string, not an int, it may contain further text and additional ages. + """ + age: String + + """The characters blood type""" + bloodType: String + + """ + If the character is marked as favourite by the currently authenticated user + """ + isFavourite: Boolean! + + """If the character is blocked from being added to favourites""" + isFavouriteBlocked: Boolean! + + """The url for the character page on the AniList website""" + siteUrl: String + + """Media that includes the character""" + media( + sort: [MediaSort] + type: MediaType + onList: Boolean + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): MediaConnection + updatedAt: Int @deprecated(reason: "No data available") + + """The amount of user's who have favourited the character""" + favourites: Int + + """Notes for site moderators""" + modNotes: String +} + +"""The names of the character""" +type CharacterName { + """The character's given name""" + first: String + + """The character's middle name""" + middle: String + + """The character's surname""" + last: String + + """The character's first and last name""" + full: String + + """The character's full name in their native language""" + native: String + + """Other names the character might be referred to as""" + alternative: [String] + + """Other names the character might be referred to as but are spoilers""" + alternativeSpoiler: [String] + + """ + The currently authenticated users preferred name language. Default romaji for non-authenticated + """ + userPreferred: String +} + +type CharacterImage { + """The character's image of media at its largest size""" + large: String + + """The character's image of media at medium size""" + medium: String +} + +"""Media sort enums""" +enum MediaSort { + ID + ID_DESC + TITLE_ROMAJI + TITLE_ROMAJI_DESC + TITLE_ENGLISH + TITLE_ENGLISH_DESC + TITLE_NATIVE + TITLE_NATIVE_DESC + TYPE + TYPE_DESC + FORMAT + FORMAT_DESC + START_DATE + START_DATE_DESC + END_DATE + END_DATE_DESC + SCORE + SCORE_DESC + POPULARITY + POPULARITY_DESC + TRENDING + TRENDING_DESC + EPISODES + EPISODES_DESC + DURATION + DURATION_DESC + STATUS + STATUS_DESC + CHAPTERS + CHAPTERS_DESC + VOLUMES + VOLUMES_DESC + UPDATED_AT + UPDATED_AT_DESC + SEARCH_MATCH + FAVOURITES + FAVOURITES_DESC +} + +"""The primary language of the voice actor""" +enum StaffLanguage { + """Japanese""" + JAPANESE + + """English""" + ENGLISH + + """Korean""" + KOREAN + + """Italian""" + ITALIAN + + """Spanish""" + SPANISH + + """Portuguese""" + PORTUGUESE + + """French""" + FRENCH + + """German""" + GERMAN + + """Hebrew""" + HEBREW + + """Hungarian""" + HUNGARIAN +} + +"""Staff sort enums""" +enum StaffSort { + ID + ID_DESC + ROLE + ROLE_DESC + LANGUAGE + LANGUAGE_DESC + SEARCH_MATCH + FAVOURITES + FAVOURITES_DESC + + """Order manually decided by moderators""" + RELEVANCE +} + +"""Voice actors or production staff""" +type Staff { + """The id of the staff member""" + id: Int! + + """The names of the staff member""" + name: StaffName + + """The primary language the staff member dub's in""" + language: StaffLanguage @deprecated(reason: "Replaced with languageV2") + + """ + The primary language of the staff member. Current values: Japanese, English, Korean, Italian, Spanish, Portuguese, French, German, Hebrew, Hungarian, Chinese, Arabic, Filipino, Catalan, Finnish, Turkish, Dutch, Swedish, Thai, Tagalog, Malaysian, Indonesian, Vietnamese, Nepali, Hindi, Urdu + """ + languageV2: String + + """The staff images""" + image: StaffImage + + """A general description of the staff member""" + description( + """Return the string in pre-parsed html instead of markdown""" + asHtml: Boolean + ): String + + """The person's primary occupations""" + primaryOccupations: [String] + + """ + The staff's gender. Usually Male, Female, or Non-binary but can be any string. + """ + gender: String + dateOfBirth: FuzzyDate + dateOfDeath: FuzzyDate + + """The person's age in years""" + age: Int + + """ + [startYear, endYear] (If the 2nd value is not present staff is still active) + """ + yearsActive: [Int] + + """The persons birthplace or hometown""" + homeTown: String + + """The persons blood type""" + bloodType: String + + """ + If the staff member is marked as favourite by the currently authenticated user + """ + isFavourite: Boolean! + + """If the staff member is blocked from being added to favourites""" + isFavouriteBlocked: Boolean! + + """The url for the staff page on the AniList website""" + siteUrl: String + + """Media where the staff member has a production role""" + staffMedia( + sort: [MediaSort] + type: MediaType + onList: Boolean + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): MediaConnection + + """Characters voiced by the actor""" + characters( + sort: [CharacterSort] + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): CharacterConnection + + """ + Media the actor voiced characters in. (Same data as characters with media as node instead of characters) + """ + characterMedia( + sort: [MediaSort] + onList: Boolean + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): MediaConnection + updatedAt: Int @deprecated(reason: "No data available") + + """Staff member that the submission is referencing""" + staff: Staff + + """Submitter for the submission""" + submitter: User + + """Status of the submission""" + submissionStatus: Int + + """Inner details of submission status""" + submissionNotes: String + + """The amount of user's who have favourited the staff member""" + favourites: Int + + """Notes for site moderators""" + modNotes: String +} + +"""The names of the staff member""" +type StaffName { + """The person's given name""" + first: String + + """The person's middle name""" + middle: String + + """The person's surname""" + last: String + + """The person's first and last name""" + full: String + + """The person's full name in their native language""" + native: String + + """Other names the staff member might be referred to as (pen names)""" + alternative: [String] + + """ + The currently authenticated users preferred name language. Default romaji for non-authenticated + """ + userPreferred: String +} + +type StaffImage { + """The person's image of media at its largest size""" + large: String + + """The person's image of media at medium size""" + medium: String +} + +"""Voice actor role for a character""" +type StaffRoleType { + """The voice actors of the character""" + voiceActor: Staff + + """Notes regarding the VA's role for the character""" + roleNotes: String + + """ + Used for grouping roles where multiple dubs exist for the same language. Either dubbing company name or language variant. + """ + dubGroup: String +} + +type StaffConnection { + edges: [StaffEdge] + nodes: [Staff] + + """The pagination information""" + pageInfo: PageInfo +} + +"""Staff connection edge""" +type StaffEdge { + node: Staff + + """The id of the connection""" + id: Int + + """The role of the staff member in the production of the media""" + role: String + + """The order the staff should be displayed from the users favourites""" + favouriteOrder: Int +} + +"""Studio sort enums""" +enum StudioSort { + ID + ID_DESC + NAME + NAME_DESC + SEARCH_MATCH + FAVOURITES + FAVOURITES_DESC +} + +type StudioConnection { + edges: [StudioEdge] + nodes: [Studio] + + """The pagination information""" + pageInfo: PageInfo +} + +"""Studio connection edge""" +type StudioEdge { + node: Studio + + """The id of the connection""" + id: Int + + """If the studio is the main animation studio of the anime""" + isMain: Boolean! + + """The order the character should be displayed from the users favourites""" + favouriteOrder: Int +} + +"""Animation or production company""" +type Studio { + """The id of the studio""" + id: Int! + + """The name of the studio""" + name: String! + + """If the studio is an animation studio or a different kind of company""" + isAnimationStudio: Boolean! + + """The media the studio has worked on""" + media( + """The order the results will be returned in""" + sort: [MediaSort] + + """If the studio was the primary animation studio of the media""" + isMain: Boolean + onList: Boolean + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): MediaConnection + + """The url for the studio page on the AniList website""" + siteUrl: String + + """ + If the studio is marked as favourite by the currently authenticated user + """ + isFavourite: Boolean! + + """The amount of user's who have favourited the studio""" + favourites: Int +} + +""" +Media Airing Schedule. NOTE: We only aim to guarantee that FUTURE airing data is present and accurate. +""" +type AiringSchedule { + """The id of the airing schedule item""" + id: Int! + + """The time the episode airs at""" + airingAt: Int! + + """Seconds until episode starts airing""" + timeUntilAiring: Int! + + """The airing episode number""" + episode: Int! + + """The associate media id of the airing episode""" + mediaId: Int! + + """The associate media of the airing episode""" + media: Media +} + +type AiringScheduleConnection { + edges: [AiringScheduleEdge] + nodes: [AiringSchedule] + + """The pagination information""" + pageInfo: PageInfo +} + +"""AiringSchedule connection edge""" +type AiringScheduleEdge { + node: AiringSchedule + + """The id of the connection""" + id: Int +} + +"""Media trend sort enums""" +enum MediaTrendSort { + ID + ID_DESC + MEDIA_ID + MEDIA_ID_DESC + DATE + DATE_DESC + SCORE + SCORE_DESC + POPULARITY + POPULARITY_DESC + TRENDING + TRENDING_DESC + EPISODE + EPISODE_DESC +} + +type MediaTrendConnection { + edges: [MediaTrendEdge] + nodes: [MediaTrend] + + """The pagination information""" + pageInfo: PageInfo +} + +"""Media trend connection edge""" +type MediaTrendEdge { + node: MediaTrend +} + +"""Daily media statistics""" +type MediaTrend { + """The id of the tag""" + mediaId: Int! + + """The day the data was recorded (timestamp)""" + date: Int! + + """The amount of media activity on the day""" + trending: Int! + + """A weighted average score of all the user's scores of the media""" + averageScore: Int + + """The number of users with the media on their list""" + popularity: Int + + """The number of users with watching/reading the media""" + inProgress: Int + + """If the media was being released at this time""" + releasing: Boolean! + + """The episode number of the anime released on this day""" + episode: Int + + """The related media""" + media: Media +} + +"""An external link to another site related to the media or staff member""" +type MediaExternalLink { + """The id of the external link""" + id: Int! + + """The url of the external link or base url of link source""" + url: String + + """The links website site name""" + site: String! + + """The links website site id""" + siteId: Int + type: ExternalLinkType + + """Language the site content is in. See Staff language field for values.""" + language: String + color: String + + """ + The icon image url of the site. Not available for all links. Transparent PNG 64x64 + """ + icon: String + notes: String + isDisabled: Boolean +} + +enum ExternalLinkType { + INFO + STREAMING + SOCIAL +} + +"""Data and links to legal streaming episodes on external sites""" +type MediaStreamingEpisode { + """Title of the episode""" + title: String + + """Url of episode image thumbnail""" + thumbnail: String + + """The url of the episode""" + url: String + + """The site location of the streaming episodes""" + site: String +} + +""" +The ranking of a media in a particular time span and format compared to other media +""" +type MediaRank { + """The id of the rank""" + id: Int! + + """The numerical rank of the media""" + rank: Int! + + """The type of ranking""" + type: MediaRankType! + + """The format the media is ranked within""" + format: MediaFormat! + + """The year the media is ranked within""" + year: Int + + """The season the media is ranked within""" + season: MediaSeason + + """If the ranking is based on all time instead of a season/year""" + allTime: Boolean + + """String that gives context to the ranking type and time span""" + context: String! +} + +"""The type of ranking""" +enum MediaRankType { + """Ranking is based on the media's ratings/score""" + RATED + + """Ranking is based on the media's popularity""" + POPULAR +} + +"""List of anime or manga""" +type MediaList { + """The id of the list entry""" + id: Int! + + """The id of the user owner of the list entry""" + userId: Int! + + """The id of the media""" + mediaId: Int! + + """The watching/reading status""" + status: MediaListStatus + + """The score of the entry""" + score( + """Force the score to be returned in the provided format type.""" + format: ScoreFormat + ): Float + + """The amount of episodes/chapters consumed by the user""" + progress: Int + + """The amount of volumes read by the user""" + progressVolumes: Int + + """The amount of times the user has rewatched/read the media""" + repeat: Int + + """Priority of planning""" + priority: Int + + """If the entry should only be visible to authenticated user""" + private: Boolean + + """Text notes""" + notes: String + + """If the entry shown be hidden from non-custom lists""" + hiddenFromStatusLists: Boolean + + """Map of booleans for which custom lists the entry are in""" + customLists( + """Change return structure to an array of objects""" + asArray: Boolean + ): Json + + """Map of advanced scores with name keys""" + advancedScores: Json + + """When the entry was started by the user""" + startedAt: FuzzyDate + + """When the entry was completed by the user""" + completedAt: FuzzyDate + + """When the entry data was last updated""" + updatedAt: Int + + """When the entry data was created""" + createdAt: Int + media: Media + user: User +} + +"""Review sort enums""" +enum ReviewSort { + ID + ID_DESC + SCORE + SCORE_DESC + RATING + RATING_DESC + CREATED_AT + CREATED_AT_DESC + UPDATED_AT + UPDATED_AT_DESC +} + +type ReviewConnection { + edges: [ReviewEdge] + nodes: [Review] + + """The pagination information""" + pageInfo: PageInfo +} + +"""Review connection edge""" +type ReviewEdge { + node: Review +} + +"""A Review that features in an anime or manga""" +type Review { + """The id of the review""" + id: Int! + + """The id of the review's creator""" + userId: Int! + + """The id of the review's media""" + mediaId: Int! + + """For which type of media the review is for""" + mediaType: MediaType + + """A short summary of the review""" + summary: String + + """The main review body text""" + body( + """Return the string in pre-parsed html instead of markdown""" + asHtml: Boolean + ): String + + """The total user rating of the review""" + rating: Int + + """The amount of user ratings of the review""" + ratingAmount: Int + + """The rating of the review by currently authenticated user""" + userRating: ReviewRating + + """The review score of the media""" + score: Int + + """ + If the review is not yet publicly published and is only viewable by creator + """ + private: Boolean + + """The url for the review page on the AniList website""" + siteUrl: String + + """The time of the thread creation""" + createdAt: Int! + + """The time of the thread last update""" + updatedAt: Int! + + """The creator of the review""" + user: User + + """The media the review is of""" + media: Media +} + +"""Review rating enums""" +enum ReviewRating { + NO_VOTE + UP_VOTE + DOWN_VOTE +} + +"""Recommendation sort enums""" +enum RecommendationSort { + ID + ID_DESC + RATING + RATING_DESC +} + +type RecommendationConnection { + edges: [RecommendationEdge] + nodes: [Recommendation] + + """The pagination information""" + pageInfo: PageInfo +} + +"""Recommendation connection edge""" +type RecommendationEdge { + node: Recommendation +} + +"""Media recommendation""" +type Recommendation { + """The id of the recommendation""" + id: Int! + + """Users rating of the recommendation""" + rating: Int + + """The rating of the recommendation by currently authenticated user""" + userRating: RecommendationRating + + """The media the recommendation is from""" + media: Media + + """The recommended media""" + mediaRecommendation: Media + + """The user that first created the recommendation""" + user: User +} + +"""Recommendation rating enums""" +enum RecommendationRating { + NO_RATING + RATE_UP + RATE_DOWN +} + +"""A media's statistics""" +type MediaStats { + scoreDistribution: [ScoreDistribution] + statusDistribution: [StatusDistribution] + airingProgression: [AiringProgression] @deprecated(reason: "Replaced by MediaTrends") +} + +"""A user's list score distribution.""" +type ScoreDistribution { + score: Int + + """The amount of list entries with this score""" + amount: Int +} + +""" +The distribution of the watching/reading status of media or a user's list +""" +type StatusDistribution { + """The day the activity took place (Unix timestamp)""" + status: MediaListStatus + + """The amount of entries with this status""" + amount: Int +} + +"""Score & Watcher stats for airing anime by episode and mid-week""" +type AiringProgression { + """ + The episode the stats were recorded at. .5 is the mid point between 2 episodes airing dates. + """ + episode: Float + + """The average score for the media""" + score: Float + + """The amount of users watching the anime""" + watching: Int +} + +"""Type of relation media has to its parent.""" +enum MediaRelation { + """An adaption of this media into a different format""" + ADAPTATION + + """Released before the relation""" + PREQUEL + + """Released after the relation""" + SEQUEL + + """The media a side story is from""" + PARENT + + """A side story of the parent media""" + SIDE_STORY + + """Shares at least 1 character""" + CHARACTER + + """A shortened and summarized version""" + SUMMARY + + """An alternative version of the same media""" + ALTERNATIVE + + """An alternative version of the media with a different primary focus""" + SPIN_OFF + + """Other""" + OTHER + + """Version 2 only. The source material the media was adapted from""" + SOURCE + + """Version 2 only.""" + COMPILATION + + """Version 2 only.""" + CONTAINS +} + +type UserStatisticTypes { + anime: UserStatistics + manga: UserStatistics +} + +type UserStatistics { + count: Int! + meanScore: Float! + standardDeviation: Float! + minutesWatched: Int! + episodesWatched: Int! + chaptersRead: Int! + volumesRead: Int! + formats(limit: Int, sort: [UserStatisticsSort]): [UserFormatStatistic] + statuses(limit: Int, sort: [UserStatisticsSort]): [UserStatusStatistic] + scores(limit: Int, sort: [UserStatisticsSort]): [UserScoreStatistic] + lengths(limit: Int, sort: [UserStatisticsSort]): [UserLengthStatistic] + releaseYears(limit: Int, sort: [UserStatisticsSort]): [UserReleaseYearStatistic] + startYears(limit: Int, sort: [UserStatisticsSort]): [UserStartYearStatistic] + genres(limit: Int, sort: [UserStatisticsSort]): [UserGenreStatistic] + tags(limit: Int, sort: [UserStatisticsSort]): [UserTagStatistic] + countries(limit: Int, sort: [UserStatisticsSort]): [UserCountryStatistic] + voiceActors(limit: Int, sort: [UserStatisticsSort]): [UserVoiceActorStatistic] + staff(limit: Int, sort: [UserStatisticsSort]): [UserStaffStatistic] + studios(limit: Int, sort: [UserStatisticsSort]): [UserStudioStatistic] +} + +"""User statistics sort enum""" +enum UserStatisticsSort { + ID + ID_DESC + COUNT + COUNT_DESC + PROGRESS + PROGRESS_DESC + MEAN_SCORE + MEAN_SCORE_DESC +} + +type UserFormatStatistic { + count: Int! + meanScore: Float! + minutesWatched: Int! + chaptersRead: Int! + mediaIds: [Int]! + format: MediaFormat +} + +type UserStatusStatistic { + count: Int! + meanScore: Float! + minutesWatched: Int! + chaptersRead: Int! + mediaIds: [Int]! + status: MediaListStatus +} + +type UserScoreStatistic { + count: Int! + meanScore: Float! + minutesWatched: Int! + chaptersRead: Int! + mediaIds: [Int]! + score: Int +} + +type UserLengthStatistic { + count: Int! + meanScore: Float! + minutesWatched: Int! + chaptersRead: Int! + mediaIds: [Int]! + length: String +} + +type UserReleaseYearStatistic { + count: Int! + meanScore: Float! + minutesWatched: Int! + chaptersRead: Int! + mediaIds: [Int]! + releaseYear: Int +} + +type UserStartYearStatistic { + count: Int! + meanScore: Float! + minutesWatched: Int! + chaptersRead: Int! + mediaIds: [Int]! + startYear: Int +} + +type UserGenreStatistic { + count: Int! + meanScore: Float! + minutesWatched: Int! + chaptersRead: Int! + mediaIds: [Int]! + genre: String +} + +type UserTagStatistic { + count: Int! + meanScore: Float! + minutesWatched: Int! + chaptersRead: Int! + mediaIds: [Int]! + tag: MediaTag +} + +type UserCountryStatistic { + count: Int! + meanScore: Float! + minutesWatched: Int! + chaptersRead: Int! + mediaIds: [Int]! + country: CountryCode +} + +type UserVoiceActorStatistic { + count: Int! + meanScore: Float! + minutesWatched: Int! + chaptersRead: Int! + mediaIds: [Int]! + voiceActor: Staff + characterIds: [Int]! +} + +type UserStaffStatistic { + count: Int! + meanScore: Float! + minutesWatched: Int! + chaptersRead: Int! + mediaIds: [Int]! + staff: Staff +} + +type UserStudioStatistic { + count: Int! + meanScore: Float! + minutesWatched: Int! + chaptersRead: Int! + mediaIds: [Int]! + studio: Studio +} + +"""Mod role enums""" +enum ModRole { + """An AniList administrator""" + ADMIN + + """A head developer of AniList""" + LEAD_DEVELOPER + + """An AniList developer""" + DEVELOPER + + """A lead community moderator""" + LEAD_COMMUNITY + + """A community moderator""" + COMMUNITY + + """A discord community moderator""" + DISCORD_COMMUNITY + + """A lead anime data moderator""" + LEAD_ANIME_DATA + + """An anime data moderator""" + ANIME_DATA + + """A lead manga data moderator""" + LEAD_MANGA_DATA + + """A manga data moderator""" + MANGA_DATA + + """A lead social media moderator""" + LEAD_SOCIAL_MEDIA + + """A social media moderator""" + SOCIAL_MEDIA + + """A retired moderator""" + RETIRED + + """A character data moderator""" + CHARACTER_DATA + + """A staff data moderator""" + STAFF_DATA +} + +"""A user's statistics""" +type UserStats { + """The amount of anime the user has watched in minutes""" + watchedTime: Int + + """The amount of manga chapters the user has read""" + chaptersRead: Int + activityHistory: [UserActivityHistory] + animeStatusDistribution: [StatusDistribution] + mangaStatusDistribution: [StatusDistribution] + animeScoreDistribution: [ScoreDistribution] + mangaScoreDistribution: [ScoreDistribution] + animeListScores: ListScoreStats + mangaListScores: ListScoreStats + favouredGenresOverview: [GenreStats] + favouredGenres: [GenreStats] + favouredTags: [TagStats] + favouredActors: [StaffStats] + favouredStaff: [StaffStats] + favouredStudios: [StudioStats] + favouredYears: [YearStats] + favouredFormats: [FormatStats] +} + +"""A user's activity history stats.""" +type UserActivityHistory { + """The day the activity took place (Unix timestamp)""" + date: Int + + """The amount of activity on the day""" + amount: Int + + """The level of activity represented on a 1-10 scale""" + level: Int +} + +"""User's list score statistics""" +type ListScoreStats { + meanScore: Int + standardDeviation: Int +} + +"""User's genre statistics""" +type GenreStats { + genre: String + amount: Int + meanScore: Int + + """The amount of time in minutes the genre has been watched by the user""" + timeWatched: Int +} + +"""User's tag statistics""" +type TagStats { + tag: MediaTag + amount: Int + meanScore: Int + + """The amount of time in minutes the tag has been watched by the user""" + timeWatched: Int +} + +"""User's staff statistics""" +type StaffStats { + staff: Staff + amount: Int + meanScore: Int + + """ + The amount of time in minutes the staff member has been watched by the user + """ + timeWatched: Int +} + +"""User's studio statistics""" +type StudioStats { + studio: Studio + amount: Int + meanScore: Int + + """ + The amount of time in minutes the studio's works have been watched by the user + """ + timeWatched: Int +} + +"""User's year statistics""" +type YearStats { + year: Int + amount: Int + meanScore: Int +} + +"""User's format statistics""" +type FormatStats { + format: MediaFormat + amount: Int +} + +"""A user's previous name""" +type UserPreviousName { + """A previous name of the user.""" + name: String + + """When the user first changed from this name.""" + createdAt: Int + + """When the user most recently changed from this name.""" + updatedAt: Int +} + +""" +8 digit long date integer (YYYYMMDD). Unknown dates represented by 0. E.g. 2016: 20160000, May 1976: 19760500 +""" +scalar FuzzyDateInt + +"""Media list sort enums""" +enum MediaListSort { + MEDIA_ID + MEDIA_ID_DESC + SCORE + SCORE_DESC + STATUS + STATUS_DESC + PROGRESS + PROGRESS_DESC + PROGRESS_VOLUMES + PROGRESS_VOLUMES_DESC + REPEAT + REPEAT_DESC + PRIORITY + PRIORITY_DESC + STARTED_ON + STARTED_ON_DESC + FINISHED_ON + FINISHED_ON_DESC + ADDED_TIME + ADDED_TIME_DESC + UPDATED_TIME + UPDATED_TIME_DESC + MEDIA_TITLE_ROMAJI + MEDIA_TITLE_ROMAJI_DESC + MEDIA_TITLE_ENGLISH + MEDIA_TITLE_ENGLISH_DESC + MEDIA_TITLE_NATIVE + MEDIA_TITLE_NATIVE_DESC + MEDIA_POPULARITY + MEDIA_POPULARITY_DESC +} + +"""Airing schedule sort enums""" +enum AiringSort { + ID + ID_DESC + MEDIA_ID + MEDIA_ID_DESC + TIME + TIME_DESC + EPISODE + EPISODE_DESC +} + +"""Notification union type""" +union NotificationUnion = AiringNotification | FollowingNotification | ActivityMessageNotification | ActivityMentionNotification | ActivityReplyNotification | ActivityReplySubscribedNotification | ActivityLikeNotification | ActivityReplyLikeNotification | ThreadCommentMentionNotification | ThreadCommentReplyNotification | ThreadCommentSubscribedNotification | ThreadCommentLikeNotification | ThreadLikeNotification | RelatedMediaAdditionNotification | MediaDataChangeNotification | MediaMergeNotification | MediaDeletionNotification + +"""Notification for when an episode of anime airs""" +type AiringNotification { + """The id of the Notification""" + id: Int! + + """The type of notification""" + type: NotificationType + + """The id of the aired anime""" + animeId: Int! + + """The episode number that just aired""" + episode: Int! + + """The notification context text""" + contexts: [String] + + """The time the notification was created at""" + createdAt: Int + + """The associated media of the airing schedule""" + media: Media +} + +""" +Notification for when the authenticated user is followed by another user +""" +type FollowingNotification { + """The id of the Notification""" + id: Int! + + """The id of the user who followed the authenticated user""" + userId: Int! + + """The type of notification""" + type: NotificationType + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The liked activity""" + user: User +} + +"""Notification for when a user is send an activity message""" +type ActivityMessageNotification { + """The id of the Notification""" + id: Int! + + """The if of the user who send the message""" + userId: Int! + + """The type of notification""" + type: NotificationType + + """The id of the activity message""" + activityId: Int! + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The message activity""" + message: MessageActivity + + """The user who sent the message""" + user: User +} + +"""User message activity""" +type MessageActivity { + """The id of the activity""" + id: Int! + + """The user id of the activity's recipient""" + recipientId: Int + + """The user id of the activity's sender""" + messengerId: Int + + """The type of the activity""" + type: ActivityType + + """The number of activity replies""" + replyCount: Int! + + """The message text (Markdown)""" + message( + """Return the string in pre-parsed html instead of markdown""" + asHtml: Boolean + ): String + + """If the activity is locked and can receive replies""" + isLocked: Boolean + + """If the currently authenticated user is subscribed to the activity""" + isSubscribed: Boolean + + """The amount of likes the activity has""" + likeCount: Int! + + """If the currently authenticated user liked the activity""" + isLiked: Boolean + + """ + If the message is private and only viewable to the sender and recipients + """ + isPrivate: Boolean + + """The url for the activity page on the AniList website""" + siteUrl: String + + """The time the activity was created at""" + createdAt: Int! + + """The user who the activity message was sent to""" + recipient: User + + """The user who sent the activity message""" + messenger: User + + """The written replies to the activity""" + replies: [ActivityReply] + + """The users who liked the activity""" + likes: [User] +} + +"""Activity type enum.""" +enum ActivityType { + """A text activity""" + TEXT + + """A anime list update activity""" + ANIME_LIST + + """A manga list update activity""" + MANGA_LIST + + """A text message activity sent to another user""" + MESSAGE + + """Anime & Manga list update, only used in query arguments""" + MEDIA_LIST +} + +"""Replay to an activity item""" +type ActivityReply { + """The id of the reply""" + id: Int! + + """The id of the replies creator""" + userId: Int + + """The id of the parent activity""" + activityId: Int + + """The reply text""" + text( + """Return the string in pre-parsed html instead of markdown""" + asHtml: Boolean + ): String + + """The amount of likes the reply has""" + likeCount: Int! + + """If the currently authenticated user liked the reply""" + isLiked: Boolean + + """The time the reply was created at""" + createdAt: Int! + + """The user who created reply""" + user: User + + """The users who liked the reply""" + likes: [User] +} + +""" +Notification for when authenticated user is @ mentioned in activity or reply +""" +type ActivityMentionNotification { + """The id of the Notification""" + id: Int! + + """The id of the user who mentioned the authenticated user""" + userId: Int! + + """The type of notification""" + type: NotificationType + + """The id of the activity where mentioned""" + activityId: Int! + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The liked activity""" + activity: ActivityUnion + + """The user who mentioned the authenticated user""" + user: User +} + +"""Activity union type""" +union ActivityUnion = TextActivity | ListActivity | MessageActivity + +"""User text activity""" +type TextActivity { + """The id of the activity""" + id: Int! + + """The user id of the activity's creator""" + userId: Int + + """The type of activity""" + type: ActivityType + + """The number of activity replies""" + replyCount: Int! + + """The status text (Markdown)""" + text( + """Return the string in pre-parsed html instead of markdown""" + asHtml: Boolean + ): String + + """The url for the activity page on the AniList website""" + siteUrl: String + + """If the activity is locked and can receive replies""" + isLocked: Boolean + + """If the currently authenticated user is subscribed to the activity""" + isSubscribed: Boolean + + """The amount of likes the activity has""" + likeCount: Int! + + """If the currently authenticated user liked the activity""" + isLiked: Boolean + + """If the activity is pinned to the top of the users activity feed""" + isPinned: Boolean + + """The time the activity was created at""" + createdAt: Int! + + """The user who created the activity""" + user: User + + """The written replies to the activity""" + replies: [ActivityReply] + + """The users who liked the activity""" + likes: [User] +} + +"""User list activity (anime & manga updates)""" +type ListActivity { + """The id of the activity""" + id: Int! + + """The user id of the activity's creator""" + userId: Int + + """The type of activity""" + type: ActivityType + + """The number of activity replies""" + replyCount: Int! + + """The list item's textual status""" + status: String + + """The list progress made""" + progress: String + + """If the activity is locked and can receive replies""" + isLocked: Boolean + + """If the currently authenticated user is subscribed to the activity""" + isSubscribed: Boolean + + """The amount of likes the activity has""" + likeCount: Int! + + """If the currently authenticated user liked the activity""" + isLiked: Boolean + + """If the activity is pinned to the top of the users activity feed""" + isPinned: Boolean + + """The url for the activity page on the AniList website""" + siteUrl: String + + """The time the activity was created at""" + createdAt: Int! + + """The owner of the activity""" + user: User + + """The associated media to the activity update""" + media: Media + + """The written replies to the activity""" + replies: [ActivityReply] + + """The users who liked the activity""" + likes: [User] +} + +""" +Notification for when a user replies to the authenticated users activity +""" +type ActivityReplyNotification { + """The id of the Notification""" + id: Int! + + """The id of the user who replied to the activity""" + userId: Int! + + """The type of notification""" + type: NotificationType + + """The id of the activity which was replied too""" + activityId: Int! + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The liked activity""" + activity: ActivityUnion + + """The user who replied to the activity""" + user: User +} + +""" +Notification for when a user replies to activity the authenticated user has replied to +""" +type ActivityReplySubscribedNotification { + """The id of the Notification""" + id: Int! + + """The id of the user who replied to the activity""" + userId: Int! + + """The type of notification""" + type: NotificationType + + """The id of the activity which was replied too""" + activityId: Int! + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The liked activity""" + activity: ActivityUnion + + """The user who replied to the activity""" + user: User +} + +"""Notification for when a activity is liked""" +type ActivityLikeNotification { + """The id of the Notification""" + id: Int! + + """The id of the user who liked to the activity""" + userId: Int! + + """The type of notification""" + type: NotificationType + + """The id of the activity which was liked""" + activityId: Int! + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The liked activity""" + activity: ActivityUnion + + """The user who liked the activity""" + user: User +} + +"""Notification for when a activity reply is liked""" +type ActivityReplyLikeNotification { + """The id of the Notification""" + id: Int! + + """The id of the user who liked to the activity reply""" + userId: Int! + + """The type of notification""" + type: NotificationType + + """The id of the activity where the reply which was liked""" + activityId: Int! + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The liked activity""" + activity: ActivityUnion + + """The user who liked the activity reply""" + user: User +} + +""" +Notification for when authenticated user is @ mentioned in a forum thread comment +""" +type ThreadCommentMentionNotification { + """The id of the Notification""" + id: Int! + + """The id of the user who mentioned the authenticated user""" + userId: Int! + + """The type of notification""" + type: NotificationType + + """The id of the comment where mentioned""" + commentId: Int! + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The thread that the relevant comment belongs to""" + thread: Thread + + """The thread comment that included the @ mention""" + comment: ThreadComment + + """The user who mentioned the authenticated user""" + user: User +} + +"""Forum Thread""" +type Thread { + """The id of the thread""" + id: Int! + + """The title of the thread""" + title: String + + """The text body of the thread (Markdown)""" + body( + """Return the string in pre-parsed html instead of markdown""" + asHtml: Boolean + ): String + + """The id of the thread owner user""" + userId: Int! + + """The id of the user who most recently commented on the thread""" + replyUserId: Int + + """The id of the most recent comment on the thread""" + replyCommentId: Int + + """The number of comments on the thread""" + replyCount: Int + + """The number of times users have viewed the thread""" + viewCount: Int + + """If the thread is locked and can receive comments""" + isLocked: Boolean + + """ + If the thread is stickied and should be displayed at the top of the page + """ + isSticky: Boolean + + """If the currently authenticated user is subscribed to the thread""" + isSubscribed: Boolean + + """The amount of likes the thread has""" + likeCount: Int! + + """If the currently authenticated user liked the thread""" + isLiked: Boolean + + """The time of the last reply""" + repliedAt: Int + + """The time of the thread creation""" + createdAt: Int! + + """The time of the thread last update""" + updatedAt: Int! + + """The owner of the thread""" + user: User + + """The user to last reply to the thread""" + replyUser: User + + """The users who liked the thread""" + likes: [User] + + """The url for the thread page on the AniList website""" + siteUrl: String + + """The categories of the thread""" + categories: [ThreadCategory] + + """The media categories of the thread""" + mediaCategories: [Media] +} + +"""A forum thread category""" +type ThreadCategory { + """The id of the category""" + id: Int! + + """The name of the category""" + name: String! +} + +"""Forum Thread Comment""" +type ThreadComment { + """The id of the comment""" + id: Int! + + """The user id of the comment's owner""" + userId: Int + + """The id of thread the comment belongs to""" + threadId: Int + + """The text content of the comment (Markdown)""" + comment( + """Return the string in pre-parsed html instead of markdown""" + asHtml: Boolean + ): String + + """The amount of likes the comment has""" + likeCount: Int! + + """If the currently authenticated user liked the comment""" + isLiked: Boolean + + """The url for the comment page on the AniList website""" + siteUrl: String + + """The time of the comments creation""" + createdAt: Int! + + """The time of the comments last update""" + updatedAt: Int! + + """The thread the comment belongs to""" + thread: Thread + + """The user who created the comment""" + user: User + + """The users who liked the comment""" + likes: [User] + + """The comment's child reply comments""" + childComments: Json + + """If the comment tree is locked and may not receive replies or edits""" + isLocked: Boolean +} + +"""Notification for when a user replies to your forum thread comment""" +type ThreadCommentReplyNotification { + """The id of the Notification""" + id: Int! + + """The id of the user who create the comment reply""" + userId: Int! + + """The type of notification""" + type: NotificationType + + """The id of the reply comment""" + commentId: Int! + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The thread that the relevant comment belongs to""" + thread: Thread + + """The reply thread comment""" + comment: ThreadComment + + """The user who replied to the activity""" + user: User +} + +"""Notification for when a user replies to a subscribed forum thread""" +type ThreadCommentSubscribedNotification { + """The id of the Notification""" + id: Int! + + """The id of the user who commented on the thread""" + userId: Int! + + """The type of notification""" + type: NotificationType + + """The id of the new comment in the subscribed thread""" + commentId: Int! + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The thread that the relevant comment belongs to""" + thread: Thread + + """The reply thread comment""" + comment: ThreadComment + + """The user who replied to the subscribed thread""" + user: User +} + +"""Notification for when a thread comment is liked""" +type ThreadCommentLikeNotification { + """The id of the Notification""" + id: Int! + + """The id of the user who liked to the activity""" + userId: Int! + + """The type of notification""" + type: NotificationType + + """The id of the activity which was liked""" + commentId: Int! + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The thread that the relevant comment belongs to""" + thread: Thread + + """The thread comment that was liked""" + comment: ThreadComment + + """The user who liked the activity""" + user: User +} + +"""Notification for when a thread is liked""" +type ThreadLikeNotification { + """The id of the Notification""" + id: Int! + + """The id of the user who liked to the activity""" + userId: Int! + + """The type of notification""" + type: NotificationType + + """The id of the thread which was liked""" + threadId: Int! + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The thread that the relevant comment belongs to""" + thread: Thread + + """The liked thread comment""" + comment: ThreadComment + + """The user who liked the activity""" + user: User +} + +"""Notification for when new media is added to the site""" +type RelatedMediaAdditionNotification { + """The id of the Notification""" + id: Int! + + """The type of notification""" + type: NotificationType + + """The id of the new media""" + mediaId: Int! + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The associated media of the airing schedule""" + media: Media +} + +""" +Notification for when a media entry's data was changed in a significant way impacting users' list tracking +""" +type MediaDataChangeNotification { + """The id of the Notification""" + id: Int! + + """The type of notification""" + type: NotificationType + + """The id of the media that received data changes""" + mediaId: Int! + + """The reason for the media data change""" + context: String + + """The reason for the media data change""" + reason: String + + """The time the notification was created at""" + createdAt: Int + + """The media that received data changes""" + media: Media +} + +""" +Notification for when a media entry is merged into another for a user who had it on their list +""" +type MediaMergeNotification { + """The id of the Notification""" + id: Int! + + """The type of notification""" + type: NotificationType + + """The id of the media that was merged into""" + mediaId: Int! + + """The title of the deleted media""" + deletedMediaTitles: [String] + + """The reason for the media data change""" + context: String + + """The reason for the media merge""" + reason: String + + """The time the notification was created at""" + createdAt: Int + + """The media that was merged into""" + media: Media +} + +""" +Notification for when a media tracked in a user's list is deleted from the site +""" +type MediaDeletionNotification { + """The id of the Notification""" + id: Int! + + """The type of notification""" + type: NotificationType + + """The title of the deleted media""" + deletedMediaTitle: String + + """The reason for the media deletion""" + context: String + + """The reason for the media deletion""" + reason: String + + """The time the notification was created at""" + createdAt: Int +} + +"""Activity sort enums""" +enum ActivitySort { + ID + ID_DESC + PINNED +} + +"""Thread sort enums""" +enum ThreadSort { + ID + ID_DESC + TITLE + TITLE_DESC + CREATED_AT + CREATED_AT_DESC + UPDATED_AT + UPDATED_AT_DESC + REPLIED_AT + REPLIED_AT_DESC + REPLY_COUNT + REPLY_COUNT_DESC + VIEW_COUNT + VIEW_COUNT_DESC + IS_STICKY + SEARCH_MATCH +} + +"""Thread comments sort enums""" +enum ThreadCommentSort { + ID + ID_DESC +} + +"""Types that can be liked""" +enum LikeableType { + THREAD + THREAD_COMMENT + ACTIVITY + ACTIVITY_REPLY +} + +"""List of anime or manga""" +type MediaListCollection { + """Grouped media list entries""" + lists: [MediaListGroup] + + """The owner of the list""" + user: User + + """If there is another chunk""" + hasNextChunk: Boolean + + """A map of media list entry arrays grouped by status""" + statusLists(asArray: Boolean): [[MediaList]] @deprecated(reason: "Not GraphQL spec compliant, use lists field instead.") + + """A map of media list entry arrays grouped by custom lists""" + customLists(asArray: Boolean): [[MediaList]] @deprecated(reason: "Not GraphQL spec compliant, use lists field instead.") +} + +"""List group of anime or manga entries""" +type MediaListGroup { + """Media list entries""" + entries: [MediaList] + name: String + isCustomList: Boolean + isSplitCompletedList: Boolean + status: MediaListStatus +} + +"""Provides the parsed markdown as html""" +type ParsedMarkdown { + """The parsed markdown as html""" + html: String +} + +type AniChartUser { + user: User + settings: Json + highlights: Json +} + +type SiteStatistics { + users( + sort: [SiteTrendSort] + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): SiteTrendConnection + anime( + sort: [SiteTrendSort] + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): SiteTrendConnection + manga( + sort: [SiteTrendSort] + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): SiteTrendConnection + characters( + sort: [SiteTrendSort] + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): SiteTrendConnection + staff( + sort: [SiteTrendSort] + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): SiteTrendConnection + studios( + sort: [SiteTrendSort] + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): SiteTrendConnection + reviews( + sort: [SiteTrendSort] + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): SiteTrendConnection +} + +"""Site trend sort enums""" +enum SiteTrendSort { + DATE + DATE_DESC + COUNT + COUNT_DESC + CHANGE + CHANGE_DESC +} + +type SiteTrendConnection { + edges: [SiteTrendEdge] + nodes: [SiteTrend] + + """The pagination information""" + pageInfo: PageInfo +} + +"""Site trend connection edge""" +type SiteTrendEdge { + node: SiteTrend +} + +"""Daily site statistics""" +type SiteTrend { + """The day the data was recorded (timestamp)""" + date: Int! + count: Int! + + """The change from yesterday""" + change: Int! +} + +enum ExternalLinkMediaType { + ANIME + MANGA + STAFF +} + +type Mutation { + UpdateUser( + """User's about/bio text""" + about: String + + """User's title language""" + titleLanguage: UserTitleLanguage + + """If the user should see media marked as adult-only""" + displayAdultContent: Boolean + + """ + If the user should get notifications when a show they are watching aires + """ + airingNotifications: Boolean + + """The user's list scoring system""" + scoreFormat: ScoreFormat + + """The user's default list order""" + rowOrder: String + + """Profile highlight color""" + profileColor: String + + """Profile highlight color""" + donatorBadge: String + + """Notification options""" + notificationOptions: [NotificationOptionInput] + + """Timezone offset format: -?HH:MM""" + timezone: String + + """ + Minutes between activity for them to be merged together. 0 is Never, Above 2 weeks (20160 mins) is Always. + """ + activityMergeTime: Int + + """The user's anime list options""" + animeListOptions: MediaListOptionsInput + + """The user's anime list options""" + mangaListOptions: MediaListOptionsInput + + """The language the user wants to see staff and character names in""" + staffNameLanguage: UserStaffNameLanguage + + """Only allow messages from other users the user follows""" + restrictMessagesToFollowing: Boolean + disabledListActivity: [ListActivityOptionInput] + ): User + + """Create or update a media list entry""" + SaveMediaListEntry( + """The list entry id, required for updating""" + id: Int + + """The id of the media the entry is of""" + mediaId: Int + + """The watching/reading status""" + status: MediaListStatus + + """The score of the media in the user's chosen scoring method""" + score: Float + + """The score of the media in 100 point""" + scoreRaw: Int + + """The amount of episodes/chapters consumed by the user""" + progress: Int + + """The amount of volumes read by the user""" + progressVolumes: Int + + """The amount of times the user has rewatched/read the media""" + repeat: Int + + """Priority of planning""" + priority: Int + + """If the entry should only be visible to authenticated user""" + private: Boolean + + """Text notes""" + notes: String + + """If the entry shown be hidden from non-custom lists""" + hiddenFromStatusLists: Boolean + + """Array of custom list names which should be enabled for this entry""" + customLists: [String] + + """Array of advanced scores""" + advancedScores: [Float] + + """When the entry was started by the user""" + startedAt: FuzzyDateInput + + """When the entry was completed by the user""" + completedAt: FuzzyDateInput + ): MediaList + + """Update multiple media list entries to the same values""" + UpdateMediaListEntries( + """The watching/reading status""" + status: MediaListStatus + + """The score of the media in the user's chosen scoring method""" + score: Float + + """The score of the media in 100 point""" + scoreRaw: Int + + """The amount of episodes/chapters consumed by the user""" + progress: Int + + """The amount of volumes read by the user""" + progressVolumes: Int + + """The amount of times the user has rewatched/read the media""" + repeat: Int + + """Priority of planning""" + priority: Int + + """If the entry should only be visible to authenticated user""" + private: Boolean + + """Text notes""" + notes: String + + """If the entry shown be hidden from non-custom lists""" + hiddenFromStatusLists: Boolean + + """Array of advanced scores""" + advancedScores: [Float] + + """When the entry was started by the user""" + startedAt: FuzzyDateInput + + """When the entry was completed by the user""" + completedAt: FuzzyDateInput + + """The list entries ids to update""" + ids: [Int] + ): [MediaList] + + """Delete a media list entry""" + DeleteMediaListEntry( + """The id of the media list entry to delete""" + id: Int + ): Deleted + + """Delete a custom list and remove the list entries from it""" + DeleteCustomList( + """The name of the custom list to delete""" + customList: String + + """The media list type of the custom list""" + type: MediaType + ): Deleted + + """Create or update text activity for the currently authenticated user""" + SaveTextActivity( + """The activity's id, required for updating""" + id: Int + + """The activity text""" + text: String + + """If the activity should be locked. (Mod Only)""" + locked: Boolean + ): TextActivity + + """Create or update message activity for the currently authenticated user""" + SaveMessageActivity( + """The activity id, required for updating""" + id: Int + + """The activity message text""" + message: String + + """The id of the user the message is being sent to""" + recipientId: Int + + """If the activity should be private""" + private: Boolean + + """If the activity should be locked. (Mod Only)""" + locked: Boolean + + """If the message should be sent from the Moderator account (Mod Only)""" + asMod: Boolean + ): MessageActivity + + """Update list activity (Mod Only)""" + SaveListActivity( + """The activity's id, required for updating""" + id: Int + + """If the activity should be locked. (Mod Only)""" + locked: Boolean + ): ListActivity + + """Delete an activity item of the authenticated users""" + DeleteActivity( + """The id of the activity to delete""" + id: Int + ): Deleted + + """Toggle activity to be pinned to the top of the user's activity feed""" + ToggleActivityPin( + """Toggle activity id to be pinned""" + id: Int + + """If the activity should be pinned or unpinned""" + pinned: Boolean + ): ActivityUnion + + """Toggle the subscription of an activity item""" + ToggleActivitySubscription( + """The id of the activity to un/subscribe""" + activityId: Int + + """Whether to subscribe or unsubscribe from the activity""" + subscribe: Boolean + ): ActivityUnion + + """Create or update an activity reply""" + SaveActivityReply( + """The activity reply id, required for updating""" + id: Int + + """The id of the parent activity being replied to""" + activityId: Int + + """The reply text""" + text: String + + """If the reply should be sent from the Moderator account (Mod Only)""" + asMod: Boolean + ): ActivityReply + + """Delete an activity reply of the authenticated users""" + DeleteActivityReply( + """The id of the reply to delete""" + id: Int + ): Deleted + + """ + Add or remove a like from a likeable type. + Returns all the users who liked the same model + """ + ToggleLike( + """The id of the likeable type""" + id: Int + + """The type of model to be un/liked""" + type: LikeableType + ): [User] + + """Add or remove a like from a likeable type.""" + ToggleLikeV2( + """The id of the likeable type""" + id: Int + + """The type of model to be un/liked""" + type: LikeableType + ): LikeableUnion + + """Toggle the un/following of a user""" + ToggleFollow( + """The id of the user to un/follow""" + userId: Int + ): User + + """ + Favourite or unfavourite an anime, manga, character, staff member, or studio + """ + ToggleFavourite( + """The id of the anime to un/favourite""" + animeId: Int + + """The id of the manga to un/favourite""" + mangaId: Int + + """The id of the character to un/favourite""" + characterId: Int + + """The id of the staff to un/favourite""" + staffId: Int + + """The id of the studio to un/favourite""" + studioId: Int + ): Favourites + + """Update the order favourites are displayed in""" + UpdateFavouriteOrder( + """The id of the anime to un/favourite""" + animeIds: [Int] + + """The id of the manga to un/favourite""" + mangaIds: [Int] + + """The id of the character to un/favourite""" + characterIds: [Int] + + """The id of the staff to un/favourite""" + staffIds: [Int] + + """The id of the studio to un/favourite""" + studioIds: [Int] + + """List of integers which the anime should be ordered by (Asc)""" + animeOrder: [Int] + + """List of integers which the manga should be ordered by (Asc)""" + mangaOrder: [Int] + + """List of integers which the character should be ordered by (Asc)""" + characterOrder: [Int] + + """List of integers which the staff should be ordered by (Asc)""" + staffOrder: [Int] + + """List of integers which the studio should be ordered by (Asc)""" + studioOrder: [Int] + ): Favourites + + """Create or update a review""" + SaveReview( + """The review id, required for updating""" + id: Int + + """The id of the media the review is of""" + mediaId: Int + + """The main review text. Min:2200 characters""" + body: String + + """A short summary/preview of the review. Min:20, Max:120 characters""" + summary: String + + """A short summary/preview of the review. Min:20, Max:120 characters""" + score: Int + + """If the review should only be visible to its creator""" + private: Boolean + ): Review + + """Delete a review""" + DeleteReview( + """The id of the review to delete""" + id: Int + ): Deleted + + """Rate a review""" + RateReview( + """The id of the review to rate""" + reviewId: Int + + """The rating to apply to the review""" + rating: ReviewRating + ): Review + + """Recommendation a media""" + SaveRecommendation( + """The id of the base media""" + mediaId: Int + + """The id of the media to recommend""" + mediaRecommendationId: Int + + """The rating to give the recommendation""" + rating: RecommendationRating + ): Recommendation + + """Create or update a forum thread""" + SaveThread( + """The thread id, required for updating""" + id: Int + + """The title of the thread""" + title: String + + """The main text body of the thread""" + body: String + + """Forum categories the thread should be within""" + categories: [Int] + + """Media related to the contents of the thread""" + mediaCategories: [Int] + + """If the thread should be stickied. (Mod Only)""" + sticky: Boolean + + """If the thread should be locked. (Mod Only)""" + locked: Boolean + ): Thread + + """Delete a thread""" + DeleteThread( + """The id of the thread to delete""" + id: Int + ): Deleted + + """Toggle the subscription of a forum thread""" + ToggleThreadSubscription( + """The id of the forum thread to un/subscribe""" + threadId: Int + + """Whether to subscribe or unsubscribe from the forum thread""" + subscribe: Boolean + ): Thread + + """Create or update a thread comment""" + SaveThreadComment( + """The comment id, required for updating""" + id: Int + + """The id of thread the comment belongs to""" + threadId: Int + + """The id of thread comment to reply to""" + parentCommentId: Int + + """The comment markdown text""" + comment: String + + """If the comment tree should be locked. (Mod Only)""" + locked: Boolean + ): ThreadComment + + """Delete a thread comment""" + DeleteThreadComment( + """The id of the thread comment to delete""" + id: Int + ): Deleted + UpdateAniChartSettings(titleLanguage: String, outgoingLinkProvider: String, theme: String, sort: String): Json + UpdateAniChartHighlights(highlights: [AniChartHighlightInput]): Json +} + +"""Notification option input""" +input NotificationOptionInput { + """The type of notification""" + type: NotificationType + + """Whether this type of notification is enabled""" + enabled: Boolean +} + +"""A user's list options for anime or manga lists""" +input MediaListOptionsInput { + """The order each list should be displayed in""" + sectionOrder: [String] + + """If the completed sections of the list should be separated by format""" + splitCompletedSectionByFormat: Boolean + + """The names of the user's custom lists""" + customLists: [String] + + """The names of the user's advanced scoring sections""" + advancedScoring: [String] + + """If advanced scoring is enabled""" + advancedScoringEnabled: Boolean + + """list theme""" + theme: String +} + +input ListActivityOptionInput { + disabled: Boolean + type: MediaListStatus +} + +"""Date object that allows for incomplete date values (fuzzy)""" +input FuzzyDateInput { + """Numeric Year (2017)""" + year: Int + + """Numeric Month (3)""" + month: Int + + """Numeric Day (24)""" + day: Int +} + +"""Deleted data type""" +type Deleted { + """If an item has been successfully deleted""" + deleted: Boolean +} + +"""Likeable union type""" +union LikeableUnion = ListActivity | TextActivity | MessageActivity | ActivityReply | Thread | ThreadComment + +input AniChartHighlightInput { + mediaId: Int + highlight: String +} + +"""Page of data (Used for internal use only)""" +type InternalPage { + mediaSubmissions( + mediaId: Int + submissionId: Int + userId: Int + assigneeId: Int + status: SubmissionStatus + + """Filter by the media's type""" + type: MediaType + + """The order the results will be returned in""" + sort: [SubmissionSort] + ): [MediaSubmission] + characterSubmissions( + characterId: Int + + """Filter by the submitter of the submission""" + userId: Int + assigneeId: Int + + """Filter by the status of the submission""" + status: SubmissionStatus + + """The order the results will be returned in""" + sort: [SubmissionSort] + ): [CharacterSubmission] + staffSubmissions( + staffId: Int + + """Filter by the submitter of the submission""" + userId: Int + assigneeId: Int + + """Filter by the status of the submission""" + status: SubmissionStatus + + """The order the results will be returned in""" + sort: [SubmissionSort] + ): [StaffSubmission] + revisionHistory( + """Filter by the user id""" + userId: Int + + """Filter by the media id""" + mediaId: Int + + """Filter by the character id""" + characterId: Int + + """Filter by the staff id""" + staffId: Int + + """Filter by the studio id""" + studioId: Int + ): [RevisionHistory] + reports(reporterId: Int, reportedId: Int): [Report] + modActions(userId: Int, modId: Int): [ModAction] + userBlockSearch( + """Filter by search query""" + search: String + ): [User] + + """The pagination information""" + pageInfo: PageInfo + users( + """Filter by the user id""" + id: Int + + """Filter by the name of the user""" + name: String + + """Filter to moderators only if true""" + isModerator: Boolean + + """Filter by search query""" + search: String + + """The order the results will be returned in""" + sort: [UserSort] + ): [User] + media( + """Filter by the media id""" + id: Int + + """Filter by the media's MyAnimeList id""" + idMal: Int + + """Filter by the start date of the media""" + startDate: FuzzyDateInt + + """Filter by the end date of the media""" + endDate: FuzzyDateInt + + """Filter by the season the media was released in""" + season: MediaSeason + + """ + The year of the season (Winter 2017 would also include December 2016 releases). Requires season argument + """ + seasonYear: Int + + """Filter by the media's type""" + type: MediaType + + """Filter by the media's format""" + format: MediaFormat + + """Filter by the media's current release status""" + status: MediaStatus + + """Filter by amount of episodes the media has""" + episodes: Int + + """Filter by the media's episode length""" + duration: Int + + """Filter by the media's chapter count""" + chapters: Int + + """Filter by the media's volume count""" + volumes: Int + + """Filter by if the media's intended for 18+ adult audiences""" + isAdult: Boolean + + """Filter by the media's genres""" + genre: String + + """Filter by the media's tags""" + tag: String + + """ + Only apply the tags filter argument to tags above this rank. Default: 18 + """ + minimumTagRank: Int + + """Filter by the media's tags with in a tag category""" + tagCategory: String + + """Filter by the media on the authenticated user's lists""" + onList: Boolean + + """Filter media by sites name with a online streaming or reading license""" + licensedBy: String + + """Filter media by sites id with a online streaming or reading license""" + licensedById: Int + + """Filter by the media's average score""" + averageScore: Int + + """Filter by the number of users with this media on their list""" + popularity: Int + + """Filter by the source type of the media""" + source: MediaSource + + """Filter by the media's country of origin""" + countryOfOrigin: CountryCode + + """If the media is officially licensed or a self-published doujin release""" + isLicensed: Boolean + + """Filter by search query""" + search: String + + """Filter by the media id""" + id_not: Int + + """Filter by the media id""" + id_in: [Int] + + """Filter by the media id""" + id_not_in: [Int] + + """Filter by the media's MyAnimeList id""" + idMal_not: Int + + """Filter by the media's MyAnimeList id""" + idMal_in: [Int] + + """Filter by the media's MyAnimeList id""" + idMal_not_in: [Int] + + """Filter by the start date of the media""" + startDate_greater: FuzzyDateInt + + """Filter by the start date of the media""" + startDate_lesser: FuzzyDateInt + + """Filter by the start date of the media""" + startDate_like: String + + """Filter by the end date of the media""" + endDate_greater: FuzzyDateInt + + """Filter by the end date of the media""" + endDate_lesser: FuzzyDateInt + + """Filter by the end date of the media""" + endDate_like: String + + """Filter by the media's format""" + format_in: [MediaFormat] + + """Filter by the media's format""" + format_not: MediaFormat + + """Filter by the media's format""" + format_not_in: [MediaFormat] + + """Filter by the media's current release status""" + status_in: [MediaStatus] + + """Filter by the media's current release status""" + status_not: MediaStatus + + """Filter by the media's current release status""" + status_not_in: [MediaStatus] + + """Filter by amount of episodes the media has""" + episodes_greater: Int + + """Filter by amount of episodes the media has""" + episodes_lesser: Int + + """Filter by the media's episode length""" + duration_greater: Int + + """Filter by the media's episode length""" + duration_lesser: Int + + """Filter by the media's chapter count""" + chapters_greater: Int + + """Filter by the media's chapter count""" + chapters_lesser: Int + + """Filter by the media's volume count""" + volumes_greater: Int + + """Filter by the media's volume count""" + volumes_lesser: Int + + """Filter by the media's genres""" + genre_in: [String] + + """Filter by the media's genres""" + genre_not_in: [String] + + """Filter by the media's tags""" + tag_in: [String] + + """Filter by the media's tags""" + tag_not_in: [String] + + """Filter by the media's tags with in a tag category""" + tagCategory_in: [String] + + """Filter by the media's tags with in a tag category""" + tagCategory_not_in: [String] + + """Filter media by sites name with a online streaming or reading license""" + licensedBy_in: [String] + + """Filter media by sites id with a online streaming or reading license""" + licensedById_in: [Int] + + """Filter by the media's average score""" + averageScore_not: Int + + """Filter by the media's average score""" + averageScore_greater: Int + + """Filter by the media's average score""" + averageScore_lesser: Int + + """Filter by the number of users with this media on their list""" + popularity_not: Int + + """Filter by the number of users with this media on their list""" + popularity_greater: Int + + """Filter by the number of users with this media on their list""" + popularity_lesser: Int + + """Filter by the source type of the media""" + source_in: [MediaSource] + + """The order the results will be returned in""" + sort: [MediaSort] + ): [Media] + characters( + """Filter by character id""" + id: Int + + """Filter by character by if its their birthday today""" + isBirthday: Boolean + + """Filter by search query""" + search: String + + """Filter by character id""" + id_not: Int + + """Filter by character id""" + id_in: [Int] + + """Filter by character id""" + id_not_in: [Int] + + """The order the results will be returned in""" + sort: [CharacterSort] + ): [Character] + staff( + """Filter by the staff id""" + id: Int + + """Filter by staff by if its their birthday today""" + isBirthday: Boolean + + """Filter by search query""" + search: String + + """Filter by the staff id""" + id_not: Int + + """Filter by the staff id""" + id_in: [Int] + + """Filter by the staff id""" + id_not_in: [Int] + + """The order the results will be returned in""" + sort: [StaffSort] + ): [Staff] + studios( + """Filter by the studio id""" + id: Int + + """Filter by search query""" + search: String + + """Filter by the studio id""" + id_not: Int + + """Filter by the studio id""" + id_in: [Int] + + """Filter by the studio id""" + id_not_in: [Int] + + """The order the results will be returned in""" + sort: [StudioSort] + ): [Studio] + mediaList( + """Filter by a list entry's id""" + id: Int + + """Filter by a user's id""" + userId: Int + + """Filter by a user's name""" + userName: String + + """Filter by the list entries media type""" + type: MediaType + + """Filter by the watching/reading status""" + status: MediaListStatus + + """Filter by the media id of the list entry""" + mediaId: Int + + """ + Filter list entries to users who are being followed by the authenticated user + """ + isFollowing: Boolean + + """Filter by note words and #tags""" + notes: String + + """Filter by the date the user started the media""" + startedAt: FuzzyDateInt + + """Filter by the date the user completed the media""" + completedAt: FuzzyDateInt + + """ + Limit to only entries also on the auth user's list. Requires user id or name arguments. + """ + compareWithAuthList: Boolean + + """Filter by a user's id""" + userId_in: [Int] + + """Filter by the watching/reading status""" + status_in: [MediaListStatus] + + """Filter by the watching/reading status""" + status_not_in: [MediaListStatus] + + """Filter by the watching/reading status""" + status_not: MediaListStatus + + """Filter by the media id of the list entry""" + mediaId_in: [Int] + + """Filter by the media id of the list entry""" + mediaId_not_in: [Int] + + """Filter by note words and #tags""" + notes_like: String + + """Filter by the date the user started the media""" + startedAt_greater: FuzzyDateInt + + """Filter by the date the user started the media""" + startedAt_lesser: FuzzyDateInt + + """Filter by the date the user started the media""" + startedAt_like: String + + """Filter by the date the user completed the media""" + completedAt_greater: FuzzyDateInt + + """Filter by the date the user completed the media""" + completedAt_lesser: FuzzyDateInt + + """Filter by the date the user completed the media""" + completedAt_like: String + + """The order the results will be returned in""" + sort: [MediaListSort] + ): [MediaList] + airingSchedules( + """Filter by the id of the airing schedule item""" + id: Int + + """Filter by the id of associated media""" + mediaId: Int + + """Filter by the airing episode number""" + episode: Int + + """Filter by the time of airing""" + airingAt: Int + + """Filter to episodes that haven't yet aired""" + notYetAired: Boolean + + """Filter by the id of the airing schedule item""" + id_not: Int + + """Filter by the id of the airing schedule item""" + id_in: [Int] + + """Filter by the id of the airing schedule item""" + id_not_in: [Int] + + """Filter by the id of associated media""" + mediaId_not: Int + + """Filter by the id of associated media""" + mediaId_in: [Int] + + """Filter by the id of associated media""" + mediaId_not_in: [Int] + + """Filter by the airing episode number""" + episode_not: Int + + """Filter by the airing episode number""" + episode_in: [Int] + + """Filter by the airing episode number""" + episode_not_in: [Int] + + """Filter by the airing episode number""" + episode_greater: Int + + """Filter by the airing episode number""" + episode_lesser: Int + + """Filter by the time of airing""" + airingAt_greater: Int + + """Filter by the time of airing""" + airingAt_lesser: Int + + """The order the results will be returned in""" + sort: [AiringSort] + ): [AiringSchedule] + mediaTrends( + """Filter by the media id""" + mediaId: Int + + """Filter by date""" + date: Int + + """Filter by trending amount""" + trending: Int + + """Filter by score""" + averageScore: Int + + """Filter by popularity""" + popularity: Int + + """Filter by episode number""" + episode: Int + + """Filter to stats recorded while the media was releasing""" + releasing: Boolean + + """Filter by the media id""" + mediaId_not: Int + + """Filter by the media id""" + mediaId_in: [Int] + + """Filter by the media id""" + mediaId_not_in: [Int] + + """Filter by date""" + date_greater: Int + + """Filter by date""" + date_lesser: Int + + """Filter by trending amount""" + trending_greater: Int + + """Filter by trending amount""" + trending_lesser: Int + + """Filter by trending amount""" + trending_not: Int + + """Filter by score""" + averageScore_greater: Int + + """Filter by score""" + averageScore_lesser: Int + + """Filter by score""" + averageScore_not: Int + + """Filter by popularity""" + popularity_greater: Int + + """Filter by popularity""" + popularity_lesser: Int + + """Filter by popularity""" + popularity_not: Int + + """Filter by episode number""" + episode_greater: Int + + """Filter by episode number""" + episode_lesser: Int + + """Filter by episode number""" + episode_not: Int + + """The order the results will be returned in""" + sort: [MediaTrendSort] + ): [MediaTrend] + notifications( + """Filter by the type of notifications""" + type: NotificationType + + """Reset the unread notification count to 0 on load""" + resetNotificationCount: Boolean + + """Filter by the type of notifications""" + type_in: [NotificationType] + ): [NotificationUnion] + followers( + """User id of the follower/followed""" + userId: Int! + + """The order the results will be returned in""" + sort: [UserSort] + ): [User] + following( + """User id of the follower/followed""" + userId: Int! + + """The order the results will be returned in""" + sort: [UserSort] + ): [User] + activities( + """Filter by the activity id""" + id: Int + + """Filter by the owner user id""" + userId: Int + + """Filter by the id of the user who sent a message""" + messengerId: Int + + """Filter by the associated media id of the activity""" + mediaId: Int + + """Filter by the type of activity""" + type: ActivityType + + """ + Filter activity to users who are being followed by the authenticated user + """ + isFollowing: Boolean + + """Filter activity to only activity with replies""" + hasReplies: Boolean + + """Filter activity to only activity with replies or is of type text""" + hasRepliesOrTypeText: Boolean + + """Filter by the time the activity was created""" + createdAt: Int + + """Filter by the activity id""" + id_not: Int + + """Filter by the activity id""" + id_in: [Int] + + """Filter by the activity id""" + id_not_in: [Int] + + """Filter by the owner user id""" + userId_not: Int + + """Filter by the owner user id""" + userId_in: [Int] + + """Filter by the owner user id""" + userId_not_in: [Int] + + """Filter by the id of the user who sent a message""" + messengerId_not: Int + + """Filter by the id of the user who sent a message""" + messengerId_in: [Int] + + """Filter by the id of the user who sent a message""" + messengerId_not_in: [Int] + + """Filter by the associated media id of the activity""" + mediaId_not: Int + + """Filter by the associated media id of the activity""" + mediaId_in: [Int] + + """Filter by the associated media id of the activity""" + mediaId_not_in: [Int] + + """Filter by the type of activity""" + type_not: ActivityType + + """Filter by the type of activity""" + type_in: [ActivityType] + + """Filter by the type of activity""" + type_not_in: [ActivityType] + + """Filter by the time the activity was created""" + createdAt_greater: Int + + """Filter by the time the activity was created""" + createdAt_lesser: Int + + """The order the results will be returned in""" + sort: [ActivitySort] + ): [ActivityUnion] + activityReplies( + """Filter by the reply id""" + id: Int + + """Filter by the parent id""" + activityId: Int + ): [ActivityReply] + threads( + """Filter by the thread id""" + id: Int + + """Filter by the user id of the thread's creator""" + userId: Int + + """Filter by the user id of the last user to comment on the thread""" + replyUserId: Int + + """Filter by if the currently authenticated user's subscribed threads""" + subscribed: Boolean + + """Filter by thread category id""" + categoryId: Int + + """Filter by thread media id category""" + mediaCategoryId: Int + + """Filter by search query""" + search: String + + """Filter by the thread id""" + id_in: [Int] + + """The order the results will be returned in""" + sort: [ThreadSort] + ): [Thread] + threadComments( + """Filter by the comment id""" + id: Int + + """Filter by the thread id""" + threadId: Int + + """Filter by the user id of the comment's creator""" + userId: Int + + """The order the results will be returned in""" + sort: [ThreadCommentSort] + ): [ThreadComment] + reviews( + """Filter by Review id""" + id: Int + + """Filter by media id""" + mediaId: Int + + """Filter by user id""" + userId: Int + + """Filter by media type""" + mediaType: MediaType + + """The order the results will be returned in""" + sort: [ReviewSort] + ): [Review] + recommendations( + """Filter by recommendation id""" + id: Int + + """Filter by media id""" + mediaId: Int + + """Filter by media recommendation id""" + mediaRecommendationId: Int + + """Filter by user who created the recommendation""" + userId: Int + + """Filter by total rating of the recommendation""" + rating: Int + + """Filter by the media on the authenticated user's lists""" + onList: Boolean + + """Filter by total rating of the recommendation""" + rating_greater: Int + + """Filter by total rating of the recommendation""" + rating_lesser: Int + + """The order the results will be returned in""" + sort: [RecommendationSort] + ): [Recommendation] + likes( + """The id of the likeable type""" + likeableId: Int + + """The type of model the id applies to""" + type: LikeableType + ): [User] +} + +"""Submission status""" +enum SubmissionStatus { + PENDING + REJECTED + PARTIALLY_ACCEPTED + ACCEPTED +} + +"""Submission sort enums""" +enum SubmissionSort { + ID + ID_DESC +} + +"""Media submission""" +type MediaSubmission { + """The id of the submission""" + id: Int! + + """User submitter of the submission""" + submitter: User + + """Data Mod assigned to handle the submission""" + assignee: User + + """Status of the submission""" + status: SubmissionStatus + submitterStats: Json + notes: String + source: String + changes: [String] + + """Whether the submission is locked""" + locked: Boolean + media: Media + submission: Media + characters: [MediaSubmissionComparison] + staff: [MediaSubmissionComparison] + studios: [MediaSubmissionComparison] + relations: [MediaEdge] + externalLinks: [MediaSubmissionComparison] + createdAt: Int +} + +"""Media submission with comparison to current data""" +type MediaSubmissionComparison { + submission: MediaSubmissionEdge + character: MediaCharacter + staff: StaffEdge + studio: StudioEdge + externalLink: MediaExternalLink +} + +type MediaSubmissionEdge { + """The id of the direct submission""" + id: Int + characterRole: CharacterRole + staffRole: String + roleNotes: String + dubGroup: String + characterName: String + isMain: Boolean + character: Character + characterSubmission: Character + voiceActor: Staff + voiceActorSubmission: Staff + staff: Staff + staffSubmission: Staff + studio: Studio + externalLink: MediaExternalLink + media: Media +} + +"""Internal - Media characters separated""" +type MediaCharacter { + """The id of the connection""" + id: Int + + """The characters role in the media""" + role: CharacterRole + roleNotes: String + dubGroup: String + + """Media specific character name""" + characterName: String + + """The characters in the media voiced by the parent actor""" + character: Character + + """The voice actor of the character""" + voiceActor: Staff +} + +"""A submission for a character that features in an anime or manga""" +type CharacterSubmission { + """The id of the submission""" + id: Int! + + """Character that the submission is referencing""" + character: Character + + """The character submission changes""" + submission: Character + + """Submitter for the submission""" + submitter: User + + """Data Mod assigned to handle the submission""" + assignee: User + + """Status of the submission""" + status: SubmissionStatus + + """Inner details of submission status""" + notes: String + source: String + + """Whether the submission is locked""" + locked: Boolean + createdAt: Int +} + +"""A submission for a staff that features in an anime or manga""" +type StaffSubmission { + """The id of the submission""" + id: Int! + + """Staff that the submission is referencing""" + staff: Staff + + """The staff submission changes""" + submission: Staff + + """Submitter for the submission""" + submitter: User + + """Data Mod assigned to handle the submission""" + assignee: User + + """Status of the submission""" + status: SubmissionStatus + + """Inner details of submission status""" + notes: String + source: String + + """Whether the submission is locked""" + locked: Boolean + createdAt: Int +} + +"""Feed of mod edit activity""" +type RevisionHistory { + """The id of the media""" + id: Int! + + """The action taken on the objects""" + action: RevisionHistoryAction + + """A JSON object of the fields that changed""" + changes: Json + + """The user who made the edit to the object""" + user: User + + """The media the mod feed entry references""" + media: Media + + """The character the mod feed entry references""" + character: Character + + """The staff member the mod feed entry references""" + staff: Staff + + """The studio the mod feed entry references""" + studio: Studio + + """The external link source the mod feed entry references""" + externalLink: MediaExternalLink + + """When the mod feed entry was created""" + createdAt: Int +} + +"""Revision history actions""" +enum RevisionHistoryAction { + CREATE + EDIT +} + +type Report { + id: Int! + reporter: User + reported: User + reason: String + + """When the entry data was created""" + createdAt: Int + cleared: Boolean +} + +type ModAction { + """The id of the action""" + id: Int! + user: User + mod: User + type: ModActionType + objectId: Int + objectType: String + data: String + createdAt: Int! +} + +enum ModActionType { + NOTE + BAN + DELETE + EDIT + EXPIRE + REPORT + RESET + ANON +} + +"""The official titles of the media in various languages""" +input MediaTitleInput { + """The romanization of the native language title""" + romaji: String + + """The official english title""" + english: String + + """Official title in it's native language""" + native: String +} + +input AiringScheduleInput { + airingAt: Int + episode: Int + timeUntilAiring: Int +} + +"""An external link to another site related to the media""" +input MediaExternalLinkInput { + """The id of the external link""" + id: Int! + + """The url of the external link""" + url: String! + + """The site location of the external link""" + site: String! +} + +"""The names of the character""" +input CharacterNameInput { + """The character's given name""" + first: String + + """The character's middle name""" + middle: String + + """The character's surname""" + last: String + + """The character's full name in their native language""" + native: String + + """Other names the character might be referred by""" + alternative: [String] + + """Other names the character might be referred to as but are spoilers""" + alternativeSpoiler: [String] +} + +type CharacterSubmissionConnection { + edges: [CharacterSubmissionEdge] + nodes: [CharacterSubmission] + + """The pagination information""" + pageInfo: PageInfo +} + +"""CharacterSubmission connection edge""" +type CharacterSubmissionEdge { + node: CharacterSubmission + + """The characters role in the media""" + role: CharacterRole + + """The voice actors of the character""" + voiceActors: [Staff] + + """The submitted voice actors of the character""" + submittedVoiceActors: [StaffSubmission] +} + +"""The names of the staff member""" +input StaffNameInput { + """The person's given name""" + first: String + + """The person's middle name""" + middle: String + + """The person's surname""" + last: String + + """The person's full name in their native language""" + native: String + + """Other names the character might be referred by""" + alternative: [String] +} + +"""User data for moderators""" +type UserModData { + alts: [User] + bans: Json + ip: Json + counts: Json + privacy: Int + email: String +}
\ No newline at end of file |