Rename project from inventree to vibetree
- go.mod module path (and every internal/vibetree import) inventree -> vibetree - cmd/inventree/ -> cmd/vibetree/, deploy/inventree.service -> vibetree.service - Default site name (seed data + the siteName template func's fallback) is now "vibetree", shown in the navbar, <title>, and login page - Session cookie renamed inventree_session -> vibetree_session - Default DB path data/inventree.db -> data/vibetree.db, CLI/log text, Dockerfile, docker-compose.yml, README, .gitignore/.dockerignore all updated to match Existing installs: this changes the session cookie name (users will be signed out once) and the default DB filename (point -db at your existing file, or rename it, to keep your data).
This commit is contained in:
+1
-1
@@ -3,4 +3,4 @@ data/
|
|||||||
*.db-shm
|
*.db-shm
|
||||||
*.db-wal
|
*.db-wal
|
||||||
.git/
|
.git/
|
||||||
inventree
|
vibetree
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
/inventree
|
/vibetree
|
||||||
/data/
|
/data/
|
||||||
*.db
|
*.db
|
||||||
*.db-shm
|
*.db-shm
|
||||||
|
|||||||
+7
-7
@@ -9,19 +9,19 @@ RUN go mod download
|
|||||||
|
|
||||||
COPY . .
|
COPY . .
|
||||||
ARG VERSION=dev
|
ARG VERSION=dev
|
||||||
RUN go build -trimpath -ldflags "-s -w -X main.version=${VERSION}" -o /out/inventree ./cmd/inventree
|
RUN go build -trimpath -ldflags "-s -w -X main.version=${VERSION}" -o /out/vibetree ./cmd/vibetree
|
||||||
|
|
||||||
FROM alpine:3.20
|
FROM alpine:3.20
|
||||||
RUN apk add --no-cache ca-certificates tzdata && \
|
RUN apk add --no-cache ca-certificates tzdata && \
|
||||||
addgroup -S inventree && adduser -S inventree -G inventree
|
addgroup -S vibetree && adduser -S vibetree -G vibetree
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY --from=build /out/inventree /usr/local/bin/inventree
|
COPY --from=build /out/vibetree /usr/local/bin/vibetree
|
||||||
RUN mkdir -p /app/data && chown -R inventree:inventree /app/data
|
RUN mkdir -p /app/data && chown -R vibetree:vibetree /app/data
|
||||||
|
|
||||||
USER inventree
|
USER vibetree
|
||||||
VOLUME ["/app/data"]
|
VOLUME ["/app/data"]
|
||||||
EXPOSE 8080
|
EXPOSE 8080
|
||||||
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s CMD wget -qO- http://127.0.0.1:8080/healthz || exit 1
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s CMD wget -qO- http://127.0.0.1:8080/healthz || exit 1
|
||||||
|
|
||||||
ENTRYPOINT ["inventree"]
|
ENTRYPOINT ["vibetree"]
|
||||||
CMD ["serve", "-addr", ":8080", "-db", "/app/data/inventree.db"]
|
CMD ["serve", "-addr", ":8080", "-db", "/app/data/vibetree.db"]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# inventree
|
# vibetree
|
||||||
|
|
||||||
A small, self-contained IT asset inventory system. The heart of inventree is a
|
A small, self-contained IT asset inventory system. The heart of vibetree is a
|
||||||
nested folder tree — like a file manager — for organizing physical and
|
nested folder tree — like a file manager — for organizing physical and
|
||||||
virtual IT assets (servers, switches, laptops, printers, etc.).
|
virtual IT assets (servers, switches, laptops, printers, etc.).
|
||||||
|
|
||||||
@@ -14,8 +14,8 @@ virtual IT assets (servers, switches, laptops, printers, etc.).
|
|||||||
## Quick start
|
## Quick start
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
go build -o inventree ./cmd/inventree
|
go build -o vibetree ./cmd/vibetree
|
||||||
./inventree serve
|
./vibetree serve
|
||||||
```
|
```
|
||||||
|
|
||||||
Then open http://localhost:8080 and log in with:
|
Then open http://localhost:8080 and log in with:
|
||||||
@@ -28,18 +28,18 @@ Password: admin
|
|||||||
(This default account is created intentionally on first run. Change or
|
(This default account is created intentionally on first run. Change or
|
||||||
disable it via the Users admin page once you're up and running.)
|
disable it via the Users admin page once you're up and running.)
|
||||||
|
|
||||||
The database file is created automatically at `data/inventree.db` on first
|
The database file is created automatically at `data/vibetree.db` on first
|
||||||
run, with migrations applied and seed data (default statuses, item types,
|
run, with migrations applied and seed data (default statuses, item types,
|
||||||
and the admin account) inserted.
|
and the admin account) inserted.
|
||||||
|
|
||||||
## CLI
|
## CLI
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
inventree # same as `inventree serve`
|
vibetree # same as `vibetree serve`
|
||||||
inventree serve # start the web server
|
vibetree serve # start the web server
|
||||||
inventree version # print the version
|
vibetree version # print the version
|
||||||
inventree database migrate # apply pending migrations and exit
|
vibetree database migrate # apply pending migrations and exit
|
||||||
inventree database backup [path] # write a consistent VACUUM INTO snapshot
|
vibetree database backup [path] # write a consistent VACUUM INTO snapshot
|
||||||
```
|
```
|
||||||
|
|
||||||
`serve` flags:
|
`serve` flags:
|
||||||
@@ -47,7 +47,7 @@ inventree database backup [path] # write a consistent VACUUM INTO snapshot
|
|||||||
| Flag | Default | Description |
|
| Flag | Default | Description |
|
||||||
|---------------------|------------------------|--------------------------------------------|
|
|---------------------|------------------------|--------------------------------------------|
|
||||||
| `-addr` | `:8080` | Listen address |
|
| `-addr` | `:8080` | Listen address |
|
||||||
| `-db` | `data/inventree.db` | Path to the SQLite database file |
|
| `-db` | `data/vibetree.db` | Path to the SQLite database file |
|
||||||
| `-secure-cookies` | `false` | Mark the session cookie `Secure` (enable when serving over HTTPS) |
|
| `-secure-cookies` | `false` | Mark the session cookie `Secure` (enable when serving over HTTPS) |
|
||||||
|
|
||||||
`/healthz` is available for load balancer / container health checks.
|
`/healthz` is available for load balancer / container health checks.
|
||||||
@@ -158,13 +158,13 @@ fresh one over a few peeled-off labels.
|
|||||||
references with examples are documented right on that page.
|
references with examples are documented right on that page.
|
||||||
|
|
||||||
A full backup/restore of everything (folders, assets, types, custom fields,
|
A full backup/restore of everything (folders, assets, types, custom fields,
|
||||||
statuses, users) is just `inventree database backup` — it's a consistent
|
statuses, users) is just `vibetree database backup` — it's a consistent
|
||||||
snapshot of the whole SQLite database.
|
snapshot of the whole SQLite database.
|
||||||
|
|
||||||
## Project layout
|
## Project layout
|
||||||
|
|
||||||
```
|
```
|
||||||
cmd/inventree/ CLI entrypoint (serve, version, database migrate/backup)
|
cmd/vibetree/ CLI entrypoint (serve, version, database migrate/backup)
|
||||||
internal/
|
internal/
|
||||||
auth/ session management, secure cookies
|
auth/ session management, secure cookies
|
||||||
database/ SQLite connection, pragmas, migrations
|
database/ SQLite connection, pragmas, migrations
|
||||||
@@ -201,33 +201,33 @@ the compiled binary has no C library dependencies.
|
|||||||
docker compose up --build
|
docker compose up --build
|
||||||
```
|
```
|
||||||
|
|
||||||
This builds the image, starts inventree on port 8080, and persists the
|
This builds the image, starts vibetree on port 8080, and persists the
|
||||||
database in a named volume (`inventree-data`, mounted at `/app/data`).
|
database in a named volume (`vibetree-data`, mounted at `/app/data`).
|
||||||
|
|
||||||
Or directly:
|
Or directly:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
docker build -t inventree .
|
docker build -t vibetree .
|
||||||
docker run -p 8080:8080 -v inventree-data:/app/data inventree
|
docker run -p 8080:8080 -v vibetree-data:/app/data vibetree
|
||||||
```
|
```
|
||||||
|
|
||||||
## systemd
|
## systemd
|
||||||
|
|
||||||
See `deploy/inventree.service` for an example unit. Adjust the paths, then:
|
See `deploy/vibetree.service` for an example unit. Adjust the paths, then:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
sudo useradd --system --home /opt/inventree --shell /usr/sbin/nologin inventree
|
sudo useradd --system --home /opt/vibetree --shell /usr/sbin/nologin vibetree
|
||||||
sudo mkdir -p /opt/inventree/data
|
sudo mkdir -p /opt/vibetree/data
|
||||||
sudo cp inventree /opt/inventree/inventree
|
sudo cp vibetree /opt/vibetree/vibetree
|
||||||
sudo chown -R inventree:inventree /opt/inventree
|
sudo chown -R vibetree:vibetree /opt/vibetree
|
||||||
sudo cp deploy/inventree.service /etc/systemd/system/
|
sudo cp deploy/vibetree.service /etc/systemd/system/
|
||||||
sudo systemctl daemon-reload
|
sudo systemctl daemon-reload
|
||||||
sudo systemctl enable --now inventree
|
sudo systemctl enable --now vibetree
|
||||||
```
|
```
|
||||||
|
|
||||||
## Scope
|
## Scope
|
||||||
|
|
||||||
inventree is intentionally a focused MVP: folders, assets, custom types,
|
vibetree is intentionally a focused MVP: folders, assets, custom types,
|
||||||
statuses, users, search, and CSV import/export. It does not include
|
statuses, users, search, and CSV import/export. It does not include
|
||||||
ticketing, purchasing, monitoring, RMM, MDM, or accounting features — if you
|
ticketing, purchasing, monitoring, RMM, MDM, or accounting features — if you
|
||||||
need those, look elsewhere and integrate via CSV.
|
need those, look elsewhere and integrate via CSV.
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Command inventree runs the inventree IT asset inventory server, or one of
|
// Command vibetree runs the vibetree IT asset inventory server, or one of
|
||||||
// its supporting subcommands (version, database migrate, database backup).
|
// its supporting subcommands (version, database migrate, database backup).
|
||||||
package main
|
package main
|
||||||
|
|
||||||
@@ -14,8 +14,8 @@ import (
|
|||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"inventree/internal/database"
|
"vibetree/internal/database"
|
||||||
"inventree/internal/web"
|
"vibetree/internal/web"
|
||||||
)
|
)
|
||||||
|
|
||||||
// version is set at build time via -ldflags "-X main.version=...".
|
// version is set at build time via -ldflags "-X main.version=...".
|
||||||
@@ -36,11 +36,11 @@ func run(args []string) error {
|
|||||||
case "serve":
|
case "serve":
|
||||||
return runServe(args[1:])
|
return runServe(args[1:])
|
||||||
case "version":
|
case "version":
|
||||||
fmt.Println("inventree", version)
|
fmt.Println("vibetree", version)
|
||||||
return nil
|
return nil
|
||||||
case "database":
|
case "database":
|
||||||
if len(args) < 2 {
|
if len(args) < 2 {
|
||||||
return fmt.Errorf("usage: inventree database <migrate|backup>")
|
return fmt.Errorf("usage: vibetree database <migrate|backup>")
|
||||||
}
|
}
|
||||||
switch args[1] {
|
switch args[1] {
|
||||||
case "migrate":
|
case "migrate":
|
||||||
@@ -60,22 +60,22 @@ func run(args []string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func printUsage() {
|
func printUsage() {
|
||||||
fmt.Println(`inventree - a small IT asset inventory system
|
fmt.Println(`vibetree - a small IT asset inventory system
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
inventree [serve] Start the web server (default command)
|
vibetree [serve] Start the web server (default command)
|
||||||
inventree version Print the version
|
vibetree version Print the version
|
||||||
inventree database migrate Apply pending database migrations
|
vibetree database migrate Apply pending database migrations
|
||||||
inventree database backup [path] Write a consistent backup snapshot
|
vibetree database backup [path] Write a consistent backup snapshot
|
||||||
|
|
||||||
Flags for "serve":
|
Flags for "serve":
|
||||||
-addr string listen address (default ":8080")
|
-addr string listen address (default ":8080")
|
||||||
-db string path to the SQLite database file (default "data/inventree.db")
|
-db string path to the SQLite database file (default "data/vibetree.db")
|
||||||
-secure-cookies mark the session cookie Secure (enable when serving over HTTPS)`)
|
-secure-cookies mark the session cookie Secure (enable when serving over HTTPS)`)
|
||||||
}
|
}
|
||||||
|
|
||||||
func dbPathFlag(args []string) (dbPath string, rest []string) {
|
func dbPathFlag(args []string) (dbPath string, rest []string) {
|
||||||
dbPath = "data/inventree.db"
|
dbPath = "data/vibetree.db"
|
||||||
for i := 0; i < len(args); i++ {
|
for i := 0; i < len(args); i++ {
|
||||||
if args[i] == "-db" && i+1 < len(args) {
|
if args[i] == "-db" && i+1 < len(args) {
|
||||||
dbPath = args[i+1]
|
dbPath = args[i+1]
|
||||||
@@ -137,7 +137,7 @@ func ensureDir(path string) error {
|
|||||||
func runServe(args []string) error {
|
func runServe(args []string) error {
|
||||||
var (
|
var (
|
||||||
addr = ":8080"
|
addr = ":8080"
|
||||||
dbPath = "data/inventree.db"
|
dbPath = "data/vibetree.db"
|
||||||
secureCookies = false
|
secureCookies = false
|
||||||
)
|
)
|
||||||
for i := 0; i < len(args); i++ {
|
for i := 0; i < len(args); i++ {
|
||||||
@@ -196,7 +196,7 @@ func runServe(args []string) error {
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
log.Info("inventree listening", "addr", addr, "db", dbPath)
|
log.Info("vibetree listening", "addr", addr, "db", dbPath)
|
||||||
if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
|
if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=inventree - IT asset inventory
|
Description=vibetree - IT asset inventory
|
||||||
After=network.target
|
After=network.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
User=inventree
|
User=vibetree
|
||||||
Group=inventree
|
Group=vibetree
|
||||||
WorkingDirectory=/opt/inventree
|
WorkingDirectory=/opt/vibetree
|
||||||
ExecStart=/opt/inventree/inventree serve -addr :8080 -db /opt/inventree/data/inventree.db
|
ExecStart=/opt/vibetree/vibetree serve -addr :8080 -db /opt/vibetree/data/vibetree.db
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
RestartSec=2
|
RestartSec=2
|
||||||
|
|
||||||
@@ -15,7 +15,7 @@ RestartSec=2
|
|||||||
NoNewPrivileges=true
|
NoNewPrivileges=true
|
||||||
ProtectSystem=strict
|
ProtectSystem=strict
|
||||||
ProtectHome=true
|
ProtectHome=true
|
||||||
ReadWritePaths=/opt/inventree/data
|
ReadWritePaths=/opt/vibetree/data
|
||||||
PrivateTmp=true
|
PrivateTmp=true
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
+5
-5
@@ -1,13 +1,13 @@
|
|||||||
services:
|
services:
|
||||||
inventree:
|
vibetree:
|
||||||
build: .
|
build: .
|
||||||
image: inventree:latest
|
image: vibetree:latest
|
||||||
container_name: inventree
|
container_name: vibetree
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
ports:
|
ports:
|
||||||
- "8080:8080"
|
- "8080:8080"
|
||||||
volumes:
|
volumes:
|
||||||
- inventree-data:/app/data
|
- vibetree-data:/app/data
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD", "wget", "-qO-", "http://127.0.0.1:8080/healthz"]
|
test: ["CMD", "wget", "-qO-", "http://127.0.0.1:8080/healthz"]
|
||||||
interval: 30s
|
interval: 30s
|
||||||
@@ -16,4 +16,4 @@ services:
|
|||||||
start_period: 5s
|
start_period: 5s
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
inventree-data:
|
vibetree-data:
|
||||||
|
|||||||
@@ -11,9 +11,9 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"inventree/internal/folders"
|
"vibetree/internal/folders"
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
"inventree/internal/settings"
|
"vibetree/internal/settings"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|||||||
@@ -8,11 +8,11 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"inventree/internal/assets"
|
"vibetree/internal/assets"
|
||||||
"inventree/internal/database"
|
"vibetree/internal/database"
|
||||||
"inventree/internal/folders"
|
"vibetree/internal/folders"
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
"inventree/internal/settings"
|
"vibetree/internal/settings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Seed data from migrations/0002_seed.sql gives us stable IDs to rely on:
|
// Seed data from migrations/0002_seed.sql gives us stable IDs to rely on:
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
@@ -4,9 +4,9 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"inventree/internal/assets"
|
"vibetree/internal/assets"
|
||||||
"inventree/internal/itemtypes"
|
"vibetree/internal/itemtypes"
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestQuantityFixedAtOneForUniqueTypes(t *testing.T) {
|
func TestQuantityFixedAtOneForUniqueTypes(t *testing.T) {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package assets
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Search performs a global, case-insensitive substring search across asset
|
// Search performs a global, case-insensitive substring search across asset
|
||||||
|
|||||||
@@ -10,12 +10,12 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
"inventree/internal/users"
|
"vibetree/internal/users"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
CookieName = "inventree_session"
|
CookieName = "vibetree_session"
|
||||||
SessionTTL = 7 * 24 * time.Hour
|
SessionTTL = 7 * 24 * time.Hour
|
||||||
contextUserK = ctxKey("current_user")
|
contextUserK = ctxKey("current_user")
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"inventree/internal/auth"
|
"vibetree/internal/auth"
|
||||||
"inventree/internal/database"
|
"vibetree/internal/database"
|
||||||
"inventree/internal/users"
|
"vibetree/internal/users"
|
||||||
)
|
)
|
||||||
|
|
||||||
func testDB(t *testing.T) *sql.DB {
|
func testDB(t *testing.T) *sql.DB {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"inventree/internal/database"
|
"vibetree/internal/database"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestOpenSetsPragmasAndMigrates(t *testing.T) {
|
func TestOpenSetsPragmasAndMigrates(t *testing.T) {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
-- Initial schema for inventree
|
-- Initial schema for vibetree
|
||||||
|
|
||||||
CREATE TABLE users (
|
CREATE TABLE users (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ INSERT INTO settings (key, value) VALUES
|
|||||||
('asset_id_prefix', 'IT-'),
|
('asset_id_prefix', 'IT-'),
|
||||||
('asset_id_padding', '6'),
|
('asset_id_padding', '6'),
|
||||||
('asset_id_seq', '0'),
|
('asset_id_seq', '0'),
|
||||||
('site_name', 'inventree');
|
('site_name', 'vibetree');
|
||||||
|
|
||||||
INSERT INTO item_types (name, description, icon, enabled, sort_order) VALUES
|
INSERT INTO item_types (name, description, icon, enabled, sort_order) VALUES
|
||||||
('Laptop', 'Portable computer', 'bi-laptop', 1, 1),
|
('Laptop', 'Portable computer', 'bi-laptop', 1, 1),
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"inventree/internal/database"
|
"vibetree/internal/database"
|
||||||
"inventree/internal/folders"
|
"vibetree/internal/folders"
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
func testDB(t *testing.T) *sql.DB {
|
func testDB(t *testing.T) *sql.DB {
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"inventree/internal/database"
|
"vibetree/internal/database"
|
||||||
"inventree/internal/itemtypes"
|
"vibetree/internal/itemtypes"
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
func testDB(t *testing.T) *sql.DB {
|
func testDB(t *testing.T) *sql.DB {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Package models defines the core domain types shared across inventree.
|
// Package models defines the core domain types shared across vibetree.
|
||||||
package models
|
package models
|
||||||
|
|
||||||
import "time"
|
import "time"
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ImportResult struct {
|
type ImportResult struct {
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"inventree/internal/database"
|
"vibetree/internal/database"
|
||||||
"inventree/internal/statuses"
|
"vibetree/internal/statuses"
|
||||||
)
|
)
|
||||||
|
|
||||||
func testDB(t *testing.T) *sql.DB {
|
func testDB(t *testing.T) *sql.DB {
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
|
|
||||||
"golang.org/x/crypto/bcrypt"
|
"golang.org/x/crypto/bcrypt"
|
||||||
|
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"inventree/internal/database"
|
"vibetree/internal/database"
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
"inventree/internal/users"
|
"vibetree/internal/users"
|
||||||
)
|
)
|
||||||
|
|
||||||
func testDB(t *testing.T) *sql.DB {
|
func testDB(t *testing.T) *sql.DB {
|
||||||
|
|||||||
+8
-8
@@ -1,5 +1,5 @@
|
|||||||
// Package web implements the HTTP server: routing, session middleware,
|
// Package web implements the HTTP server: routing, session middleware,
|
||||||
// template rendering, and all page/API handlers for inventree.
|
// template rendering, and all page/API handlers for vibetree.
|
||||||
package web
|
package web
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -9,13 +9,13 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"inventree/internal/assets"
|
"vibetree/internal/assets"
|
||||||
"inventree/internal/auth"
|
"vibetree/internal/auth"
|
||||||
"inventree/internal/folders"
|
"vibetree/internal/folders"
|
||||||
"inventree/internal/itemtypes"
|
"vibetree/internal/itemtypes"
|
||||||
"inventree/internal/settings"
|
"vibetree/internal/settings"
|
||||||
"inventree/internal/statuses"
|
"vibetree/internal/statuses"
|
||||||
"inventree/internal/users"
|
"vibetree/internal/users"
|
||||||
)
|
)
|
||||||
|
|
||||||
// App holds every dependency HTTP handlers need: data stores, templates, and
|
// App holds every dependency HTTP handlers need: data stores, templates, and
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
type assetRequest struct {
|
type assetRequest struct {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package web
|
|||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"inventree/internal/auth"
|
"vibetree/internal/auth"
|
||||||
)
|
)
|
||||||
|
|
||||||
type loginPageData struct {
|
type loginPageData struct {
|
||||||
|
|||||||
@@ -5,12 +5,12 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"inventree/internal/assets"
|
"vibetree/internal/assets"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (a *App) handleExportCSV(w http.ResponseWriter, r *http.Request) {
|
func (a *App) handleExportCSV(w http.ResponseWriter, r *http.Request) {
|
||||||
ctx := r.Context()
|
ctx := r.Context()
|
||||||
filename := fmt.Sprintf("inventree-assets-%s.csv", time.Now().Format("2006-01-02"))
|
filename := fmt.Sprintf("vibetree-assets-%s.csv", time.Now().Format("2006-01-02"))
|
||||||
w.Header().Set("Content-Type", "text/csv; charset=utf-8")
|
w.Header().Set("Content-Type", "text/csv; charset=utf-8")
|
||||||
w.Header().Set("Content-Disposition", "attachment; filename=\""+filename+"\"")
|
w.Header().Set("Content-Disposition", "attachment; filename=\""+filename+"\"")
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"inventree/internal/folders"
|
"vibetree/internal/folders"
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
// handleFolderOptions returns every folder as a flat, indented list for
|
// handleFolderOptions returns every folder as a flat, indented list for
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ package web
|
|||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"inventree/internal/assets"
|
"vibetree/internal/assets"
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
// InventoryPageData is the top-level data passed to templates/pages/inventory.html.
|
// InventoryPageData is the top-level data passed to templates/pages/inventory.html.
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
type itemTypesListData struct {
|
type itemTypesListData struct {
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"inventree/internal/assets"
|
"vibetree/internal/assets"
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
// LabelTemplate describes a sheet of adhesive labels: cell size, grid, and
|
// LabelTemplate describes a sheet of adhesive labels: cell size, grid, and
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package web
|
|||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
type SearchPanelData struct {
|
type SearchPanelData struct {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
type settingsPageData struct {
|
type settingsPageData struct {
|
||||||
@@ -17,7 +17,7 @@ type settingsPageData struct {
|
|||||||
|
|
||||||
func (a *App) handleSettingsPage(w http.ResponseWriter, r *http.Request) {
|
func (a *App) handleSettingsPage(w http.ResponseWriter, r *http.Request) {
|
||||||
ctx := r.Context()
|
ctx := r.Context()
|
||||||
siteName, err := a.Settings.Get(ctx, "site_name", "inventree")
|
siteName, err := a.Settings.Get(ctx, "site_name", "vibetree")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
writeErr(w, http.StatusInternalServerError, err.Error())
|
writeErr(w, http.StatusInternalServerError, err.Error())
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
||||||
"inventree/internal/assets"
|
"vibetree/internal/assets"
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
type settingsImportPageData struct {
|
type settingsImportPageData struct {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
// parseRole maps a form's role value to a models.Role, defaulting to
|
// parseRole maps a form's role value to a models.Role, defaulting to
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ package web
|
|||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"inventree/internal/auth"
|
"vibetree/internal/auth"
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
// loadSession attaches the current user (if any) to the request context
|
// loadSession attaches the current user (if any) to the request context
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
content "inventree/web"
|
content "vibetree/web"
|
||||||
)
|
)
|
||||||
|
|
||||||
// templateFuncs are available to every template (pages and fragments).
|
// templateFuncs are available to every template (pages and fragments).
|
||||||
@@ -101,9 +101,9 @@ func loadTemplates(a *App) (*templateSet, error) {
|
|||||||
// used by layout.html for the <title> and navbar brand text.
|
// used by layout.html for the <title> and navbar brand text.
|
||||||
appFuncs := template.FuncMap{
|
appFuncs := template.FuncMap{
|
||||||
"siteName": func() string {
|
"siteName": func() string {
|
||||||
name, err := a.Settings.Get(context.Background(), "site_name", "inventree")
|
name, err := a.Settings.Get(context.Background(), "site_name", "vibetree")
|
||||||
if err != nil || name == "" {
|
if err != nil || name == "" {
|
||||||
return "inventree"
|
return "vibetree"
|
||||||
}
|
}
|
||||||
return name
|
return name
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ package web
|
|||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
content "inventree/web"
|
content "vibetree/web"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Router builds the complete HTTP handler for inventree: static assets,
|
// Router builds the complete HTTP handler for vibetree: static assets,
|
||||||
// authentication, the AJAX-driven inventory tree, and the traditional
|
// authentication, the AJAX-driven inventory tree, and the traditional
|
||||||
// full-page admin sections (item types, users, settings).
|
// full-page admin sections (item types, users, settings).
|
||||||
func (a *App) Router() http.Handler {
|
func (a *App) Router() http.Handler {
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"inventree/internal/assets"
|
"vibetree/internal/assets"
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
// treeAssetLimit bounds how many assets are rendered directly inside a
|
// treeAssetLimit bounds how many assets are rendered directly inside a
|
||||||
|
|||||||
@@ -11,9 +11,9 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"inventree/internal/database"
|
"vibetree/internal/database"
|
||||||
"inventree/internal/models"
|
"vibetree/internal/models"
|
||||||
"inventree/internal/web"
|
"vibetree/internal/web"
|
||||||
)
|
)
|
||||||
|
|
||||||
func testApp(t *testing.T) *web.App {
|
func testApp(t *testing.T) *web.App {
|
||||||
@@ -49,7 +49,7 @@ func loginAs(t *testing.T, srv *httptest.Server, username, password string) *htt
|
|||||||
t.Fatalf("expected redirect on login, got %d", res.StatusCode)
|
t.Fatalf("expected redirect on login, got %d", res.StatusCode)
|
||||||
}
|
}
|
||||||
for _, c := range res.Cookies() {
|
for _, c := range res.Cookies() {
|
||||||
if c.Name == "inventree_session" {
|
if c.Name == "vibetree_session" {
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// Package content embeds inventree's HTML templates and static assets
|
// Package content embeds vibetree's HTML templates and static assets
|
||||||
// (Bootstrap CSS/JS, icons, vanilla JS) into the compiled binary.
|
// (Bootstrap CSS/JS, icons, vanilla JS) into the compiled binary.
|
||||||
package content
|
package content
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// inventree - vanilla JS driving the inventory tree and AJAX panels.
|
// vibetree - vanilla JS driving the inventory tree and AJAX panels.
|
||||||
// No build step, no frameworks: plain DOM APIs + fetch.
|
// No build step, no frameworks: plain DOM APIs + fetch.
|
||||||
//
|
//
|
||||||
// Interaction model: the tree and panels behave like a native file manager.
|
// Interaction model: the tree and panels behave like a native file manager.
|
||||||
|
|||||||
Reference in New Issue
Block a user