Socket
Book a DemoInstallSign in
Socket

github.com/wahyd4/zendesk

Package Overview
Dependencies
Alerts
File Explorer
Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

github.com/wahyd4/zendesk

v0.0.0-20200302132006-47707df8a890
Source
Go
Version published
Created
Source

Zendesk Code Challenge

Github Build

How to

How to run


./auto/run

Or without Docker


go run main.go

Please use your arrow keys to select search data type and field name from all fields, then type the value for that field.

If there are something matched, the application will printed out all the information, including linked User and Organisation information.

Otherwise you should expect a error message says Cannot find any matched result

Notice: Due to the limited time, currently you can't go back in the CLI.

If you want to skip the current search then just type `Enter`.

How to test


./auto/test

Or without Docker


go test ./... -cover

How to build Docker image


GITHUB_RUN_NUMBER=1 ./auto/build

How does the application work

The application loads organisations, users and tickets from json into memory, then puts them into models and sets up the relationships between models. For instance the organisation property in a user model.

For the search part, in order to provide a better performance(which the time complexity for searching is O(1) ) the BuildIndexes() method will scan every model item and every field in that model to build a index map with two levels.

For example the index map for organisations looks like:

organisations index map

In the outer level of the map the key is the field name, the value is a map, which each key presents one uniq value for that field, and the value is a array of all the matched model reference(pointer).

Besides, I also created a SearchIndex to present one type of model which can be searched. So we end up with having 3 different indexes which implement ListSearchableFields and Search method for each model type. It decouples the logic and decreases the duplication.

Last but not least, the Search() method will delegate the call the one SearchIndex and print out all the matched results.

Assumptions

  • All the data in json is valid, for example no invalid organisation_id in users.json

Highlights

  • Had basic CI(Github workflow) pipeline setup
  • Containerised Application
  • Created indexes for all entities and fields, after all the entities been scanned, no matter how many items we have, the search time complexity is always O(1).
  • Used table driven test

If I had more time / What can I improve

  • Better object printing instead of using spew.Dump()
  • Reuse more shard logic especially in search/index.go, but due to Go missing generics concept it's different when compare to Ruby, Java and some other popular languages.
  • Add more tests with more check points. Due to this code test costs me a lot of time to complete, so I didn't cover all the code currently, but I am keen to add more tests if possible.
  • Better user experience in CLI application, current the cli app is very basic and go can't go back to previous menu.
  • Better error handling instead of just panic
  • Adopt a logging framework, instead of just fmt.Prntln

FAQs

Package last updated on 02 Mar 2020

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

About

Packages

Stay in touch

Get open source security insights delivered straight into your inbox.

  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc

U.S. Patent No. 12,346,443 & 12,314,394. Other pending.