feat: add disk usage information to the sidebar
							parent
							
								
									42a39b3f1d
								
							
						
					
					
						commit
						d1d8e3e340
					
				| 
						 | 
				
			
			@ -19,12 +19,15 @@
 | 
			
		|||
        "moment": "^2.29.2",
 | 
			
		||||
        "normalize.css": "^8.0.1",
 | 
			
		||||
        "noty": "^3.2.0-beta",
 | 
			
		||||
        "pretty-bytes": "^6.0.0",
 | 
			
		||||
        "qrcode.vue": "^1.7.0",
 | 
			
		||||
        "utif": "^3.1.0",
 | 
			
		||||
        "vue": "^2.6.10",
 | 
			
		||||
        "vue-async-computed": "^3.9.0",
 | 
			
		||||
        "vue-i18n": "^8.15.3",
 | 
			
		||||
        "vue-lazyload": "^1.3.3",
 | 
			
		||||
        "vue-router": "^3.1.3",
 | 
			
		||||
        "vue-simple-progress": "^1.1.1",
 | 
			
		||||
        "vuex": "^3.1.2",
 | 
			
		||||
        "vuex-router-sync": "^5.0.0",
 | 
			
		||||
        "whatwg-fetch": "^3.6.2"
 | 
			
		||||
| 
						 | 
				
			
			@ -11127,6 +11130,17 @@
 | 
			
		|||
        "node": ">=6.0.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/pretty-bytes": {
 | 
			
		||||
      "version": "6.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.0.0.tgz",
 | 
			
		||||
      "integrity": "sha512-6UqkYefdogmzqAZWzJ7laYeJnaXDy2/J+ZqiiMtS7t7OfpXWTlaeGMwX8U6EFvPV/YWWEKRkS8hKS4k60WHTOg==",
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": "^14.13.1 || >=16.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://github.com/sponsors/sindresorhus"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/pretty-error": {
 | 
			
		||||
      "version": "2.1.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz",
 | 
			
		||||
| 
						 | 
				
			
			@ -13839,6 +13853,14 @@
 | 
			
		|||
      "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz",
 | 
			
		||||
      "integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg=="
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/vue-async-computed": {
 | 
			
		||||
      "version": "3.9.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/vue-async-computed/-/vue-async-computed-3.9.0.tgz",
 | 
			
		||||
      "integrity": "sha512-ac6m/9zxHHNGGKNOU1en8qNk+fAmEbJLuWL7qyQTFuH3vjv3V4urv//QHcVzCobROM6btnaDG2b+XYMncF/ETA==",
 | 
			
		||||
      "peerDependencies": {
 | 
			
		||||
        "vue": "~2"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/vue-eslint-parser": {
 | 
			
		||||
      "version": "7.6.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.6.0.tgz",
 | 
			
		||||
| 
						 | 
				
			
			@ -14018,6 +14040,11 @@
 | 
			
		|||
      "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.1.tgz",
 | 
			
		||||
      "integrity": "sha512-RRQNLT8Mzr8z7eL4p7BtKvRaTSGdCbTy2+Mm5HTJvLGYSSeG9gDzNasJPP/yOYKLy+/cLG/ftrqq5fvkFwBJEw=="
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/vue-simple-progress": {
 | 
			
		||||
      "version": "1.1.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/vue-simple-progress/-/vue-simple-progress-1.1.1.tgz",
 | 
			
		||||
      "integrity": "sha512-ltLWYBA5eVQHWyt1NwZeGeK0VQC69JVh1oqUdro0po7r8Hc8SEMEyEfuwyCO4s27h5I3jbD99BKKkyPSQZgoZA=="
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/vue-style-loader": {
 | 
			
		||||
      "version": "4.1.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz",
 | 
			
		||||
| 
						 | 
				
			
			@ -24394,6 +24421,11 @@
 | 
			
		|||
        "fast-diff": "^1.1.2"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "pretty-bytes": {
 | 
			
		||||
      "version": "6.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.0.0.tgz",
 | 
			
		||||
      "integrity": "sha512-6UqkYefdogmzqAZWzJ7laYeJnaXDy2/J+ZqiiMtS7t7OfpXWTlaeGMwX8U6EFvPV/YWWEKRkS8hKS4k60WHTOg=="
 | 
			
		||||
    },
 | 
			
		||||
    "pretty-error": {
 | 
			
		||||
      "version": "2.1.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz",
 | 
			
		||||
| 
						 | 
				
			
			@ -26664,6 +26696,12 @@
 | 
			
		|||
      "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz",
 | 
			
		||||
      "integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg=="
 | 
			
		||||
    },
 | 
			
		||||
    "vue-async-computed": {
 | 
			
		||||
      "version": "3.9.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/vue-async-computed/-/vue-async-computed-3.9.0.tgz",
 | 
			
		||||
      "integrity": "sha512-ac6m/9zxHHNGGKNOU1en8qNk+fAmEbJLuWL7qyQTFuH3vjv3V4urv//QHcVzCobROM6btnaDG2b+XYMncF/ETA==",
 | 
			
		||||
      "requires": {}
 | 
			
		||||
    },
 | 
			
		||||
    "vue-eslint-parser": {
 | 
			
		||||
      "version": "7.6.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.6.0.tgz",
 | 
			
		||||
| 
						 | 
				
			
			@ -26801,6 +26839,11 @@
 | 
			
		|||
      "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.1.tgz",
 | 
			
		||||
      "integrity": "sha512-RRQNLT8Mzr8z7eL4p7BtKvRaTSGdCbTy2+Mm5HTJvLGYSSeG9gDzNasJPP/yOYKLy+/cLG/ftrqq5fvkFwBJEw=="
 | 
			
		||||
    },
 | 
			
		||||
    "vue-simple-progress": {
 | 
			
		||||
      "version": "1.1.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/vue-simple-progress/-/vue-simple-progress-1.1.1.tgz",
 | 
			
		||||
      "integrity": "sha512-ltLWYBA5eVQHWyt1NwZeGeK0VQC69JVh1oqUdro0po7r8Hc8SEMEyEfuwyCO4s27h5I3jbD99BKKkyPSQZgoZA=="
 | 
			
		||||
    },
 | 
			
		||||
    "vue-style-loader": {
 | 
			
		||||
      "version": "4.1.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,12 +21,15 @@
 | 
			
		|||
    "moment": "^2.29.2",
 | 
			
		||||
    "normalize.css": "^8.0.1",
 | 
			
		||||
    "noty": "^3.2.0-beta",
 | 
			
		||||
    "pretty-bytes": "^6.0.0",
 | 
			
		||||
    "qrcode.vue": "^1.7.0",
 | 
			
		||||
    "utif": "^3.1.0",
 | 
			
		||||
    "vue": "^2.6.10",
 | 
			
		||||
    "vue-async-computed": "^3.9.0",
 | 
			
		||||
    "vue-i18n": "^8.15.3",
 | 
			
		||||
    "vue-lazyload": "^1.3.3",
 | 
			
		||||
    "vue-router": "^3.1.3",
 | 
			
		||||
    "vue-simple-progress": "^1.1.1",
 | 
			
		||||
    "vuex": "^3.1.2",
 | 
			
		||||
    "vuex-router-sync": "^5.0.0",
 | 
			
		||||
    "whatwg-fetch": "^3.6.2"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
import { fetchURL, removePrefix, createURL } from "./utils";
 | 
			
		||||
import { createURL, fetchURL, removePrefix } from "./utils";
 | 
			
		||||
import { baseURL } from "@/utils/constants";
 | 
			
		||||
import store from "@/store";
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -176,3 +176,11 @@ export function getSubtitlesURL(file) {
 | 
			
		|||
 | 
			
		||||
  return subtitles;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export async function usage(url) {
 | 
			
		||||
  url = removePrefix(url);
 | 
			
		||||
 | 
			
		||||
  const res = await fetchURL(`/api/usage${url}`, {});
 | 
			
		||||
 | 
			
		||||
  return await res.json();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -80,6 +80,16 @@
 | 
			
		|||
      </router-link>
 | 
			
		||||
    </template>
 | 
			
		||||
 | 
			
		||||
    <div
 | 
			
		||||
      class="credits"
 | 
			
		||||
      v-if="$router.currentRoute.path.includes('/files/')"
 | 
			
		||||
      style="width: 90%; margin: 2em 2.5em 3em 2.5em"
 | 
			
		||||
    >
 | 
			
		||||
      <progress-bar :val="usage.usedPercentage" :size="large"></progress-bar>
 | 
			
		||||
      <br />
 | 
			
		||||
      {{ usage.used }} of {{ usage.total }} used
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <p class="credits">
 | 
			
		||||
      <span>
 | 
			
		||||
        <span v-if="disableExternal">File Browser</span>
 | 
			
		||||
| 
						 | 
				
			
			@ -109,9 +119,15 @@ import {
 | 
			
		|||
  noAuth,
 | 
			
		||||
  authMethod,
 | 
			
		||||
} from "@/utils/constants";
 | 
			
		||||
import { files as api } from "@/api";
 | 
			
		||||
import ProgressBar from "vue-simple-progress";
 | 
			
		||||
import prettyBytes from "pretty-bytes";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: "sidebar",
 | 
			
		||||
  components: {
 | 
			
		||||
    ProgressBar,
 | 
			
		||||
  },
 | 
			
		||||
  computed: {
 | 
			
		||||
    ...mapState(["user"]),
 | 
			
		||||
    ...mapGetters(["isLogged"]),
 | 
			
		||||
| 
						 | 
				
			
			@ -124,6 +140,31 @@ export default {
 | 
			
		|||
    noAuth: () => noAuth,
 | 
			
		||||
    authMethod: () => authMethod,
 | 
			
		||||
  },
 | 
			
		||||
  asyncComputed: {
 | 
			
		||||
    usage: {
 | 
			
		||||
      async get() {
 | 
			
		||||
        let path = this.$route.path.endsWith("/")
 | 
			
		||||
          ? this.$route.path
 | 
			
		||||
          : this.$route.path + "/";
 | 
			
		||||
        let usageStats = { used: 0, total: 0, usedPercentage: 0 };
 | 
			
		||||
        try {
 | 
			
		||||
          let usage = await api.usage(path);
 | 
			
		||||
          usageStats = {
 | 
			
		||||
            used: prettyBytes(usage.used),
 | 
			
		||||
            total: prettyBytes(usage.total),
 | 
			
		||||
            usedPercentage: Math.round((usage.used / usage.total) * 100),
 | 
			
		||||
          };
 | 
			
		||||
        } catch (error) {
 | 
			
		||||
          this.$showError(error);
 | 
			
		||||
        }
 | 
			
		||||
        return usageStats;
 | 
			
		||||
      },
 | 
			
		||||
      default: { used: "0 B", total: "0 B", usedPercentage: 0 },
 | 
			
		||||
      shouldUpdate() {
 | 
			
		||||
        return this.$router.currentRoute.path.includes("/files/");
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    toRoot() {
 | 
			
		||||
      this.$router.push({ path: "/files/" }, () => {});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,8 +3,10 @@ import Noty from "noty";
 | 
			
		|||
import VueLazyload from "vue-lazyload";
 | 
			
		||||
import i18n from "@/i18n";
 | 
			
		||||
import { disableExternal } from "@/utils/constants";
 | 
			
		||||
import AsyncComputed from "vue-async-computed";
 | 
			
		||||
 | 
			
		||||
Vue.use(VueLazyload);
 | 
			
		||||
Vue.use(AsyncComputed);
 | 
			
		||||
 | 
			
		||||
Vue.config.productionTip = true;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										1
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										1
									
								
								go.mod
								
								
								
								
							| 
						 | 
				
			
			@ -55,6 +55,7 @@ require (
 | 
			
		|||
	github.com/pelletier/go-toml v1.9.4 // indirect
 | 
			
		||||
	github.com/pierrec/lz4/v4 v4.1.2 // indirect
 | 
			
		||||
	github.com/pmezard/go-difflib v1.0.0 // indirect
 | 
			
		||||
	github.com/shirou/gopsutil/v3 v3.22.5 // indirect
 | 
			
		||||
	github.com/spf13/cast v1.4.1 // indirect
 | 
			
		||||
	github.com/spf13/jwalterweatherman v1.1.0 // indirect
 | 
			
		||||
	github.com/subosito/gotenv v1.2.0 // indirect
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										13
									
								
								go.sum
								
								
								
								
							
							
						
						
									
										13
									
								
								go.sum
								
								
								
								
							| 
						 | 
				
			
			@ -101,6 +101,7 @@ github.com/go-errors/errors v1.1.1/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWE
 | 
			
		|||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
 | 
			
		||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
 | 
			
		||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
 | 
			
		||||
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
 | 
			
		||||
github.com/golang-jwt/jwt/v4 v4.4.1 h1:pC5DB52sCeK48Wlb9oPcdhnjkz1TKt1D/P7WKJ0kUcQ=
 | 
			
		||||
github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
 | 
			
		||||
github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
 | 
			
		||||
| 
						 | 
				
			
			@ -147,6 +148,8 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 | 
			
		|||
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
			
		||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
 | 
			
		||||
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
 | 
			
		||||
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
 | 
			
		||||
| 
						 | 
				
			
			@ -206,6 +209,7 @@ github.com/lucas-clemente/aes12 v0.0.0-20171027163421-cd47fb39b79f/go.mod h1:JpH
 | 
			
		|||
github.com/lucas-clemente/quic-clients v0.1.0/go.mod h1:y5xVIEoObKqULIKivu+gD/LU90pL73bTdtQjPBvtCBk=
 | 
			
		||||
github.com/lucas-clemente/quic-go v0.10.2/go.mod h1:hvaRS9IHjFLMq76puFJeWNfmn+H70QZ/CXoxqw9bzao=
 | 
			
		||||
github.com/lucas-clemente/quic-go-certificates v0.0.0-20160823095156-d2f86524cced/go.mod h1:NCcRLrOTZbzhZvixZLlERbJtDtYsmMw8Jc4vS8Z0g58=
 | 
			
		||||
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
 | 
			
		||||
github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo=
 | 
			
		||||
github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
 | 
			
		||||
github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk=
 | 
			
		||||
| 
						 | 
				
			
			@ -241,10 +245,13 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
 | 
			
		|||
github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
			
		||||
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
 | 
			
		||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 | 
			
		||||
github.com/russross/blackfriday v0.0.0-20170610170232-067529f716f4/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
 | 
			
		||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 | 
			
		||||
github.com/shirou/gopsutil/v3 v3.22.5 h1:atX36I/IXgFiB81687vSiBI5zrMsxcIBkP9cQMJQoJA=
 | 
			
		||||
github.com/shirou/gopsutil/v3 v3.22.5/go.mod h1:so9G9VzeHt/hsd0YwqprnjHnfARAUktauykSbr+y2gA=
 | 
			
		||||
github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo=
 | 
			
		||||
github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo=
 | 
			
		||||
github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA=
 | 
			
		||||
| 
						 | 
				
			
			@ -267,6 +274,8 @@ github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMT
 | 
			
		|||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 | 
			
		||||
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
 | 
			
		||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
 | 
			
		||||
github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk=
 | 
			
		||||
github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ=
 | 
			
		||||
github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce h1:fb190+cK2Xz/dvi9Hv8eCYJYvIGUTN2/KLq1pT6CjEc=
 | 
			
		||||
github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4=
 | 
			
		||||
github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
 | 
			
		||||
| 
						 | 
				
			
			@ -280,6 +289,7 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
 | 
			
		|||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
			
		||||
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
			
		||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
			
		||||
github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
 | 
			
		||||
go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
 | 
			
		||||
go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU=
 | 
			
		||||
go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=
 | 
			
		||||
| 
						 | 
				
			
			@ -408,6 +418,7 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w
 | 
			
		|||
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
| 
						 | 
				
			
			@ -431,12 +442,14 @@ golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7w
 | 
			
		|||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -65,6 +65,8 @@ func NewHandler(
 | 
			
		|||
	api.PathPrefix("/resources").Handler(monkey(resourcePutHandler, "/api/resources")).Methods("PUT")
 | 
			
		||||
	api.PathPrefix("/resources").Handler(monkey(resourcePatchHandler(fileCache), "/api/resources")).Methods("PATCH")
 | 
			
		||||
 | 
			
		||||
	api.PathPrefix("/usage").Handler(monkey(diskUsage, "/api/usage")).Methods("GET")
 | 
			
		||||
 | 
			
		||||
	api.Path("/shares").Handler(monkey(shareListHandler, "/api/shares")).Methods("GET")
 | 
			
		||||
	api.PathPrefix("/share").Handler(monkey(shareGetsHandler, "/api/share")).Methods("GET")
 | 
			
		||||
	api.PathPrefix("/share").Handler(monkey(sharePostHandler, "/api/share")).Methods("POST")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,6 +11,7 @@ import (
 | 
			
		|||
	"path/filepath"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/shirou/gopsutil/v3/disk"
 | 
			
		||||
	"github.com/spf13/afero"
 | 
			
		||||
 | 
			
		||||
	"github.com/filebrowser/filebrowser/v2/errors"
 | 
			
		||||
| 
						 | 
				
			
			@ -330,3 +331,32 @@ func patchAction(ctx context.Context, action, src, dst string, d *data, fileCach
 | 
			
		|||
		return fmt.Errorf("unsupported action %s: %w", action, errors.ErrInvalidRequestParams)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type DiskUsageResponse struct {
 | 
			
		||||
	Total uint64 `json:"total"`
 | 
			
		||||
	Used  uint64 `json:"used"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var diskUsage = withUser(func(w http.ResponseWriter, r *http.Request, d *data) (int, error) {
 | 
			
		||||
	file, err := files.NewFileInfo(files.FileOptions{
 | 
			
		||||
		Fs:         d.user.Fs,
 | 
			
		||||
		Path:       r.URL.Path,
 | 
			
		||||
		Modify:     d.user.Perm.Modify,
 | 
			
		||||
		Expand:     false,
 | 
			
		||||
		ReadHeader: false,
 | 
			
		||||
		Checker:    d,
 | 
			
		||||
		Content:    false,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return errToStatus(err), err
 | 
			
		||||
	}
 | 
			
		||||
	fPath := file.RealPath()
 | 
			
		||||
	usage, err := disk.UsageWithContext(r.Context(), fPath)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return errToStatus(err), err
 | 
			
		||||
	}
 | 
			
		||||
	return renderJSON(w, r, &DiskUsageResponse{
 | 
			
		||||
		Total: usage.Total,
 | 
			
		||||
		Used:  usage.Used,
 | 
			
		||||
	})
 | 
			
		||||
})
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue