package server import ( "encoding/json" "net/http" ) // handleSessionCheck verifies the session is valid and returns session info. func (s *Server) handleSessionCheck(w http.ResponseWriter, r *http.Request) { sess := GetSession(r) if sess == nil { if cookie, err := r.Cookie("session_id"); err == nil && cookie.Value != "" { sess = s.sessions.Get(cookie.Value) } } if sess == nil { s.writeJSONRPC(w, nil, nil, &RPCError{ Code: 100, Message: "Session expired", }) return } s.writeJSONRPC(w, nil, s.buildSessionInfo(sess), nil) } // handleSessionModules returns installed module names. func (s *Server) handleSessionModules(w http.ResponseWriter, r *http.Request) { s.writeJSONRPC(w, nil, []string{ "base", "web", "contacts", "sale", "account", "stock", "purchase", "crm", "hr", "project", "fleet", "product", "l10n_de", }, nil) } // handleManifest returns a minimal PWA manifest. func (s *Server) handleManifest(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/manifest+json") json.NewEncoder(w).Encode(map[string]interface{}{ "name": "Odoo", "short_name": "Odoo", "start_url": "/web", "display": "standalone", "background_color": "#71639e", "theme_color": "#71639e", "icons": []map[string]string{ {"src": "/web/static/img/odoo-icon-192x192.png", "sizes": "192x192", "type": "image/png"}, }, }) } // handleBootstrapTranslations returns empty translations for initial boot. func (s *Server) handleBootstrapTranslations(w http.ResponseWriter, r *http.Request) { s.writeJSONRPC(w, nil, map[string]interface{}{ "lang": "en_US", "hash": "empty", "lang_parameters": map[string]interface{}{ "direction": "ltr", "date_format": "%%m/%%d/%%Y", "time_format": "%%H:%%M:%%S", "grouping": "[3,0]", "decimal_point": ".", "thousands_sep": ",", "week_start": 1, }, "modules": map[string]interface{}{}, "multi_lang": false, }, nil) }