@@ -6,12 +6,14 @@ import (
66 "log"
77 "os"
88 "path/filepath"
9+ "regexp"
910 "strings"
1011
1112 "text/template"
1213
1314 "github.com/devopsdays/devopsdays-cli/helpers"
1415 "github.com/devopsdays/devopsdays-cli/model"
16+ "github.com/tcnksm/go-input"
1517)
1618
1719const tmpl = `+++
@@ -29,6 +31,181 @@ Food-truck SpaceTeam pivot earned media agile big data entrepreneur actionable i
2931
3032`
3133
34+ // CreateSpeaker takes input from the user to create a new speaker
35+ func CreateSpeaker (speakerName , city , year string ) (err error ) {
36+
37+ var imagePath string
38+
39+ ui := & input.UI {}
40+
41+ if city == "" {
42+ cityName , err := ui .Ask ("City" , & input.Options {
43+ // Read the default val from env var
44+ Required : true ,
45+ Loop : true ,
46+ HideOrder : true ,
47+ })
48+ if err != nil {
49+ log .Fatal (err )
50+ }
51+ city = cityName
52+ }
53+
54+ if year == "" {
55+ yearName , err := ui .Ask ("Year" , & input.Options {
56+ // Read the default val from env var
57+ Required : true ,
58+ Loop : true ,
59+ HideOrder : true ,
60+ })
61+ if err != nil {
62+ log .Fatal (err )
63+ }
64+ year = yearName
65+ }
66+
67+ name , err := ui .Ask ("Speaker Name" , & input.Options {
68+ Required : true ,
69+ Loop : true ,
70+ HideOrder : true ,
71+ })
72+ if err != nil {
73+ log .Fatal (err )
74+ }
75+
76+ website , err := ui .Ask ("Website (optional)" , & input.Options {
77+ HideOrder : true ,
78+ Required : false ,
79+ Loop : true ,
80+ ValidateFunc : func (s string ) error {
81+ if (s != "" ) && (helpers .ValidateField (s , "website" ) != true ) {
82+ return fmt .Errorf ("please enter a properly formed URL" )
83+ }
84+
85+ return nil
86+ },
87+ })
88+ if err != nil {
89+ log .Fatal (err )
90+ }
91+
92+ twitter , err := ui .Ask ("Twitter (optional)" , & input.Options {
93+ HideOrder : true ,
94+ Loop : true ,
95+ Required : false ,
96+ ValidateFunc : func (s string ) error {
97+ if (s != "" ) && (helpers .ValidateField (s , "twitter" ) != true ) {
98+ return fmt .Errorf ("please enter a properly formed twitter handle" )
99+ }
100+
101+ return nil
102+ },
103+ })
104+ if err != nil {
105+ log .Fatal (err )
106+ }
107+
108+ facebook , err := ui .Ask ("Facebook (optional)" , & input.Options {
109+ HideOrder : true ,
110+ Loop : true ,
111+ Required : false ,
112+ ValidateFunc : func (s string ) error {
113+ if (s != "" ) && (helpers .ValidateField (s , "facebook" ) != true ) {
114+ return fmt .Errorf ("please enter a properly formed Facebook profile URL" )
115+ }
116+
117+ return nil
118+ },
119+ })
120+ if err != nil {
121+ log .Fatal (err )
122+ }
123+
124+ linkedin , err := ui .Ask ("LinkedIn (optional)" , & input.Options {
125+ HideOrder : true , Loop : true ,
126+ Required : false ,
127+ ValidateFunc : func (s string ) error {
128+ if (s != "" ) && (helpers .ValidateField (s , "linkedin" ) != true ) {
129+ return fmt .Errorf ("please enter a properly formed LinkedIn URL" )
130+ }
131+
132+ return nil
133+ },
134+ })
135+ if err != nil {
136+ log .Fatal (err )
137+ }
138+
139+ github , err := ui .Ask ("GitHub (optional)" , & input.Options {
140+ HideOrder : true , Loop : true ,
141+ Required : false ,
142+ ValidateFunc : func (s string ) error {
143+ if (s != "" ) && (helpers .ValidateField (s , "github" ) != true ) {
144+ return fmt .Errorf ("please enter a properly formed GitHub handle" )
145+ }
146+
147+ return nil
148+ },
149+ })
150+ if err != nil {
151+ log .Fatal (err )
152+ }
153+
154+ gitlab , err := ui .Ask ("GitLab (optional)" , & input.Options {
155+ HideOrder : true ,
156+ Loop : true ,
157+ Required : false ,
158+ ValidateFunc : func (s string ) error {
159+ if (s != "" ) && (helpers .ValidateField (s , "gitlab" ) != true ) {
160+ return fmt .Errorf ("please enter a properly formed GitLab handle" )
161+ }
162+
163+ return nil
164+ },
165+ })
166+ if err != nil {
167+ log .Fatal (err )
168+ }
169+
170+ imageQuery , err := ui .Ask ("Would you like to add the speaker image now? [Y/n]" , & input.Options {
171+ Default : "Y" ,
172+ HideOrder : true ,
173+ Loop : true ,
174+ Required : true ,
175+ ValidateFunc : func (s string ) error {
176+ if s != "Y" && s != "y" && s != "N" && s != "n" {
177+ return fmt .Errorf ("input must be Y or n" )
178+ }
179+
180+ return nil
181+ },
182+ })
183+
184+ if (imageQuery == "Y" ) || (imageQuery == "y" ) {
185+ imagePath = CreateSpeakerImage (helpers .NameClean (name ), city , year )
186+ } else {
187+ imagePath = ""
188+ }
189+
190+ fmt .Println (imageQuery )
191+
192+ mySpeaker := model.Speaker {
193+ Name : helpers .NameClean (name ),
194+ Title : name ,
195+ Website : website ,
196+ Twitter : twitter ,
197+ Facebook : facebook ,
198+ Linkedin : linkedin ,
199+ Github : github ,
200+ Gitlab : gitlab ,
201+ ImagePath : imagePath ,
202+ }
203+
204+ NewSpeaker (mySpeaker , city , year )
205+
206+ return
207+ }
208+
32209// NewSpeaker takes in a constructed Speaker type and generates the stuff
33210func NewSpeaker (speaker model.Speaker , city string , year string ) (err error ) {
34211
@@ -62,3 +239,49 @@ func NewSpeaker(speaker model.Speaker, city string, year string) (err error) {
62239 }
63240 return
64241}
242+
243+ // CreateSpeakerImage takes in a path to an image and resizes it to the proper dimensions and copies it to the destination
244+ func CreateSpeakerImage (speaker , city , year string ) (imageFile string ) {
245+ ui := & input.UI {}
246+ srcPath , err := ui .Ask ("Path to speaker image. Must be a PNG or JPG file." , & input.Options {
247+ Required : true ,
248+ Loop : true ,
249+ HideOrder : true ,
250+ ValidateFunc : func (s string ) error {
251+ if (s != "" ) && (helpers .ValidateField (s , "filepath" ) != true ) {
252+ return fmt .Errorf ("please enter a proper path" )
253+ }
254+
255+ if _ , err := os .Stat (s ); err == nil {
256+ return fmt .Errorf ("File not found." )
257+ }
258+
259+ return nil
260+ },
261+ })
262+ if err != nil {
263+ log .Fatal (err )
264+ }
265+ // create the destPath better here
266+
267+ re := regexp .MustCompile ("\\ .[^.]+$" )
268+ ext := strings .ToLower (re .FindString (srcPath ))
269+ switch ext {
270+ case "jpg" :
271+ s := []string {strings .TrimSpace (speaker ), ".jpg" }
272+ destPath := filepath .Join (helpers .EventContentPath (city , year ), "speakers" , strings .Join (s , "" ))
273+ helpers .ResizeImage (srcPath , destPath , "jpg" , 600 , 600 )
274+ return strings .Join (s , "" )
275+ case "jpeg" :
276+ s := []string {strings .TrimSpace (speaker ), ".jpg" }
277+ destPath := filepath .Join (helpers .EventContentPath (city , year ), "speakers" , strings .Join (s , "" ))
278+ helpers .ResizeImage (srcPath , destPath , "jpg" , 600 , 600 )
279+ return strings .Join (s , "" )
280+ case "png" :
281+ s := []string {strings .TrimSpace (speaker ), ".png" }
282+ destPath := filepath .Join (helpers .EventContentPath (city , year ), "speakers" , strings .Join (s , "" ))
283+ helpers .ResizeImage (srcPath , destPath , "png" , 600 , 600 )
284+ return strings .Join (s , "" )
285+ }
286+ return ""
287+ }
0 commit comments