Skip to content

Commit

Permalink
feat(web,server): support maintainer role (#749)
Browse files Browse the repository at this point in the history
  • Loading branch information
rot1024 authored Oct 25, 2023
1 parent a8fb535 commit 20b086c
Show file tree
Hide file tree
Showing 21 changed files with 10,145 additions and 5,261 deletions.
7 changes: 5 additions & 2 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"go.testEnvFile": "${workspaceRoot}/.env",
"go.lintTool": "golangci-lint",
"editor.formatOnSave": true,
"yaml.format.enable": true,
"yaml.format.enable": false,
"yaml.completion": true,
"yaml.validate": true,
"yaml.hover": true,
Expand All @@ -28,5 +28,8 @@
],
"url": "./server/schemas/plugin_manifest_translation.json"
}
]
],
"[yaml]": {
"editor.formatOnSave": false
}
}
4 changes: 3 additions & 1 deletion server/gql/team.graphql → server/gql/workspace.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ enum Role {
READER
# a role who can read and write project
WRITER
# a role who can maintain a project
MAINTAINER
# a eole who can have full controll of project
OWNER
}
Expand Down Expand Up @@ -103,4 +105,4 @@ extend type Mutation {
addMemberToTeam(input: AddMemberToTeamInput!): AddMemberToTeamPayload
removeMemberFromTeam(input: RemoveMemberFromTeamInput!): RemoveMemberFromTeamPayload
updateMemberOfTeam(input: UpdateMemberOfTeamInput!): UpdateMemberOfTeamPayload
}
}
5 changes: 4 additions & 1 deletion server/internal/adapter/gql/generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ func ToRole(r workspace.Role) Role {
return RoleReader
case workspace.RoleWriter:
return RoleWriter
case workspace.RoleMaintainer:
return RoleMaintainer
case workspace.RoleOwner:
return RoleOwner
}
Expand Down
10 changes: 6 additions & 4 deletions server/internal/adapter/gql/gqlmodel/models_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 12 additions & 9 deletions server/internal/app/auth_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,21 +115,24 @@ func generateOperator(ctx context.Context, cfg *ServerConfig, u *user.User) (*us

readableWorkspaces := workspaces.FilterByUserRole(uid, workspace.RoleReader).IDs()
writableWorkspaces := workspaces.FilterByUserRole(uid, workspace.RoleWriter).IDs()
maintainingWorkspaces := workspaces.FilterByUserRole(uid, workspace.RoleMaintainer).IDs()
owningWorkspaces := workspaces.FilterByUserRole(uid, workspace.RoleOwner).IDs()
defaultPolicy := util.CloneRef(cfg.Config.Policy.Default)

return &usecase.Operator{
AcOperator: &accountusecase.Operator{
User: &uid,
ReadableWorkspaces: readableWorkspaces,
WritableWorkspaces: writableWorkspaces,
OwningWorkspaces: owningWorkspaces,
DefaultPolicy: defaultPolicy,
User: &uid,
ReadableWorkspaces: readableWorkspaces,
WritableWorkspaces: writableWorkspaces,
MaintainableWorkspaces: maintainingWorkspaces,
OwningWorkspaces: owningWorkspaces,
DefaultPolicy: defaultPolicy,
},
ReadableScenes: scenes.FilterByWorkspace(readableWorkspaces...).IDs(),
WritableScenes: scenes.FilterByWorkspace(writableWorkspaces...).IDs(),
OwningScenes: scenes.FilterByWorkspace(owningWorkspaces...).IDs(),
DefaultPolicy: defaultPolicy,
ReadableScenes: scenes.FilterByWorkspace(readableWorkspaces...).IDs(),
WritableScenes: scenes.FilterByWorkspace(writableWorkspaces...).IDs(),
MaintainingScenes: scenes.FilterByWorkspace(maintainingWorkspaces...).IDs(),
OwningScenes: scenes.FilterByWorkspace(owningWorkspaces...).IDs(),
DefaultPolicy: defaultPolicy,
}, nil
}

Expand Down
44 changes: 32 additions & 12 deletions server/internal/usecase/operator.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,12 @@ import (
)

type Operator struct {
AcOperator *accountusecase.Operator
ReadableScenes scene.IDList
WritableScenes scene.IDList
OwningScenes scene.IDList
DefaultPolicy *policy.ID
AcOperator *accountusecase.Operator
ReadableScenes scene.IDList
WritableScenes scene.IDList
MaintainingScenes scene.IDList
OwningScenes scene.IDList
DefaultPolicy *policy.ID
}

func (o *Operator) Workspaces(r workspace.Role) accountdomain.WorkspaceIDList {
Expand All @@ -29,42 +30,57 @@ func (o *Operator) Workspaces(r workspace.Role) accountdomain.WorkspaceIDList {
if r == workspace.RoleWriter {
return o.AcOperator.WritableWorkspaces
}
if r == workspace.RoleMaintainer {
return o.AcOperator.MaintainableWorkspaces
}
if r == workspace.RoleOwner {
return o.AcOperator.OwningWorkspaces
}
return nil
}

func (o *Operator) AllReadableWorkspaces() user.WorkspaceIDList {
return append(o.AcOperator.ReadableWorkspaces, o.AllWritableWorkspaces()...)
return o.AcOperator.AllReadableWorkspaces()
}

func (o *Operator) AllWritableWorkspaces() user.WorkspaceIDList {
return append(o.AcOperator.WritableWorkspaces, o.AllOwningWorkspaces()...)
return o.AcOperator.AllWritableWorkspaces()
}

func (o *Operator) AllMaintainingWorkspace() user.WorkspaceIDList {
return o.AcOperator.AllMaintainingWorkspaces()
}

func (o *Operator) AllOwningWorkspaces() user.WorkspaceIDList {
return o.AcOperator.OwningWorkspaces
return o.AcOperator.AllOwningWorkspaces()
}

func (o *Operator) IsReadableWorkspace(ws ...accountdomain.WorkspaceID) bool {
return o.AllReadableWorkspaces().Intersect(ws).Len() > 0
return o.AcOperator.IsReadableWorkspace(ws...)
}

func (o *Operator) IsWritableWorkspace(ws ...accountdomain.WorkspaceID) bool {
return o.AllWritableWorkspaces().Intersect(ws).Len() > 0
return o.AcOperator.IsWritableWorkspace(ws...)
}

func (o *Operator) IsMaintainingWorkspace(ws ...accountdomain.WorkspaceID) bool {
return o.AcOperator.IsMaintainingWorkspace(ws...)
}

func (o *Operator) IsOwningWorkspace(ws ...accountdomain.WorkspaceID) bool {
return o.AllOwningWorkspaces().Intersect(ws).Len() > 0
return o.AcOperator.IsOwningWorkspace(ws...)
}

func (o *Operator) AllReadableScenes() scene.IDList {
return append(o.ReadableScenes, o.AllWritableScenes()...)
}

func (o *Operator) AllWritableScenes() scene.IDList {
return append(o.WritableScenes, o.AllOwningScenes()...)
return append(o.WritableScenes, o.AllMaintainingScenes()...)
}

func (o *Operator) AllMaintainingScenes() scene.IDList {
return append(o.MaintainingScenes, o.AllOwningScenes()...)
}

func (o *Operator) AllOwningScenes() scene.IDList {
Expand All @@ -79,6 +95,10 @@ func (o *Operator) IsWritableScene(scene ...id.SceneID) bool {
return o.AllWritableScenes().Has(scene...)
}

func (o *Operator) IsMaintainingScene(scene ...id.SceneID) bool {
return o.AllMaintainingScenes().Has(scene...)
}

func (o *Operator) IsOwningScene(scene ...id.SceneID) bool {
return o.AllOwningScenes().Has(scene...)
}
Expand Down
38 changes: 38 additions & 0 deletions web/codegen-classic.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// CLASSIC CONFIG

import { CodegenConfig } from "@graphql-codegen/cli";

const config: CodegenConfig = {
overwrite: true,
schema: "../server/gql/*.graphql",
documents: [
"src/classic/gql/fragments/*.ts",
"src/classic/gql/queries/*.ts",
"src/classic/**/*.graphql",
],
generates: {
"./src/classic/gql/graphql-client-api.tsx": {
plugins: ["typescript", "typescript-operations", "typescript-react-apollo"],
config: {
useTypeImports: true,
scalars: {
DateTime: "Date",
FileSize: "number",
ID: "string",
Cursor: "string",
URL: "string",
Lang: "string",
TranslatedString: "{ [lang in string]?: string } | null",
},
},
},
"./src/classic/gql/graphql.schema.json": {
plugins: ["introspection"],
},
"./src/classic/gql/fragmentMatcher.json": {
plugins: ["fragment-matcher"],
},
},
};

export default config;
41 changes: 0 additions & 41 deletions web/codegen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,44 +37,3 @@ const config: CodegenConfig = {
};

export default config;

// CLASSIC CONFIG

// import { CodegenConfig } from "@graphql-codegen/cli";

// const config: CodegenConfig = {
// overwrite: true,
// schema: "../server/gql/*.graphql",
// documents: [
// "src/classic/gql/fragments/*.ts",
// "src/classic/gql/queries/*.ts",
// "src/classic/**/*.graphql",
// ],
// generates: {
// "./src/classic/gql/graphql-client-api.tsx": {
// plugins: ["typescript", "typescript-operations", "typescript-react-apollo"],
// config: {
// useTypeImports: true,
// scalars: {
// DateTime: "Date",
// FileSize: "number",
// ID: "string",
// Cursor: "string",
// URL: "string",
// Lang: "string",
// TranslatedString: "{ [lang in string]?: string } | null",
// },
// },
// },
// "./src/classic/gql/graphql.schema.json": {
// plugins: ["introspection"],
// },
// "./src/classic/gql/fragmentMatcher.json": {
// plugins: ["fragment-matcher"],
// },
// },
// };

// export default config;

// CLASSIC CONFIG
4 changes: 3 additions & 1 deletion web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@
"format": "eslint --fix .",
"storybook": "storybook dev -p 9001",
"storybook:build": "storybook build --quiet -o dist/storybook",
"gql": "graphql-codegen",
"gql": "run-s gql:beta gql:classic",
"gql:beta": "graphql-codegen",
"gql:classic": "graphql-codegen -c codegen-classic.ts",
"i18n": "i18next",
"gen:doc:plugin": "ts-node -O '{\"module\":\"CommonJS\"}' ./bin/pluginDoc"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ const MemberListItem: React.FC<Props> = ({ user, role, owner, onChangeRole, onRe
const roles = [
{ key: "READER", label: t("Reader") },
{ key: "WRITER", label: t("Writer") },
{ key: "MAINTAINER", label: t("Maintainer") },
{ key: "OWNER", label: t("Owner") },
];

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,20 +29,17 @@ import {
EarthLayerCommonFragment,
EarthLayerItemFragment,
PropertySchemaGroupFragmentFragment,
PropertyGroupFragmentFragment,
PropertySchemaFieldFragmentFragment,
PropertyFieldFragmentFragment,
} from "@reearth/classic/gql";
import { valueFromGQL } from "@reearth/classic/util/value";

export type { Layer } from "@reearth/classic/components/molecules/Visualizer";
type PropertyGroupFragmentFragment = Extract<
PropertyItemFragmentFragment,
{ __typename?: "PropertyGroup" }
>;
type PropertySchemaFieldFragmentFragment = PropertySchemaGroupFragmentFragment["fields"][number];
type PropertyFieldFragmentFragment = PropertyGroupFragmentFragment["fields"][number];

// export type RawLayer =
// | (EarthLayerItemFragment & EarthLayerCommonFragment)
// | ({
// __typename: "LayerGroup";
// layers?: RawLayer[] | null | undefined;
// } & EarthLayerCommonFragment);
export type { Layer } from "@reearth/classic/components/molecules/Visualizer";

export type RawLayer = EarthLayerCommonFragment &
(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,7 @@ export default (params: Params) => {
role: {
READER: Role.Reader,
WRITER: Role.Writer,
MAINTAINER: Role.Maintainer,
OWNER: Role.Owner,
}[role],
},
Expand Down
7 changes: 7 additions & 0 deletions web/src/classic/gql/fragmentMatcher.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@
"LayerTagGroup",
"LayerTagItem"
],
"NLSLayer": [
"NLSLayerGroup",
"NLSLayerSimple"
],
"Node": [
"Asset",
"Dataset",
Expand All @@ -16,6 +20,9 @@
"Project",
"Property",
"Scene",
"Story",
"StoryBlock",
"StoryPage",
"Team",
"User"
],
Expand Down
Loading

0 comments on commit 20b086c

Please sign in to comment.