mirror of
https://github.com/usememos/memos.git
synced 2025-06-05 22:09:59 +02:00
fix: resource api
This commit is contained in:
@ -23,9 +23,6 @@ RUN go build \
|
|||||||
FROM alpine:3.14.3 AS monolithic
|
FROM alpine:3.14.3 AS monolithic
|
||||||
WORKDIR /usr/local/memos
|
WORKDIR /usr/local/memos
|
||||||
|
|
||||||
# RUN apk add --no-cache tzdata
|
|
||||||
# ENV TZ="Asia/Shanghai"
|
|
||||||
|
|
||||||
COPY --from=backend /backend-build/memos /usr/local/memos/
|
COPY --from=backend /backend-build/memos /usr/local/memos/
|
||||||
COPY --from=frontend /frontend-build/dist /usr/local/memos/web/dist
|
COPY --from=frontend /frontend-build/dist /usr/local/memos/web/dist
|
||||||
|
|
||||||
|
@ -84,6 +84,8 @@ func (m *Main) Run() error {
|
|||||||
s.ShortcutService = store.NewShortcutService(db)
|
s.ShortcutService = store.NewShortcutService(db)
|
||||||
s.MemoService = store.NewMemoService(db)
|
s.MemoService = store.NewMemoService(db)
|
||||||
s.UserService = store.NewUserService(db)
|
s.UserService = store.NewUserService(db)
|
||||||
|
s.ShortcutService = store.NewShortcutService(db)
|
||||||
|
s.ResourceService = store.NewResourceService(db)
|
||||||
|
|
||||||
m.server = s
|
m.server = s
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ func getUserIdContextKey() string {
|
|||||||
func setUserSession(c echo.Context, user *api.User) error {
|
func setUserSession(c echo.Context, user *api.User) error {
|
||||||
sess, err := session.Get("session", c)
|
sess, err := session.Get("session", c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to get session")
|
return fmt.Errorf("failed to get session, err: %w", err)
|
||||||
}
|
}
|
||||||
sess.Options = &sessions.Options{
|
sess.Options = &sessions.Options{
|
||||||
Path: "/",
|
Path: "/",
|
||||||
@ -34,7 +34,7 @@ func setUserSession(c echo.Context, user *api.User) error {
|
|||||||
sess.Values[userIdContextKey] = user.Id
|
sess.Values[userIdContextKey] = user.Id
|
||||||
err = sess.Save(c.Request(), c.Response())
|
err = sess.Save(c.Request(), c.Response())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to set session")
|
return fmt.Errorf("failed to set session, err: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@ -43,7 +43,7 @@ func setUserSession(c echo.Context, user *api.User) error {
|
|||||||
func removeUserSession(c echo.Context) error {
|
func removeUserSession(c echo.Context) error {
|
||||||
sess, err := session.Get("session", c)
|
sess, err := session.Get("session", c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to get session")
|
return fmt.Errorf("failed to get session, err: %w", err)
|
||||||
}
|
}
|
||||||
sess.Options = &sessions.Options{
|
sess.Options = &sessions.Options{
|
||||||
Path: "/",
|
Path: "/",
|
||||||
@ -53,14 +53,14 @@ func removeUserSession(c echo.Context) error {
|
|||||||
sess.Values[userIdContextKey] = nil
|
sess.Values[userIdContextKey] = nil
|
||||||
err = sess.Save(c.Request(), c.Response())
|
err = sess.Save(c.Request(), c.Response())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to set session")
|
return fmt.Errorf("failed to set session, err: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use session instead of jwt in the initial version
|
// Use session instead of jwt in the initial version
|
||||||
func JWTMiddleware(us api.UserService, next echo.HandlerFunc) echo.HandlerFunc {
|
func BasicAuthMiddleware(us api.UserService, next echo.HandlerFunc) echo.HandlerFunc {
|
||||||
return func(c echo.Context) error {
|
return func(c echo.Context) error {
|
||||||
// Skips auth
|
// Skips auth
|
||||||
if common.HasPrefixes(c.Path(), "/api/auth") {
|
if common.HasPrefixes(c.Path(), "/api/auth") {
|
||||||
@ -69,7 +69,7 @@ func JWTMiddleware(us api.UserService, next echo.HandlerFunc) echo.HandlerFunc {
|
|||||||
|
|
||||||
sess, err := session.Get("session", c)
|
sess, err := session.Get("session", c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return echo.NewHTTPError(http.StatusUnauthorized, "Missing session")
|
return echo.NewHTTPError(http.StatusUnauthorized, "Missing session").SetInternal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
userIdValue := sess.Values[userIdContextKey]
|
userIdValue := sess.Values[userIdContextKey]
|
@ -30,20 +30,20 @@ func (s *Server) registerResourceRoutes(g *echo.Group) {
|
|||||||
size := file.Size
|
size := file.Size
|
||||||
src, err := file.Open()
|
src, err := file.Open()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return echo.NewHTTPError(http.StatusBadRequest, "Failed to open file").SetInternal(err)
|
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to open file").SetInternal(err)
|
||||||
}
|
}
|
||||||
defer src.Close()
|
defer src.Close()
|
||||||
|
|
||||||
blob, err := ioutil.ReadAll(src)
|
fileBytes, err := ioutil.ReadAll(src)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return echo.NewHTTPError(http.StatusBadRequest, "Failed to read file").SetInternal(err)
|
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to read file").SetInternal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
resourceCreate := &api.ResourceCreate{
|
resourceCreate := &api.ResourceCreate{
|
||||||
Filename: filename,
|
Filename: filename,
|
||||||
Type: filetype,
|
Type: filetype,
|
||||||
Size: size,
|
Size: size,
|
||||||
Blob: blob,
|
Blob: fileBytes,
|
||||||
CreatorId: userId,
|
CreatorId: userId,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ package server
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"memos/api"
|
"memos/api"
|
||||||
"memos/common"
|
"time"
|
||||||
|
|
||||||
"github.com/gorilla/sessions"
|
"github.com/gorilla/sessions"
|
||||||
"github.com/labstack/echo-contrib/session"
|
"github.com/labstack/echo-contrib/session"
|
||||||
@ -28,6 +28,16 @@ func NewServer() *Server {
|
|||||||
e.HideBanner = true
|
e.HideBanner = true
|
||||||
e.HidePort = false
|
e.HidePort = false
|
||||||
|
|
||||||
|
e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{
|
||||||
|
Format: "${method} ${uri} ${status}\n",
|
||||||
|
}))
|
||||||
|
|
||||||
|
e.Use(middleware.TimeoutWithConfig(middleware.TimeoutConfig{
|
||||||
|
Skipper: middleware.DefaultSkipper,
|
||||||
|
ErrorMessage: "Request timeout",
|
||||||
|
Timeout: 30 * time.Second,
|
||||||
|
}))
|
||||||
|
|
||||||
e.Use(middleware.StaticWithConfig(middleware.StaticConfig{
|
e.Use(middleware.StaticWithConfig(middleware.StaticConfig{
|
||||||
Skipper: middleware.DefaultSkipper,
|
Skipper: middleware.DefaultSkipper,
|
||||||
Root: "web/dist",
|
Root: "web/dist",
|
||||||
@ -35,7 +45,7 @@ func NewServer() *Server {
|
|||||||
HTML5: true,
|
HTML5: true,
|
||||||
}))
|
}))
|
||||||
|
|
||||||
e.Use(session.Middleware(sessions.NewCookieStore([]byte(common.GenUUID()))))
|
e.Use(session.Middleware(sessions.NewCookieStore([]byte("just_memos"))))
|
||||||
|
|
||||||
s := &Server{
|
s := &Server{
|
||||||
e: e,
|
e: e,
|
||||||
@ -47,7 +57,7 @@ func NewServer() *Server {
|
|||||||
|
|
||||||
apiGroup := e.Group("/api")
|
apiGroup := e.Group("/api")
|
||||||
apiGroup.Use(func(next echo.HandlerFunc) echo.HandlerFunc {
|
apiGroup.Use(func(next echo.HandlerFunc) echo.HandlerFunc {
|
||||||
return JWTMiddleware(s.UserService, next)
|
return BasicAuthMiddleware(s.UserService, next)
|
||||||
})
|
})
|
||||||
s.registerAuthRoutes(apiGroup)
|
s.registerAuthRoutes(apiGroup)
|
||||||
s.registerUserRoutes(apiGroup)
|
s.registerUserRoutes(apiGroup)
|
||||||
|
@ -11,7 +11,13 @@ import (
|
|||||||
|
|
||||||
func (s *Server) registerUserRoutes(g *echo.Group) {
|
func (s *Server) registerUserRoutes(g *echo.Group) {
|
||||||
g.GET("/user/me", func(c echo.Context) error {
|
g.GET("/user/me", func(c echo.Context) error {
|
||||||
userId := c.Get(getUserIdContextKey()).(int)
|
// /api/user/me is used to check if the user is logged in,
|
||||||
|
userSessionId := c.Get(getUserIdContextKey())
|
||||||
|
if userSessionId == nil {
|
||||||
|
return echo.NewHTTPError(http.StatusUnauthorized, "Missing session")
|
||||||
|
}
|
||||||
|
|
||||||
|
userId := userSessionId.(int)
|
||||||
userFind := &api.UserFind{
|
userFind := &api.UserFind{
|
||||||
Id: &userId,
|
Id: &userId,
|
||||||
}
|
}
|
||||||
|
@ -47,7 +47,7 @@ func (s *Server) registerWebhookRoutes(g *echo.Group) {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
g.GET("r/:resourceId/:filename", func(c echo.Context) error {
|
g.GET("/r/:resourceId/:filename", func(c echo.Context) error {
|
||||||
resourceId, err := strconv.Atoi(c.Param("resourceId"))
|
resourceId, err := strconv.Atoi(c.Param("resourceId"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("ID is not a number: %s", c.Param("resourceId"))).SetInternal(err)
|
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("ID is not a number: %s", c.Param("resourceId"))).SetInternal(err)
|
||||||
|
@ -24,7 +24,7 @@ func (s *ResourceService) CreateResource(create *api.ResourceCreate) (*api.Resou
|
|||||||
return resource, nil
|
return resource, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *ResourceService) FindResouceList(find *api.ResourceFind) ([]*api.Resource, error) {
|
func (s *ResourceService) FindResourceList(find *api.ResourceFind) ([]*api.Resource, error) {
|
||||||
list, err := findResourceList(s.db, find)
|
list, err := findResourceList(s.db, find)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -33,6 +33,19 @@ func (s *ResourceService) FindResouceList(find *api.ResourceFind) ([]*api.Resour
|
|||||||
return list, nil
|
return list, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *ResourceService) FindResource(find *api.ResourceFind) (*api.Resource, error) {
|
||||||
|
list, err := findResourceList(s.db, find)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(list) == 0 {
|
||||||
|
return nil, &common.Error{Code: common.NotFound, Err: fmt.Errorf("not found")}
|
||||||
|
}
|
||||||
|
|
||||||
|
return list[0], nil
|
||||||
|
}
|
||||||
|
|
||||||
func (s *ResourceService) DeleteResource(delete *api.ResourceDelete) error {
|
func (s *ResourceService) DeleteResource(delete *api.ResourceDelete) error {
|
||||||
err := deleteResource(s.db, delete)
|
err := deleteResource(s.db, delete)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Reference in New Issue
Block a user