mirror of
https://github.com/usememos/memos.git
synced 2025-06-05 22:09:59 +02:00
chore: implement create resource
This commit is contained in:
@ -48,7 +48,7 @@ func (s *APIV2Service) SetMemoResources(ctx context.Context, request *apiv2pb.Se
|
|||||||
MemoID: &request.Id,
|
MemoID: &request.Id,
|
||||||
UpdatedTs: &updatedTs,
|
UpdatedTs: &updatedTs,
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
return nil, status.Errorf(codes.Internal, "failed to update resource")
|
return nil, status.Errorf(codes.Internal, "failed to update resource: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@ package v2
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"net/url"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
@ -12,6 +13,40 @@ import (
|
|||||||
"github.com/usememos/memos/store"
|
"github.com/usememos/memos/store"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func (s *APIV2Service) CreateResource(ctx context.Context, request *apiv2pb.CreateResourceRequest) (*apiv2pb.CreateResourceResponse, error) {
|
||||||
|
user, err := getCurrentUser(ctx, s.Store)
|
||||||
|
if err != nil {
|
||||||
|
return nil, status.Errorf(codes.Internal, "failed to get current user: %v", err)
|
||||||
|
}
|
||||||
|
if request.ExternalLink != "" {
|
||||||
|
// Only allow those external links scheme with http/https
|
||||||
|
linkURL, err := url.Parse(request.ExternalLink)
|
||||||
|
if err != nil {
|
||||||
|
return nil, status.Errorf(codes.InvalidArgument, "invalid external link: %v", err)
|
||||||
|
}
|
||||||
|
if linkURL.Scheme != "http" && linkURL.Scheme != "https" {
|
||||||
|
return nil, status.Errorf(codes.InvalidArgument, "invalid external link scheme: %v", linkURL.Scheme)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
create := &store.Resource{
|
||||||
|
CreatorID: user.ID,
|
||||||
|
Filename: request.Filename,
|
||||||
|
ExternalLink: request.ExternalLink,
|
||||||
|
Type: request.Type,
|
||||||
|
}
|
||||||
|
if request.MemoId != nil {
|
||||||
|
create.MemoID = request.MemoId
|
||||||
|
}
|
||||||
|
resource, err := s.Store.CreateResource(ctx, create)
|
||||||
|
if err != nil {
|
||||||
|
return nil, status.Errorf(codes.Internal, "failed to create resource: %v", err)
|
||||||
|
}
|
||||||
|
return &apiv2pb.CreateResourceResponse{
|
||||||
|
Resource: s.convertResourceFromStore(ctx, resource),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (s *APIV2Service) ListResources(ctx context.Context, _ *apiv2pb.ListResourcesRequest) (*apiv2pb.ListResourcesResponse, error) {
|
func (s *APIV2Service) ListResources(ctx context.Context, _ *apiv2pb.ListResourcesRequest) (*apiv2pb.ListResourcesResponse, error) {
|
||||||
user, err := getCurrentUser(ctx, s.Store)
|
user, err := getCurrentUser(ctx, s.Store)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -44,10 +44,6 @@ export function signout() {
|
|||||||
return axios.post("/api/v1/auth/signout");
|
return axios.post("/api/v1/auth/signout");
|
||||||
}
|
}
|
||||||
|
|
||||||
export function createResource(resourceCreate: ResourceCreate) {
|
|
||||||
return axios.post<Resource>("/api/v1/resource", resourceCreate);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function createResourceWithBlob(formData: FormData) {
|
export function createResourceWithBlob(formData: FormData) {
|
||||||
return axios.post<Resource>("/api/v1/resource/blob", formData);
|
return axios.post<Resource>("/api/v1/resource/blob", formData);
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { resourceServiceClient } from "@/grpcweb";
|
import { resourceServiceClient } from "@/grpcweb";
|
||||||
import * as api from "@/helpers/api";
|
import * as api from "@/helpers/api";
|
||||||
import { Resource, UpdateResourceRequest } from "@/types/proto/api/v2/resource_service";
|
import { CreateResourceRequest, Resource, UpdateResourceRequest } from "@/types/proto/api/v2/resource_service";
|
||||||
import { useTranslate } from "@/utils/i18n";
|
import { useTranslate } from "@/utils/i18n";
|
||||||
import store, { useAppSelector } from "../";
|
import store, { useAppSelector } from "../";
|
||||||
import { patchResource, setResources } from "../reducer/resource";
|
import { patchResource, setResources } from "../reducer/resource";
|
||||||
@ -17,8 +17,11 @@ export const useResourceStore = () => {
|
|||||||
getState: () => {
|
getState: () => {
|
||||||
return store.getState().resource;
|
return store.getState().resource;
|
||||||
},
|
},
|
||||||
async createResource(resourceCreate: ResourceCreate): Promise<Resource> {
|
async createResource(create: CreateResourceRequest): Promise<Resource> {
|
||||||
const { data: resource } = await api.createResource(resourceCreate);
|
const { resource } = await resourceServiceClient.createResource(create);
|
||||||
|
if (!resource) {
|
||||||
|
throw new Error("resource is null");
|
||||||
|
}
|
||||||
const resourceList = state.resources;
|
const resourceList = state.resources;
|
||||||
store.dispatch(setResources([resource, ...resourceList]));
|
store.dispatch(setResources([resource, ...resourceList]));
|
||||||
return resource;
|
return resource;
|
||||||
@ -36,8 +39,8 @@ export const useResourceStore = () => {
|
|||||||
store.dispatch(setResources([resource, ...resourceList]));
|
store.dispatch(setResources([resource, ...resourceList]));
|
||||||
return resource;
|
return resource;
|
||||||
},
|
},
|
||||||
async updateResource(request: UpdateResourceRequest): Promise<Resource> {
|
async updateResource(update: UpdateResourceRequest): Promise<Resource> {
|
||||||
const { resource } = await resourceServiceClient.updateResource(request);
|
const { resource } = await resourceServiceClient.updateResource(update);
|
||||||
if (!resource) {
|
if (!resource) {
|
||||||
throw new Error("resource is null");
|
throw new Error("resource is null");
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user