Initial commit
diff --git a/includes/connect/class-wc-stripe-connect-rest-oauth-connect-controller.php b/includes/connect/class-wc-stripe-connect-rest-oauth-connect-controller.php
new file mode 100644
index 0000000..f27a930
--- /dev/null
+++ b/includes/connect/class-wc-stripe-connect-rest-oauth-connect-controller.php
@@ -0,0 +1,69 @@
+<?php
+
+if ( ! defined( 'ABSPATH' ) ) {
+	exit;
+}
+
+if ( ! class_exists( 'WC_Stripe_Connect_REST_Oauth_Connect_Controller' ) ) {
+	/**
+	 * Stripe Connect Oauth Connect controller class.
+	 */
+	class WC_Stripe_Connect_REST_Oauth_Connect_Controller extends WC_Stripe_Connect_REST_Controller {
+
+		/**
+		 * REST base.
+		 *
+		 * @var string
+		 */
+		protected $rest_base = 'connect/stripe/oauth/connect';
+
+		/**
+		 * Stripe Connect.
+		 *
+		 * @var WC_Stripe_Connect
+		 */
+		protected $connect;
+
+		/**
+		 * Constructor.
+		 *
+		 * @param WC_Stripe_Connect     $connect stripe connect.
+		 * @param WC_Stripe_Connect_API $api     stripe connect api.
+		 */
+		public function __construct( WC_Stripe_Connect $connect, WC_Stripe_Connect_API $api ) {
+
+			parent::__construct( $api );
+
+			$this->connect = $connect;
+		}
+
+		/**
+		 * OAuth Connection flow.
+		 *
+		 * @param array $request POST request.
+		 *
+		 * @return array|WP_Error
+		 */
+		public function post( $request ) {
+
+			$data     = $request->get_json_params();
+			$response = $this->connect->connect_oauth( $data['state'], $data['code'] );
+
+			if ( is_wp_error( $response ) ) {
+
+				WC_Stripe_Logger::log( $response, __CLASS__ );
+
+				return new WP_Error(
+					$response->get_error_code(),
+					$response->get_error_message(),
+					[ 'status' => 400 ]
+				);
+			}
+
+			return [
+				'success'    => true,
+				'account_id' => $response->accountId, // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
+			];
+		}
+	}
+}