Commit 21f18f7c authored by Steven's avatar Steven

chore: tweak activity service definition

parent cc91b1e5
......@@ -19,28 +19,6 @@ consumes:
produces:
- application/json
paths:
/api/v1/activities/{id}:
get:
summary: GetActivity returns the activity with the given id.
operationId: ActivityService_GetActivity
responses:
"200":
description: A successful response.
schema:
$ref: '#/definitions/v1Activity'
default:
description: An unexpected error response.
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: id
description: The system-generated unique identifier for the activity.
in: path
required: true
type: integer
format: int32
tags:
- ActivityService
/api/v1/auth/signin:
post:
summary: SignIn signs in the user with the given username and password.
......@@ -925,13 +903,13 @@ paths:
- MemoService
/api/v1/{name_1}:
get:
summary: GetIdentityProvider gets an identity provider.
operationId: IdentityProviderService_GetIdentityProvider
summary: GetUser gets a user by name.
operationId: UserService_GetUser
responses:
"200":
description: A successful response.
schema:
$ref: '#/definitions/apiv1IdentityProvider'
$ref: '#/definitions/v1User'
default:
description: An unexpected error response.
schema:
......@@ -939,14 +917,14 @@ paths:
parameters:
- name: name_1
description: |-
The name of the identityProvider to get.
Format: identityProviders/{id}
The name of the user.
Format: users/{id}
in: path
required: true
type: string
pattern: identityProviders/[^/]+
pattern: users/[^/]+
tags:
- IdentityProviderService
- UserService
delete:
summary: DeleteIdentityProvider deletes an identity provider.
operationId: IdentityProviderService_DeleteIdentityProvider
......@@ -973,13 +951,13 @@ paths:
- IdentityProviderService
/api/v1/{name_2}:
get:
summary: GetResource returns a resource by name.
operationId: ResourceService_GetResource
summary: GetIdentityProvider gets an identity provider.
operationId: IdentityProviderService_GetIdentityProvider
responses:
"200":
description: A successful response.
schema:
$ref: '#/definitions/v1Resource'
$ref: '#/definitions/apiv1IdentityProvider'
default:
description: An unexpected error response.
schema:
......@@ -987,15 +965,14 @@ paths:
parameters:
- name: name_2
description: |-
The name of the resource.
Format: resources/{id}
id is the system generated unique identifier.
The name of the identityProvider to get.
Format: identityProviders/{id}
in: path
required: true
type: string
pattern: resources/[^/]+
pattern: identityProviders/[^/]+
tags:
- ResourceService
- IdentityProviderService
delete:
summary: DeleteInbox deletes an inbox.
operationId: InboxService_DeleteInbox
......@@ -1022,13 +999,13 @@ paths:
- InboxService
/api/v1/{name_3}:
get:
summary: GetMemo gets a memo.
operationId: MemoService_GetMemo
summary: GetResource returns a resource by name.
operationId: ResourceService_GetResource
responses:
"200":
description: A successful response.
schema:
$ref: '#/definitions/v1Memo'
$ref: '#/definitions/v1Resource'
default:
description: An unexpected error response.
schema:
......@@ -1036,14 +1013,15 @@ paths:
parameters:
- name: name_3
description: |-
The name of the memo.
Format: memos/{id}
The name of the resource.
Format: resources/{id}
id is the system generated unique identifier.
in: path
required: true
type: string
pattern: memos/[^/]+
pattern: resources/[^/]+
tags:
- MemoService
- ResourceService
delete:
summary: DeleteResource deletes a resource by name.
operationId: ResourceService_DeleteResource
......@@ -1070,6 +1048,29 @@ paths:
tags:
- ResourceService
/api/v1/{name_4}:
get:
summary: GetMemo gets a memo.
operationId: MemoService_GetMemo
responses:
"200":
description: A successful response.
schema:
$ref: '#/definitions/v1Memo'
default:
description: An unexpected error response.
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name_4
description: |-
The name of the memo.
Format: memos/{id}
in: path
required: true
type: string
pattern: memos/[^/]+
tags:
- MemoService
delete:
summary: DeleteMemo deletes a memo.
operationId: MemoService_DeleteMemo
......@@ -1096,13 +1097,13 @@ paths:
- MemoService
/api/v1/{name}:
get:
summary: GetUser gets a user by name.
operationId: UserService_GetUser
summary: GetActivity returns the activity with the given id.
operationId: ActivityService_GetActivity
responses:
"200":
description: A successful response.
schema:
$ref: '#/definitions/v1User'
$ref: '#/definitions/v1Activity'
default:
description: An unexpected error response.
schema:
......@@ -1110,14 +1111,14 @@ paths:
parameters:
- name: name
description: |-
The name of the user.
Format: users/{id}
The name of the activity.
Format: activities/{id}
in: path
required: true
type: string
pattern: users/[^/]+
pattern: activities/[^/]+
tags:
- UserService
- ActivityService
delete:
summary: DeleteUser deletes a user.
operationId: UserService_DeleteUser
......@@ -2277,14 +2278,15 @@ definitions:
v1Activity:
type: object
properties:
id:
type: integer
format: int32
description: The system-generated unique identifier for the activity.
name:
type: string
title: |-
The name of the activity.
Format: activities/{id}
creatorId:
type: integer
format: int32
description: The system-generated unique identifier for the user who created the activity.
description: The uid of the user who created the activity.
type:
type: string
description: The type of the activity.
......
......@@ -12,15 +12,16 @@ option go_package = "gen/api/v1";
service ActivityService {
// GetActivity returns the activity with the given id.
rpc GetActivity(GetActivityRequest) returns (Activity) {
option (google.api.http) = {get: "/api/v1/activities/{id}"};
option (google.api.method_signature) = "id";
option (google.api.http) = {get: "/api/v1/{name=activities/*}"};
option (google.api.method_signature) = "name";
}
}
message Activity {
// The system-generated unique identifier for the activity.
int32 id = 1;
// The system-generated unique identifier for the user who created the activity.
// The name of the activity.
// Format: activities/{id}
string name = 1;
// The uid of the user who created the activity.
int32 creator_id = 2;
// The type of the activity.
string type = 3;
......@@ -32,6 +33,11 @@ message Activity {
ActivityPayload payload = 6;
}
message ActivityPayload {
ActivityMemoCommentPayload memo_comment = 1;
ActivityVersionUpdatePayload version_update = 2;
}
// ActivityMemoCommentPayload represents the payload of a memo comment activity.
message ActivityMemoCommentPayload {
// The memo id of comment.
......@@ -45,12 +51,8 @@ message ActivityVersionUpdatePayload {
string version = 1;
}
message ActivityPayload {
ActivityMemoCommentPayload memo_comment = 1;
ActivityVersionUpdatePayload version_update = 2;
}
message GetActivityRequest {
// The system-generated unique identifier for the activity.
int32 id = 1;
// The name of the activity.
// Format: activities/{id}
string name = 1;
}
This diff is collapsed.
......@@ -42,14 +42,14 @@ func request_ActivityService_GetActivity_0(ctx context.Context, marshaler runtim
_ = err
)
val, ok = pathParams["id"]
val, ok = pathParams["name"]
if !ok {
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id")
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name")
}
protoReq.Id, err = runtime.Int32(val)
protoReq.Name, err = runtime.String(val)
if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err)
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err)
}
msg, err := client.GetActivity(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
......@@ -68,14 +68,14 @@ func local_request_ActivityService_GetActivity_0(ctx context.Context, marshaler
_ = err
)
val, ok = pathParams["id"]
val, ok = pathParams["name"]
if !ok {
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id")
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name")
}
protoReq.Id, err = runtime.Int32(val)
protoReq.Name, err = runtime.String(val)
if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err)
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err)
}
msg, err := server.GetActivity(ctx, &protoReq)
......@@ -98,7 +98,7 @@ func RegisterActivityServiceHandlerServer(ctx context.Context, mux *runtime.Serv
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
var err error
var annotatedContext context.Context
annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/memos.api.v1.ActivityService/GetActivity", runtime.WithHTTPPathPattern("/api/v1/activities/{id}"))
annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/memos.api.v1.ActivityService/GetActivity", runtime.WithHTTPPathPattern("/api/v1/{name=activities/*}"))
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
......@@ -162,7 +162,7 @@ func RegisterActivityServiceHandlerClient(ctx context.Context, mux *runtime.Serv
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
var err error
var annotatedContext context.Context
annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/memos.api.v1.ActivityService/GetActivity", runtime.WithHTTPPathPattern("/api/v1/activities/{id}"))
annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/memos.api.v1.ActivityService/GetActivity", runtime.WithHTTPPathPattern("/api/v1/{name=activities/*}"))
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
......@@ -182,7 +182,7 @@ func RegisterActivityServiceHandlerClient(ctx context.Context, mux *runtime.Serv
}
var (
pattern_ActivityService_GetActivity_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "activities", "id"}, ""))
pattern_ActivityService_GetActivity_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 2, 5, 3}, []string{"api", "v1", "activities", "name"}, ""))
)
var (
......
......@@ -2,6 +2,7 @@ package v1
import (
"context"
"fmt"
"time"
"google.golang.org/grpc/codes"
......@@ -14,8 +15,12 @@ import (
)
func (s *APIV1Service) GetActivity(ctx context.Context, request *v1pb.GetActivityRequest) (*v1pb.Activity, error) {
activityID, err := ExtractActivityIDFromName(request.Name)
if err != nil {
return nil, status.Errorf(codes.InvalidArgument, "invalid activity name: %v", err)
}
activity, err := s.Store.GetActivity(ctx, &store.FindActivity{
ID: &request.Id,
ID: &activityID,
})
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to get activity: %v", err)
......@@ -30,7 +35,7 @@ func (s *APIV1Service) GetActivity(ctx context.Context, request *v1pb.GetActivit
func (*APIV1Service) convertActivityFromStore(_ context.Context, activity *store.Activity) (*v1pb.Activity, error) {
return &v1pb.Activity{
Id: activity.ID,
Name: fmt.Sprintf("%s%d", ActivityNamePrefix, activity.ID),
CreatorId: activity.CreatorID,
Type: activity.Type.String(),
Level: activity.Level.String(),
......
......@@ -17,6 +17,7 @@ const (
InboxNamePrefix = "inboxes/"
StorageNamePrefix = "storages/"
IdentityProviderNamePrefix = "identityProviders/"
ActivityNamePrefix = "activities/"
)
// GetNameParentTokens returns the tokens from a resource name.
......@@ -123,3 +124,15 @@ func ExtractIdentityProviderIDFromName(name string) (int32, error) {
}
return id, nil
}
func ExtractActivityIDFromName(name string) (int32, error) {
tokens, err := GetNameParentTokens(name, ActivityNamePrefix)
if err != nil {
return 0, err
}
id, err := util.ConvertStringToInt32(tokens[0])
if err != nil {
return 0, errors.Errorf("invalid activity ID %q", tokens[0])
}
return id, nil
}
......@@ -4,7 +4,7 @@ import { useEffect, useState } from "react";
import toast from "react-hot-toast";
import { activityServiceClient } from "@/grpcweb";
import useNavigateTo from "@/hooks/useNavigateTo";
import { MemoNamePrefix, useInboxStore, useMemoStore, useUserStore } from "@/store/v1";
import { activityNamePrefix, MemoNamePrefix, useInboxStore, useMemoStore, useUserStore } from "@/store/v1";
import { Inbox, Inbox_Status } from "@/types/proto/api/v1/inbox_service";
import { Memo } from "@/types/proto/api/v1/memo_service";
import { User } from "@/types/proto/api/v1/user_service";
......@@ -31,7 +31,7 @@ const MemoCommentMessage = ({ inbox }: Props) => {
(async () => {
const activity = await activityServiceClient.getActivity({
id: inbox.activityId,
name: `${activityNamePrefix}${inbox.activityId}`,
});
if (activity.payload?.memoComment) {
const memoCommentPayload = activity.payload.memoComment;
......
......@@ -3,7 +3,7 @@ import clsx from "clsx";
import { useEffect, useState } from "react";
import toast from "react-hot-toast";
import { activityServiceClient } from "@/grpcweb";
import { useInboxStore } from "@/store/v1";
import { activityNamePrefix, useInboxStore } from "@/store/v1";
import { Activity } from "@/types/proto/api/v1/activity_service";
import { Inbox, Inbox_Status } from "@/types/proto/api/v1/inbox_service";
import { useTranslate } from "@/utils/i18n";
......@@ -25,7 +25,7 @@ const VersionUpdateMessage = ({ inbox }: Props) => {
(async () => {
const activity = await activityServiceClient.getActivity({
id: inbox.activityId,
name: `${activityNamePrefix}${inbox.activityId}`,
});
setActivity(activity);
})();
......
import { Button, Input, Switch } from "@mui/joy";
import { isEqual } from "lodash-es";
import { useState } from "react";
import { WorkspaceSettingPrefix, useWorkspaceSettingStore } from "@/store/v1";
import { workspaceSettingNamePrefix, useWorkspaceSettingStore } from "@/store/v1";
import { WorkspaceMemoRelatedSetting } from "@/types/proto/api/v1/workspace_setting_service";
import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting";
import { useTranslate } from "@/utils/i18n";
......@@ -24,7 +24,7 @@ const MemoRelatedSettings = () => {
const updateSetting = async () => {
await workspaceSettingStore.setWorkspaceSetting({
name: `${WorkspaceSettingPrefix}${WorkspaceSettingKey.MEMO_RELATED}`,
name: `${workspaceSettingNamePrefix}${WorkspaceSettingKey.MEMO_RELATED}`,
memoRelatedSetting,
});
};
......
......@@ -3,7 +3,7 @@ import { isEqual } from "lodash-es";
import { useMemo, useState } from "react";
import { toast } from "react-hot-toast";
import { Link } from "react-router-dom";
import { WorkspaceSettingPrefix, useWorkspaceSettingStore } from "@/store/v1";
import { workspaceSettingNamePrefix, useWorkspaceSettingStore } from "@/store/v1";
import {
WorkspaceStorageSetting,
WorkspaceStorageSetting_S3Config,
......@@ -107,7 +107,7 @@ const StorageSection = () => {
const saveWorkspaceStorageSetting = async () => {
await workspaceSettingStore.setWorkspaceSetting({
name: `${WorkspaceSettingPrefix}${WorkspaceSettingKey.STORAGE}`,
name: `${workspaceSettingNamePrefix}${WorkspaceSettingKey.STORAGE}`,
storageSetting: workspaceStorageSetting,
});
toast.success("Updated");
......
......@@ -3,7 +3,7 @@ import { useState } from "react";
import { toast } from "react-hot-toast";
import { Link } from "react-router-dom";
import { workspaceSettingServiceClient } from "@/grpcweb";
import { WorkspaceSettingPrefix, useWorkspaceSettingStore } from "@/store/v1";
import { workspaceSettingNamePrefix, useWorkspaceSettingStore } from "@/store/v1";
import { WorkspaceGeneralSetting } from "@/types/proto/api/v1/workspace_setting_service";
import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting";
import { useTranslate } from "@/utils/i18n";
......@@ -29,7 +29,7 @@ const WorkspaceSection = () => {
try {
await workspaceSettingServiceClient.setWorkspaceSetting({
setting: {
name: `${WorkspaceSettingPrefix}${WorkspaceSettingKey.GENERAL}`,
name: `${workspaceSettingNamePrefix}${WorkspaceSettingKey.GENERAL}`,
generalSetting: workspaceGeneralSetting,
},
});
......@@ -49,7 +49,7 @@ const WorkspaceSection = () => {
try {
await workspaceSettingServiceClient.setWorkspaceSetting({
setting: {
name: `${WorkspaceSettingPrefix}${WorkspaceSettingKey.GENERAL}`,
name: `${workspaceSettingNamePrefix}${WorkspaceSettingKey.GENERAL}`,
generalSetting: workspaceGeneralSetting,
},
});
......
......@@ -4,7 +4,7 @@ import { useState } from "react";
import { toast } from "react-hot-toast";
import { convertFileToBase64 } from "@/helpers/utils";
import useCurrentUser from "@/hooks/useCurrentUser";
import { UserNamePrefix, useUserStore } from "@/store/v1";
import { userNamePrefix, useUserStore } from "@/store/v1";
import { User as UserPb } from "@/types/proto/api/v1/user_service";
import { useTranslate } from "@/utils/i18n";
import { generateDialog } from "./Dialog";
......@@ -104,7 +104,7 @@ const UpdateAccountDialog: React.FC<Props> = ({ destroy }: Props) => {
try {
const updateMask = [];
if (!isEqual(currentUser.name.replace(UserNamePrefix, ""), state.username)) {
if (!isEqual(currentUser.name.replace(userNamePrefix, ""), state.username)) {
updateMask.push("username");
}
if (!isEqual(currentUser.nickname, state.nickname)) {
......
......@@ -2,7 +2,7 @@ import { Button, IconButton, Input } from "@mui/joy";
import Textarea from "@mui/joy/Textarea/Textarea";
import { useState } from "react";
import { toast } from "react-hot-toast";
import { WorkspaceSettingPrefix, useWorkspaceSettingStore } from "@/store/v1";
import { workspaceSettingNamePrefix, useWorkspaceSettingStore } from "@/store/v1";
import { WorkspaceCustomProfile, WorkspaceGeneralSetting } from "@/types/proto/api/v1/workspace_setting_service";
import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting";
import { useTranslate } from "@/utils/i18n";
......@@ -84,7 +84,7 @@ const UpdateCustomizedProfileDialog: React.FC<Props> = ({ destroy }: Props) => {
try {
await workspaceSettingStore.setWorkspaceSetting({
name: `${WorkspaceSettingPrefix}${WorkspaceSettingKey.GENERAL}`,
name: `${workspaceSettingNamePrefix}${WorkspaceSettingKey.GENERAL}`,
generalSetting: {
...workspaceGeneralSetting,
customProfile: customProfile,
......
export const WorkspaceSettingPrefix = "settings/";
export const UserNamePrefix = "users/";
export const workspaceSettingNamePrefix = "settings/";
export const userNamePrefix = "users/";
export const MemoNamePrefix = "memos/";
export const IdentityProviderNamePrefix = "identityProviders/";
export const identityProviderNamePrefix = "identityProviders/";
export const activityNamePrefix = "activities/";
export const extractMemoIdFromName = (name: string) => {
return parseInt(name.split(MemoNamePrefix).pop() || "", 10);
};
export const extractIdentityProviderIdFromName = (name: string) => {
return parseInt(name.split(IdentityProviderNamePrefix).pop() || "", 10);
return parseInt(name.split(identityProviderNamePrefix).pop() || "", 10);
};
......@@ -3,7 +3,7 @@ import { combine } from "zustand/middleware";
import { workspaceSettingServiceClient } from "@/grpcweb";
import { WorkspaceSetting } from "@/types/proto/api/v1/workspace_setting_service";
import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting";
import { WorkspaceSettingPrefix } from "./resourceName";
import { workspaceSettingNamePrefix } from "./resourceName";
interface State {
workspaceSettingByName: Record<string, WorkspaceSetting>;
......@@ -19,11 +19,11 @@ export const useWorkspaceSettingStore = create(
return get();
},
fetchWorkspaceSetting: async (key: WorkspaceSettingKey) => {
const setting = await workspaceSettingServiceClient.getWorkspaceSetting({ name: `${WorkspaceSettingPrefix}${key}` });
const setting = await workspaceSettingServiceClient.getWorkspaceSetting({ name: `${workspaceSettingNamePrefix}${key}` });
set({ workspaceSettingByName: { ...get().workspaceSettingByName, [setting.name]: setting } });
},
getWorkspaceSettingByKey: (key: WorkspaceSettingKey): WorkspaceSetting => {
return get().workspaceSettingByName[`${WorkspaceSettingPrefix}${key}`] || WorkspaceSetting.fromPartial({});
return get().workspaceSettingByName[`${workspaceSettingNamePrefix}${key}`] || WorkspaceSetting.fromPartial({});
},
setWorkspaceSetting: async (setting: WorkspaceSetting) => {
await workspaceSettingServiceClient.setWorkspaceSetting({ setting });
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment