Skip to content

[CON-3220] feat(GoTo): add ListMetadata#2955

Open
immdipu wants to merge 13 commits into
mainfrom
dipu/goto-metadata
Open

[CON-3220] feat(GoTo): add ListMetadata#2955
immdipu wants to merge 13 commits into
mainfrom
dipu/goto-metadata

Conversation

@immdipu
Copy link
Copy Markdown
Contributor

@immdipu immdipu commented May 5, 2026

Checklist

  • Connector uses internal/components
  • Metadata uses V2 metadata format
  • Read supports pagination and incremental sync
  • Raw response is returned as is, no formatting or flattening is performed.
  • Write payloads should accept what ReadResults.Fields is returning. Any unnecessary nesting around the input is removed.
  • Provider errors are mapped if non-standard (errors with 200 response code are converted to 4XX)
  • Custom fields, if not human readable names, are resolved to readable names.
  • Unit tests cover read/write/metadata logic (placed in /tests/)
  • Appropriate object names are used. Objects need to be resources, not actions (jobs and not jobs.list).
  • Modules are only being added because:
    • The same base URL cannot be used to make a proxy call to objects in all modules
    • Different base URLs (drive.google.com vs google.com)
    • Object name collisions (same object name exists in two or more modules)

Sample Metadata Response

    ~/Desktop/Ampersand/connectors    dipu/goto-metadata *12  go run ./test/goto/metadata                                                                             ✔  system   09:34:10 PM  
time=2026-05-05T21:34:29.160+05:45 level=DEBUG msg="loading credentials file" path=./go-to-creds.json
{
  "historicalMeetings": {
    "DisplayName": "Historicalmeetings",
    "Fields": {
      "accountKey": {
        "DisplayName": "accountKey",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "conferenceCallInfo": {
        "DisplayName": "conferenceCallInfo",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "duration": {
        "DisplayName": "duration",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "email": {
        "DisplayName": "email",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "endTime": {
        "DisplayName": "endTime",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "firstName": {
        "DisplayName": "firstName",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "lastName": {
        "DisplayName": "lastName",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "locale": {
        "DisplayName": "locale",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "meetingId": {
        "DisplayName": "meetingId",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "meetingType": {
        "DisplayName": "meetingType",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "numAttendees": {
        "DisplayName": "numAttendees",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "organizerKey": {
        "DisplayName": "organizerKey",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "sessionId": {
        "DisplayName": "sessionId",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "startTime": {
        "DisplayName": "startTime",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "subject": {
        "DisplayName": "subject",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      }
    },
    "FieldsMap": {}
  },
  "webinars": {
    "DisplayName": "Webinars",
    "Fields": {
      "accountKey": {
        "DisplayName": "accountKey",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "approvalType": {
        "DisplayName": "approvalType",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "breakoutsAllowed": {
        "DisplayName": "breakoutsAllowed",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "boolean",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "boolean",
        "Values": []
      },
      "experienceType": {
        "DisplayName": "experienceType",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "impromptu": {
        "DisplayName": "impromptu",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "boolean",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "boolean",
        "Values": []
      },
      "isPasswordProtected": {
        "DisplayName": "isPasswordProtected",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "boolean",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "boolean",
        "Values": []
      },
      "locale": {
        "DisplayName": "locale",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "omid": {
        "DisplayName": "omid",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "organizerKey": {
        "DisplayName": "organizerKey",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "recurrenceType": {
        "DisplayName": "recurrenceType",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "registrationSettingsKey": {
        "DisplayName": "registrationSettingsKey",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "registrationUrl": {
        "DisplayName": "registrationUrl",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "status": {
        "DisplayName": "status",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "subject": {
        "DisplayName": "subject",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "timeZone": {
        "DisplayName": "timeZone",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "times": {
        "DisplayName": "times",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "other",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "other",
        "Values": []
      },
      "webinarId": {
        "DisplayName": "webinarId",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      },
      "webinarKey": {
        "DisplayName": "webinarKey",
        "IsCustom": null,
        "IsRequired": null,
        "ProviderType": "string",
        "ReadOnly": null,
        "ReferenceTo": [],
        "ValueType": "string",
        "Values": []
      }
    },
    "FieldsMap": {}
  }
}
Errors:  map[]


Copilot AI review requested due to automatic review settings May 5, 2026 11:43
@linear
Copy link
Copy Markdown

linear Bot commented May 5, 2026

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds initial GoTo deep-connector support for object metadata discovery (ListObjectMetadata) by sampling provider API responses, along with GoTo post-auth metadata (accountKey) and supporting test/manual harnesses.

Changes:

  • Introduces a GoTo “core” adapter (internal/components SchemaProvider) that builds per-object sample requests and infers field metadata from the first returned record.
  • Adds GoTo provider modules (GoTo / GoTo Connect) and declares post-auth metadata (accountKey) as required for both.
  • Adds unit tests and sample JSON fixtures for GoTo metadata, plus manual test programs.

Reviewed changes

Copilot reviewed 15 out of 15 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
test/granola/connector.go Sets an explicit module when constructing the Granola test connector.
test/goto/metadata/main.go Manual program to call ListObjectMetadata for GoTo objects.
test/goto/connector.go Helper to construct a GoTo connector for manual runs.
test/goto/auth-metadata/main.go Manual program to fetch and log GoTo post-auth metadata (accountKey).
providers/goto/test/webinars.json Fixture data for webinars metadata sampling.
providers/goto/test/sessions.json Fixture data for sessions metadata sampling.
providers/goto/metadata_test.go Unit tests validating metadata sampling for GoTo objects.
providers/goto/internal/gotocore/utils.go URL building + response-shape extraction helpers + basic type analysis for metadata inference.
providers/goto/internal/gotocore/support.go Object registry mapping object names to endpoint paths and response shape “service” types.
providers/goto/internal/gotocore/handlers.go Request building (including time filters) + response parsing into ObjectMetadata.
providers/goto/internal/gotocore/adapter.go Adapter wiring to schema.NewObjectSchemaProvider using the handlers.
providers/goto/connector.go Top-level GoTo connector wiring (modules, adapters) and ListObjectMetadata delegation.
providers/goto/authmetamodel.go Model for accountKey auth metadata map parsing/serialization.
providers/goto/authmetadata.go Implements GetPostAuthInfo by retrieving accountKey from /admin/rest/v1/me.
providers/goTo.go Adds GoTo modules + post-auth metadata requirement in provider catalog entry.

Comment thread test/granola/connector.go Outdated
Comment thread providers/goto/connector.go
Comment thread providers/goto/connector.go
Comment thread providers/goto/authmetadata.go Outdated
@immdipu immdipu self-assigned this May 5, 2026
@immdipu immdipu requested a review from RajatPawar May 5, 2026 15:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants