Files
speckle-server/packages/server
Gergő Jedlicska 08e941f8af Poor man's SSO (#2641)
* Implemented workspace general page

* Added notifications to user input

* Allowed non-admins to view but not edit

* Added redirect to homeroute

* Fixed validation

* Squashed commit of the following:

commit 7bf14ab8af0f76b4c9d0aa87fc08085af7c34959
Author: Chuck Driesler <chuck@speckle.systems>
Date:   Tue Aug 6 19:40:50 2024 +0200

    mob next [ci-skip] [ci skip] [skip ci]

    lastFile:packages/server/modules/workspacesCore/migrations/20240806160740_workspace_domains.ts

commit 8aa3fb0cb052c10eeeb83bf9874ae0d1c065e480
Author: Alessandro Magionami <alessandro.magionami@gmail.com>
Date:   Tue Aug 6 18:54:15 2024 +0200

    mob next [ci-skip] [ci skip] [skip ci]

    lastFile:packages/server/modules/core/domain/userEmails/operations.ts

commit 66dfd0cf6c15a789c8f96a65a3168323e83a7b9e
Author: Chuck Driesler <chuck@speckle.systems>
Date:   Tue Aug 6 18:30:22 2024 +0200

    mob next [ci-skip] [ci skip] [skip ci]

    lastFile:packages/server/modules/workspacesCore/domain/types.ts

Co-authored-by: Alessandro Magionami <alessandro.magionami@gmail.com>

* Move General to workspaces folder

* feat(workspaces): inputs on security section

* feat(workspaces): add domain to workspace mutation

* chore(workspaces): add blocked domains list

* fix(workspaces): modals with buttons

* feat(workspaceDomains): delete domain

* fix(workspaces): use  mutation

* fix(workspaces): present user verified domains as options

* Moved sidebar menu to a composable

* Added coming soon tag back

* feat(workspaces): create domains resolver for workspace

* chore(workspaces): fix tests

* chore(workspaces): fix types

* chore(workspaces): fix linter

* fix(workspaces): do some delete I think

* chore(workspaces): add domainBasedMembershipProtectionEnabled field to workspace

* chore(workspaces): improve validation for email domain

* fix(workspace): query and do the thing

* chore(workspaces): add graphql schema for domainBasedMembershipProtection

* chore(workspaces): lint and test failures

* fix(workspaces): test issues w new field

* feat(workspaces): add discoverability flag

* chore(workspaces): they made me do it

* feat(workspaces): enable toggling domain protection

* feat(workspaces): add discoverability toggle to workspace settings

* feat(workspace): auto enable discoverability on first domain registration

* feat(workspace): discoverability toggle fixes

* fix(eventBus): fix tests

* feat(workspaces): user discoverable workspaces (#2620)

* feat(workspaces): it works just trust me

* fix(workspaces): don't worry about it

* fix(workspaces); happy path success

* fix(workspaces): almost there

* fix(workspaces): successful tests!

* fix(workspaces): we have DISCOVERED (#2621)

* Fixed linting issue

* Updated query

* Updated validation rules

* Updated validation rules

* Fix unsaved file with type export

* Addressed PR comments

* Updated cache

* Updated item classes, add fragment back

* Gergo/web 1574 join workspaces via discovery (#2623)

* chore(useremails): add find verified emails by user function

* chore(workspace): table helper for workspace domains

* chore(workspace): get workspace with domains function

* chore(workspace): test get workspace with domains function

* feat(workspace): restrict workspace membership when updating workspace role

* chore(workspaces): fix types

* feat(workspaces): WIP join

* feat(workspaces): join button makes u join

* chore(useremails): fix type for find verified emails function

* feat(workspaces): join

* feat(workspace): prevent inviting user without email matching domain

* chore(workspaces): fix linter

* fix(workspaces): invoke join (gergo wrote this)

* fuck

* fix(workspaces): properly get discoverable workspaces

* fix(workspaces): test

---------

Co-authored-by: Gergő Jedlicska <gergo@jedlicska.com>
Co-authored-by: Chuck Driesler <chuck@speckle.systems>

* fix(workspaces): some query stuff

* fix(workspaces): mutate cache instead of refetch

* fix(workspaces): more adjustments to gql query and fragment structure

* fix(workspaces): queries, style, structure

* fix(workspaces): match discoverability with current styles

* chore(workspaces): lint lint lint

* fix(workspaces): got it twisted

* chore(workspaces): fix test

* fix(workspaces): route to joined workspace on join

---------

Co-authored-by: Mike Tasset <mike.tasset@gmail.com>
Co-authored-by: Chuck Driesler <chuck@speckle.systems>
Co-authored-by: Alessandro Magionami <alessandro.magionami@gmail.com>
2024-08-26 13:33:16 +02:00
..
2024-08-26 13:33:16 +02:00
2024-07-16 14:17:40 +02:00
2024-08-26 13:33:16 +02:00
2024-08-26 13:33:16 +02:00
2024-06-12 15:42:17 +03:00

Speckle Server

Twitter Follow Community forum users website docs

Status

Speckle-Next codecov pre-commit.ci status

Disclaimer

We're working to stabilize the 2.0 API, and until then there will be breaking changes.

Documentation

Comprehensive developer and user documentation can be found in our:

📚 Speckle Docs website

Introduction

The Speckle Server is a node application tested against v12.

The external dependencies are PostgreSQL and Redis. To get the dependencies running without any hassle, you can run them in docker containers as described in our Server deployment instructions (chapter Run your speckle-server fork, step 1)

NOTE: If you install PostgreSQL yourself or use an existing PostgreSQL instance, make sure to create a database and a user that can access it

After you have PostgreSQL and Redis running, in the packages/server folder:

  • copy the .env-example file to .env,
  • (if you plan to run tests) copy the .env.test-example file to .env.test
  • If you have a custom setup, open and edit the .env & .env.test files, filling in the required variables,
  • run yarn install,
  • finally yarn dev,
  • check 127.0.0.1:3000/graphql out!

Developing

The server consists of several semi-related components, or modules. These can be found in /modules. Module composition:

  • an index.js file that exposes two functions, init and finalize (mandatory)
  • a graph folder, with two subfolders, namely resolvers and schemas (optional - these will be picked up and merged).

TypeScript

This package has TypeScript support and you can use TS everywhere in it - modules, tests, migrations (read note about migrations below).

To run the app, build it first into /dist and then run it through ./bin/www. Or just run - yarn dev which will run the TS compiler in watch mode and also run the build app through nodemon.

Tests and the CLI, however, do not need an explicit build inside the /dist folder as they use ts-node to execute TS files directly. This is to improve the DX and allow you to iterate on tests faster, without having to run the TS compiler.

GraphQL types

Whenever a schema changes you can run yarn gqlgen to regenerate GraphQL types at @/modules/core/graph/generated/graphql.ts. This file will hold types for scalars, variables and most importantly - resolvers.

You can get the best DX by typing your resolvers with the Resolvers type and then you will get proper type checking for parent, arguments and so on in your resolvers.

Migrations

To create new migrations use yarn migrate create. Note that migrations are only ever read from the ./dist folder to avoid scenarious when both the TS and JS version of the same migration is executed, so if you ever create a new migration make sure you build the app into /dist if you want it to be applied.

CLI

We've got a yargs based dev-only CLI that you can run and extend with useful commands. Run it through yarn cli and add new commands under ./modules/cli

Bull queue monitoring

Use yarn cli bull monitor to serve a Web UI for our Bull queues (e.g. Notifications queues). In the prod env we don't retain old jobs, but locally these older results aren't deleted and you'll see them in this Web UI.

Server & Apps

Frontend

  • In development mode, the Speckle Server will proxy the frontend from 127.0.0.1:3000 to 127.0.0.1:8080. If you don't see anything, ensure you've run yarn dev in the frontend package.

  • In production mode, the frontend is served by an nginx container that proxy server requests to the server (depending on the requested path). For more information about making a production deployment, check out our detailed guide

GraphIQL

A GraphIQL app is available for authenticated api exploration at 127.0.0.1:3000/explorer. Note that for the authentication flow to work, you need to have the frontend running first.

GraphQL Playground

For non-authenticated api exploration, you can use the Graphql Playground which is available by default at 127.0.0.1:3000/graphql.

Testing

To run all tests, simply run yarn test. The recommended extensions for the workspace include a test explorer, that can run individual tests.

If you really want to run specific tests from a terminal, use the mocha --grep @subset syntax. For example:

  • mocha --grep @auth --watch to run tests pertaning to the auth module only in watch mode.
  • mocha --grep @core-streams --watch to run tests pertaining to stream related services.

It's suggested to just run tests from the VSCode test explorer, however.

Integration tests with GraphQL

The best way to do integration tests is to actually invoke queries against an ApolloServer instance. To make this process even better you can rely on GraphQL Code Generator to properly generate types for the queries you write in your tests.

Put your test-specific queries/mutations in @/test/graphql and then run yarn gqlgen. This will generate a typings file at @/test/graphql/generated/graphql.ts which will contain query & variable types for the operations you've created.

You can then specify these types when running operations through executeOperation from @/test/graphqlHelper.ts (through the generic arguments), and then inside your TS test file you'll get properly typed response structures. Awesome!

Community

The Speckle Community hangs out on the forum, do join and introduce yourself & feel free to ask us questions!

License

Unless otherwise described, the code in this repository is licensed under the Apache-2.0 License. Please note that some modules, extensions or code herein might be otherwise licensed. This is indicated either in the root of the containing folder under a different license file, or in the respective file's header. If you have any questions, don't hesitate to get in touch with us via email.