- graph, dotenv read

- graph, cors and secure header
- web, urql client basic setup
This commit is contained in:
2024-11-04 11:35:43 +05:30
parent 46c46a7e71
commit 45c318b897
22 changed files with 590 additions and 64 deletions

View File

@@ -1,9 +0,0 @@
import { gql } from '@urql/svelte';
export const QryMe = gql`
query Me {
me {
id
displayName
}
}
`;

View File

@@ -1,51 +0,0 @@
export type Maybe<T> = T | null;
export type InputMaybe<T> = Maybe<T>;
export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };
export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };
export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };
export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };
export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };
/** All built-in and custom scalars, mapped to their actual values */
export type Scalars = {
ID: { input: string; output: string; }
String: { input: string; output: string; }
Boolean: { input: boolean; output: boolean; }
Int: { input: number; output: number; }
Float: { input: number; output: number; }
Any: { input: any; output: any; }
Map: { input: any; output: any; }
Time: { input: any; output: any; }
Void: { input: any; output: any; }
};
export type AuthUser = {
__typename?: 'AuthUser';
displayName: Scalars['String']['output'];
email: Scalars['String']['output'];
id: Scalars['ID']['output'];
roleID: Scalars['Int']['output'];
};
export type Mutation = {
__typename?: 'Mutation';
login: Scalars['Boolean']['output'];
logout: Scalars['Boolean']['output'];
};
export type MutationLoginArgs = {
email: Scalars['String']['input'];
username: Scalars['String']['input'];
};
export type Query = {
__typename?: 'Query';
heartBeat: Scalars['Boolean']['output'];
/** me, is current AuthUser info */
me?: Maybe<AuthUser>;
};
export type MeQueryVariables = Exact<{ [key: string]: never; }>;
export type MeQuery = { __typename?: 'Query', me?: { __typename?: 'AuthUser', id: string, displayName: string } | null };

View File

@@ -10,7 +10,7 @@ import (
"github.com/99designs/gqlgen/graphql/handler"
"github.com/99designs/gqlgen/graphql/handler/extension"
"github.com/99designs/gqlgen/graphql/playground"
"github.com/vektah/gqlparser/gqlerror"
"github.com/vektah/gqlparser/v2/gqlerror"
"gitserver.in/patialtech/rano/graph/generated"
"gitserver.in/patialtech/rano/pkg/logger"
)
@@ -149,4 +149,5 @@ func GraphiQL(queryEndpoint string) func(w http.ResponseWriter, r *http.Request)
func Query(w http.ResponseWriter, r *http.Request) {
// srv.ServeHTTP(w, r.WithContext(userCtx(r)))
srv.ServeHTTP(w, r)
}

View File

@@ -1,33 +1,42 @@
package main
import (
"fmt"
"net/http"
"os"
"gitserver.in/patialtech/mux"
"gitserver.in/patialtech/mux/middleware"
"gitserver.in/patialtech/rano/config"
"gitserver.in/patialtech/rano/graph"
"gitserver.in/patialtech/rano/pkg/logger"
)
func main() {
r := mux.NewRouter()
// CORS
r.Use(middleware.CORS(middleware.CORSOption{
AllowedHeaders: []string{"Content-Type"},
MaxAge: 60,
}))
// Secure Headers
r.Use(middleware.Helmet(middleware.HelmetOption{
ContentSecurityPolicy: middleware.CSP{
ScriptSrc: []string{"self", "https://cdn.jsdelivr.net", "unsafe-inline"},
},
}))
// graphiql
r.Get("/graphiql", graph.GraphiQL("/query"))
r.GET("/graphiql", graph.GraphiQL("/query"))
// graph query
r.Post("/query", graph.Query)
r.POST("/query", graph.Query)
// catch all
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
r.GET("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello there"))
})
port := os.Getenv("GRAPH_PORT")
if port == "" {
port = "4001"
}
r.Serve(func(srv *http.Server) error {
srv.Addr = ":" + port
srv.Addr = fmt.Sprintf(":%d", config.Read().GraphPort)
logger.Info("graph server listening on %s", srv.Addr)
return srv.ListenAndServe()
})