Skip to content

Commit 4cad1a7

Browse files
committed
feeds
1 parent 7543e87 commit 4cad1a7

File tree

12 files changed

+694
-164
lines changed

12 files changed

+694
-164
lines changed

cmd/goatak_server/admin_api.go

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ func (h *HttpServer) NewAdminAPI(app *App, addr string, webtakRoot string) *Admi
5959
api.f.Get("/points", getPointsPage())
6060
api.f.Get("/devices", getDevicesPage())
6161
api.f.Get("/profiles", getProfilesPage())
62+
api.f.Get("/feeds", getFeedsPage())
6263

6364
api.f.Get("/api/config", getConfigHandler(app))
6465
api.f.Get("/api/connections", getApiConnHandler(app))
@@ -86,6 +87,11 @@ func (h *HttpServer) NewAdminAPI(app *App, addr string, webtakRoot string) *Admi
8687
api.f.Put("/api/profile/:login/:uid", getApiProfilePutHandler(app))
8788
api.f.Delete("/api/profile/:login/:uid", getApiProfileDeleteHandler(app))
8889

90+
api.f.Get("/api/feed", getApiFeedsHandler(app))
91+
api.f.Post("/api/feed", getApiFeedPostHandler(app))
92+
api.f.Put("/api/feed/:uid", getApiFeedPutHandler(app))
93+
api.f.Delete("/api/feed/:uid", getApiFeedDeleteHandler(app))
94+
8995
api.f.Get("/api/mission", getApiAllMissionHandler(app))
9096
api.f.Get("/api/mission/:id/changes", getApiAllMissionChangesHandler(app))
9197

@@ -268,6 +274,18 @@ func getProfilesPage() fiber.Handler {
268274
}
269275
}
270276

277+
func getFeedsPage() fiber.Handler {
278+
return func(ctx *fiber.Ctx) error {
279+
data := map[string]any{
280+
"theme": "auto",
281+
"page": " feeds",
282+
"js": []string{"feeds.js"},
283+
}
284+
285+
return ctx.Render("templates/feeds", data, "templates/menu", "templates/header")
286+
}
287+
}
288+
271289
func getConfigHandler(app *App) fiber.Handler {
272290
m := make(map[string]any, 0)
273291
m["lat"] = app.lat
@@ -685,6 +703,100 @@ func getApiProfileDeleteHandler(app *App) fiber.Handler {
685703
}
686704
}
687705

706+
func getApiFeedsHandler(app *App) fiber.Handler {
707+
return func(ctx *fiber.Ctx) error {
708+
data := app.dbm.FeedQuery().All(true).Get()
709+
710+
feeds := make([]*model.FeedDTO, len(data))
711+
712+
for i, f := range data {
713+
feeds[i] = f.DTO(true)
714+
}
715+
716+
return ctx.JSON(feeds)
717+
}
718+
}
719+
720+
func getApiFeedPostHandler(app *App) fiber.Handler {
721+
return func(ctx *fiber.Ctx) error {
722+
var m *model.FeedPostDTO
723+
724+
if err := ctx.BodyParser(&m); err != nil {
725+
return err
726+
}
727+
728+
if m.UID == "" {
729+
m.UID = uuid.NewString()
730+
}
731+
732+
f := &model.Feed2{
733+
UID: m.UID,
734+
Active: m.Active,
735+
Alias: m.Alias,
736+
URL: m.URL,
737+
Latitude: m.Latitude,
738+
Longitude: m.Longitude,
739+
Fov: m.Fov,
740+
Heading: m.Heading,
741+
Range: m.Range,
742+
User: Username(ctx),
743+
Scope: m.Scope,
744+
}
745+
746+
if err := app.dbm.Create(f); err != nil {
747+
return SendError(ctx, err.Error())
748+
}
749+
750+
return ctx.JSON(f.DTO(true))
751+
}
752+
}
753+
754+
func getApiFeedPutHandler(app *App) fiber.Handler {
755+
return func(ctx *fiber.Ctx) error {
756+
uid := ctx.Params("uid")
757+
758+
f := app.dbm.FeedQuery().UID(uid).All(true).One()
759+
760+
if f == nil {
761+
return ctx.SendStatus(fiber.StatusNotFound)
762+
}
763+
764+
var m *model.FeedPutDTO
765+
766+
if err := ctx.BodyParser(&m); err != nil {
767+
return err
768+
}
769+
770+
f.Active = m.Active
771+
f.Alias = m.Alias
772+
f.URL = m.URL
773+
f.Latitude = m.Latitude
774+
f.Longitude = m.Longitude
775+
f.Fov = m.Fov
776+
f.Heading = m.Heading
777+
f.Range = m.Range
778+
f.Scope = m.Scope
779+
780+
if err := app.dbm.Save(f); err != nil {
781+
return SendError(ctx, err.Error())
782+
}
783+
784+
return ctx.JSON(f.DTO(true))
785+
}
786+
}
787+
788+
func getApiFeedDeleteHandler(app *App) fiber.Handler {
789+
return func(ctx *fiber.Ctx) error {
790+
uid := ctx.Params("uid")
791+
792+
if err := app.dbm.FeedQuery().UID(uid).Delete(); err != nil {
793+
return SendError(ctx, err.Error())
794+
}
795+
796+
return ctx.JSON(fiber.Map{"status": "ok"})
797+
}
798+
}
799+
688800
func getPluginsManifestHandler(_ *App) fiber.Handler {
689801
return func(ctx *fiber.Ctx) error {
690802
return ctx.JSON(fiber.Map{"plugins": []string{}, "iconSets": []string{}})

cmd/goatak_server/main.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ type App struct {
4242

4343
items repository.ItemsRepository
4444
messages []*model.ChatMessage
45-
feeds repository.FeedsRepository
4645
dbm *database.DatabaseManager
4746
users repository.DeviceRepository
4847

@@ -59,7 +58,6 @@ func NewApp(config *config.AppConfig) *App {
5958
ch: make(chan *cot.CotMessage, 100),
6059
handlers: sync.Map{},
6160
items: repository.NewItemsMemoryRepo(),
62-
feeds: repository.NewFeedsFileRepo(filepath.Join(config.DataDir(), "feeds")),
6361
uid: uuid.NewString(),
6462
eventProcessors: make([]*EventProcessor, 0),
6563
}
@@ -93,12 +91,6 @@ func (app *App) Run() {
9391
log.Fatal(err)
9492
}
9593

96-
if app.feeds != nil {
97-
if err := app.feeds.Start(); err != nil {
98-
log.Fatal(err)
99-
}
100-
}
101-
10294
ctx, cancel := context.WithCancel(context.Background())
10395

10496
if addr := app.config.String("udp_addr"); addr != "" {

cmd/goatak_server/marti_api.go

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -557,35 +557,26 @@ func getVideoListHandler(app *App) fiber.Handler {
557557
r := new(model.VideoConnections)
558558
user := app.users.Get(Username(ctx))
559559

560-
app.feeds.ForEach(func(f *model.Feed2) bool {
561-
if user.CanSeeScope(f.Scope) {
562-
r.Feeds = append(r.Feeds, f.ToFeed())
563-
}
564-
565-
return true
566-
})
560+
for _, f := range app.dbm.FeedQuery().Scope(user.Scope).ReadScope(user.ReadScope).Get() {
561+
r.Feeds = append(r.Feeds, f.ToFeed())
562+
}
567563

568564
return ctx.XML(r)
569565
}
570566
}
571567

572568
func getVideo2ListHandler(app *App) fiber.Handler {
573569
return func(ctx *fiber.Ctx) error {
574-
conn := make([]*model.VideoConnections2, 0)
575570
user := app.users.Get(Username(ctx))
576571

577-
app.feeds.ForEach(func(f *model.Feed2) bool {
578-
if user.CanSeeScope(f.Scope) {
579-
conn = append(conn, &model.VideoConnections2{Feeds: []*model.Feed2{f}})
580-
}
581-
582-
return true
583-
})
584-
585-
r := make(map[string]any)
586-
r["videoConnections"] = conn
572+
feeds := app.dbm.FeedQuery().Scope(user.Scope).ReadScope(user.ReadScope).Get()
573+
conn := make([]*model.VideoConnections2, len(feeds))
574+
575+
for i, f := range feeds {
576+
conn[i] = &model.VideoConnections2{Feeds: []*model.FeedDTO{f.DTO(false)}}
577+
}
587578

588-
return ctx.JSON(r)
579+
return ctx.JSON(fiber.Map{"videoConnections": conn})
589580
}
590581
}
591582

@@ -601,7 +592,13 @@ func getVideoPostHandler(app *App) fiber.Handler {
601592
}
602593

603594
for _, f := range r.Feeds {
604-
app.feeds.Store(f.ToFeed2().WithUser(username).WithScope(user.Scope))
595+
f2 := f.ToFeed2()
596+
f2.User = username
597+
f2.Scope = user.GetScope()
598+
599+
if err := app.dbm.Save(f2); err != nil {
600+
app.logger.Error("error save feed", slog.Any("error", err))
601+
}
605602
}
606603

607604
return nil

cmd/goatak_server/mission_api.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,13 @@ func getMissionCotHandler(app *App) fiber.Handler {
353353
enc := xml.NewEncoder(fb)
354354

355355
for _, item := range mission.Points {
356-
if err := enc.Encode(cot.CotToEvent(item.GetEvent())); err != nil {
356+
evt := cot.CotToEvent(item.GetEvent())
357+
358+
if evt == nil {
359+
continue
360+
}
361+
362+
if err := enc.Encode(evt); err != nil {
357363
app.logger.Error("xml encode error", slog.Any("error", err))
358364
}
359365
}

0 commit comments

Comments
 (0)