alfred/test-updates #15
							
								
								
									
										16
									
								
								.dockerignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								.dockerignore
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | |||||||
|  | /** | ||||||
|  | !/args | ||||||
|  | !/cmd/africastalking | ||||||
|  | !/cmd/ssh | ||||||
|  | !/config | ||||||
|  | !/debug | ||||||
|  | !/handlers | ||||||
|  | !/internal | ||||||
|  | !/profile | ||||||
|  | !/services | ||||||
|  | !/ssh | ||||||
|  | !/store | ||||||
|  | !/LICENSE | ||||||
|  | !/README.md | ||||||
|  | !/go.* | ||||||
|  | !/.env.example | ||||||
| @ -18,3 +18,6 @@ DATA_URL_BASE=http://localhost:5006 | |||||||
| #Language | #Language | ||||||
| DEFAULT_LANGUAGE=eng | DEFAULT_LANGUAGE=eng | ||||||
| LANGUAGES=eng, swa | LANGUAGES=eng, swa | ||||||
|  | 
 | ||||||
|  | #Alias search domains | ||||||
|  | ALIAS_SEARCH_DOMAINS=sarafu.local, sarafu.eth | ||||||
|  | |||||||
							
								
								
									
										56
									
								
								.github/workflows/docker.yaml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								.github/workflows/docker.yaml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,56 @@ | |||||||
|  | name: release | ||||||
|  | 
 | ||||||
|  | on: | ||||||
|  |   push: | ||||||
|  |     tags: | ||||||
|  |       - "v*" | ||||||
|  | 
 | ||||||
|  | jobs: | ||||||
|  |   docker: | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     steps: | ||||||
|  |       - name: Set up QEMU | ||||||
|  |         uses: docker/setup-qemu-action@v2 | ||||||
|  | 
 | ||||||
|  |       - name: Set up Docker Buildx | ||||||
|  |         uses: docker/setup-buildx-action@v2 | ||||||
|  | 
 | ||||||
|  |       - name: Check out repo | ||||||
|  |         uses: actions/checkout@v3 | ||||||
|  |         with: | ||||||
|  |           fetch-depth: 0 | ||||||
|  | 
 | ||||||
|  |       - name: Cache Docker layers | ||||||
|  |         uses: actions/cache@v3 | ||||||
|  |         with: | ||||||
|  |           path: /tmp/.buildx-cache | ||||||
|  |           key: ${{ runner.os }}-buildx-${{ github.sha }} | ||||||
|  |           restore-keys: | | ||||||
|  |             ${{ runner.os }}-buildx- | ||||||
|  | 
 | ||||||
|  |       - name: Login to GHCR Docker registry | ||||||
|  |         uses: docker/login-action@v1 | ||||||
|  |         with: | ||||||
|  |           registry: ghcr.io | ||||||
|  |           username: ${{ github.repository_owner }} | ||||||
|  |           password: ${{ secrets.GITHUB_TOKEN }} | ||||||
|  | 
 | ||||||
|  |       - name: Set outputs | ||||||
|  |         run: | | ||||||
|  |           echo "RELEASE_TAG=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV \ | ||||||
|  |           && echo "RELEASE_SHORT_COMMIT=$(git rev-parse --short HEAD)" >> $GITHUB_ENV | ||||||
|  | 
 | ||||||
|  |       - name: Build and push image | ||||||
|  |         uses: docker/build-push-action@v2 | ||||||
|  |         with: | ||||||
|  |           context: ./ | ||||||
|  |           file: ./Dockerfile | ||||||
|  |           platforms: linux/amd64 | ||||||
|  |           push: true | ||||||
|  |           build-args: | | ||||||
|  |             BUILD=${{ env.RELEASE_SHORT_COMMIT }} | ||||||
|  |           cache-from: type=local,src=/tmp/.buildx-cache | ||||||
|  |           cache-to: type=local,dest=/tmp/.buildx-cache | ||||||
|  |           tags: | | ||||||
|  |             ghcr.io/grassrootseconomics/sarafu-vise:latest | ||||||
|  |             ghcr.io/grassrootseconomics/sarafu-vise:${{ env.RELEASE_TAG }} | ||||||
							
								
								
									
										50
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,50 @@ | |||||||
|  | FROM golang:1.23.4-bookworm AS build | ||||||
|  | 
 | ||||||
|  | ENV CGO_ENABLED=1 | ||||||
|  | 
 | ||||||
|  | ARG BUILDPLATFORM | ||||||
|  | ARG TARGETPLATFORM | ||||||
|  | ARG BUILD=dev | ||||||
|  | 
 | ||||||
|  | WORKDIR /build | ||||||
|  | RUN apt-get update && apt-get install -y --no-install-recommends \ | ||||||
|  |     libgdbm-dev \ | ||||||
|  |     git \ | ||||||
|  |     && rm -rf /var/lib/apt/lists/* | ||||||
|  | RUN git clone https://git.defalsify.org/vise.git go-vise | ||||||
|  | COPY . ./sarafu-vise | ||||||
|  | 
 | ||||||
|  | WORKDIR /build/sarafu-vise/services/registration | ||||||
|  | RUN echo "Compiling go-vise files" | ||||||
|  | RUN make VISE_PATH=/build/go-vise -B | ||||||
|  | 
 | ||||||
|  | WORKDIR /build/sarafu-vise | ||||||
|  | RUN echo "Building on $BUILDPLATFORM, building for $TARGETPLATFORM" | ||||||
|  | RUN go mod download | ||||||
|  | RUN go build -tags logtrace,online -o sarafu-at -ldflags="-X main.build=${BUILD} -s -w" cmd/africastalking/main.go | ||||||
|  | RUN go build -tags logtrace,online -o sarafu-ssh -ldflags="-X main.build=${BUILD} -s -w" cmd/ssh/main.go | ||||||
|  | 
 | ||||||
|  | FROM debian:bookworm-slim | ||||||
|  | 
 | ||||||
|  | ENV DEBIAN_FRONTEND=noninteractive | ||||||
|  | 
 | ||||||
|  | RUN apt-get update && apt-get install -y --no-install-recommends \ | ||||||
|  |     libgdbm-dev \ | ||||||
|  |     ca-certificates \ | ||||||
|  |     && apt-get clean \ | ||||||
|  |     && rm -rf /var/lib/apt/lists/* | ||||||
|  | 
 | ||||||
|  | WORKDIR /service | ||||||
|  | 
 | ||||||
|  | COPY --from=build /build/sarafu-vise/sarafu-at . | ||||||
|  | COPY --from=build /build/sarafu-vise/sarafu-ssh . | ||||||
|  | COPY --from=build /build/sarafu-vise/LICENSE . | ||||||
|  | COPY --from=build /build/sarafu-vise/README.md . | ||||||
|  | COPY --from=build /build/sarafu-vise/services ./services | ||||||
|  | COPY --from=build /build/sarafu-vise/.env.example . | ||||||
|  | RUN mv .env.example .env | ||||||
|  | 
 | ||||||
|  | EXPOSE 7123 | ||||||
|  | EXPOSE 7122 | ||||||
|  | 
 | ||||||
|  | CMD ["./sarafu-at"] | ||||||
| @ -44,14 +44,12 @@ func main() { | |||||||
| 	var err error | 	var err error | ||||||
| 	var gettextDir string | 	var gettextDir string | ||||||
| 	var langs args.LangVar | 	var langs args.LangVar | ||||||
| 	var resourceDir string |  | ||||||
| 
 | 
 | ||||||
| 	flag.BoolVar(&engineDebug, "d", false, "use engine debug output") | 	flag.BoolVar(&engineDebug, "d", false, "use engine debug output") | ||||||
| 	flag.StringVar(override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") | 	flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") | ||||||
| 	flag.StringVar(override.UserConn, "userdata", "?", "userdata store connection string") | 	flag.StringVar(&override.UserConn, "userdata", "?", "userdata store connection string") | ||||||
| 	flag.StringVar(override.ResourceConn, "resource", "?", "resource data directory") | 	flag.StringVar(&override.ResourceConn, "resource", "?", "resource data directory") | ||||||
| 	flag.StringVar(&resourceDir, "resource-dir", "", "resource data directory. If set, overrides --resource to create a non-binary fsdb for the given path.") | 	flag.StringVar(&override.StateConn, "state", "?", "state store connection string") | ||||||
| 	flag.StringVar(override.StateConn, "state", "?", "state store connection string") |  | ||||||
| 	flag.UintVar(&size, "s", 160, "max size of output") | 	flag.UintVar(&size, "s", 160, "max size of output") | ||||||
| 	flag.StringVar(&host, "h", config.Host(), "http host") | 	flag.StringVar(&host, "h", config.Host(), "http host") | ||||||
| 	flag.UintVar(&port, "p", config.Port(), "http port") | 	flag.UintVar(&port, "p", config.Port(), "http port") | ||||||
| @ -59,10 +57,6 @@ func main() { | |||||||
| 	flag.Var(&langs, "language", "add symbol resolution for language") | 	flag.Var(&langs, "language", "add symbol resolution for language") | ||||||
| 	flag.Parse() | 	flag.Parse() | ||||||
| 
 | 
 | ||||||
| 	if resourceDir != "" { |  | ||||||
| 		*override.ResourceConn = resourceDir |  | ||||||
| 		override.ResourceConnMode = storage.DBMODE_TEXT |  | ||||||
| 	} |  | ||||||
| 	config.Apply(override) | 	config.Apply(override) | ||||||
| 	conns, err := config.GetConns() | 	conns, err := config.GetConns() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | |||||||
| @ -53,14 +53,12 @@ func main() { | |||||||
| 	var err error | 	var err error | ||||||
| 	var gettextDir string | 	var gettextDir string | ||||||
| 	var langs args.LangVar | 	var langs args.LangVar | ||||||
| 	var resourceDir string |  | ||||||
| 
 | 
 | ||||||
| 	flag.StringVar(&sessionId, "session-id", "075xx2123", "session id") | 	flag.StringVar(&sessionId, "session-id", "075xx2123", "session id") | ||||||
| 	flag.StringVar(override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") | 	flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") | ||||||
| 	flag.StringVar(override.ResourceConn, "resource", "?", "resource data directory") | 	flag.StringVar(&override.ResourceConn, "resource", "?", "resource data directory") | ||||||
| 	flag.StringVar(&resourceDir, "resource-dir", "", "resource data directory. If set, overrides --resource to create a non-binary fsdb for the given path.") | 	flag.StringVar(&override.UserConn, "userdata", "?", "userdata store connection string") | ||||||
| 	flag.StringVar(override.UserConn, "userdata", "?", "userdata store connection string") | 	flag.StringVar(&override.StateConn, "state", "?", "state store connection string") | ||||||
| 	flag.StringVar(override.StateConn, "state", "?", "state store connection string") |  | ||||||
| 
 | 
 | ||||||
| 	flag.BoolVar(&engineDebug, "d", false, "use engine debug output") | 	flag.BoolVar(&engineDebug, "d", false, "use engine debug output") | ||||||
| 	flag.UintVar(&size, "s", 160, "max size of output") | 	flag.UintVar(&size, "s", 160, "max size of output") | ||||||
| @ -70,10 +68,6 @@ func main() { | |||||||
| 	flag.Var(&langs, "language", "add symbol resolution for language") | 	flag.Var(&langs, "language", "add symbol resolution for language") | ||||||
| 	flag.Parse() | 	flag.Parse() | ||||||
| 
 | 
 | ||||||
| 	if resourceDir != "" { |  | ||||||
| 		*override.ResourceConn = resourceDir |  | ||||||
| 		override.ResourceConnMode = storage.DBMODE_TEXT |  | ||||||
| 	} |  | ||||||
| 	config.Apply(override) | 	config.Apply(override) | ||||||
| 	conns, err := config.GetConns() | 	conns, err := config.GetConns() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | |||||||
| @ -43,13 +43,11 @@ func main() { | |||||||
| 	var err error | 	var err error | ||||||
| 	var gettextDir string | 	var gettextDir string | ||||||
| 	var langs args.LangVar | 	var langs args.LangVar | ||||||
| 	var resourceDir string |  | ||||||
| 
 | 
 | ||||||
| 	flag.StringVar(override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") | 	flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") | ||||||
| 	flag.StringVar(override.UserConn, "userdata", "?", "userdata store connection string") | 	flag.StringVar(&override.UserConn, "userdata", "?", "userdata store connection string") | ||||||
| 	flag.StringVar(override.ResourceConn, "resource", "?", "resource data directory") | 	flag.StringVar(&override.ResourceConn, "resource", "?", "resource data directory") | ||||||
| 	flag.StringVar(&resourceDir, "resource-dir", "", "resource data directory. If set, overrides --resource to create a non-binary fsdb for the given path.") | 	flag.StringVar(&override.StateConn, "state", "?", "state store connection string") | ||||||
| 	flag.StringVar(override.StateConn, "state", "?", "state store connection string") |  | ||||||
| 
 | 
 | ||||||
| 	flag.BoolVar(&engineDebug, "d", false, "use engine debug output") | 	flag.BoolVar(&engineDebug, "d", false, "use engine debug output") | ||||||
| 	flag.UintVar(&size, "s", 160, "max size of output") | 	flag.UintVar(&size, "s", 160, "max size of output") | ||||||
| @ -59,10 +57,6 @@ func main() { | |||||||
| 	flag.Var(&langs, "language", "add symbol resolution for language") | 	flag.Var(&langs, "language", "add symbol resolution for language") | ||||||
| 	flag.Parse() | 	flag.Parse() | ||||||
| 
 | 
 | ||||||
| 	if resourceDir != "" { |  | ||||||
| 		*override.ResourceConn = resourceDir |  | ||||||
| 		override.ResourceConnMode = storage.DBMODE_TEXT |  | ||||||
| 	} |  | ||||||
| 	config.Apply(override) | 	config.Apply(override) | ||||||
| 	conns, err := config.GetConns() | 	conns, err := config.GetConns() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | |||||||
| @ -38,10 +38,10 @@ func main() { | |||||||
| 	var langs args.LangVar | 	var langs args.LangVar | ||||||
| 
 | 
 | ||||||
| 	flag.StringVar(&sessionId, "session-id", "075xx2123", "session id") | 	flag.StringVar(&sessionId, "session-id", "075xx2123", "session id") | ||||||
| 	flag.StringVar(override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") | 	flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") | ||||||
| 	flag.StringVar(override.ResourceConn, "resource", "?", "resource data directory") | 	flag.StringVar(&override.ResourceConn, "resource", "?", "resource data directory") | ||||||
| 	flag.StringVar(override.UserConn, "userdata", "?", "userdata store connection string") | 	flag.StringVar(&override.UserConn, "userdata", "?", "userdata store connection string") | ||||||
| 	flag.StringVar(override.StateConn, "state", "?", "state store connection string") | 	flag.StringVar(&override.StateConn, "state", "?", "state store connection string") | ||||||
| 	flag.BoolVar(&engineDebug, "d", false, "use engine debug output") | 	flag.BoolVar(&engineDebug, "d", false, "use engine debug output") | ||||||
| 	flag.UintVar(&size, "s", 160, "max size of output") | 	flag.UintVar(&size, "s", 160, "max size of output") | ||||||
| 	flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory") | 	flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory") | ||||||
|  | |||||||
| @ -38,10 +38,11 @@ func main() { | |||||||
| 	var stateDebug bool | 	var stateDebug bool | ||||||
| 	var host string | 	var host string | ||||||
| 	var port uint | 	var port uint | ||||||
| 	flag.StringVar(override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") | 	 | ||||||
| 	flag.StringVar(override.ResourceConn, "resource", "?", "resource connection string") | 	flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") | ||||||
| 	flag.StringVar(override.UserConn, "userdata", "?", "userdata store connection string") | 	flag.StringVar(&override.ResourceConn, "resource", "?", "resource connection string") | ||||||
| 	flag.StringVar(override.StateConn, "state", "?", "state store connection string") | 	flag.StringVar(&override.UserConn, "userdata", "?", "userdata store connection string") | ||||||
|  | 	flag.StringVar(&override.StateConn, "state", "?", "state store connection string") | ||||||
| 	flag.BoolVar(&engineDebug, "d", false, "use engine debug output") | 	flag.BoolVar(&engineDebug, "d", false, "use engine debug output") | ||||||
| 	flag.UintVar(&size, "s", 160, "max size of output") | 	flag.UintVar(&size, "s", 160, "max size of output") | ||||||
| 	flag.StringVar(&host, "h", config.HostSSH(), "socket host") | 	flag.StringVar(&host, "h", config.HostSSH(), "socket host") | ||||||
|  | |||||||
| @ -6,17 +6,9 @@ import ( | |||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func NewOverride() *viseconfig.Override { | func NewOverride() *viseconfig.Override { | ||||||
| 	var a string |  | ||||||
| 	var b string |  | ||||||
| 	var c string |  | ||||||
| 	var d string |  | ||||||
| 	o := &viseconfig.Override{ | 	o := &viseconfig.Override{ | ||||||
| 		DbConn:           &a, |  | ||||||
| 		StateConn:        &b, |  | ||||||
| 		StateConnMode:    storage.DBMODE_TEXT, | 		StateConnMode:    storage.DBMODE_TEXT, | ||||||
| 		ResourceConn:     &c, |  | ||||||
| 		ResourceConnMode: storage.DBMODE_TEXT, | 		ResourceConnMode: storage.DBMODE_TEXT, | ||||||
| 		UserConn:         &d, |  | ||||||
| 		UserConnMode:     storage.DBMODE_BINARY, | 		UserConnMode:     storage.DBMODE_BINARY, | ||||||
| 	} | 	} | ||||||
| 	return o | 	return o | ||||||
|  | |||||||
| @ -1,6 +1,8 @@ | |||||||
| package config | package config | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
|  | 	"strings" | ||||||
|  | 
 | ||||||
| 	apiconfig "git.grassecon.net/grassrootseconomics/sarafu-api/config" | 	apiconfig "git.grassecon.net/grassrootseconomics/sarafu-api/config" | ||||||
| 	viseconfig "git.grassecon.net/grassrootseconomics/visedriver/config" | 	viseconfig "git.grassecon.net/grassrootseconomics/visedriver/config" | ||||||
| 	"git.grassecon.net/grassrootseconomics/visedriver/env" | 	"git.grassecon.net/grassrootseconomics/visedriver/env" | ||||||
| @ -23,7 +25,8 @@ const ( | |||||||
| 	defaultSSHHost  string = "127.0.0.1" | 	defaultSSHHost  string = "127.0.0.1" | ||||||
| 	defaultSSHPort  uint   = 7122 | 	defaultSSHPort  uint   = 7122 | ||||||
| 	defaultHTTPHost string = "127.0.0.1" | 	defaultHTTPHost string = "127.0.0.1" | ||||||
| 	defaultHTTPPort uint   = 7123 | 	defaultHTTPPort uint     = 7123 | ||||||
|  | 	defaultDomain          = "sarafu.local" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func LoadConfig() error { | func LoadConfig() error { | ||||||
| @ -39,6 +42,17 @@ func LoadConfig() error { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func SearchDomains() []string { | ||||||
|  | 	var ParsedDomains []string | ||||||
|  | 	SearchDomains := env.GetEnv("ALIAS_SEARCH_DOMAINS", defaultDomain) | ||||||
|  | 	SearchDomainList := strings.Split(env.GetEnv("ALIAS_SEARCH_DOMAINS", SearchDomains), ",") | ||||||
|  | 	for _, domain := range SearchDomainList { | ||||||
|  | 		ParsedDomains = append(ParsedDomains, strings.ReplaceAll(domain, " ", "")) | ||||||
|  | 	} | ||||||
|  | 	return ParsedDomains | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| func Language() string { | func Language() string { | ||||||
| 	return viseconfig.DefaultLanguage | 	return viseconfig.DefaultLanguage | ||||||
| } | } | ||||||
|  | |||||||
| @ -25,21 +25,15 @@ func main() { | |||||||
| 
 | 
 | ||||||
| 	override := config.NewOverride() | 	override := config.NewOverride() | ||||||
| 	var sessionId string | 	var sessionId string | ||||||
| 	var resourceDir string |  | ||||||
| 
 | 
 | ||||||
| 	flag.StringVar(&sessionId, "session-id", "075xx2123", "session id") | 	flag.StringVar(&sessionId, "session-id", "075xx2123", "session id") | ||||||
| 	flag.StringVar(override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") | 	flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") | ||||||
| 	flag.StringVar(override.ResourceConn, "resource", "?", "resource data directory") | 	flag.StringVar(&override.ResourceConn, "resource", "?", "resource data directory") | ||||||
| 	flag.StringVar(&resourceDir, "resource-dir", "", "resource data directory. If set, overrides --resource to create a non-binary fsdb for the given path.") |  | ||||||
| 
 | 
 | ||||||
| 	flag.StringVar(override.UserConn, "userdata", "?", "userdata store connection string") | 	flag.StringVar(&override.UserConn, "userdata", "?", "userdata store connection string") | ||||||
| 	flag.StringVar(override.StateConn, "state", "?", "state store connection string") | 	flag.StringVar(&override.StateConn, "state", "?", "state store connection string") | ||||||
| 	flag.Parse() | 	flag.Parse() | ||||||
| 
 | 
 | ||||||
| 	if resourceDir != "" { |  | ||||||
| 		*override.ResourceConn = resourceDir |  | ||||||
| 		override.ResourceConnMode = storage.DBMODE_TEXT |  | ||||||
| 	} |  | ||||||
| 	config.Apply(override) | 	config.Apply(override) | ||||||
| 	conns, err := config.GetConns() | 	conns, err := config.GetConns() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | |||||||
| @ -38,21 +38,15 @@ func main() { | |||||||
| 	var engineDebug bool | 	var engineDebug bool | ||||||
| 	var err error | 	var err error | ||||||
| 	var first bool | 	var first bool | ||||||
| 	var resourceDir string |  | ||||||
| 
 | 
 | ||||||
| 	flag.StringVar(&sessionId, "session-id", "075xx2123", "session id") | 	flag.StringVar(&sessionId, "session-id", "075xx2123", "session id") | ||||||
| 	flag.StringVar(override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") | 	flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") | ||||||
| 	flag.StringVar(override.ResourceConn, "resource", "?", "resource data directory") | 	flag.StringVar(&override.ResourceConn, "resource", "?", "resource data directory") | ||||||
| 	flag.StringVar(&resourceDir, "resource-dir", "", "resource data directory. If set, overrides --resource to create a non-binary fsdb for the given path.") | 	flag.StringVar(&override.UserConn, "userdata", "?", "userdata store connection string") | ||||||
| 	flag.StringVar(override.UserConn, "userdata", "?", "userdata store connection string") | 	flag.StringVar(&override.StateConn, "state", "?", "state store connection string") | ||||||
| 	flag.StringVar(override.StateConn, "state", "?", "state store connection string") |  | ||||||
| 	flag.BoolVar(&engineDebug, "d", false, "use engine debug output") | 	flag.BoolVar(&engineDebug, "d", false, "use engine debug output") | ||||||
| 	flag.Parse() | 	flag.Parse() | ||||||
| 
 | 
 | ||||||
| 	if resourceDir != "" { |  | ||||||
| 		*override.ResourceConn = resourceDir |  | ||||||
| 		override.ResourceConnMode = storage.DBMODE_TEXT |  | ||||||
| 	} |  | ||||||
| 	config.Apply(override) | 	config.Apply(override) | ||||||
| 	conns, err := config.GetConns() | 	conns, err := config.GetConns() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | |||||||
							
								
								
									
										4
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								go.mod
									
									
									
									
									
								
							| @ -5,8 +5,8 @@ go 1.23.4 | |||||||
| require ( | require ( | ||||||
| 	git.defalsify.org/vise.git v0.2.3-0.20250120121301-10739fb4a8c9 | 	git.defalsify.org/vise.git v0.2.3-0.20250120121301-10739fb4a8c9 | ||||||
| 	git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d | 	git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d | ||||||
| 	git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250121135150-e0b539809805 | 	git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250123142805-2181388f5bf1 | ||||||
| 	git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250122123424-6749c632b0a2 | 	git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250124100946-03d19283f6fa | ||||||
| 	git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250121135340-ca97e23e8c84 | 	git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250121135340-ca97e23e8c84 | ||||||
| 	github.com/alecthomas/assert/v2 v2.2.2 | 	github.com/alecthomas/assert/v2 v2.2.2 | ||||||
| 	github.com/gofrs/uuid v4.4.0+incompatible | 	github.com/gofrs/uuid v4.4.0+incompatible | ||||||
|  | |||||||
							
								
								
									
										8
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								go.sum
									
									
									
									
									
								
							| @ -2,10 +2,10 @@ git.defalsify.org/vise.git v0.2.3-0.20250120121301-10739fb4a8c9 h1:sPcqXQcywxA8W | |||||||
| git.defalsify.org/vise.git v0.2.3-0.20250120121301-10739fb4a8c9/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck= | git.defalsify.org/vise.git v0.2.3-0.20250120121301-10739fb4a8c9/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck= | ||||||
| git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d h1:5mzLas+jxTUtusOKx4XvU+n2QvrV/mH17MnJRy46siQ= | git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d h1:5mzLas+jxTUtusOKx4XvU+n2QvrV/mH17MnJRy46siQ= | ||||||
| git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60= | git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60= | ||||||
| git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250121135150-e0b539809805 h1:deGnqf4YCsbxhXgjFEjYjTUCvciLEmI26T9IysRsQXY= | git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250123142805-2181388f5bf1 h1:BJHfokTHzrw9QjQ+4s2HmSER0iBPuE7byW5oQC2zLIQ= | ||||||
| git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250121135150-e0b539809805/go.mod h1:9bc3d//Qqm11hz7GYRdQc1Uan+0GJIOpvRBbv8cHMu8= | git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250123142805-2181388f5bf1/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= | ||||||
| git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250122123424-6749c632b0a2 h1:ON77G5K0JNuwPb5JT/hRfF6G6+xstlBQgEIEzWydnhg= | git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250124100946-03d19283f6fa h1:yQLKwby3eD/zNjNw/INU5lGiLuWPEHdsgASwMA4UptE= | ||||||
| git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250122123424-6749c632b0a2/go.mod h1:pjKp9L/ZsWW3kMB0UoIl1yv9TBIuU33mn9Aghxp7vGk= | git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250124100946-03d19283f6fa/go.mod h1:pjKp9L/ZsWW3kMB0UoIl1yv9TBIuU33mn9Aghxp7vGk= | ||||||
| git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250121135340-ca97e23e8c84 h1:VoBmqsjlRdz+IPbtKsAkc1IrMepjR+QlesZT31Jokrk= | git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250121135340-ca97e23e8c84 h1:VoBmqsjlRdz+IPbtKsAkc1IrMepjR+QlesZT31Jokrk= | ||||||
| git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250121135340-ca97e23e8c84/go.mod h1:DpibtYpnT3nG4Kn556hRAkdu4+CtiI/6MbnQHal51mQ= | git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250121135340-ca97e23e8c84/go.mod h1:DpibtYpnT3nG4Kn556hRAkdu4+CtiI/6MbnQHal51mQ= | ||||||
| github.com/alecthomas/assert/v2 v2.2.2 h1:Z/iVC0xZfWTaFNE6bA3z07T86hd45Xe2eLt6WVy2bbk= | github.com/alecthomas/assert/v2 v2.2.2 h1:Z/iVC0xZfWTaFNE6bA3z07T86hd45Xe2eLt6WVy2bbk= | ||||||
|  | |||||||
| @ -23,7 +23,9 @@ import ( | |||||||
| 	"git.grassecon.net/grassrootseconomics/common/person" | 	"git.grassecon.net/grassrootseconomics/common/person" | ||||||
| 	"git.grassecon.net/grassrootseconomics/common/phone" | 	"git.grassecon.net/grassrootseconomics/common/phone" | ||||||
| 	"git.grassecon.net/grassrootseconomics/common/pin" | 	"git.grassecon.net/grassrootseconomics/common/pin" | ||||||
|  | 	"git.grassecon.net/grassrootseconomics/sarafu-api/models" | ||||||
| 	"git.grassecon.net/grassrootseconomics/sarafu-api/remote" | 	"git.grassecon.net/grassrootseconomics/sarafu-api/remote" | ||||||
|  | 	"git.grassecon.net/grassrootseconomics/sarafu-vise/config" | ||||||
| 	"git.grassecon.net/grassrootseconomics/sarafu-vise/profile" | 	"git.grassecon.net/grassrootseconomics/sarafu-vise/profile" | ||||||
| 	"git.grassecon.net/grassrootseconomics/sarafu-vise/store" | 	"git.grassecon.net/grassrootseconomics/sarafu-vise/store" | ||||||
| 	storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db" | 	storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db" | ||||||
| @ -662,6 +664,10 @@ func (h *MenuHandlers) SaveFirstname(ctx context.Context, sym string, input []by | |||||||
| 			logg.ErrorCtxf(ctx, "failed to write firstName entry with", "key", storedb.DATA_FIRST_NAME, "value", temporaryFirstName, "error", err) | 			logg.ErrorCtxf(ctx, "failed to write firstName entry with", "key", storedb.DATA_FIRST_NAME, "value", temporaryFirstName, "error", err) | ||||||
| 			return res, err | 			return res, err | ||||||
| 		} | 		} | ||||||
|  | 		err := h.constructAccountAlias(ctx) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return res, err | ||||||
|  | 		} | ||||||
| 		res.FlagSet = append(res.FlagSet, flag_firstname_set) | 		res.FlagSet = append(res.FlagSet, flag_firstname_set) | ||||||
| 	} else { | 	} else { | ||||||
| 		if firstNameSet { | 		if firstNameSet { | ||||||
| @ -1076,6 +1082,11 @@ func (h *MenuHandlers) GetProfileInfo(ctx context.Context, sym string, input []b | |||||||
| 	gender := getEntryOrDefault(store.ReadEntry(ctx, sessionId, storedb.DATA_GENDER)) | 	gender := getEntryOrDefault(store.ReadEntry(ctx, sessionId, storedb.DATA_GENDER)) | ||||||
| 	location := getEntryOrDefault(store.ReadEntry(ctx, sessionId, storedb.DATA_LOCATION)) | 	location := getEntryOrDefault(store.ReadEntry(ctx, sessionId, storedb.DATA_LOCATION)) | ||||||
| 	offerings := getEntryOrDefault(store.ReadEntry(ctx, sessionId, storedb.DATA_OFFERINGS)) | 	offerings := getEntryOrDefault(store.ReadEntry(ctx, sessionId, storedb.DATA_OFFERINGS)) | ||||||
|  | 	alias := getEntryOrDefault(store.ReadEntry(ctx, sessionId, storedb.DATA_ACCOUNT_ALIAS)) | ||||||
|  | 
 | ||||||
|  | 	if alias != defaultValue { | ||||||
|  | 		alias = strings.Split(alias, ".")[0] | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	// Construct the full name
 | 	// Construct the full name
 | ||||||
| 	name := person.ConstructName(firstName, familyName, defaultValue) | 	name := person.ConstructName(firstName, familyName, defaultValue) | ||||||
| @ -1092,18 +1103,18 @@ func (h *MenuHandlers) GetProfileInfo(ctx context.Context, sym string, input []b | |||||||
| 	switch language.Code { | 	switch language.Code { | ||||||
| 	case "eng": | 	case "eng": | ||||||
| 		res.Content = fmt.Sprintf( | 		res.Content = fmt.Sprintf( | ||||||
| 			"Name: %s\nGender: %s\nAge: %s\nLocation: %s\nYou provide: %s\n", | 			"Name: %s\nGender: %s\nAge: %s\nLocation: %s\nYou provide: %s\nYour alias: %s\n", | ||||||
| 			name, gender, age, location, offerings, | 			name, gender, age, location, offerings, alias, | ||||||
| 		) | 		) | ||||||
| 	case "swa": | 	case "swa": | ||||||
| 		res.Content = fmt.Sprintf( | 		res.Content = fmt.Sprintf( | ||||||
| 			"Jina: %s\nJinsia: %s\nUmri: %s\nEneo: %s\nUnauza: %s\n", | 			"Jina: %s\nJinsia: %s\nUmri: %s\nEneo: %s\nUnauza: %s\nLakabu yako: %s\n", | ||||||
| 			name, gender, age, location, offerings, | 			name, gender, age, location, offerings, alias, | ||||||
| 		) | 		) | ||||||
| 	default: | 	default: | ||||||
| 		res.Content = fmt.Sprintf( | 		res.Content = fmt.Sprintf( | ||||||
| 			"Name: %s\nGender: %s\nAge: %s\nLocation: %s\nYou provide: %s\n", | 			"Name: %s\nGender: %s\nAge: %s\nLocation: %s\nYou provide: %s\nYour alias: %s\n", | ||||||
| 			name, gender, age, location, offerings, | 			name, gender, age, location, offerings, alias, | ||||||
| 		) | 		) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| @ -1159,6 +1170,10 @@ func (h *MenuHandlers) UpdateAllProfileItems(ctx context.Context, sym string, in | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return res, err | 		return res, err | ||||||
| 	} | 	} | ||||||
|  | 	err = h.constructAccountAlias(ctx) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return res, err | ||||||
|  | 	} | ||||||
| 	return res, nil | 	return res, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -1399,16 +1414,16 @@ func (h *MenuHandlers) FetchCommunityBalance(ctx context.Context, sym string, in | |||||||
| // TODO: split up functino
 | // TODO: split up functino
 | ||||||
| func (h *MenuHandlers) ValidateRecipient(ctx context.Context, sym string, input []byte) (resource.Result, error) { | func (h *MenuHandlers) ValidateRecipient(ctx context.Context, sym string, input []byte) (resource.Result, error) { | ||||||
| 	var res resource.Result | 	var res resource.Result | ||||||
|  | 	var AliasAddressResult string | ||||||
|  | 	var AliasAddress *models.AliasAddress | ||||||
| 	store := h.userdataStore | 	store := h.userdataStore | ||||||
| 
 | 
 | ||||||
| 	sessionId, ok := ctx.Value("SessionId").(string) | 	sessionId, ok := ctx.Value("SessionId").(string) | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		return res, fmt.Errorf("missing session") | 		return res, fmt.Errorf("missing session") | ||||||
| 	} | 	} | ||||||
| 
 |  | ||||||
| 	flag_invalid_recipient, _ := h.flagManager.GetFlag("flag_invalid_recipient") | 	flag_invalid_recipient, _ := h.flagManager.GetFlag("flag_invalid_recipient") | ||||||
| 	flag_invalid_recipient_with_invite, _ := h.flagManager.GetFlag("flag_invalid_recipient_with_invite") | 	flag_invalid_recipient_with_invite, _ := h.flagManager.GetFlag("flag_invalid_recipient_with_invite") | ||||||
| 	flag_api_error, _ := h.flagManager.GetFlag("flag_api_call_error") |  | ||||||
| 
 | 
 | ||||||
| 	recipient := string(input) | 	recipient := string(input) | ||||||
| 
 | 
 | ||||||
| @ -1468,21 +1483,32 @@ func (h *MenuHandlers) ValidateRecipient(ctx context.Context, sym string, input | |||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 		case "alias": | 		case "alias": | ||||||
| 			// Call the API to validate and retrieve the address for the alias
 | 			if strings.Contains(recipient, ".") { | ||||||
| 			r, aliasErr := h.accountService.CheckAliasAddress(ctx, recipient) | 				AliasAddress, err = h.accountService.CheckAliasAddress(ctx, recipient) | ||||||
| 			if aliasErr != nil { | 				if err == nil { | ||||||
| 				res.FlagSet = append(res.FlagSet, flag_api_error) | 					AliasAddressResult = AliasAddress.Address | ||||||
| 				res.Content = recipient | 				} | ||||||
| 
 | 			} else { | ||||||
| 				logg.ErrorCtxf(ctx, "failed on CheckAliasAddress", "error", aliasErr) | 				//Perform a search for each search domain,break on first match
 | ||||||
| 				return res, err | 				for _, domain := range config.SearchDomains() { | ||||||
|  | 					fqdn := fmt.Sprintf("%s.%s", recipient, domain) | ||||||
|  | 					AliasAddress, err = h.accountService.CheckAliasAddress(ctx, fqdn) | ||||||
|  | 					if err == nil { | ||||||
|  | 						AliasAddressResult = AliasAddress.Address | ||||||
|  | 						continue | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
| 			} | 			} | ||||||
| 
 | 			if AliasAddressResult == "" { | ||||||
| 			// Alias validation succeeded, save the Ethereum address
 | 				res.Content = recipient | ||||||
| 			err = store.WriteEntry(ctx, sessionId, storedb.DATA_RECIPIENT, []byte(r.Address)) | 				res.FlagSet = append(res.FlagSet, flag_invalid_recipient) | ||||||
| 			if err != nil { | 				return res, nil | ||||||
| 				logg.ErrorCtxf(ctx, "failed to write recipient entry with", "key", storedb.DATA_RECIPIENT, "value", r.Address, "error", err) | 			} else { | ||||||
| 				return res, err | 				err = store.WriteEntry(ctx, sessionId, storedb.DATA_RECIPIENT, []byte(AliasAddressResult)) | ||||||
|  | 				if err != nil { | ||||||
|  | 					logg.ErrorCtxf(ctx, "failed to write recipient entry with", "key", storedb.DATA_RECIPIENT, "value", AliasAddressResult, "error", err) | ||||||
|  | 					return res, err | ||||||
|  | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| @ -2015,7 +2041,6 @@ func (h *MenuHandlers) GetVoucherDetails(ctx context.Context, sym string, input | |||||||
| 	if !ok { | 	if !ok { | ||||||
| 		return res, fmt.Errorf("missing session") | 		return res, fmt.Errorf("missing session") | ||||||
| 	} | 	} | ||||||
| 
 |  | ||||||
| 	flag_api_error, _ := h.flagManager.GetFlag("flag_api_call_error") | 	flag_api_error, _ := h.flagManager.GetFlag("flag_api_call_error") | ||||||
| 
 | 
 | ||||||
| 	// get the active address
 | 	// get the active address
 | ||||||
| @ -2242,3 +2267,46 @@ func (h *MenuHandlers) persistLanguageCode(ctx context.Context, code string) err | |||||||
| 	} | 	} | ||||||
| 	return h.persistInitialLanguageCode(ctx, sessionId, code) | 	return h.persistInitialLanguageCode(ctx, sessionId, code) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func (h *MenuHandlers) constructAccountAlias(ctx context.Context) error { | ||||||
|  | 	var alias string | ||||||
|  | 	store := h.userdataStore | ||||||
|  | 	sessionId, ok := ctx.Value("SessionId").(string) | ||||||
|  | 	if !ok { | ||||||
|  | 		return fmt.Errorf("missing session") | ||||||
|  | 	} | ||||||
|  | 	firstName, err := store.ReadEntry(ctx, sessionId, storedb.DATA_FIRST_NAME) | ||||||
|  | 	if err != nil { | ||||||
|  | 		if db.IsNotFound(err) { | ||||||
|  | 			return nil | ||||||
|  | 		} | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	familyName, err := store.ReadEntry(ctx, sessionId, storedb.DATA_FAMILY_NAME) | ||||||
|  | 	if err != nil { | ||||||
|  | 		if db.IsNotFound(err) { | ||||||
|  | 			return nil | ||||||
|  | 		} | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	pubKey, err := store.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) | ||||||
|  | 	if err != nil { | ||||||
|  | 		if db.IsNotFound(err) { | ||||||
|  | 			return nil | ||||||
|  | 		} | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	aliasInput := fmt.Sprintf("%s%s", firstName, familyName) | ||||||
|  | 	aliasResult, err := h.accountService.RequestAlias(ctx, string(pubKey), aliasInput) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return fmt.Errorf("Failed to retrieve alias: %s", err.Error()) | ||||||
|  | 	} | ||||||
|  | 	alias = aliasResult.Alias | ||||||
|  | 	//Store the alias
 | ||||||
|  | 	err = store.WriteEntry(ctx, sessionId, storedb.DATA_ACCOUNT_ALIAS, []byte(alias)) | ||||||
|  | 	if err != nil { | ||||||
|  | 		logg.ErrorCtxf(ctx, "failed to write account alias", "key", storedb.DATA_ACCOUNT_ALIAS, "value", alias, "error", err) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | |||||||
| @ -1680,7 +1680,7 @@ func TestValidateRecipient(t *testing.T) { | |||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name:           "Test with alias recepient", | 			name:           "Test with alias recepient", | ||||||
| 			input:          []byte("alias123"), | 			input:          []byte("alias123.sarafu.local"), | ||||||
| 			expectedResult: resource.Result{}, | 			expectedResult: resource.Result{}, | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| @ -1798,37 +1798,37 @@ func TestGetProfile(t *testing.T) { | |||||||
| 	}{ | 	}{ | ||||||
| 		{ | 		{ | ||||||
| 			name:         "Test with full profile information in eng", | 			name:         "Test with full profile information in eng", | ||||||
| 			keys:         []storedb.DataTyp{storedb.DATA_FAMILY_NAME, storedb.DATA_FIRST_NAME, storedb.DATA_GENDER, storedb.DATA_OFFERINGS, storedb.DATA_LOCATION, storedb.DATA_YOB}, | 			keys:         []storedb.DataTyp{storedb.DATA_FAMILY_NAME, storedb.DATA_FIRST_NAME, storedb.DATA_GENDER, storedb.DATA_OFFERINGS, storedb.DATA_LOCATION, storedb.DATA_YOB, storedb.DATA_ACCOUNT_ALIAS}, | ||||||
| 			profileInfo:  []string{"Doee", "John", "Male", "Bananas", "Kilifi", "1976"}, | 			profileInfo:  []string{"Doee", "John", "Male", "Bananas", "Kilifi", "1976", "DoeJohn"}, | ||||||
| 			languageCode: "eng", | 			languageCode: "eng", | ||||||
| 			result: resource.Result{ | 			result: resource.Result{ | ||||||
| 				Content: fmt.Sprintf( | 				Content: fmt.Sprintf( | ||||||
| 					"Name: %s\nGender: %s\nAge: %s\nLocation: %s\nYou provide: %s\n", | 					"Name: %s\nGender: %s\nAge: %s\nLocation: %s\nYou provide: %s\nYour alias: %s\n", | ||||||
| 					"John Doee", "Male", "49", "Kilifi", "Bananas", | 					"John Doee", "Male", "49", "Kilifi", "Bananas", "DoeJohn", | ||||||
| 				), | 				), | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name:         "Test with with profile information in swa", | 			name:         "Test with with profile information in swa", | ||||||
| 			keys:         []storedb.DataTyp{storedb.DATA_FAMILY_NAME, storedb.DATA_FIRST_NAME, storedb.DATA_GENDER, storedb.DATA_OFFERINGS, storedb.DATA_LOCATION, storedb.DATA_YOB}, | 			keys:         []storedb.DataTyp{storedb.DATA_FAMILY_NAME, storedb.DATA_FIRST_NAME, storedb.DATA_GENDER, storedb.DATA_OFFERINGS, storedb.DATA_LOCATION, storedb.DATA_YOB, storedb.DATA_ACCOUNT_ALIAS}, | ||||||
| 			profileInfo:  []string{"Doee", "John", "Male", "Bananas", "Kilifi", "1976"}, | 			profileInfo:  []string{"Doee", "John", "Male", "Bananas", "Kilifi", "1976", "DoeJohn"}, | ||||||
| 			languageCode: "swa", | 			languageCode: "swa", | ||||||
| 			result: resource.Result{ | 			result: resource.Result{ | ||||||
| 				Content: fmt.Sprintf( | 				Content: fmt.Sprintf( | ||||||
| 					"Jina: %s\nJinsia: %s\nUmri: %s\nEneo: %s\nUnauza: %s\n", | 					"Jina: %s\nJinsia: %s\nUmri: %s\nEneo: %s\nUnauza: %s\nLakabu yako: %s\n", | ||||||
| 					"John Doee", "Male", "49", "Kilifi", "Bananas", | 					"John Doee", "Male", "49", "Kilifi", "Bananas", "DoeJohn", | ||||||
| 				), | 				), | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name:         "Test with with profile information with language that is not yet supported", | 			name:         "Test with with profile information with language that is not yet supported", | ||||||
| 			keys:         []storedb.DataTyp{storedb.DATA_FAMILY_NAME, storedb.DATA_FIRST_NAME, storedb.DATA_GENDER, storedb.DATA_OFFERINGS, storedb.DATA_LOCATION, storedb.DATA_YOB}, | 			keys:         []storedb.DataTyp{storedb.DATA_FAMILY_NAME, storedb.DATA_FIRST_NAME, storedb.DATA_GENDER, storedb.DATA_OFFERINGS, storedb.DATA_LOCATION, storedb.DATA_YOB, storedb.DATA_ACCOUNT_ALIAS}, | ||||||
| 			profileInfo:  []string{"Doee", "John", "Male", "Bananas", "Kilifi", "1976"}, | 			profileInfo:  []string{"Doee", "John", "Male", "Bananas", "Kilifi", "1976", "DoeJohn"}, | ||||||
| 			languageCode: "nor", | 			languageCode: "nor", | ||||||
| 			result: resource.Result{ | 			result: resource.Result{ | ||||||
| 				Content: fmt.Sprintf( | 				Content: fmt.Sprintf( | ||||||
| 					"Name: %s\nGender: %s\nAge: %s\nLocation: %s\nYou provide: %s\n", | 					"Name: %s\nGender: %s\nAge: %s\nLocation: %s\nYou provide: %s\nYour alias: %s\n", | ||||||
| 					"John Doee", "Male", "49", "Kilifi", "Bananas", | 					"John Doee", "Male", "49", "Kilifi", "Bananas", "DoeJohn", | ||||||
| 				), | 				), | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
|  | |||||||
| @ -427,7 +427,7 @@ | |||||||
|                 }, |                 }, | ||||||
|                 { |                 { | ||||||
|                     "input": "1234", |                     "input": "1234", | ||||||
|                     "expectedContent": "My profile:\nName: foo bar\nGender: male\nAge: 80\nLocation: Kilifi\nYou provide: Bananas\n\n0:Back\n9:Quit" |                     "expectedContent": "My profile:\nName: foo bar\nGender: male\nAge: 80\nLocation: Kilifi\nYou provide: Bananas\nYour alias: \n\n0:Back\n9:Quit" | ||||||
|                 }, |                 }, | ||||||
|                 { |                 { | ||||||
|                     "input": "0", |                     "input": "0", | ||||||
|  | |||||||
| @ -11,6 +11,9 @@ import ( | |||||||
| 	"git.grassecon.net/grassrootseconomics/visedriver/storage" | 	"git.grassecon.net/grassrootseconomics/visedriver/storage" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func New(ctx context.Context, storageService storage.StorageService, conn storage.ConnData) remote.AccountService { | func New(ctx context.Context, storageService storage.StorageService) remote.AccountService { | ||||||
| 	return &httpremote.HTTPAccountService{} | 	return &httpremote.HTTPAccountService{ | ||||||
|  | 		SS:     storageService, | ||||||
|  | 		UseApi: false, | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  | |||||||
| @ -61,6 +61,8 @@ const ( | |||||||
| 	DATA_SELECTED_LANGUAGE_CODE | 	DATA_SELECTED_LANGUAGE_CODE | ||||||
| 	//ISO 639 code for the language initially selected.
 | 	//ISO 639 code for the language initially selected.
 | ||||||
| 	DATA_INITIAL_LANGUAGE_CODE | 	DATA_INITIAL_LANGUAGE_CODE | ||||||
|  | 	//Fully qualified account alias string
 | ||||||
|  | 	DATA_ACCOUNT_ALIAS | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| const ( | const ( | ||||||
|  | |||||||
| @ -16,10 +16,10 @@ func init() { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		panic(err) | 		panic(err) | ||||||
| 	} | 	} | ||||||
| 	override.StateConn = &stateDir | 	override.StateConn = stateDir | ||||||
| 	userDir, err := os.MkdirTemp("", "sarafu-vise-menutraversal-fs-user-") | 	userDir, err := os.MkdirTemp("", "sarafu-vise-menutraversal-fs-user-") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		panic(err) | 		panic(err) | ||||||
| 	} | 	} | ||||||
| 	override.UserConn = &userDir | 	override.UserConn = userDir | ||||||
| } | } | ||||||
|  | |||||||
| @ -21,7 +21,7 @@ func init() { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		panic(err) | 		panic(err) | ||||||
| 	} | 	} | ||||||
| 	override.StateConn = &stateDir | 	override.StateConn = stateDir | ||||||
| 	userDir, err := os.MkdirTemp("", "sarafu-vise-menutraversal-gdbm-user-") | 	userDir, err := os.MkdirTemp("", "sarafu-vise-menutraversal-gdbm-user-") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		panic(err) | 		panic(err) | ||||||
| @ -30,5 +30,5 @@ func init() { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		panic(err) | 		panic(err) | ||||||
| 	} | 	} | ||||||
| 	override.UserConn = &userDir | 	override.UserConn = userDir | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user