Skip to content

Commit

Permalink
feat: add database filesize in UI (#488)
Browse files Browse the repository at this point in the history
  • Loading branch information
boojack committed Nov 18, 2022
1 parent 706b1b4 commit a2831b3
Show file tree
Hide file tree
Showing 13 changed files with 74 additions and 26 deletions.
2 changes: 2 additions & 0 deletions api/system.go
Expand Up @@ -5,6 +5,8 @@ import "github.com/usememos/memos/server/profile"
type SystemStatus struct {
Host *User `json:"host"`
Profile *profile.Profile `json:"profile"`
DBSize int64 `json:"dbSize"`

// System settings
// Allow sign up.
AllowSignUp bool `json:"allowSignUp"`
Expand Down
11 changes: 9 additions & 2 deletions server/resource.go
Expand Up @@ -16,6 +16,11 @@ import (
"github.com/labstack/echo/v4"
)

const (
// The max file size is 32MB.
maxFileSize = (32 * 8) << 20
)

func (s *Server) registerResourceRoutes(g *echo.Group) {
g.POST("/resource", func(c echo.Context) error {
ctx := c.Request().Context()
Expand All @@ -24,13 +29,15 @@ func (s *Server) registerResourceRoutes(g *echo.Group) {
return echo.NewHTTPError(http.StatusUnauthorized, "Missing user in session")
}

err := c.Request().ParseMultipartForm(64 << 20)
if err != nil {
if err := c.Request().ParseMultipartForm(maxFileSize); err != nil {
return echo.NewHTTPError(http.StatusBadRequest, "Upload file overload max size").SetInternal(err)
}

file, err := c.FormFile("file")
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to get uploading file").SetInternal(err)
}
if file == nil {
return echo.NewHTTPError(http.StatusBadRequest, "Upload file not found").SetInternal(err)
}

Expand Down
12 changes: 12 additions & 0 deletions server/system.go
Expand Up @@ -3,9 +3,11 @@ package server
import (
"encoding/json"
"net/http"
"os"

"github.com/usememos/memos/api"
"github.com/usememos/memos/common"
metric "github.com/usememos/memos/plugin/metrics"

"github.com/labstack/echo/v4"
)
Expand Down Expand Up @@ -65,6 +67,12 @@ func (s *Server) registerSystemRoutes(g *echo.Group) {
}
}

fi, err := os.Stat(s.Profile.DSN)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to read database fileinfo").SetInternal(err)
}
systemStatus.DBSize = fi.Size()

c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8)
if err := json.NewEncoder(c.Response().Writer).Encode(composeResponse(systemStatus)); err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to encode system status response").SetInternal(err)
Expand Down Expand Up @@ -103,6 +111,10 @@ func (s *Server) registerSystemRoutes(g *echo.Group) {
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to upsert system setting").SetInternal(err)
}
s.Collector.Collect(ctx, &metric.Metric{
Name: "systemSetting updated",
Labels: map[string]string{"field": string(systemSettingUpsert.Name)},
})

c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8)
if err := json.NewEncoder(c.Response().Writer).Encode(composeResponse(systemSetting)); err != nil {
Expand Down
4 changes: 2 additions & 2 deletions server/version/version.go
Expand Up @@ -7,10 +7,10 @@ import (

// Version is the service current released version.
// Semantic versioning: https://semver.org/
var Version = "0.7.2"
var Version = "0.7.3"

// DevVersion is the service current development version.
var DevVersion = "0.7.2"
var DevVersion = "0.7.3"

func GetCurrentVersion(mode string) string {
if mode == "dev" {
Expand Down
1 change: 1 addition & 0 deletions web/src/App.tsx
Expand Up @@ -21,6 +21,7 @@ function App() {
globalService.initialState();
}, []);

// Inject additional style and script codes.
useEffect(() => {
api.getSystemStatus().then(({ data }) => {
const { data: status } = data;
Expand Down
32 changes: 25 additions & 7 deletions web/src/components/Settings/SystemSection.tsx
Expand Up @@ -3,17 +3,28 @@ import { useTranslation } from "react-i18next";
import { Button, Switch, Textarea } from "@mui/joy";
import * as api from "../../helpers/api";
import toastHelper from "../Toast";
import "../../less/settings/preferences-section.less";
import "../../less/settings/system-section.less";

interface State {
dbSize: number;
allowSignUp: boolean;
additionalStyle: string;
additionalScript: string;
}

const formatBytes = (bytes: number) => {
if (bytes <= 0) return "0 Bytes";
const k = 1024,
dm = 2,
sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"],
i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + sizes[i];
};

const SystemSection = () => {
const { t } = useTranslation();
const [state, setState] = useState<State>({
dbSize: 0,
allowSignUp: false,
additionalStyle: "",
additionalScript: "",
Expand All @@ -23,6 +34,7 @@ const SystemSection = () => {
api.getSystemStatus().then(({ data }) => {
const { data: status } = data;
setState({
dbSize: status.dbSize,
allowSignUp: status.allowSignUp,
additionalStyle: status.additionalStyle,
additionalScript: status.additionalScript,
Expand Down Expand Up @@ -82,13 +94,17 @@ const SystemSection = () => {
};

return (
<div className="section-container preferences-section-container">
<div className="section-container system-section-container">
<p className="title-text">{t("common.basic")}</p>
<label className="form-label selector">
<p className="text-value">
Database File Size: <span className="font-mono font-medium">{formatBytes(state.dbSize)}</span>
</p>
<p className="title-text">{t("sidebar.setting")}</p>
<label className="form-label">
<span className="normal-text">Allow user signup</span>
<Switch size="sm" checked={state.allowSignUp} onChange={(event) => handleAllowSignUpChanged(event.target.checked)} />
</label>
<div className="form-label selector">
<div className="form-label">
<span className="normal-text">Additional style</span>
<Button size="sm" onClick={handleSaveAdditionalStyle}>
Save
Expand All @@ -100,12 +116,13 @@ const SystemSection = () => {
fontFamily: "monospace",
fontSize: "14px",
}}
minRows={5}
minRows={4}
maxRows={10}
placeholder="Additional css codes"
value={state.additionalStyle}
onChange={(event) => handleAdditionalStyleChanged(event.target.value)}
/>
<div className="form-label selector mt-2">
<div className="form-label mt-2">
<span className="normal-text">Additional script</span>
<Button size="sm" onClick={handleSaveAdditionalScript}>
Save
Expand All @@ -117,8 +134,9 @@ const SystemSection = () => {
fontFamily: "monospace",
fontSize: "14px",
}}
minRows={5}
minRows={4}
maxRows={10}
placeholder="Additional JavaScript codes"
value={state.additionalScript}
onChange={(event) => handleAdditionalScriptChanged(event.target.value)}
/>
Expand Down
1 change: 0 additions & 1 deletion web/src/components/ShareMemoImageDialog.tsx
Expand Up @@ -64,7 +64,6 @@ const ShareMemoImageDialog: React.FC<Props> = (props: Props) => {
}

toImage(memoElRef.current, {
backgroundColor: "#eaeaea",
pixelRatio: window.devicePixelRatio * 2,
})
.then((url) => {
Expand Down
9 changes: 0 additions & 9 deletions web/src/helpers/storage.ts
Expand Up @@ -57,12 +57,3 @@ export function remove(keys: StorageKey[]) {
}
}
}

export function emitStorageChangedEvent() {
const iframeEl = document.createElement("iframe");
iframeEl.style.display = "none";
document.body.appendChild(iframeEl);

iframeEl.contentWindow?.localStorage.setItem("t", Date.now().toString());
iframeEl.remove();
}
2 changes: 1 addition & 1 deletion web/src/less/base-dialog.less
@@ -1,5 +1,5 @@
.dialog-wrapper {
@apply fixed top-0 left-0 flex flex-col justify-start items-center w-full h-full pt-16 z-100 overflow-x-hidden overflow-y-scroll bg-transparent transition-all hide-scrollbar;
@apply fixed top-0 left-0 flex flex-col justify-start items-center w-full h-full pt-16 pb-8 z-100 overflow-x-hidden overflow-y-scroll bg-transparent transition-all hide-scrollbar;

&.showup {
background-color: rgba(0, 0, 0, 0.6);
Expand Down
17 changes: 17 additions & 0 deletions web/src/less/settings/system-section.less
@@ -0,0 +1,17 @@
.system-section-container {
> .title-text {
@apply mt-4 first:mt-1;
}

> .text-value {
@apply mr-2 text-sm;
}

> .form-label {
@apply mb-2 flex flex-row justify-between items-center;

> .normal-text {
@apply mr-2 text-sm;
}
}
}
6 changes: 3 additions & 3 deletions web/src/less/share-memo-image-dialog.less
Expand Up @@ -42,7 +42,7 @@
}

> .time-text {
@apply w-full px-6 pt-5 pb-2 text-xs text-gray-500 bg-white;
@apply w-full px-6 pt-5 pb-2 text-sm text-gray-500 bg-white;
}

> .memo-content-wrapper {
Expand Down Expand Up @@ -72,11 +72,11 @@
@apply w-64 flex flex-col justify-center items-start;

> .name-text {
@apply text-lg truncate font-bold text-gray-600;
@apply text-lg truncate font-medium text-gray-600;
}

> .usage-text {
@apply -mt-1 text-sm text-gray-400 font-medium;
@apply -mt-1 text-sm font-normal text-gray-400;
}
}

Expand Down
2 changes: 1 addition & 1 deletion web/src/locales/en.json
Expand Up @@ -79,7 +79,7 @@
},
"editor": {
"editing": "Editing...",
"cancel-edit": "Cancel Edit",
"cancel-edit": "Cancel edit",
"save": "Save",
"placeholder": "Any thoughts...",
"only-image-supported": "Only image file supported.",
Expand Down
1 change: 1 addition & 0 deletions web/src/types/modules/system.d.ts
Expand Up @@ -6,6 +6,7 @@ interface Profile {
interface SystemStatus {
host: User;
profile: Profile;
dbSize: number;
// System settings
allowSignUp: boolean;
additionalStyle: string;
Expand Down

0 comments on commit a2831b3

Please sign in to comment.