# Hive plugin for Apollo-Router

[Hive](https://the-guild.dev/graphql/hive) is a fully open-source schema registry, analytics,
metrics and gateway for [GraphQL federation](https://the-guild.dev/graphql/hive/federation) and
other GraphQL APIs.

---

This project includes a Hive integration plugin for Apollo-Router.

At the moment, the following are implemented:

- [Fetching Supergraph from Hive CDN](https://the-guild.dev/graphql/hive/docs/high-availability-cdn)
- [Sending usage information](https://the-guild.dev/graphql/hive/docs/schema-registry/usage-reporting)
  from a running Apollo Router instance to Hive
- Persisted Operations using Hive's
  [App Deployments](https://the-guild.dev/graphql/hive/docs/schema-registry/app-deployments)

This project is constructed as a Rust project that implements Apollo-Router plugin interface.

This build of this project creates an artifact identical to Apollo-Router releases, with additional
features provided by Hive.

## Getting Started

### Binary/Docker

We provide a custom build of Apollo-Router that acts as a drop-in replacement, and adds Hive
integration to Apollo-Router.

[Please follow this guide and documentation for integrating Hive with Apollo Router](https://the-guild.dev/graphql/hive/docs/other-integrations/apollo-router)

### As a Library

If you are
[building a custom Apollo-Router with your own native plugins](https://www.apollographql.com/docs/graphos/routing/customization/native-plugins),
you can use the Hive plugin as a dependency from Crates.io:

```toml
[dependencies]
hive-apollo-router-plugin = "..."
```

And then in your codebase, make sure to import and register the Hive plugin:

```rs
use apollo_router::register_plugin;
// import the registry instance and the plugin registration function
use hive_apollo_router_plugin::registry::HiveRegistry;
// Import the usage plugin
use hive_apollo_router_plugin::usage::UsagePlugin;
// Import persisted documents plugin, if needed
use hive_apollo_router_plugin::persisted_documents::PersistedDocumentsPlugin;


// In your main function, make sure to register the plugin before you create or initialize Apollo-Router
fn main() {
    // Register the Hive usage_reporting plugin
    register_plugin!("hive", "usage", UsagePlugin);
    // Register the persisted documents plugin, if needed
    register_plugin!("hive", "persisted_documents", PersistedDocumentsPlugin);

    // Initialize the Hive Registry instance and start the Apollo Router
    match HiveRegistry::new(None).and(apollo_router::main()) {
        Ok(_) => {}
        Err(e) => {
            eprintln!("{}", e);
            std::process::exit(1);
        }
    }
}
```

## Development

0. Install latest version of Rust
1. To get started with development, it is recommended to ensure Rust-analyzer extension is enabled
   on your VSCode instance.
2. Validate project status by running `cargo check`
3. To start the server with the demo config file (`./router.yaml`), use
   `cargo run -- --config router.yaml`. Make sure to set environment variables required for your
   setup and development process
   ([docs](https://the-guild.dev/graphql/hive/docs/other-integrations/apollo-router#configuration)).
4. You can also just run
   `cargo run -- --config router.yaml --log debug --dev --supergraph some.supergraph.graphql` for
   running it with a test supergraph file.
